\ 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 @@
+
+
+
+
+
+
+