Cleanup, change how we load templates.
This commit is contained in:
@@ -224,7 +224,7 @@ PIPELINE_JS = {
|
||||
) + ['js/hesitate.js', 'js/base.js',
|
||||
'js/models/feedback.js', 'js/views/feedback.js',
|
||||
'js/models/section.js', 'js/views/section.js',
|
||||
'js/models/metadata_model.js'],
|
||||
'js/models/metadata_model.js', 'js/views/metadata_editor_view.js'],
|
||||
'output_filename': 'js/cms-application.js',
|
||||
'test_order': 0
|
||||
},
|
||||
|
||||
35
cms/static/coffee/spec/views/metadata_edit_spec.coffee
Normal file
35
cms/static/coffee/spec/views/metadata_edit_spec.coffee
Normal file
@@ -0,0 +1,35 @@
|
||||
beforeEach ->
|
||||
# TODO: update these
|
||||
setFixtures(sandbox({id: "page-alert"}))
|
||||
appendSetFixtures(sandbox({id: "page-notification"}))
|
||||
|
||||
describe "CMS.Views.Metadata.Editor creates editors for each field", ->
|
||||
beforeEach ->
|
||||
@model = new Backbone.Model({
|
||||
display_name: {
|
||||
default_value: null,
|
||||
display_name: "Display Name",
|
||||
explicitly_set: true,
|
||||
field_name: "display_name",
|
||||
help: "Specifies the name for this component. The name appears as a tooltip in the course ribbon at the top of the page.",
|
||||
inheritable: false,
|
||||
options: [],
|
||||
type: "Generic",
|
||||
value: "Word cloud"
|
||||
},
|
||||
num_inputs: {
|
||||
default_value: 5,
|
||||
display_name: "Inputs",
|
||||
explicitly_set: false,
|
||||
field_name: "num_inputs",
|
||||
help: "Number of text boxes for student to input words/sentences.",
|
||||
inheritable: false,
|
||||
options: {min: 1},
|
||||
type: "Integer",
|
||||
value: 5
|
||||
}
|
||||
})
|
||||
|
||||
it "renders on initalize", ->
|
||||
view = new CMS.Views.Metadata.Editor({model: @model})
|
||||
expect(view.models).toBeDefined()
|
||||
@@ -27,7 +27,7 @@ class CMS.Views.ModuleEdit extends Backbone.View
|
||||
@metadataEditor = new CMS.Views.Metadata.Editor({
|
||||
el: metadataEditor,
|
||||
model: new Backbone.Model(metadataEditor.data('metadata'))
|
||||
});
|
||||
})
|
||||
|
||||
# Need to update set "active" class on data editor if there is one.
|
||||
# If we are only showing settings, hide the data editor controls and update settings accordingly.
|
||||
|
||||
@@ -5,45 +5,44 @@ CMS.Views.Metadata.Editor = Backbone.View.extend({
|
||||
// Model is simply a Backbone.Model instance.
|
||||
|
||||
initialize : function() {
|
||||
var tpl = $("#metadata-editor-tpl").text();
|
||||
if(!tpl) {
|
||||
console.error("Couldn't load metadata editor template");
|
||||
}
|
||||
this.template = _.template(tpl);
|
||||
|
||||
this.$el.html(this.template({metadata_entries: this.model.attributes}));
|
||||
var counter = 0;
|
||||
|
||||
// Sort entries by display name.
|
||||
var sortedObject = _.sortBy(this.model.attributes,
|
||||
function (val) {
|
||||
return val.display_name
|
||||
});
|
||||
|
||||
this.models = [];
|
||||
|
||||
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;
|
||||
|
||||
// Sort entries by display name.
|
||||
var sortedObject = _.sortBy(self.model.attributes,
|
||||
function (val) {
|
||||
return val.display_name
|
||||
});
|
||||
|
||||
self.models = [];
|
||||
|
||||
_.each(sortedObject,
|
||||
function (item) {
|
||||
var model = new CMS.Models.Metadata(item);
|
||||
self.models.push(model);
|
||||
var data = {
|
||||
el: self.$el.find('.metadata_entry')[counter++],
|
||||
model: model
|
||||
};
|
||||
if (item.type === CMS.Models.Metadata.SELECT_TYPE) {
|
||||
new CMS.Views.Metadata.Option(data);
|
||||
}
|
||||
else if (item.type === CMS.Models.Metadata.INTEGER_TYPE ||
|
||||
item.type === CMS.Models.Metadata.FLOAT_TYPE) {
|
||||
new CMS.Views.Metadata.Number(data);
|
||||
}
|
||||
else {
|
||||
// Everything else is treated as GENERIC_TYPE, which uses String editor.
|
||||
new CMS.Views.Metadata.String(data);
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
_.each(sortedObject,
|
||||
function (item) {
|
||||
var model = new CMS.Models.Metadata(item);
|
||||
self.models.push(model);
|
||||
var data = {
|
||||
el: self.$el.find('.metadata_entry')[counter++],
|
||||
model: model
|
||||
};
|
||||
if (item.type === CMS.Models.Metadata.SELECT_TYPE) {
|
||||
new CMS.Views.Metadata.Option(data);
|
||||
}
|
||||
else if (item.type === CMS.Models.Metadata.INTEGER_TYPE ||
|
||||
item.type === CMS.Models.Metadata.FLOAT_TYPE) {
|
||||
new CMS.Views.Metadata.Number(data);
|
||||
}
|
||||
else {
|
||||
// Everything else is treated as GENERIC_TYPE, which uses String editor.
|
||||
new CMS.Views.Metadata.String(data);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
getModifiedMetadataValues: function () {
|
||||
@@ -73,14 +72,14 @@ CMS.Views.Metadata.AbstractEditor = Backbone.View.extend({
|
||||
var self = this;
|
||||
var templateName = this.getTemplateName();
|
||||
this.uniqueId = _.uniqueId(templateName + "_");
|
||||
window.templateLoader.loadRemoteTemplate(templateName,
|
||||
"/static/client_templates/" + templateName + ".html",
|
||||
function (raw_template) {
|
||||
self.template = _.template(raw_template);
|
||||
self.$el.append(self.template({model: self.model, uniqueId: self.uniqueId}));
|
||||
self.render();
|
||||
}
|
||||
);
|
||||
|
||||
var tpl = $("#"+templateName).text();
|
||||
if(!tpl) {
|
||||
console.error("Couldn't load template: " + templateName);
|
||||
}
|
||||
this.template = _.template(tpl);
|
||||
this.$el.append(this.template({model: this.model, uniqueId: this.uniqueId}));
|
||||
this.render();
|
||||
},
|
||||
|
||||
getTemplateName : function () {},
|
||||
@@ -136,7 +135,7 @@ CMS.Views.Metadata.String = CMS.Views.Metadata.AbstractEditor.extend({
|
||||
},
|
||||
|
||||
getTemplateName : function () {
|
||||
return "metadata_string_entry";
|
||||
return "metadata-string-entry";
|
||||
},
|
||||
|
||||
getValueFromEditor : function () {
|
||||
@@ -187,15 +186,18 @@ CMS.Views.Metadata.Number = CMS.Views.Metadata.AbstractEditor.extend({
|
||||
this.$el.find('input').attr(step, stepValue);
|
||||
}
|
||||
|
||||
// Manually runs polyfill for input number types to correct for Firefox non-support
|
||||
this.$el.find('.setting-input-number').inputNumber();
|
||||
// Manually runs polyfill for input number types to correct for Firefox non-support.
|
||||
// inputNumber will be undefined when unit test is running.
|
||||
if ($.fn.inputNumber) {
|
||||
this.$el.find('.setting-input-number').inputNumber();
|
||||
}
|
||||
|
||||
this.initialized = true;
|
||||
}
|
||||
},
|
||||
|
||||
getTemplateName : function () {
|
||||
return "metadata_number_entry";
|
||||
return "metadata-number-entry";
|
||||
},
|
||||
|
||||
getValueFromEditor : function () {
|
||||
@@ -240,7 +242,6 @@ CMS.Views.Metadata.Number = CMS.Views.Metadata.AbstractEditor.extend({
|
||||
|
||||
});
|
||||
|
||||
|
||||
CMS.Views.Metadata.Option = CMS.Views.Metadata.AbstractEditor.extend({
|
||||
|
||||
events : {
|
||||
@@ -249,7 +250,7 @@ CMS.Views.Metadata.Option = CMS.Views.Metadata.AbstractEditor.extend({
|
||||
},
|
||||
|
||||
getTemplateName : function () {
|
||||
return "metadata_option_entry";
|
||||
return "metadata-option-entry";
|
||||
},
|
||||
|
||||
getValueFromEditor : function () {
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
<script type="text/javascript" src="${static.url('js/models/metadata_model.js')}"></script>
|
||||
<script type="text/javascript" src="${static.url('js/views/metadata_editor_view.js')}"></script>
|
||||
<script type="text/javascript" src="${static.url('js/template_loader.js')}"></script>
|
||||
<script src="${static.url('js/vendor/html5-input-polyfills/number-polyfill.js')}"></script>
|
||||
<link rel="stylesheet" type="text/css" href="${static.url('css/vendor/html5-input-polyfills/number-polyfill.css')}" />
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<%! from django.utils.translation import ugettext as _ %>
|
||||
<%namespace name='static' file='../static_content.html'/>
|
||||
|
||||
<%
|
||||
import hashlib
|
||||
@@ -7,6 +8,23 @@
|
||||
hlskey = hashlib.md5(module.location.url()).hexdigest()
|
||||
%>
|
||||
|
||||
## js templates
|
||||
<script id="metadata-editor-tpl" type="text/template">
|
||||
<%static:include path="js/metadata-editor.underscore" />
|
||||
</script>
|
||||
|
||||
<script id="metadata-number-entry" type="text/template">
|
||||
<%static:include path="js/metadata-number-entry.underscore" />
|
||||
</script>
|
||||
|
||||
<script id="metadata-string-entry" type="text/template">
|
||||
<%static:include path="js/metadata-string-entry.underscore" />
|
||||
</script>
|
||||
|
||||
<script id="metadata-option-entry" type="text/template">
|
||||
<%static:include path="js/metadata-option-entry.underscore" />
|
||||
</script>
|
||||
|
||||
<% showHighLevelSource='source_code' in editable_metadata_fields and editable_metadata_fields['source_code']['explicitly_set'] %>
|
||||
<% metadata_field_copy = copy.deepcopy(editable_metadata_fields) %>
|
||||
## Delete 'source_code' field (if it exists) so metadata editor view does not attempt to render it.
|
||||
|
||||
@@ -250,6 +250,6 @@ class CombinedOpenEndedDescriptor(CombinedOpenEndedFields, RawDescriptor):
|
||||
def non_editable_metadata_fields(self):
|
||||
non_editable_fields = super(CombinedOpenEndedDescriptor, self).non_editable_metadata_fields
|
||||
non_editable_fields.extend([CombinedOpenEndedDescriptor.due, CombinedOpenEndedDescriptor.graceperiod,
|
||||
CombinedOpenEndedDescriptor.markdown])
|
||||
CombinedOpenEndedDescriptor.markdown, CombinedOpenEndedDescriptor.version])
|
||||
return non_editable_fields
|
||||
|
||||
|
||||
Reference in New Issue
Block a user