106 lines
3.0 KiB
JavaScript
106 lines
3.0 KiB
JavaScript
var _ = require('underscore');
|
|
var Backbone = require('backbone');
|
|
|
|
var CustomForm = Backbone.Form.extend({
|
|
initialize: function (options) {
|
|
this.options = options;
|
|
Backbone.Form.Original.prototype.initialize.call(this, options);
|
|
this.listenTo(this.model, 'updateSchema', this.updateSchema);
|
|
},
|
|
|
|
updateSchema: function (schema) {
|
|
var newFields = _.keys(schema);
|
|
var currentFields = _.keys(this.schema);
|
|
var field;
|
|
var options;
|
|
|
|
// Remove all fields not present in the new schema
|
|
_.each(currentFields, function (key) {
|
|
if (schema[key] == null) {
|
|
this.fields[key].remove();
|
|
delete this.fields[key];
|
|
}
|
|
}, this);
|
|
|
|
// Creat all fields not present in the old schema
|
|
_.each(newFields, function (key) {
|
|
var fieldSchema = schema[key];
|
|
if (this.schema[key] == null) {
|
|
this.fields[key] = this.createField(key, fieldSchema);
|
|
this.renderAddedField(key);
|
|
} else {
|
|
// update schema for this field and render
|
|
field = this.fields[key];
|
|
options = _.extend({}, _.omit(field.editor.options, _.keys(schema[key])), {
|
|
schema: schema[key]
|
|
});
|
|
|
|
field.editor._popupManager && field.editor._popupManager.destroy();
|
|
field.editor._dialogView && field.editor._dialogView.clean();
|
|
field.editor.undelegateEvents();
|
|
if (field.editor._destroyBinds) {
|
|
field.editor._destroyBinds();
|
|
}
|
|
field.editor.initialize(options);
|
|
field.editor.delegateEvents();
|
|
field.editor.render();
|
|
}
|
|
}, this);
|
|
|
|
// update the schema
|
|
this.schema = _.extend({}, this.schema, schema);
|
|
},
|
|
|
|
renderAddedField: function (fieldKey) {
|
|
var self = this;
|
|
var fields = this.fields;
|
|
var $form = this.$el;
|
|
var $ = Backbone.$;
|
|
|
|
$form.find('[data-editors]').each(function (i, el) {
|
|
var $container = $(el);
|
|
var selection = $container.attr('data-editors');
|
|
|
|
if (_.isUndefined(selection)) return;
|
|
|
|
// Work out which fields to include
|
|
var keys = (selection === '*')
|
|
? self.selectedFields || _.keys(fields)
|
|
: selection.split(',');
|
|
|
|
// Add them
|
|
_.each(keys, function (key) {
|
|
var field;
|
|
if (key === fieldKey) {
|
|
field = fields[key];
|
|
$container.append(field.editor.render().el);
|
|
}
|
|
});
|
|
});
|
|
|
|
// Render standalone fields
|
|
$form.find('[data-editors]').each(function (i, el) {
|
|
var $container = $(el);
|
|
var selection = $container.attr('data-editors');
|
|
|
|
if (_.isUndefined(selection)) return;
|
|
|
|
// Work out which fields to include
|
|
var keys = (selection === '*')
|
|
? self.selectedFields || _.keys(fields)
|
|
: selection.split(',');
|
|
|
|
// Add them
|
|
_.each(keys, function (key) {
|
|
var field;
|
|
if (key === fieldKey) {
|
|
field = fields[key];
|
|
$container.append(field.editor.render().el);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
});
|
|
|
|
module.exports = CustomForm;
|