diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index 956f9c1695..622d29772b 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -158,11 +158,19 @@ def edit_subsection(request, location): # this should blow up if we don't find any parents, which would be erroneous parent = modulestore().get_item(parent_locs[0]) + # remove all metadata from the generic dictionary that is presented in a more normalized UI + + policy_metadata = dict((key,value) for key, value in item.metadata.iteritems() + if key not in ['display_name', 'start', 'due', 'format'] and key not in item.system_metadata_fields) + + logging.debug(policy_metadata) + return render_to_response('edit_subsection.html', {'subsection': item, 'create_new_unit_template': Location('i4x', 'edx', 'templates', 'vertical', 'Empty'), 'lms_link': lms_link, - 'parent_item' : parent + 'parent_item' : parent, + 'policy_metadata' : policy_metadata }) @login_required diff --git a/cms/static/js/base.js b/cms/static/js/base.js index 06e8f33c92..13fcda55b1 100644 --- a/cms/static/js/base.js +++ b/cms/static/js/base.js @@ -36,8 +36,31 @@ $(document).ready(function() { $('.set-date').bind('click', showDateSetter); $('.remove-date').bind('click', removeDateSetter); + // add/remove policy metadata button click handlers + $('.add-policy-data').bind('click', addPolicyMetadata); + $('.remove-policy-data').bind('click', removePolicyMetadata); + }); +function addPolicyMetadata(e) { + e.preventDefault(); + var template =$('#add-new-policy-element-template > li'); + var newNode = template.clone(); + var _parent_el = $(this).parent('ol:.policy-list'); + newNode.insertBefore('.add-policy-data'); + $('.remove-policy-data').bind('click', removePolicyMetadata); +} + +function removePolicyMetadata(e) { + e.preventDefault(); + policy_name = $(this).data('policy-name'); + var _parent_el = $(this).parent('li:.policy-list-element'); + //$(_parent_el).remove(); + + _parent_el.appendTo("#policy-to-delete"); +} + + // This method only changes the ordering of the child objects in a subsection function onUnitReordered() { var subsection_id = $(this).data('subsection-id'); @@ -86,7 +109,7 @@ function saveSubsection(e) { var id = $(this).data('id'); - // pull all metadata editable fields on page + // pull all 'normalized' metadata editable fields on page var metadata_fields = $('input[data-metadata-name]'); metadata = {}; @@ -95,6 +118,19 @@ function saveSubsection(e) { metadata[$(el).data("metadata-name")] = el.value; } + // now add 'free-formed' metadata which are presented to the user as dual input fields (name/value) + $('ol.policy-list > li.policy-list-element').each( function(i, element) { + name = $(element).children('.policy-list-name').val(); + val = $(element).children('.policy-list-value').val(); + metadata[name] = val; + }); + + // now add any 'removed' policy metadata which is stored in a separate hidden div + // 'null' presented to the server means 'remove' + $("#policy-to-delete > li.policy-list-element").each(function(i, element) { + name = $(element).children('.policy-list-name').val(); + metadata[name] = null; + }); // Piece back together the date/time UI elements into one date/time string // NOTE: our various "date/time" metadata elements don't always utilize the same formatting string diff --git a/cms/templates/edit_subsection.html b/cms/templates/edit_subsection.html index 2201b06b14..6f2347398b 100644 --- a/cms/templates/edit_subsection.html +++ b/cms/templates/edit_subsection.html @@ -25,7 +25,7 @@