diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index 14f96e312a..f70164138d 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -261,7 +261,6 @@ def edit_unit(request, location): break lms_link = get_lms_link_for_item(item.location) - preview_lms_link = get_lms_link_for_item(item.location, preview=True) component_templates = defaultdict(list) diff --git a/cms/static/js/base.js b/cms/static/js/base.js index 41c1ee3cdb..7e55d2b8d8 100644 --- a/cms/static/js/base.js +++ b/cms/static/js/base.js @@ -80,64 +80,6 @@ $(document).ready(function() { $('.import .file-input').click(); }); - // making the unit list draggable. Note: sortable didn't work b/c it considered - // drop points which the user hovered over as destinations and proactively changed - // the dom; so, if the user subsequently dropped at an illegal spot, the reversion - // point was the last dom change. - $('.unit').draggable({ - axis: 'y', - handle: '.drag-handle', - zIndex: 999, - start: initiateHesitate, - drag: checkHoverState, - stop: removeHesitate, - revert: "invalid" - }); - - // Subsection reordering - $('.id-holder').draggable({ - axis: 'y', - handle: '.section-item .drag-handle', - zIndex: 999, - start: initiateHesitate, - drag: checkHoverState, - stop: removeHesitate, - revert: "invalid" - }); - - // Section reordering - $('.courseware-section').draggable({ - axis: 'y', - handle: 'header .drag-handle', - stack: '.courseware-section', - revert: "invalid" - }); - - - $('.sortable-unit-list').droppable({ - accept : '.unit', - greedy: true, - tolerance: "pointer", - hoverClass: "dropover", - drop: onUnitReordered - }); - $('.subsection-list > ol').droppable({ - // why don't we have a more useful class for subsections than id-holder? - accept : '.id-holder', // '.unit, .id-holder', - tolerance: "pointer", - hoverClass: "dropover", - drop: onSubsectionReordered, - greedy: true - }); - - // Section reordering - $('.courseware-overview').droppable({ - accept : '.courseware-section', - tolerance: "pointer", - drop: onSectionReordered, - greedy: true - }); - $('.new-course-button').bind('click', addNewCourse); // section name editing @@ -279,136 +221,6 @@ function removePolicyMetadata(e) { saveSubsection() } -CMS.HesitateEvent.toggleXpandHesitation = null; -function initiateHesitate(event, ui) { - CMS.HesitateEvent.toggleXpandHesitation = new CMS.HesitateEvent(expandSection, 'dragLeave', true); - $('.collapsed').on('dragEnter', CMS.HesitateEvent.toggleXpandHesitation, CMS.HesitateEvent.toggleXpandHesitation.trigger); - $('.collapsed').each(function() { - this.proportions = {width : this.offsetWidth, height : this.offsetHeight }; - // reset b/c these were holding values from aborts - this.isover = false; - }); -} -function checkHoverState(event, ui) { - // copied from jquery.ui.droppable.js $.ui.ddmanager.drag & other ui.intersect - var draggable = $(this).data("ui-draggable"), - x1 = (draggable.positionAbs || draggable.position.absolute).left + (draggable.helperProportions.width / 2), - y1 = (draggable.positionAbs || draggable.position.absolute).top + (draggable.helperProportions.height / 2); - $('.collapsed').each(function() { - // don't expand the thing being carried - if (ui.helper.is(this)) { - return; - } - - $.extend(this, {offset : $(this).offset()}); - - var droppable = this, - l = droppable.offset.left, - r = l + droppable.proportions.width, - t = droppable.offset.top, - b = t + droppable.proportions.height; - - if (l === r) { - // probably wrong values b/c invisible at the time of caching - droppable.proportions = { width : droppable.offsetWidth, height : droppable.offsetHeight }; - r = l + droppable.proportions.width; - b = t + droppable.proportions.height; - } - // equivalent to the intersects test - var intersects = (l < x1 && // Right Half - x1 < r && // Left Half - t < y1 && // Bottom Half - y1 < b ), // Top Half - - c = !intersects && this.isover ? "isout" : (intersects && !this.isover ? "isover" : null); - - if(!c) { - return; - } - - this[c] = true; - this[c === "isout" ? "isover" : "isout"] = false; - $(this).trigger(c === "isover" ? "dragEnter" : "dragLeave"); - }); -} -function removeHesitate(event, ui) { - $('.collapsed').off('dragEnter', CMS.HesitateEvent.toggleXpandHesitation.trigger); - CMS.HesitateEvent.toggleXpandHesitation = null; -} - -function expandSection(event) { - $(event.delegateTarget).removeClass('collapsed', 400); - // don't descend to icon's on children (which aren't under first child) only to this element's icon - $(event.delegateTarget).children().first().find('.expand-collapse-icon').removeClass('expand', 400).addClass('collapse'); -} - -function onUnitReordered(event, ui) { - // a unit's been dropped on this subsection, - // figure out where it came from and where it slots in. - _handleReorder(event, ui, 'subsection-id', 'li:.leaf'); -} - -function onSubsectionReordered(event, ui) { - // a subsection has been dropped on this section, - // figure out where it came from and where it slots in. - _handleReorder(event, ui, 'section-id', 'li:.branch'); -} - -function onSectionReordered(event, ui) { - // a section moved w/in the overall (cannot change course via this, so no parentage change possible, just order) - _handleReorder(event, ui, 'course-id', '.courseware-section'); -} - -function _handleReorder(event, ui, parentIdField, childrenSelector) { - // figure out where it came from and where it slots in. - var subsection_id = $(event.target).data(parentIdField); - var _els = $(event.target).children(childrenSelector); - var children = _els.map(function(idx, el) { return $(el).data('id'); }).get(); - // if new to this parent, figure out which parent to remove it from and do so - if (!_.contains(children, ui.draggable.data('id'))) { - var old_parent = ui.draggable.parent(); - var old_children = old_parent.children(childrenSelector).map(function(idx, el) { return $(el).data('id'); }).get(); - old_children = _.without(old_children, ui.draggable.data('id')); - $.ajax({ - url: "/save_item", - type: "POST", - dataType: "json", - contentType: "application/json", - data:JSON.stringify({ 'id' : old_parent.data(parentIdField), 'children' : old_children}) - }); - } - else { - // staying in same parent - // remove so that the replacement in the right place doesn't double it - children = _.without(children, ui.draggable.data('id')); - } - // add to this parent (figure out where) - for (var i = 0; i < _els.length; i++) { - if (!ui.draggable.is(_els[i]) && ui.offset.top < $(_els[i]).offset().top) { - // insert at i in children and _els - ui.draggable.insertBefore($(_els[i])); - // TODO figure out correct way to have it remove the style: top:n; setting (and similar line below) - ui.draggable.attr("style", "position:relative;"); - children.splice(i, 0, ui.draggable.data('id')); - break; - } - } - // see if it goes at end (the above loop didn't insert it) - if (!_.contains(children, ui.draggable.data('id'))) { - $(event.target).append(ui.draggable); - ui.draggable.attr("style", "position:relative;"); // STYLE hack too - children.push(ui.draggable.data('id')); - } - $.ajax({ - url: "/save_item", - type: "POST", - dataType: "json", - contentType: "application/json", - data:JSON.stringify({ 'id' : subsection_id, 'children' : children}) - }); - -} - function getEdxTimeFromDateTimeVals(date_val, time_val, format) { var edxTimeStr = null; diff --git a/cms/static/js/views/overview.js b/cms/static/js/views/overview.js new file mode 100644 index 0000000000..8cbae177a8 --- /dev/null +++ b/cms/static/js/views/overview.js @@ -0,0 +1,231 @@ +$(document).ready(function() { + // making the unit list draggable. Note: sortable didn't work b/c it considered + // drop points which the user hovered over as destinations and proactively changed + // the dom; so, if the user subsequently dropped at an illegal spot, the reversion + // point was the last dom change. + $('.unit').draggable({ + axis: 'y', + handle: '.drag-handle', + zIndex: 999, + start: initiateHesitate, + // left 2nd arg in as inert selector b/c i was uncertain whether we'd try to get the shove up/down + // to work in the future + drag: generateCheckHoverState('.collapsed', ''), + stop: removeHesitate, + revert: "invalid" + }); + + // Subsection reordering + $('.id-holder').draggable({ + axis: 'y', + handle: '.section-item .drag-handle', + zIndex: 999, + start: initiateHesitate, + drag: generateCheckHoverState('.courseware-section.collapsed', ''), + stop: removeHesitate, + revert: "invalid" + }); + + // Section reordering + $('.courseware-section').draggable({ + axis: 'y', + handle: 'header .drag-handle', + stack: '.courseware-section', + revert: "invalid" + }); + + + $('.sortable-unit-list').droppable({ + accept : '.unit', + greedy: true, + tolerance: "pointer", + hoverClass: "dropover", + drop: onUnitReordered + }); + $('.subsection-list > ol').droppable({ + // why don't we have a more useful class for subsections than id-holder? + accept : '.id-holder', // '.unit, .id-holder', + tolerance: "pointer", + hoverClass: "dropover", + drop: onSubsectionReordered, + greedy: true + }); + + // Section reordering + $('.courseware-overview').droppable({ + accept : '.courseware-section', + tolerance: "pointer", + drop: onSectionReordered, + greedy: true + }); + +}); + +CMS.HesitateEvent.toggleXpandHesitation = null; +function initiateHesitate(event, ui) { + CMS.HesitateEvent.toggleXpandHesitation = new CMS.HesitateEvent(expandSection, 'dragLeave', true); + $('.collapsed').on('dragEnter', CMS.HesitateEvent.toggleXpandHesitation, CMS.HesitateEvent.toggleXpandHesitation.trigger); + $('.collapsed, .unit, .id-holder').each(function() { + this.proportions = {width : this.offsetWidth, height : this.offsetHeight }; + // reset b/c these were holding values from aborts + this.isover = false; + }); +} + +function computeIntersection(droppable, uiHelper, y) { + /* + * Test whether y falls within the bounds of the droppable on the Y axis + */ + // NOTE: this only judges y axis intersection b/c that's all we're doing right now + // don't expand the thing being carried + if (uiHelper.is(droppable)) { + return null; + } + + $.extend(droppable, {offset : $(droppable).offset()}); + + var t = droppable.offset.top, + b = t + droppable.proportions.height; + + if (t === b) { + // probably wrong values b/c invisible at the time of caching + droppable.proportions = { width : droppable.offsetWidth, height : droppable.offsetHeight }; + b = t + droppable.proportions.height; + } + // equivalent to the intersects test + return (t < y && // Bottom Half + y < b ); // Top Half +} + +// NOTE: selectorsToShove is not currently being used but I left this code as it did work but not well +function generateCheckHoverState(selectorsToOpen, selectorsToShove) { + return function(event, ui) { + // copied from jquery.ui.droppable.js $.ui.ddmanager.drag & other ui.intersect + var draggable = $(this).data("ui-draggable"), + centerY = (draggable.positionAbs || draggable.position.absolute).top + (draggable.helperProportions.height / 2); + $(selectorsToOpen).each(function() { + var intersects = computeIntersection(this, ui.helper, centerY), + c = !intersects && this.isover ? "isout" : (intersects && !this.isover ? "isover" : null); + + if(!c) { + return; + } + + this[c] = true; + this[c === "isout" ? "isover" : "isout"] = false; + $(this).trigger(c === "isover" ? "dragEnter" : "dragLeave"); + }); + + $(selectorsToShove).each(function() { + var intersectsBottom = computeIntersection(this, ui.helper, (draggable.positionAbs || draggable.position.absolute).top); + + if ($(this).hasClass('ui-dragging-pushup')) { + if (!intersectsBottom) { + console.log('not up', $(this).data('id')); + $(this).removeClass('ui-dragging-pushup'); + } + } + else if (intersectsBottom) { + console.log('up', $(this).data('id')); + $(this).addClass('ui-dragging-pushup'); + } + + var intersectsTop = computeIntersection(this, ui.helper, + (draggable.positionAbs || draggable.position.absolute).top + draggable.helperProportions.height); + + if ($(this).hasClass('ui-dragging-pushdown')) { + if (!intersectsTop) { + console.log('not down', $(this).data('id')); + $(this).removeClass('ui-dragging-pushdown'); + } + } + else if (intersectsTop) { + console.log('down', $(this).data('id')); + $(this).addClass('ui-dragging-pushdown'); + } + + }); + } +} + +function removeHesitate(event, ui) { + $('.collapsed').off('dragEnter', CMS.HesitateEvent.toggleXpandHesitation.trigger); + $('.ui-dragging-pushdown').removeClass('ui-dragging-pushdown'); + $('.ui-dragging-pushup').removeClass('ui-dragging-pushup'); + CMS.HesitateEvent.toggleXpandHesitation = null; +} + +function expandSection(event) { + $(event.delegateTarget).removeClass('collapsed', 400); + // don't descend to icon's on children (which aren't under first child) only to this element's icon + $(event.delegateTarget).children().first().find('.expand-collapse-icon').removeClass('expand', 400).addClass('collapse'); +} + +function onUnitReordered(event, ui) { + // a unit's been dropped on this subsection, + // figure out where it came from and where it slots in. + _handleReorder(event, ui, 'subsection-id', 'li:.leaf'); +} + +function onSubsectionReordered(event, ui) { + // a subsection has been dropped on this section, + // figure out where it came from and where it slots in. + _handleReorder(event, ui, 'section-id', 'li:.branch'); +} + +function onSectionReordered(event, ui) { + // a section moved w/in the overall (cannot change course via this, so no parentage change possible, just order) + _handleReorder(event, ui, 'course-id', '.courseware-section'); +} + +function _handleReorder(event, ui, parentIdField, childrenSelector) { + // figure out where it came from and where it slots in. + var subsection_id = $(event.target).data(parentIdField); + var _els = $(event.target).children(childrenSelector); + var children = _els.map(function(idx, el) { return $(el).data('id'); }).get(); + // if new to this parent, figure out which parent to remove it from and do so + if (!_.contains(children, ui.draggable.data('id'))) { + var old_parent = ui.draggable.parent(); + var old_children = old_parent.children(childrenSelector).map(function(idx, el) { return $(el).data('id'); }).get(); + old_children = _.without(old_children, ui.draggable.data('id')); + $.ajax({ + url: "/save_item", + type: "POST", + dataType: "json", + contentType: "application/json", + data:JSON.stringify({ 'id' : old_parent.data(parentIdField), 'children' : old_children}) + }); + } + else { + // staying in same parent + // remove so that the replacement in the right place doesn't double it + children = _.without(children, ui.draggable.data('id')); + } + // add to this parent (figure out where) + for (var i = 0; i < _els.length; i++) { + if (!ui.draggable.is(_els[i]) && ui.offset.top < $(_els[i]).offset().top) { + // insert at i in children and _els + ui.draggable.insertBefore($(_els[i])); + // TODO figure out correct way to have it remove the style: top:n; setting (and similar line below) + ui.draggable.attr("style", "position:relative;"); + children.splice(i, 0, ui.draggable.data('id')); + break; + } + } + // see if it goes at end (the above loop didn't insert it) + if (!_.contains(children, ui.draggable.data('id'))) { + $(event.target).append(ui.draggable); + ui.draggable.attr("style", "position:relative;"); // STYLE hack too + children.push(ui.draggable.data('id')); + } + $.ajax({ + url: "/save_item", + type: "POST", + dataType: "json", + contentType: "application/json", + data:JSON.stringify({ 'id' : subsection_id, 'children' : children}) + }); + +} + + diff --git a/cms/static/sass/_courseware.scss b/cms/static/sass/_courseware.scss index 4ea110f4c8..f2bd25c601 100644 --- a/cms/static/sass/_courseware.scss +++ b/cms/static/sass/_courseware.scss @@ -1,90 +1,90 @@ input.courseware-unit-search-input { - float: left; - width: 260px; - background-color: #fff; + float: left; + width: 260px; + background-color: #fff; } .branch { - .section-item { - @include clearfix(); + .section-item { + @include clearfix(); - .details { - display: block; - float: left; - margin-bottom: 0; - width: 650px; - } + .details { + display: block; + float: left; + margin-bottom: 0; + width: 650px; + } - .gradable-status { - float: right; - position: relative; - top: -4px; - right: 50px; - width: 145px; + .gradable-status { + float: right; + position: relative; + top: -4px; + right: 50px; + width: 145px; - .status-label { - position: absolute; - top: 2px; - right: -5px; - display: none; - width: 110px; - padding: 5px 40px 5px 10px; - @include border-radius(3px); - color: $lightGrey; - text-align: right; - font-size: 12px; - font-weight: bold; - line-height: 16px; - } + .status-label { + position: absolute; + top: 2px; + right: -5px; + display: none; + width: 110px; + padding: 5px 40px 5px 10px; + @include border-radius(3px); + color: $lightGrey; + text-align: right; + font-size: 12px; + font-weight: bold; + line-height: 16px; + } - .menu-toggle { - z-index: 10; - position: absolute; - top: 0; - right: 5px; - padding: 5px; - color: $mediumGrey; + .menu-toggle { + z-index: 10; + position: absolute; + top: 0; + right: 5px; + padding: 5px; + color: $mediumGrey; - &:hover, &.is-active { - color: $blue; - } - } + &:hover, &.is-active { + color: $blue; + } + } - .menu { - z-index: 1; - display: none; - opacity: 0.0; - position: absolute; - top: -1px; - left: 5px; - margin: 0; - padding: 8px 12px; - background: $white; - border: 1px solid $mediumGrey; - font-size: 12px; - @include border-radius(4px); - @include box-shadow(0 1px 2px rgba(0, 0, 0, .2)); - @include transition(opacity .15s); + .menu { + z-index: 1; + display: none; + opacity: 0.0; + position: absolute; + top: -1px; + left: 5px; + margin: 0; + padding: 8px 12px; + background: $white; + border: 1px solid $mediumGrey; + font-size: 12px; + @include border-radius(4px); + @include box-shadow(0 1px 2px rgba(0, 0, 0, .2)); + @include transition(opacity .15s); - li { - width: 115px; - margin-bottom: 3px; - padding-bottom: 3px; - border-bottom: 1px solid $lightGrey; + li { + width: 115px; + margin-bottom: 3px; + padding-bottom: 3px; + border-bottom: 1px solid $lightGrey; - &:last-child { - margin-bottom: 0; - padding-bottom: 0; - border: none; + &:last-child { + margin-bottom: 0; + padding-bottom: 0; + border: none; - a { - color: $darkGrey; - } - } - } + a { + color: $darkGrey; + } + } + } a { color: $blue; @@ -127,262 +127,262 @@ input.courseware-unit-search-input { .courseware-section { - position: relative; - background: #fff; - border-radius: 3px; - border: 1px solid $mediumGrey; - margin-top: 15px; - padding-bottom: 12px; - @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.1)); + position: relative; + background: #fff; + border-radius: 3px; + border: 1px solid $mediumGrey; + margin-top: 15px; + padding-bottom: 12px; + @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.1)); - &:first-child { - margin-top: 0; - } + &:first-child { + margin-top: 0; + } - &.collapsed { - padding-bottom: 0; - } + &.collapsed { + padding-bottom: 0; + } - label { - float: left; - line-height: 29px; - } + label { + float: left; + line-height: 29px; + } - .datepair { - float: left; - margin-left: 10px; - } + .datepair { + float: left; + margin-left: 10px; + } - .section-published-date { - position: absolute; - top: 19px; - right: 90px; - padding: 4px 10px; - border-radius: 3px; - background: $lightGrey; - text-align: right; + .section-published-date { + position: absolute; + top: 19px; + right: 90px; + padding: 4px 10px; + border-radius: 3px; + background: $lightGrey; + text-align: right; - .published-status { - font-size: 12px; - margin-right: 15px; + .published-status { + font-size: 12px; + margin-right: 15px; - strong { - font-weight: bold; - } - } + strong { + font-weight: bold; + } + } - .schedule-button { - @include blue-button; - } + .schedule-button { + @include blue-button; + } - .edit-button { - @include blue-button; - } + .edit-button { + @include blue-button; + } - .schedule-button, - .edit-button { - font-size: 11px; - padding: 3px 15px 5px; - } - } + .schedule-button, + .edit-button { + font-size: 11px; + padding: 3px 15px 5px; + } + } - .datepair .date, - .datepair .time { - padding-left: 0; - padding-right: 0; - border: none; - background: none; - @include box-shadow(none); - font-size: 13px; - font-weight: bold; - color: $blue; - cursor: pointer; - } + .datepair .date, + .datepair .time { + padding-left: 0; + padding-right: 0; + border: none; + background: none; + @include box-shadow(none); + font-size: 13px; + font-weight: bold; + color: $blue; + cursor: pointer; + } - .datepair .date { - width: 80px; - } + .datepair .date { + width: 80px; + } - .datepair .time { - width: 65px; - } + .datepair .time { + width: 65px; + } - &.collapsed .subsection-list, - .collapsed .subsection-list, - .collapsed > ol { - display: none !important; - } + &.collapsed .subsection-list, + .collapsed .subsection-list, + .collapsed > ol { + display: none !important; + } - header { - min-height: 75px; - @include clearfix(); + header { + min-height: 75px; + @include clearfix(); - .item-details, .section-published-date { + .item-details, .section-published-date { - } + } - .item-details { - display: inline-block; - padding: 20px 0 10px 0; - @include clearfix(); + .item-details { + display: inline-block; + padding: 20px 0 10px 0; + @include clearfix(); - .section-name { - float: left; - margin-right: 10px; - width: 350px; - font-size: 19px; - font-weight: bold; - color: $blue; - } + .section-name { + float: left; + margin-right: 10px; + width: 350px; + font-size: 19px; + font-weight: bold; + color: $blue; + } - .section-name-span { - cursor: pointer; - @include transition(color .15s); + .section-name-span { + cursor: pointer; + @include transition(color .15s); - &:hover { - color: $orange; - } - } + &:hover { + color: $orange; + } + } - .section-name-edit { - position: relative; - width: 400px; - background: $white; + .section-name-edit { + position: relative; + width: 400px; + background: $white; - input { - font-size: 16px; - } - - .save-button { - @include blue-button; - padding: 7px 20px 7px; - margin-right: 5px; - } + input { + font-size: 16px; + } + + .save-button { + @include blue-button; + padding: 7px 20px 7px; + margin-right: 5px; + } - .cancel-button { - @include white-button; - padding: 7px 20px 7px; - } - } + .cancel-button { + @include white-button; + padding: 7px 20px 7px; + } + } - .section-published-date { - float: right; - width: 265px; - margin-right: 220px; - @include border-radius(3px); - background: $lightGrey; + .section-published-date { + float: right; + width: 265px; + margin-right: 220px; + @include border-radius(3px); + background: $lightGrey; - .published-status { - font-size: 12px; - margin-right: 15px; + .published-status { + font-size: 12px; + margin-right: 15px; - strong { - font-weight: bold; - } - } + strong { + font-weight: bold; + } + } - .schedule-button { - @include blue-button; - } + .schedule-button { + @include blue-button; + } - .edit-button { - @include blue-button; - } + .edit-button { + @include blue-button; + } - .schedule-button, - .edit-button { - font-size: 11px; - padding: 3px 15px 5px; - - } - } + .schedule-button, + .edit-button { + font-size: 11px; + padding: 3px 15px 5px; + + } + } - .gradable-status { - position: absolute; - top: 20px; - right: 70px; - width: 145px; + .gradable-status { + position: absolute; + top: 20px; + right: 70px; + width: 145px; - .status-label { - position: absolute; - top: 0; - right: 2px; - display: none; - width: 100px; - padding: 10px 35px 10px 10px; - @include border-radius(3px); - background: $lightGrey; - color: $lightGrey; - text-align: right; - font-size: 12px; - font-weight: bold; - line-height: 16px; - } + .status-label { + position: absolute; + top: 0; + right: 2px; + display: none; + width: 100px; + padding: 10px 35px 10px 10px; + @include border-radius(3px); + background: $lightGrey; + color: $lightGrey; + text-align: right; + font-size: 12px; + font-weight: bold; + line-height: 16px; + } - .menu-toggle { - z-index: 10; - position: absolute; - top: 2px; - right: 5px; - padding: 5px; - color: $lightGrey; + .menu-toggle { + z-index: 10; + position: absolute; + top: 2px; + right: 5px; + padding: 5px; + color: $lightGrey; - &:hover, &.is-active { - color: $blue; - } - } + &:hover, &.is-active { + color: $blue; + } + } - .menu { - z-index: 1; - display: none; - opacity: 0.0; - position: absolute; - top: -1px; - left: 2px; - margin: 0; - padding: 8px 12px; - background: $white; - border: 1px solid $mediumGrey; - font-size: 12px; - @include border-radius(4px); - @include box-shadow(0 1px 2px rgba(0, 0, 0, .2)); - @include transition(opacity .15s); - @include transition(display .15s); + .menu { + z-index: 1; + display: none; + opacity: 0.0; + position: absolute; + top: -1px; + left: 2px; + margin: 0; + padding: 8px 12px; + background: $white; + border: 1px solid $mediumGrey; + font-size: 12px; + @include border-radius(4px); + @include box-shadow(0 1px 2px rgba(0, 0, 0, .2)); + @include transition(opacity .15s); + @include transition(display .15s); - li { - width: 115px; - margin-bottom: 3px; - padding-bottom: 3px; - border-bottom: 1px solid $lightGrey; + li { + width: 115px; + margin-bottom: 3px; + padding-bottom: 3px; + border-bottom: 1px solid $lightGrey; - &:last-child { - margin-bottom: 0; - padding-bottom: 0; - border: none; + &:last-child { + margin-bottom: 0; + padding-bottom: 0; + border: none; - a { - color: $darkGrey; - } - } - } + a { + color: $darkGrey; + } + } + } - a { + a { - &.is-selected { - font-weight: bold; - } - } - } + &.is-selected { + font-weight: bold; + } + } + } - // dropdown state - &.is-active { + // dropdown state + &.is-active { - .menu { - z-index: 1000; - display: block; - opacity: 1.0; - } + .menu { + z-index: 1000; + display: block; + opacity: 1.0; + } .menu-toggle { @@ -408,256 +408,272 @@ input.courseware-unit-search-input { } } - .item-actions { - margin-top: 21px; - margin-right: 12px; + .item-actions { + margin-top: 21px; + margin-right: 12px; - .edit-button, - .delete-button { - margin-top: -3px; - } - } + .edit-button, + .delete-button { + margin-top: -3px; + } + } - .expand-collapse-icon { - float: left; - margin: 29px 6px 16px 16px; - @include transition(none); + .expand-collapse-icon { + float: left; + margin: 29px 6px 16px 16px; + @include transition(none); - &.expand { - background-position: 0 0; - } + &.expand { + background-position: 0 0; + } - &.collapsed { - - } - } + &.collapsed { + + } + } - .drag-handle { - margin-left: 11px; - } - } + .drag-handle { + margin-left: 11px; + } + } - h3 { - font-size: 19px; - font-weight: 700; - color: $blue; - } + h3 { + font-size: 19px; + font-weight: 700; + color: $blue; + } - .section-name-span { - cursor: pointer; - @include transition(color .15s); + .section-name-span { + cursor: pointer; + @include transition(color .15s); - &:hover { - color: $orange; - } - } + &:hover { + color: $orange; + } + } - .section-name-form { - margin-bottom: 15px; - } + .section-name-form { + margin-bottom: 15px; + } - .section-name-edit { - input { - font-size: 16px; - } - - .save-button { - @include blue-button; - padding: 7px 20px 7px; - margin-right: 5px; - } + .section-name-edit { + input { + font-size: 16px; + } + + .save-button { + @include blue-button; + padding: 7px 20px 7px; + margin-right: 5px; + } - .cancel-button { - @include white-button; - padding: 7px 20px 7px; - } - } + .cancel-button { + @include white-button; + padding: 7px 20px 7px; + } + } - h4 { - font-size: 12px; - color: #878e9d; + h4 { + font-size: 12px; + color: #878e9d; - strong { - font-weight: bold; - } - } + strong { + font-weight: bold; + } + } - .list-header { - @include linear-gradient(top, transparent, rgba(0, 0, 0, .1)); - background-color: #ced2db; - border-radius: 3px 3px 0 0; - } + .list-header { + @include linear-gradient(top, transparent, rgba(0, 0, 0, .1)); + background-color: #ced2db; + border-radius: 3px 3px 0 0; + } - .subsection-list { - margin: 0 12px; + .subsection-list { + margin: 0 12px; - > ol { - @include tree-view; - border-top-width: 0; - } - } + > ol { + @include tree-view; + border-top-width: 0; + } + } - &.new-section { - header { - height: auto; - @include clearfix(); - } + &.new-section { + header { + height: auto; + @include clearfix(); + } - .expand-collapse-icon { - visibility: hidden; - } - } + .expand-collapse-icon { + visibility: hidden; + } + } } .toggle-button-sections { - display: none; - position: relative; - float: right; - margin-top: 10px; + display: none; + position: relative; + float: right; + margin-top: 10px; - font-size: 13px; - color: $darkGrey; + font-size: 13px; + color: $darkGrey; - &.is-shown { - display: block; - } + &.is-shown { + display: block; + } - .ss-icon { - @include border-radius(20px); - position: relative; - top: -1px; - display: inline-block; - margin-right: 2px; - line-height: 5px; - font-size: 11px; - } + .ss-icon { + @include border-radius(20px); + position: relative; + top: -1px; + display: inline-block; + margin-right: 2px; + line-height: 5px; + font-size: 11px; + } - .label { - display: inline-block; - } + .label { + display: inline-block; + } } .new-section-name, .new-subsection-name-input { - width: 515px; + width: 515px; } .new-section-name-save, .new-subsection-name-save { - @include blue-button; - padding: 4px 20px 7px; - margin: 0 5px; - color: #fff !important; + @include blue-button; + padding: 4px 20px 7px; + margin: 0 5px; + color: #fff !important; } .new-section-name-cancel, .new-subsection-name-cancel { - @include white-button; - padding: 4px 20px 7px; - color: #8891a1 !important; + @include white-button; + padding: 4px 20px 7px; + color: #8891a1 !important; } .dummy-calendar { - display: none; - position: absolute; - top: 55px; - left: 110px; - z-index: 9999; - border: 1px solid #3C3C3C; - @include box-shadow(0 1px 15px rgba(0, 0, 0, .2)); + display: none; + position: absolute; + top: 55px; + left: 110px; + z-index: 9999; + border: 1px solid #3C3C3C; + @include box-shadow(0 1px 15px rgba(0, 0, 0, .2)); } .unit-name-input { - padding: 20px 40px; + padding: 20px 40px; - label { - display: block; - } + label { + display: block; + } - input { - width: 100%; - font-size: 20px; - } + input { + width: 100%; + font-size: 20px; + } } .preview { - background: url(../img/preview.jpg) center top no-repeat; + background: url(../img/preview.jpg) center top no-repeat; } .edit-subsection-publish-settings { - display: none; - position: fixed; - top: 100px; - left: 50%; - z-index: 99999; - width: 600px; - margin-left: -300px; - background: #fff; - text-align: center; + display: none; + position: fixed; + top: 100px; + left: 50%; + z-index: 99999; + width: 600px; + margin-left: -300px; + background: #fff; + text-align: center; - .settings { - padding: 40px; - } + .settings { + padding: 40px; + } - h3 { - font-size: 34px; - font-weight: 300; - } + h3 { + font-size: 34px; + font-weight: 300; + } - .picker { - margin: 30px 0 65px; - } + .picker { + margin: 30px 0 65px; + } - .description { - margin-top: 30px; - font-size: 14px; - line-height: 20px; - } + .description { + margin-top: 30px; + font-size: 14px; + line-height: 20px; + } - strong { - font-weight: 700; - } + strong { + font-weight: 700; + } - .start-date, - .start-time { - font-size: 19px; - } + .start-date, + .start-time { + font-size: 19px; + } - .save-button { - @include blue-button; - margin-right: 10px; - } + .save-button { + @include blue-button; + margin-right: 10px; + } - .cancel-button { - @include white-button; - } + .cancel-button { + @include white-button; + } - .save-button, - .cancel-button { - font-size: 16px; - } + .save-button, + .cancel-button { + font-size: 16px; + } } .collapse-all-button { - float: right; - margin-top: 10px; - font-size: 13px; - color: $darkGrey; + float: right; + margin-top: 10px; + font-size: 13px; + color: $darkGrey; } // sort/drag and drop .ui-droppable { - min-height: 20px; + @include transition (padding 0.5s ease-in-out 0s); + min-height: 20px; + padding: 0; - &.dropover { - padding-top: 10px; - padding-bottom: 10px; - } + &.dropover { + padding: 15px 0; + } +} + +.ui-draggable-dragging { + @include box-shadow(0 1px 2px rgba(0, 0, 0, .3)); + border: 1px solid $darkGrey; + opacity : 0.2; + &:hover { + opacity : 1.0; + .section-item { + background: $yellow !important; + } + } + + // hiding unit button - temporary fix until this semantically corrected + .new-unit-item { + display: none; + } } ol.ui-droppable .branch:first-child .section-item { - border-top: none; + border-top: none; } - - diff --git a/cms/static/sass/_unit.scss b/cms/static/sass/_unit.scss index d8ca1117e9..bdc76c811c 100644 --- a/cms/static/sass/_unit.scss +++ b/cms/static/sass/_unit.scss @@ -305,6 +305,7 @@ .wrapper-component-editor { z-index: 9999; position: relative; + background: $lightBluishGrey2; } .component-editor { diff --git a/cms/templates/overview.html b/cms/templates/overview.html index a20531200e..20ddcead01 100644 --- a/cms/templates/overview.html +++ b/cms/templates/overview.html @@ -18,6 +18,7 @@ +