diff options
Diffstat (limited to 'web/widget/abstract/fields.js')
-rw-r--r-- | web/widget/abstract/fields.js | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/web/widget/abstract/fields.js b/web/widget/abstract/fields.js new file mode 100644 index 0000000..73111ce --- /dev/null +++ b/web/widget/abstract/fields.js @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2012-2014 Kaarle Ritvanen + * See LICENSE file for license details + */ + +define( + [ + "acf2/widget/abstract/inline", + "jquery", + "underscore", + "acf2/widget/checkbox", + "acf2/widget/checkboxes", + "acf2/widget/combobox", + "acf2/widget/field", + "acf2/widget/inline", + "acf2/widget/reference" + ], + function(Base, $, _) { + var Class = Base.extend({ + render: function(data, meta) { + this.super(Class, "render", data, meta); + + this.appendAboveFields(data, meta); + + this.reqData = data; + var self = this; + + if (meta.type == "model") { + this.fields = {}; + _.each(meta.fields, function(field) { + if (field.visible) + self.fields[field.name] = self.renderField( + field.name, + field, + field["ui-name"], + true, + false + ); + }); + + _.each(this.fields, function(f1, name) { + _.each(self.fields, function(f2) { + if (f1 != f2) + f1.on("validated", function(event) { + f2.trigger("updated", [name]); + event.stopPropagation(); + }); + }); + }); + + _.each(this.fields, function(field) { + field.trigger("start"); + }); + } + + else _.each(data.data, function(value, name) { + if (meta.type == "set") name = data.data[name]; + else if (_.isArray(data.data)) name++; + self.renderCollectionMember(name, meta); + }); + + this.appendBelowFields(data, meta); + }, + + appendAboveFields: function(data, meta) {}, + appendBelowFields: function(data, meta) {}, + + renderField: function( + name, meta, label, editable, removable + ) { + var widget = this.widget(meta).new( + this.reqData, + name, + meta, + this.level, + editable, + removable + ); + var container = this.appendWidget(widget, label); + widget.on("setVisible", function(event, visible) { + if (visible) container.show(); + else container.hide(); + event.stopPropagation(); + }); + return widget; + }, + + renderCollectionMember: function(name, meta) { + var set = meta.type == "set"; + this.renderField( + name, + meta.members, + meta["ui-member"] + " " + name, + !set, + !set && _.contains(meta.removable, name) + ).trigger("start"); + }, + + widget: function(meta) { + return require("acf2/widget/" + meta.widget); + } + }); + + return Class; + } +); |