]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js
don't attempt to retrieve the linked selector objects if the data is not retrievable...
[working/Evergreen.git] / Open-ILS / web / js / dojo / openils / widget / AutoFieldWidget.js
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');
6
7     dojo.declare('openils.widget.AutoFieldWidget', null, {
8
9         async : false,
10
11         /**
12          * args:
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
23          */
24         constructor : function(args) {
25             for(var k in args)
26                 this[k] = args[k];
27
28             // find the field description in the IDL if not provided
29             if(!this.idlField) {
30                 if(this.fmObject)
31                     this.fmClass = this.fmObject.classname;
32                 var fields = fieldmapper.IDL.fmclasses[this.fmClass].fields;
33                 for(var f in fields) 
34                     if(fields[f].name == this.fmField)
35                         this.idlField = fields[f];
36             }
37         },
38
39         /**
40          * Turn the value from the dojo widget into a value oils understands
41          */
42         getFormattedValue : function() {
43             var value = this.widget.attr('value');
44             switch(this.idlField.datatype) {
45                 case 'bool':
46                     return (value) ? 't' : 'f'
47                 case 'timestamp':
48                     return dojo.date.stamp.toISOString(value);
49                 default:
50                     return value;
51             }
52         },
53         
54         getDisplayString : function() {
55             var value = this.widgetValue;
56             switch(this.idlField.datatype) {
57                 case 'bool':
58                     return (value) ? 'True' : 'False'; // XXX i18n!
59                 case 'timestamp':
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'});
64                 case 'org_unit':
65                     return fieldmapper.aou.findOrgUnit(value).shortname();
66                 default:
67                     return value;
68             }
69         },
70
71         build : function(onload) {
72             this.onload = onload;
73             if(this.widgetValue == null)
74                 this.widgetValue = (this.fmObject) ? this.fmObject[this.idlField.name]() : null;
75
76             switch(this.idlField.datatype) {
77                 
78                 case 'id':
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
82                     break;
83
84                 case 'org_unit':
85                     this._buildOrgSelector();
86                     break;
87
88                 case 'money':
89                     dojo.require('dijit.form.CurrencyTextBox');
90                     this.widget = new dijit.form.CurrencyTextBox(this.dijitArgs, this.parentNode);
91                     break;
92
93                 case 'timestamp':
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);
99                     break;
100
101                 case 'bool':
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);
105                     break;
106
107                 case 'link':
108                     if(this._buildLinkSelector()) break;
109
110                 default:
111                     dojo.require('dijit.form.TextBox');
112                     this.widget = new dijit.form.TextBox(this.dijitArgs, this.parentNode);
113             }
114
115             if(!this.async) this._widgetLoaded();
116             return this.widget;
117         },
118
119         _buildLinkSelector : function() {
120
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;
126
127             dojo.require('openils.PermaCrud');
128             dojo.require('dojo.data.ItemFileReadStore');
129             dojo.require('dijit.form.FilteringSelect');
130
131             var self = this;
132             this.async = true;
133             this.widget = new dijit.form.FilteringSelect(this.dijitArgs, this.parentNode);
134             var rclassIdl = fieldmapper.IDL.fmclasses[linkClass];
135             var vfield;
136
137             for(var f in rclassIdl.fields) {
138                 if(self.idlField.key == rclassIdl.fields[f].name) {
139                     vfield = rclassIdl.fields[f];
140                     break;
141                 }
142             }
143
144             this.widget.searchAttr = this.widget.labelAttr = vfield.selector || vfield.name;
145             this.widget.valueAttr = vfield.name;
146
147             new openils.PermaCrud().retrieveAll(linkClass, {   
148                 async : true,
149                 oncomplete : function(r) {
150                     var list = openils.Util.readResponse(r, false, true);
151                     if(list) {
152                         self.widget.store = 
153                             new dojo.data.ItemFileReadStore({data:fieldmapper[linkClass].toStoreData(list)});
154                     }
155                     self.widget.startup();
156                     self._widgetLoaded();
157                 }
158             });
159
160             return true;
161         },
162
163         /**
164          * For widgets that run asynchronously, provide a callback for finishing up
165          */
166         _widgetLoaded : function(value) {
167             if(this.widgetValue != null) 
168                 this.widget.attr('value', this.widgetValue);
169             if(this.onload)
170                 this.onload(this.widget, self);
171         },
172
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';
180             
181             // if we have a limit perm, find the relevent orgs (async)
182             if(this.orgLimitPerms && this.orgLimitPerms.length > 0) {
183                 this.async = true;
184                 var user = new openils.User();
185                 var self = this;
186                 user.getPermOrgList(this.orgLimitPerms, 
187                     function(orgList) {
188                         self.widget.tree = orgList;
189                         self.widget.startup();
190                         self._widgetLoaded();
191                     }
192                 );
193
194             } else {
195                 this.widget.tree = fieldmapper.aou.globalOrgTree;
196                 this.widget.startup();
197             }
198         }
199     });
200 }
201