52 lines
2.1 KiB
JavaScript
52 lines
2.1 KiB
JavaScript
/**
|
|
* Simple model for adding a component of a given type (for example, "video" or "html").
|
|
*/
|
|
define(['backbone'], function(Backbone) {
|
|
return Backbone.Model.extend({
|
|
defaults: {
|
|
type: '',
|
|
// Each entry in the template array is an Object with the following keys:
|
|
// display_name
|
|
// category (may or may not match "type")
|
|
// boilerplate_name (may be null)
|
|
// is_common (only used for problems)
|
|
templates: [],
|
|
support_legend: {}
|
|
},
|
|
parse: function(response) {
|
|
// Returns true only for templates that both have no boilerplate and are of
|
|
// the overall type of the menu. This allows other component types to be added
|
|
// and they will get sorted alphabetically rather than just at the top.
|
|
// e.g. The ORA openassessment xblock is listed as an advanced problem.
|
|
var isPrimaryBlankTemplate = function(template) {
|
|
return !template.boilerplate_name && template.category === response.type;
|
|
};
|
|
|
|
this.type = response.type;
|
|
this.templates = response.templates;
|
|
this.display_name = response.display_name;
|
|
this.support_legend = response.support_legend;
|
|
|
|
// Sort the templates.
|
|
this.templates.sort(function(a, b) {
|
|
// The blank problem for the current type goes first
|
|
if (isPrimaryBlankTemplate(a)) {
|
|
return -1;
|
|
} else if (isPrimaryBlankTemplate(b)) {
|
|
return 1;
|
|
// Hinted problems should be shown at the end
|
|
} else if (a.hinted && !b.hinted) {
|
|
return 1;
|
|
} else if (!a.hinted && b.hinted) {
|
|
return -1;
|
|
} else if (a.display_name > b.display_name) {
|
|
return 1;
|
|
} else if (a.display_name < b.display_name) {
|
|
return -1;
|
|
}
|
|
return 0;
|
|
});
|
|
}
|
|
});
|
|
});
|