Commit 625c6b51 by cahrens

Cleanup, change how we load templates.

parent f3d4381f
...@@ -224,7 +224,7 @@ PIPELINE_JS = { ...@@ -224,7 +224,7 @@ PIPELINE_JS = {
) + ['js/hesitate.js', 'js/base.js', ) + ['js/hesitate.js', 'js/base.js',
'js/models/feedback.js', 'js/views/feedback.js', 'js/models/feedback.js', 'js/views/feedback.js',
'js/models/section.js', 'js/views/section.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', 'output_filename': 'js/cms-application.js',
'test_order': 0 'test_order': 0
}, },
......
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 ...@@ -27,7 +27,7 @@ class CMS.Views.ModuleEdit extends Backbone.View
@metadataEditor = new CMS.Views.Metadata.Editor({ @metadataEditor = new CMS.Views.Metadata.Editor({
el: metadataEditor, el: metadataEditor,
model: new Backbone.Model(metadataEditor.data('metadata')) model: new Backbone.Model(metadataEditor.data('metadata'))
}); })
# Need to update set "active" class on data editor if there is one. # 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. # 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({ ...@@ -5,45 +5,44 @@ CMS.Views.Metadata.Editor = Backbone.View.extend({
// Model is simply a Backbone.Model instance. // Model is simply a Backbone.Model instance.
initialize : function() { 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; var self = this;
// instantiates an editor template for each update in the collection _.each(sortedObject,
window.templateLoader.loadRemoteTemplate("metadata_editor", function (item) {
"/static/client_templates/metadata_editor.html", var model = new CMS.Models.Metadata(item);
function (raw_template) { self.models.push(model);
self.template = _.template(raw_template); var data = {
self.$el.append(self.template({metadata_entries: self.model.attributes})); el: self.$el.find('.metadata_entry')[counter++],
var counter = 0; model: model
};
// Sort entries by display name. if (item.type === CMS.Models.Metadata.SELECT_TYPE) {
var sortedObject = _.sortBy(self.model.attributes, new CMS.Views.Metadata.Option(data);
function (val) { }
return val.display_name else if (item.type === CMS.Models.Metadata.INTEGER_TYPE ||
}); item.type === CMS.Models.Metadata.FLOAT_TYPE) {
new CMS.Views.Metadata.Number(data);
self.models = []; }
else {
_.each(sortedObject, // Everything else is treated as GENERIC_TYPE, which uses String editor.
function (item) { new CMS.Views.Metadata.String(data);
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 () { getModifiedMetadataValues: function () {
...@@ -73,14 +72,14 @@ CMS.Views.Metadata.AbstractEditor = Backbone.View.extend({ ...@@ -73,14 +72,14 @@ CMS.Views.Metadata.AbstractEditor = Backbone.View.extend({
var self = this; var self = this;
var templateName = this.getTemplateName(); var templateName = this.getTemplateName();
this.uniqueId = _.uniqueId(templateName + "_"); this.uniqueId = _.uniqueId(templateName + "_");
window.templateLoader.loadRemoteTemplate(templateName,
"/static/client_templates/" + templateName + ".html", var tpl = $("#"+templateName).text();
function (raw_template) { if(!tpl) {
self.template = _.template(raw_template); console.error("Couldn't load template: " + templateName);
self.$el.append(self.template({model: self.model, uniqueId: self.uniqueId})); }
self.render(); this.template = _.template(tpl);
} this.$el.append(this.template({model: this.model, uniqueId: this.uniqueId}));
); this.render();
}, },
getTemplateName : function () {}, getTemplateName : function () {},
...@@ -136,7 +135,7 @@ CMS.Views.Metadata.String = CMS.Views.Metadata.AbstractEditor.extend({ ...@@ -136,7 +135,7 @@ CMS.Views.Metadata.String = CMS.Views.Metadata.AbstractEditor.extend({
}, },
getTemplateName : function () { getTemplateName : function () {
return "metadata_string_entry"; return "metadata-string-entry";
}, },
getValueFromEditor : function () { getValueFromEditor : function () {
...@@ -187,15 +186,18 @@ CMS.Views.Metadata.Number = CMS.Views.Metadata.AbstractEditor.extend({ ...@@ -187,15 +186,18 @@ CMS.Views.Metadata.Number = CMS.Views.Metadata.AbstractEditor.extend({
this.$el.find('input').attr(step, stepValue); this.$el.find('input').attr(step, stepValue);
} }
// Manually runs polyfill for input number types to correct for Firefox non-support // Manually runs polyfill for input number types to correct for Firefox non-support.
this.$el.find('.setting-input-number').inputNumber(); // inputNumber will be undefined when unit test is running.
if ($.fn.inputNumber) {
this.$el.find('.setting-input-number').inputNumber();
}
this.initialized = true; this.initialized = true;
} }
}, },
getTemplateName : function () { getTemplateName : function () {
return "metadata_number_entry"; return "metadata-number-entry";
}, },
getValueFromEditor : function () { getValueFromEditor : function () {
...@@ -240,7 +242,6 @@ CMS.Views.Metadata.Number = CMS.Views.Metadata.AbstractEditor.extend({ ...@@ -240,7 +242,6 @@ CMS.Views.Metadata.Number = CMS.Views.Metadata.AbstractEditor.extend({
}); });
CMS.Views.Metadata.Option = CMS.Views.Metadata.AbstractEditor.extend({ CMS.Views.Metadata.Option = CMS.Views.Metadata.AbstractEditor.extend({
events : { events : {
...@@ -249,7 +250,7 @@ CMS.Views.Metadata.Option = CMS.Views.Metadata.AbstractEditor.extend({ ...@@ -249,7 +250,7 @@ CMS.Views.Metadata.Option = CMS.Views.Metadata.AbstractEditor.extend({
}, },
getTemplateName : function () { getTemplateName : function () {
return "metadata_option_entry"; return "metadata-option-entry";
}, },
getValueFromEditor : function () { getValueFromEditor : function () {
......
...@@ -3,7 +3,6 @@ ...@@ -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/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/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> <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')}" /> <link rel="stylesheet" type="text/css" href="${static.url('css/vendor/html5-input-polyfills/number-polyfill.css')}" />
......
<%! from django.utils.translation import ugettext as _ %> <%! from django.utils.translation import ugettext as _ %>
<%namespace name='static' file='../static_content.html'/>
<% <%
import hashlib import hashlib
...@@ -7,6 +8,23 @@ ...@@ -7,6 +8,23 @@
hlskey = hashlib.md5(module.location.url()).hexdigest() 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'] %> <% showHighLevelSource='source_code' in editable_metadata_fields and editable_metadata_fields['source_code']['explicitly_set'] %>
<% metadata_field_copy = copy.deepcopy(editable_metadata_fields) %> <% 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. ## 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): ...@@ -250,6 +250,6 @@ class CombinedOpenEndedDescriptor(CombinedOpenEndedFields, RawDescriptor):
def non_editable_metadata_fields(self): def non_editable_metadata_fields(self):
non_editable_fields = super(CombinedOpenEndedDescriptor, self).non_editable_metadata_fields non_editable_fields = super(CombinedOpenEndedDescriptor, self).non_editable_metadata_fields
non_editable_fields.extend([CombinedOpenEndedDescriptor.due, CombinedOpenEndedDescriptor.graceperiod, non_editable_fields.extend([CombinedOpenEndedDescriptor.due, CombinedOpenEndedDescriptor.graceperiod,
CombinedOpenEndedDescriptor.markdown]) CombinedOpenEndedDescriptor.markdown, CombinedOpenEndedDescriptor.version])
return non_editable_fields return non_editable_fields
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment