]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/dojo/fieldmapper/Fieldmapper.js
return AutoIDL to its original state of loading the while IDL if no classes are selec...
[Evergreen.git] / Open-ILS / web / js / dojo / fieldmapper / Fieldmapper.js
1 /*
2 # ---------------------------------------------------------------------------
3 # Copyright (C) 2008  Georgia Public Library Service / Equinox Software, Inc
4 # Mike Rylander <miker@esilibrary.com>
5
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either version 2
9 # of the License, or (at your option) any later version.
10
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15 # ---------------------------------------------------------------------------
16 */
17
18 if(!dojo._hasResource["fieldmapper.Fieldmapper"]){
19         dojo._hasResource["fieldmapper.Fieldmapper"] = true;
20
21         dojo.provide("fieldmapper.Fieldmapper");
22         dojo.require("DojoSRF");
23
24
25 /* generate fieldmapper javascript classes.  This expects a global variable
26         called 'fmclasses' to be fleshed with the classes we need to build */
27
28         function FMEX(message) { this.message = message; }
29         FMEX.toString = function() { return "FieldmapperException: " + this.message + "\n"; }
30
31         dojo.declare( "fieldmapper.Fieldmapper", null, {
32
33                 constructor : function (initArray) {
34                         if (initArray) {
35                                 if (dojo.isArray(initArray)) {
36                                         this.a = initArray;
37                                 } else {
38                                         this.a = [];
39                                 }
40                         }
41                 },
42
43                 _isfieldmapper : true,
44
45                 clone : function() {
46                         var obj = new this.constructor();
47
48                         for( var i in this.a ) {
49                                 var thing = this.a[i];
50                                 if(thing == null) continue;
51
52                                 if( thing._isfieldmapper ) {
53                                         obj.a[i] = thing.clone();
54                                 } else {
55
56                                         if(dojo.isArray(thing)) {
57                                                 obj.a[i] = new Array();
58
59                                                 for( var j in thing ) {
60
61                                                         if( thing[j]._isfieldmapper )
62                                                                 obj.a[i][j] = thing[j].clone();
63                                                         else
64                                                                 obj.a[i][j] = thing[j];
65                                                 }
66                                         } else {
67                                                 obj.a[i] = thing;
68                                         }
69                                 }
70                         }
71                         return obj;
72                 },
73
74         RequiredField : function (f) {
75             if (!f) return;
76             if (fieldmapper.IDL && fieldmapper.IDL.loaded)
77                 return this.Structure.fields[f].required;
78             return;
79         },
80
81         ValidateField : function (f) {
82             if (!f) return;
83             if (fieldmapper.IDL && fieldmapper.IDL.loaded) {
84                 if (this.Structure.fields[f] && this.Structure.fields[f].validate) {
85                     return this.Structure.fields[f].validate.test(this[f]());
86                 }
87                 return true;
88             }
89             return;
90         }
91
92         });
93
94
95     fieldmapper.vivicateClass = function (cl) {
96                 dojo.provide( cl );
97                 dojo.declare( cl , fieldmapper.Fieldmapper, {
98                         constructor : function () {
99                                 if (!this.a) this.a = [];
100                                 this.classname = this.declaredClass;
101                 this._fields = [];
102
103                 if (fieldmapper.IDL && fieldmapper.IDL.loaded) {
104                     this.Structure = fieldmapper.IDL.fmclasses[this.classname]
105
106                     for (var f in fieldmapper.IDL.fmclasses[this.classname].fields) {
107                         var field = fieldmapper.IDL.fmclasses[this.classname].fields[f];
108                         var p = field.array_position;
109                                 this._fields.push( field.name );
110                                         this[field.name]=new Function('n', 'if(arguments.length==1)this.a['+p+']=n;return this.a['+p+'];');
111                     }
112                 } else {
113                                     this._fields = fmclasses[this.classname];
114
115                                 for( var pos = 0; pos <  this._fields.length; pos++ ) {
116                                         var p = parseInt(pos);
117                                         var f = this._fields[pos];
118                                         this[f]=new Function('n', 'if(arguments.length==1)this.a['+p+']=n;return this.a['+p+'];');
119                                 }
120                 }
121
122                         }
123                 });
124
125                 fieldmapper[cl] = window[cl]; // alias into place
126
127         if (fieldmapper.IDL && fieldmapper.IDL.loaded) 
128             fieldmapper[cl].Identifier = fieldmapper.IDL.fmclasses[cl].pkey;
129
130         fieldmapper[cl].prototype.fromStoreItem = _fromStoreItem;
131         fieldmapper[cl].toStoreData = _toStoreData;
132         fieldmapper[cl].toStoreItem = _toStoreItem;
133         fieldmapper[cl].prototype.toStoreItem = function ( args ) { return _toStoreItem(this, args) };
134         fieldmapper[cl].initStoreData = _initStoreData;
135         fieldmapper[cl].prototype.toHash = _toHash;
136         fieldmapper[cl].toHash = _toHash;
137         fieldmapper[cl].prototype.fromHash = _fromHash;
138         fieldmapper[cl].fromHash = _fromHash;
139     };
140
141         fieldmapper._request = function ( meth, staff, params ) {
142                 var ses = OpenSRF.CachedClientSession( meth[0] );
143                 if (!ses) return null;
144
145                 var result = null;
146                 var args = {};
147
148                 if (dojo.isArray(params)) {
149                         args.params = params;
150                 } else {
151
152                         if (dojo.isObject(params)) {
153                                 args = params;
154                         } else {
155                 args.params = [].splice.call(arguments, 2, arguments.length - 2);
156                         }
157
158                 }
159
160         if (!args.async && !args.timeout) args.timeout = 10;
161
162         if(!args.onmethoderror) {
163             args.onmethoderror = function(r, stat, stat_text) {
164                 throw new Error('Method error: ' + r.stat + ' : ' + stat_text);
165             }
166         }
167
168         if(!args.ontransporterror) {
169             args.ontransporterror = function(xreq) {
170                 throw new Error('Transport error method='+args.method+', status=' + xreq.status);
171             }
172         }
173
174                 if (!args.onerror) {
175                         args.onerror = function (r) {
176                                 throw new Error('Request error encountered! ' + r);
177                         }
178                 }
179
180                 if (!args.oncomplete) {
181                         args.oncomplete = function (r) {
182                                 var x = r.recv();
183                                 if (x) result = x.content();
184                         }
185                 }
186
187                 args.method = meth[1];
188                 if (staff && meth[2]) args.method += '.staff';
189
190                 ses.request(args).send();
191
192                 return result;
193         };
194
195         fieldmapper.standardRequest = function (meth, params) { return fieldmapper._request(meth, false, params) };
196         fieldmapper.Fieldmapper.prototype.standardRequest = fieldmapper.standardRequest;
197
198         fieldmapper.staffRequest = function (meth, params) { return fieldmapper._request(meth, true, params) };
199         fieldmapper.Fieldmapper.prototype.staffRequest = fieldmapper.staffRequest;
200
201         fieldmapper.OpenSRF = {};
202
203         /*      Methods are defined as [ service, method, have_staff ]
204                 An optional 3rd component is when a method is followed by true, such methods
205                 have a staff counterpart and should have ".staff" appended to the method 
206                 before the method is called when in XUL mode */
207         fieldmapper.OpenSRF.methods = {
208                 FETCH_ORG_BY_SHORTNAME : ['open-ils.actor','open-ils.actor.org_unit.retrieve_by_shortname'],
209                 FETCH_ORG_SETTING : ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default'],
210                 FETCH_ORG_SETTING_BATCH : ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default.batch']
211         };
212    
213     
214     //** FROM HASH **/
215         function _fromHash (_hash) {
216                 for ( var i=0; i < this._fields.length; i++) {
217                         if (_hash[this._fields[i]] != null)
218                                 this[this._fields[i]]( _hash[this._fields[i]] );
219                 }
220                 return this;
221         }
222
223         function _toHash (includeNulls, virtFields) {
224                 var _hash = {};
225                 for ( var i=0; i < this._fields.length; i++) {
226                         if (includeNulls || this[this._fields[i]]() != null) {
227                                 if (this[this._fields[i]]() == null)
228                     _hash[this._fields[i]] = null;
229                 else
230                                     _hash[this._fields[i]] = '' + this[this._fields[i]]();
231             }
232                 }
233
234                 if (virtFields && virtFields.length > 0) {
235                         for (var i = 0; i < virtFields.length; i++) {
236                                 if (!_hash[virtFields[i]])
237                                         _hash[virtFields[i]] = null;
238                         }
239                 }
240
241                 return _hash;
242         }
243     //** FROM HASH **/
244
245
246     /** FROM dojoData **/
247         function _fromStoreItem (data) {
248                 this.fromHash(data);
249
250                 for (var i = 0; this._ignore_fields && i < this._ignore_fields.length; i++)
251                         this[this._ignore_fields[i]](null);
252
253                 for (var i = 0; this._fields && i < this._fields.length; i++) {
254                         if (dojo.isArray( this[this._fields[i]]() ))
255                                 this[this._fields[i]]( this[this._fields[i]]()[0] );
256                 }
257                 return this;
258         }
259
260     function _initStoreData(label, params) {
261                 if (!params) params = {};
262                 if (!params.identifier) params.identifier = this.Identifier;
263                 if (!label) label = params.label;
264                 if (!label) label = params.identifier;
265                 return { label : label, identifier : params.identifier, items : [] };
266     }
267
268     function _toStoreItem(fmObj, params) {
269                 if (!params) params = {};
270         return fmObj.toHash(true, params.virtualFields);
271     }
272
273         function _toStoreData (list, label, params) {
274                 if (!params) params = {};
275         var data = this.initStoreData(label, params);
276
277                 for (var i = 0; list && i < list.length; i++) data.items.push( list[i].toHash(true, params.virtualFields) );
278
279                 if (params.children && params.parent) {
280                         var _hash_list = data.items;
281
282                         var _find_root = {};
283                         for (var i = 0; _hash_list && i < _hash_list.length; i++) {
284                                 _find_root[_hash_list[i][params.identifier]] = _hash_list[i]; 
285                         }
286
287                         var item_data = [];
288                         for (var i = 0; _hash_list && i < _hash_list.length; i++) {
289                                 var obj = _hash_list[i]
290                                 obj[params.children] = [];
291
292                                 for (var j = 0; _hash_list && j < _hash_list.length; j++) {
293                                         var kid = _hash_list[j];
294                                         if (kid[params.parent] == obj[params.identifier]) {
295                                                 obj[params.children].push( { _reference : kid[params.identifier] } );
296                                                 kid._iskid = true;
297                                                 if (_find_root[kid[params.identifier]]) delete _find_root[kid[params.identifier]];
298                                         }
299                                 }
300
301                                 item_data.push( obj );
302                         }
303
304                         for (var j in _find_root) {
305                                 _find_root[j]['_top'] = 'true';
306                                 if (!_find_root[j][params.parent])
307                                         _find_root[j]['_trueRoot'] = 'true';
308                         }
309
310                         data.items = item_data;
311                 }
312
313                 return data;
314         }
315     /** FROM dojoData **/
316
317
318
319     /** ! Begin code that executes on page load */
320
321     if (!window.fmclasses) dojo.require("fieldmapper.fmall", true);
322     for( var cl in fmclasses ) {
323         fieldmapper.vivicateClass(cl);
324     }
325
326     // if we were NOT called by the IDL loader ...
327     // XXX This is now deprecated in preference to fieldmapper.AutoIDL
328     if ( !(fieldmapper.IDL && fieldmapper.IDL.loaded) ) {
329
330         fieldmapper.cmsa.Identifier = 'alias';
331         fieldmapper.cmc.Identifier = 'name';
332         fieldmapper.i18n_l.Identifier = 'code';
333         fieldmapper.ccpbt.Identifier = 'code';
334         fieldmapper.ccnbt.Identifier = 'code';
335         fieldmapper.cbrebt.Identifier = 'code';
336         fieldmapper.cubt.Identifier = 'code';
337         fieldmapper.ccm.Identifier = 'code';
338         fieldmapper.cvrfm.Identifier = 'code';
339         fieldmapper.clm.Identifier = 'code';
340         fieldmapper.cam.Identifier = 'code';
341         fieldmapper.cifm.Identifier = 'code';
342         fieldmapper.citm.Identifier = 'code';
343         fieldmapper.cblvl.Identifier = 'code';
344         fieldmapper.clfm.Identifier = 'code';
345         fieldmapper.mous.Identifier = 'usr';
346         fieldmapper.moucs.Identifier = 'usr';
347         fieldmapper.mucs.Identifier = 'usr';
348         fieldmapper.mus.Identifier = 'usr';
349         fieldmapper.rxbt.Identifier = 'xact';
350         fieldmapper.rxpt.Identifier = 'xact';
351         fieldmapper.cxt.Identifier = 'name';
352         fieldmapper.amtr.Identifier = 'matchpoint';
353         fieldmapper.coust.Identifier = 'name';
354
355     }
356
357
358     /** FROM dojoData **/
359     /* set up some known class attributes */
360         if (fieldmapper.aou) fieldmapper.aou.prototype._ignore_fields = ['children'];
361         if (fieldmapper.aout) fieldmapper.aout.prototype._ignore_fields = ['children'];
362         if (fieldmapper.pgt) fieldmapper.pgt.prototype._ignore_fields = ['children'];
363
364         fieldmapper.aou.toStoreData = function (list, label) {
365                 if (!label) label = 'shortname';
366                 return _toStoreData.call(this, list, label, { 'parent' : 'parent_ou', 'children' : 'children' });
367         }
368
369         fieldmapper.aout.toStoreData = function (list, label) {
370                 if (!label) label = 'name';
371                 return _toStoreData.call(this, list, label, { 'parent' : 'parent', 'children' : 'children' });
372         }
373
374         fieldmapper.pgt.toStoreData = function (list, label) {
375                 if (!label) label = 'name';
376                 return _toStoreData.call(this, list, label, { 'parent' : 'parent', 'children' : 'children' });
377         }
378     /** FROM dojoData **/
379     
380
381 }
382
383
384