diff --git a/cms/djangoapps/contentstore/utils.py b/cms/djangoapps/contentstore/utils.py index fe1a64f5cf..582123b78f 100644 --- a/cms/djangoapps/contentstore/utils.py +++ b/cms/djangoapps/contentstore/utils.py @@ -1,7 +1,6 @@ from django.conf import settings from xmodule.modulestore import Location from xmodule.modulestore.django import modulestore -from xmodule.modulestore.draft import DRAFT from xmodule.modulestore.exceptions import ItemNotFoundError @@ -35,13 +34,14 @@ def get_course_location_for_item(location): return location -def get_lms_link_for_item(location): +def get_lms_link_for_item(location, preview=False): location = Location(location) if settings.LMS_BASE is not None: - lms_link = "{lms_base}/courses/{course_id}/jump_to/{location}".format( + lms_link = "//{preview}{lms_base}/courses/{course_id}/jump_to/{location}".format( + preview='preview.' if preview else '', lms_base=settings.LMS_BASE, # TODO: These will need to be changed to point to the particular instance of this problem in the particular course - course_id = modulestore().get_containing_courses(location)[0].id, + course_id=modulestore().get_containing_courses(location)[0].id, location=location, ) else: @@ -77,5 +77,4 @@ def compute_unit_state(unit): def get_date_display(date): - print date, type(date) return date.strftime("%d %B, %Y at %I:%M %p") diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index 78cda2e00c..e5fcd045b2 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -10,6 +10,7 @@ import sys import time import tarfile import shutil +from datetime import datetime from collections import defaultdict from uuid import uuid4 from lxml import etree @@ -191,6 +192,7 @@ def edit_subsection(request, location): break lms_link = get_lms_link_for_item(location) + preview_link = get_lms_link_for_item(location, preview=True) # make sure that location references a 'sequential', otherwise return BadRequest if item.location.category != 'sequential': @@ -217,7 +219,8 @@ def edit_subsection(request, location): 'context_course': course, 'create_new_unit_template': Location('i4x', 'edx', 'templates', 'vertical', 'Empty'), 'lms_link': lms_link, - 'parent_item' : parent, + 'preview_link': preview_link, + 'parent_item': parent, 'policy_metadata' : policy_metadata }) @@ -243,8 +246,8 @@ def edit_unit(request, location): course.location.course == item.location.course): break - # The non-draft location - lms_link = get_lms_link_for_item(item.location._replace(revision=None)) + 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) @@ -285,9 +288,10 @@ def edit_unit(request, location): 'unit_location': location, 'components': components, 'component_templates': component_templates, - 'draft_preview_link': lms_link, + 'draft_preview_link': preview_lms_link, 'published_preview_link': lms_link, 'subsection': containing_subsection, + 'release_date': get_date_display(datetime.fromtimestamp(time.mktime(containing_subsection.start))) if containing_subsection.start is not None else 'Unset', 'section': containing_section, 'create_new_unit_template': Location('i4x', 'edx', 'templates', 'vertical', 'Empty'), 'unit_state': unit_state, @@ -527,13 +531,15 @@ def save_item(request): if not has_access(request.user, item_location): raise PermissionDenied() + store = _modulestore(Location(item_location)); + if request.POST['data']: data = request.POST['data'] - modulestore().update_item(item_location, data) + store.update_item(item_location, data) if request.POST['children']: children = request.POST['children'] - modulestore().update_children(item_location, children) + store.update_children(item_location, children) # cdodge: also commit any metadata which might have been passed along in the # POST from the client, if it is there @@ -563,7 +569,7 @@ def save_item(request): existing_item.metadata.update(posted_metadata) # commit to datastore - modulestore().update_metadata(item_location, existing_item.metadata) + store.update_metadata(item_location, existing_item.metadata) return HttpResponse() diff --git a/cms/envs/dev.py b/cms/envs/dev.py index faf7dc8886..e29ee62e20 100644 --- a/cms/envs/dev.py +++ b/cms/envs/dev.py @@ -53,7 +53,7 @@ DATABASES = { } } -LMS_BASE = "http://localhost:8000" +LMS_BASE = "localhost:8000" REPOS = { 'edx4edx': { diff --git a/cms/static/js/base.js b/cms/static/js/base.js index 7448a0e151..025cd6da14 100644 --- a/cms/static/js/base.js +++ b/cms/static/js/base.js @@ -32,9 +32,11 @@ $(document).ready(function() { $('.save-subsection').bind('click', saveSubsection); // making the unit list sortable - $('.sortable-unit-list').sortable(); - $('.sortable-unit-list').disableSelection(); - $('.sortable-unit-list').bind('sortstop', onUnitReordered); + $('.sortable-unit-list').sortable({ + axis: 'y', + handle: '.drag-handle', + update: onUnitReordered + }); // expand/collapse methods for optional date setters $('.set-date').bind('click', showDateSetter); @@ -59,7 +61,22 @@ $(document).ready(function() { $('.import .file-input').click(); }); + // Subsection reordering + $('.unit-list ol').sortable({ + axis: 'y', + handle: '.section-item .drag-handle', + update: onSubsectionReordered + }); + + // Section reordering + $('.courseware-overview').sortable({ + axis: 'y', + handle: 'header .drag-handle', + update: onSectionReordered + }); + $('.new-course-button').bind('click', addNewCourse); + }); function showImportSubmit(e) { @@ -113,12 +130,7 @@ function onUnitReordered() { var subsection_id = $(this).data('subsection-id'); var _els = $(this).children('li:.leaf'); - - var children = new Array(); - for(var i=0;i<_els.length;i++) { - el = _els[i]; - children[i] = $(el).data('id'); - } + var children = _els.map(function(idx, el) { return $(el).data('id'); }).get(); // call into server to commit the new order $.ajax({ @@ -130,6 +142,38 @@ function onUnitReordered() { }); } +function onSubsectionReordered() { + var section_id = $(this).data('section-id'); + + var _els = $(this).children('li:.branch'); + var children = _els.map(function(idx, el) { return $(el).data('id'); }).get(); + + // call into server to commit the new order + $.ajax({ + url: "/save_item", + type: "POST", + dataType: "json", + contentType: "application/json", + data:JSON.stringify({ 'id' : section_id, 'metadata' : null, 'data': null, 'children' : children}) + }); +} + +function onSectionReordered() { + var course_id = $(this).data('course-id'); + + var _els = $(this).children('section:.branch'); + var children = _els.map(function(idx, el) { return $(el).data('id'); }).get(); + + // call into server to commit the new order + $.ajax({ + url: "/save_item", + type: "POST", + dataType: "json", + contentType: "application/json", + data:JSON.stringify({ 'id' : course_id, 'metadata' : null, 'data': null, 'children' : children}) + }); +} + function getEdxTimeFromDateTimeInputs(date_id, time_id, format) { var input_date = $('#'+date_id).val(); var input_time = $('#'+time_id).val(); @@ -309,7 +353,7 @@ function hideModal(e) { function onKeyUp(e) { if(e.which == 87) { - $body.toggleClass('show-wip'); + $body.toggleClass('show-wip hide-wip'); } } diff --git a/cms/static/sass/_base.scss b/cms/static/sass/_base.scss index 69b51b727e..c1875edb06 100644 --- a/cms/static/sass/_base.scss +++ b/cms/static/sass/_base.scss @@ -217,6 +217,12 @@ code { } } +body.hide-wip { + .wip, .wip-box { + display: none !important; + } +} + body.show-wip { .wip { outline: 1px solid #f00 !important; diff --git a/cms/static/sass/_unit.scss b/cms/static/sass/_unit.scss index 5eeefaecaa..0b893e1965 100644 --- a/cms/static/sass/_unit.scss +++ b/cms/static/sass/_unit.scss @@ -310,7 +310,7 @@ } } - .preview-button { + .preview-button, .view-button { @include white-button; margin-bottom: 10px; } @@ -325,7 +325,8 @@ .save-button, .preview-button, - .publish-button { + .publish-button, + .view-button { font-size: 11px; margin-top: 10px; padding: 6px 15px 8px; @@ -427,17 +428,15 @@ } .edit-state-draft { - .visibility { + .visibility, + .edit-draft-message, + .view-button { display: none; } .published-alert { display: block; } - - .edit-draft-message { - display: none; - } } .edit-state-public { @@ -446,7 +445,8 @@ .component-actions, .new-component-item, #published-alert, - .publish-draft-message { + .publish-draft-message, + .preview-button { display: none; } @@ -463,7 +463,8 @@ #delete-draft, #publish-draft, #published-alert, - #create-draft, { + #create-draft, + .view-button { display: none; } } diff --git a/cms/templates/base.html b/cms/templates/base.html index 6b53666d3f..ba91b2f400 100644 --- a/cms/templates/base.html +++ b/cms/templates/base.html @@ -17,7 +17,7 @@ <%block name="header_extras"> - + <%include file="widgets/header.html" args="active_tab=active_tab"/> <%include file="courseware_vendor_js.html"/> diff --git a/cms/templates/edit_subsection.html b/cms/templates/edit_subsection.html index ec5adc770a..15753e9720 100644 --- a/cms/templates/edit_subsection.html +++ b/cms/templates/edit_subsection.html @@ -19,31 +19,31 @@
-
- - -
-
- - -
-
- - ${units.enum_units(subsection)} -
-
- -
    - % for policy_name in policy_metadata.keys(): -
  1. - -
  2. - % endfor +
    + + +
    +
    + + +
    +
    + + ${units.enum_units(subsection)} +
    +
    + +
      + % for policy_name in policy_metadata.keys(): +
    1. + +
    2. + % endfor New Policy Data -
    -
    +
+
@@ -51,46 +51,52 @@
- + New User
diff --git a/cms/templates/overview.html b/cms/templates/overview.html index eb114b785f..9739f4c1a2 100644 --- a/cms/templates/overview.html +++ b/cms/templates/overview.html @@ -46,7 +46,7 @@

Courseware

-
+
- +
@@ -67,7 +67,7 @@ New Subsection
-
    +
      % for subsection in section.get_children():