Initial commit
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user