1 if(!dojo._hasResource['openils.widget.AutoFieldWidget']) {
2 dojo.provide('openils.widget.AutoFieldWidget');
3 dojo.require('openils.Util');
4 dojo.require('openils.User');
5 dojo.require('fieldmapper.IDL');
7 dojo.declare('openils.widget.AutoFieldWidget', null, {
13 * idlField -- Field description object from fieldmapper.IDL.fmclasses
14 * fmObject -- If available, the object being edited. This will be used
15 * to set the value of the widget.
16 * fmClass -- Class name (not required if idlField or fmObject is set)
17 * fmField -- Field name (not required if idlField)
18 * parentNode -- If defined, the widget will be appended to this DOM node
19 * dijitArgs -- Optional parameters object, passed directly to the dojo widget
20 * orgLimitPerms -- If this field defines a set of org units and an orgLimitPerms
21 * is defined, the code will limit the org units in the set to those
22 * allowed by the permission
24 constructor : function(args) {
28 // find the field description in the IDL if not provided
31 this.fmClass = this.fmObject.classname;
32 var fields = fieldmapper.IDL.fmclasses[this.fmClass].fields;
34 if(fields[f].name == this.fmField)
35 this.idlField = fields[f];
40 * Turn the value from the dojo widget into a value oils understands
42 getFormattedValue : function() {
43 var value = this.widget.attr('value');
44 switch(this.idlField.datatype) {
46 return (value) ? 't' : 'f'
48 return dojo.date.stamp.toISOString(value);
54 getDisplayString : function() {
55 var value = this.widgetValue;
56 switch(this.idlField.datatype) {
58 return (value) ? 'True' : 'False'; // XXX i18n!
60 dojo.require('dojo.date.locale');
61 dojo.require('dojo.date.stamp');
62 var date = dojo.date.stamp.fromISOString(value);
63 return dojo.date.locale.format(date, {formatLength:'short'});
65 return fieldmapper.aou.findOrgUnit(value).shortname();
71 build : function(onload) {
73 if(this.widgetValue == null)
74 this.widgetValue = (this.fmObject) ? this.fmObject[this.idlField.name]() : null;
76 switch(this.idlField.datatype) {
79 dojo.require('dijit.form.TextBox');
80 this.widget = new dijit.form.TextBox(this.dijitArgs, this.parentNode);
81 this.widget.attr('disabled', true); // never allow editing of IDs
85 this._buildOrgSelector();
89 dojo.require('dijit.form.CurrencyTextBox');
90 this.widget = new dijit.form.CurrencyTextBox(this.dijitArgs, this.parentNode);
94 dojo.require('dijit.form.DateTextBox');
95 dojo.require('dojo.date.stamp');
96 this.widget = new dijit.form.DateTextBox(this.dijitArgs, this.parentNode);
97 if(this.widgetValue != null)
98 this.widgetValue = dojo.date.stamp.fromISOString(this.widgetValue);
102 dojo.require('dijit.form.CheckBox');
103 this.widget = new dijit.form.CheckBox(this.dijitArgs, this.parentNode);
104 this.widgetValue = openils.Util.isTrue(this.widgetValue);
108 if(this._buildLinkSelector()) break;
111 dojo.require('dijit.form.TextBox');
112 this.widget = new dijit.form.TextBox(this.dijitArgs, this.parentNode);
115 if(!this.async) this._widgetLoaded();
119 _buildLinkSelector : function() {
121 /* verify we can and should grab the related class */
122 var linkClass = this.idlField['class'];
123 if(this.idlField.reltype != 'has_a') return false;
124 if(!fieldmapper.IDL.fmclasses[linkClass].permacrud) return false;
125 if(!fieldmapper.IDL.fmclasses[linkClass].permacrud.retrieve) return false;
127 dojo.require('openils.PermaCrud');
128 dojo.require('dojo.data.ItemFileReadStore');
129 dojo.require('dijit.form.FilteringSelect');
133 this.widget = new dijit.form.FilteringSelect(this.dijitArgs, this.parentNode);
134 var rclassIdl = fieldmapper.IDL.fmclasses[linkClass];
137 for(var f in rclassIdl.fields) {
138 if(self.idlField.key == rclassIdl.fields[f].name) {
139 vfield = rclassIdl.fields[f];
144 this.widget.searchAttr = this.widget.labelAttr = vfield.selector || vfield.name;
145 this.widget.valueAttr = vfield.name;
147 new openils.PermaCrud().retrieveAll(linkClass, {
149 oncomplete : function(r) {
150 var list = openils.Util.readResponse(r, false, true);
153 new dojo.data.ItemFileReadStore({data:fieldmapper[linkClass].toStoreData(list)});
155 self.widget.startup();
156 self._widgetLoaded();
164 * For widgets that run asynchronously, provide a callback for finishing up
166 _widgetLoaded : function(value) {
167 if(this.widgetValue != null)
168 this.widget.attr('value', this.widgetValue);
170 this.onload(this.widget, self);
173 _buildOrgSelector : function() {
174 dojo.require('fieldmapper.OrgUtils');
175 dojo.require('openils.widget.FilteringTreeSelect');
176 this.widget = new openils.widget.FilteringTreeSelect(this.dijitArgs, this.parentNode);
177 this.widget.searchAttr = 'shortname';
178 this.widget.labelAttr = 'shortname';
179 this.widget.parentField = 'parent_ou';
181 // if we have a limit perm, find the relevent orgs (async)
182 if(this.orgLimitPerms && this.orgLimitPerms.length > 0) {
184 var user = new openils.User();
186 user.getPermOrgList(this.orgLimitPerms,
188 self.widget.tree = orgList;
189 self.widget.startup();
190 self._widgetLoaded();
195 this.widget.tree = fieldmapper.aou.globalOrgTree;
196 this.widget.startup();