diff --git a/cms/static/client_templates/generic_metadata_entry.html b/cms/static/client_templates/generic_metadata_entry.html new file mode 100644 index 0000000000..ef65c1bf3f --- /dev/null +++ b/cms/static/client_templates/generic_metadata_entry.html @@ -0,0 +1,2 @@ + + diff --git a/cms/static/client_templates/metadata_editor.html b/cms/static/client_templates/metadata_editor.html new file mode 100644 index 0000000000..9fb8cee67b --- /dev/null +++ b/cms/static/client_templates/metadata_editor.html @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/cms/static/coffee/src/views/module_edit.coffee b/cms/static/coffee/src/views/module_edit.coffee index bf56807f66..eeda00638a 100644 --- a/cms/static/coffee/src/views/module_edit.coffee +++ b/cms/static/coffee/src/views/module_edit.coffee @@ -20,29 +20,15 @@ class CMS.Views.ModuleEdit extends Backbone.View loadEdit: -> if not @module @module = XModule.loadModule(@$el.find('.xmodule_edit')) - @originalMetadata = @metadata() - - metadata: -> - # cdodge: package up metadata which is separated into a number of input fields - # there's probably a better way to do this, but at least this lets me continue to move onwards - _metadata = {} - - $metadata = @$component_editor().find('.metadata_edit') - - if $metadata - # walk through the set of elments which have the 'xmetadata_name' attribute and - # build up a object to pass back to the server on the subsequent POST - _metadata[$(el).data("metadata-name")] = el.value for el in $('[data-metadata-name]', $metadata) - - return _metadata + # At this point, metadata-edit.html will be loaded, and the metadata (as JSON) is available. + metadataEditor = @$el.find('.metadata_edit') + @metadataEditor = new CMS.Views.Metadata.Editor({ + el: metadataEditor, + model: new CMS.Models.MetadataEditor(metadataEditor.data('metadata')) + }); changedMetadata: -> - currentMetadata = @metadata() - changedMetadata = {} - for key of currentMetadata - if currentMetadata[key] != @originalMetadata[key] - changedMetadata[key] = currentMetadata[key] - return changedMetadata + return @metadataEditor.getModifiedMetadataValues() cloneTemplate: (parent, template) -> $.post("/clone_item", { diff --git a/cms/static/js/models/metadata_editor.js b/cms/static/js/models/metadata_editor.js new file mode 100644 index 0000000000..334d8aa718 --- /dev/null +++ b/cms/static/js/models/metadata_editor.js @@ -0,0 +1,8 @@ +CMS.Models.MetadataEditor = Backbone.Model.extend({ + // This model class is not suited for restful operations and is considered just a server side initialized container + url: '', + + defaults: { + } + +}); diff --git a/cms/static/js/models/metadata_model.js b/cms/static/js/models/metadata_model.js new file mode 100644 index 0000000000..4349fa7187 --- /dev/null +++ b/cms/static/js/models/metadata_model.js @@ -0,0 +1,13 @@ +CMS.Models.Metadata = Backbone.Model.extend({ + // This model class is not suited for restful operations and is considered just a server side initialized container + url: '', + + defaults: { + "display_name": null, + "value" : null + }, + + getOriginalValue: function() { + return this.get('value'); + } +}); diff --git a/cms/static/js/views/generic_metadata_editor.js b/cms/static/js/views/generic_metadata_editor.js new file mode 100644 index 0000000000..3dc7f1f7e1 --- /dev/null +++ b/cms/static/js/views/generic_metadata_editor.js @@ -0,0 +1,28 @@ +if (!CMS.Views['Metadata']) CMS.Views.Metadata = {}; + +CMS.Views.Metadata.Generic = Backbone.View.extend({ + + // Model class ... + events : { + }, + + initialize : function() { + var self = this; + // instantiates an editor template for each update in the collection + window.templateLoader.loadRemoteTemplate("metadata_entry", + "/static/client_templates/generic_metadata_entry.html", + function (raw_template) { + self.template = _.template(raw_template); + self.$el.append(self.template({model: self.model})); + } + ); + }, + + modified: function () { + return this.getValue() !== this.model.getOriginalValue(); + }, + + getValue: function() { + return this.$el.find('.editor').val(); + } +}); diff --git a/cms/static/js/views/metadata_editor_view.js b/cms/static/js/views/metadata_editor_view.js new file mode 100644 index 0000000000..6c1665d294 --- /dev/null +++ b/cms/static/js/views/metadata_editor_view.js @@ -0,0 +1,44 @@ +if (!CMS.Views['Metadata']) CMS.Views.Metadata = {}; + +CMS.Views.Metadata.Editor = Backbone.View.extend({ + + // Model class is ... + events : { + }, + + views : {}, // child views + + initialize : function() { + var self = this; + // instantiates an editor template for each update in the collection + window.templateLoader.loadRemoteTemplate("metadata_editor", + "/static/client_templates/metadata_editor.html", + function (raw_template) { + self.template = _.template(raw_template); + self.$el.append(self.template({metadata_entries: self.model.attributes})); + var counter = 0; + _.each(self.model.attributes, + function(item, key) { + self.views[key] = new CMS.Views.Metadata.Generic({ + el: self.$el.find('.metadata_entry')[counter], + model: new CMS.Models.Metadata(item) + } + ); + counter+=1; + }); + } + ); + }, + + getModifiedMetadataValues: function () { + var modified_values = {}; + _.each(this.views, + function (item, key) { + if (item.modified()) { + modified_values[key] = item.getValue(); + } + } + ); + return modified_values; + } +}); diff --git a/cms/templates/base.html b/cms/templates/base.html index f1a87d6424..db62c76015 100644 --- a/cms/templates/base.html +++ b/cms/templates/base.html @@ -49,6 +49,13 @@ + + + + + + +