]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/fieldmapper/IDL.js
return AutoIDL to its original state of loading the while IDL if no classes are selec...
[working/Evergreen.git] / Open-ILS / web / js / dojo / fieldmapper / IDL.js
1 if(!dojo._hasResource["fieldmapper.IDL"]) {
2     dojo._hasResource['fieldmapper.IDL'] = true;
3     dojo.require("DojoSRF");
4     dojo.provide("fieldmapper.IDL");
5     dojo.declare('fieldmapper.IDL', null, {
6     
7         _URL_PATH : '/reports/fm_IDL.xml', // XXX locale?
8         // -- just need to set up xmlent and use '/reports/'+OpenSRF.locale+'/fm_IDL.xml'
9         NS_REPORTS : 'http://open-ils.org/spec/opensrf/IDL/reporter/v1',
10         NS_PERSIST : 'http://open-ils.org/spec/opensrf/IDL/persistence/v1',
11         NS_OBJ : 'http://open-ils.org/spec/opensrf/IDL/objects/v1',
12
13         constructor : function(classlist) {
14
15             var preload = [];
16             if (window._preload_fieldmapper_IDL) {
17                 if (!fieldmapper.IDL.fmclasses) fieldmapper.IDL.fmclasses = {};
18                 if (!window.fmclasses) window.fmclasses = {};
19
20                 for (var c in window._preload_fieldmapper_IDL) {
21                     preload.push(c);
22                     fieldmapper.IDL.fmclasses[c] = window._preload_fieldmapper_IDL[c];
23
24                     window.fmclasses[c] = [];
25                     dojo.forEach(fieldmapper.IDL.fmclasses[c].fields, function(obj){ window.fmclasses[c].push(obj.name) });
26
27                     if (classlist && classlist.length)
28                         classlist = dojo.filter(classlist, function(x){return x != c;});
29                 }
30
31                 fieldmapper.IDL.loaded = true;
32                 window._preload_fieldmapper_IDL = null;
33             }
34
35             if(!fieldmapper.IDL.fmclasses || (classlist && classlist.length)) {
36                 var idl_url = this._URL_PATH;
37
38                 if (classlist.length && (classlist.length > 1 || classlist[0] != '*')) {
39                     idl_url += '?';
40
41                     for (var i = 0; i < classlist.length; i++) {
42                         var trim_class = classlist[i];
43                         if (!trim_class) continue;
44                         if (fieldmapper.IDL.fmclasses && fieldmapper.IDL.fmclasses[trim_class]) continue;
45
46                         if (i > 0) idl_url += '&';
47                         idl_url += 'class=' + trim_class;
48                     }
49                 }
50                         
51                 if( !idl_url.match(/\?$/) ) { // make sure we have classes that need loading
52
53                     var self = this;
54                     dojo.xhrGet({
55                         url : idl_url,
56                         handleAs : 'xml',
57                         sync : true,
58                         timeout : 10000,
59                         load : function (response) {
60                             self._parse(response);
61                             fieldmapper.IDL.loaded = true;
62                         },
63                         error : function (response) {
64                             fieldmapper.IDL.loaded = false;
65                             dojo.require('fieldmapper.fmall', true);
66                         }
67                     });
68                 }
69             }
70             dojo.require('fieldmapper.Fieldmapper'); 
71
72             if (preload.length)
73                 dojo.forEach( classlist, function (c) { fieldmapper.vivicateClass(c); } );
74
75             if (classlist && classlist.length)
76                 dojo.forEach( classlist, function (c) { fieldmapper.vivicateClass(c); } );
77         },
78
79         _parse : function(xmlNode) {
80             var classes = dojo.query('class',xmlNode);
81             if (!fieldmapper.IDL || !fieldmapper.IDL.fmclasses)
82                 fieldmapper.IDL.fmclasses = {};
83
84             for(var i = 0; i < classes.length; i++) {
85                 var node = classes[i];
86                 var id = node.getAttribute('id');
87                 var fields = dojo.query('fields',node)[0];
88                 window.fmclasses[id] = [];
89                 
90                 var fieldData = this._parseFields(node, id);
91     
92                 var obj = { 
93                     fields  : fieldData.list,
94                     field_map : fieldData.map,
95                     name    : node.getAttribute('id'),
96                     //table   : fieldmapper._getAttributeNS(node,this.NS_PERSIST, 'tablename'),
97                     //core    : fieldmapper._getAttributeNS(node,this.NS_REPORTS, 'core'),
98                     label   : fieldmapper._getAttributeNS(node,this.NS_REPORTS, 'label'),
99                     restrict_primary   : fieldmapper._getAttributeNS(node,this.NS_PERSIST, 'restrict_primary'),
100                     virtual : (fieldmapper._getAttributeNS(node,this.NS_PERSIST, 'virtual') == 'true'),
101                     pkey    : fieldmapper._getAttributeNS(fields,this.NS_PERSIST, 'primary'),
102                     pkey_sequence : fieldmapper._getAttributeNS(fields,this.NS_PERSIST, 'sequence')
103                 };
104
105                 var valid = fieldmapper._getAttributeNS(node,this.NS_OBJ, 'validate');
106                 if (valid) obj.validate = new RegExp( valid.replace(/\\/g, '\\\\') );
107
108                 var permacrud = dojo.query('permacrud',node)[0];
109                 if(permacrud) {
110                     var actions = ['create', 'retrieve', 'update', 'delete'];
111                     obj.permacrud = {};
112                     for(var idx in actions) {
113                         var action = actions[idx];
114                         var pnode = dojo.query(action,permacrud)[0];
115                         if(pnode) {
116                             var permString = pnode.getAttribute('permission');
117                             var permList = null;
118                             if(permString)
119                                 permList = (permString.match(/ /)) ? permString.split(' ') : [permString];
120  
121                             var contextString = pnode.getAttribute('context_field');
122                             var contextList = null;
123                             if(contextString)
124                                 contextList = (contextString.match(/ /)) ? contextString.split(' ') : [contextString];
125     
126                             obj.permacrud[action] = { 
127                                 perms : permList,
128                                 localContextFields : contextList // need to add foreign context fields
129                             }; // add more details as necessary
130                         }
131                     }
132                 }
133     
134                 obj.core = (obj.core == 'true');
135                 obj.label = (obj.label) ? obj.label : obj.name;
136                 fieldmapper.IDL.fmclasses[id] = obj;
137             }
138     
139         },
140     
141         /* parses the links and fields portion of the IDL */
142         _parseFields : function(node, classname) {
143             var data = [];
144             var map = {};
145     
146             var fields = dojo.query('fields',node)[0];
147             fields = dojo.query('field',fields);
148     
149             var links = dojo.query('links',node)[0];
150             if( links ) links = dojo.query('link',links);
151             else links = [];
152     
153     
154             var position = 0;
155             for(var i = 0; i < fields.length; i++) {
156                 var field = fields[i];
157                 var name = field.getAttribute('name');
158
159                 if(name == 'isnew' || name == 'ischanged' || name == 'isdeleted') 
160                     continue;
161
162                 var obj = {
163                     field : field,
164                     name        : name,
165                     label : fieldmapper._getAttributeNS(field,this.NS_REPORTS,'label'),
166                     datatype : fieldmapper._getAttributeNS(field,this.NS_REPORTS,'datatype'),
167                     primitive : fieldmapper._getAttributeNS(field,this.NS_PERSIST,'primitive'),
168                     selector : fieldmapper._getAttributeNS(field,this.NS_REPORTS,'selector'),
169                     array_position : position++,
170                     type        : 'field',
171                     virtual : (fieldmapper._getAttributeNS(fields[i],this.NS_PERSIST, 'virtual') == 'true'),
172                     required : (fieldmapper._getAttributeNS(fields[i],this.NS_OBJ, 'required') == 'true'),
173                     i18n : (fieldmapper._getAttributeNS(fields[i],this.NS_PERSIST, 'i18n') == 'true')
174                 };
175
176                 obj.label = obj.label || obj.name;
177                 obj.datatype = obj.datatype || 'text';
178
179                 window.fmclasses[classname].push(obj.name);
180     
181                 var link = null;
182                 for(var l = 0; l < links.length; l++) {
183                     if(links[l].getAttribute('field') == name) {
184                         link = links[l];
185                         break;
186                     }
187                 }
188     
189                 if(link) {
190                     obj.type = 'link';
191                     obj.key = link.getAttribute('key');
192                     obj['class'] = link.getAttribute('class');
193                     obj.reltype = link.getAttribute('reltype');
194                 } 
195     
196                 data.push(obj);
197                 map[obj.name] = obj;
198             }
199     
200             dojo.forEach(['isnew', 'ischanged', 'isdeleted'],
201                 function(name) {
202                     var obj = {
203                         name : name,
204                         array_position : position++,
205                         type : 'field',
206                         virtual : true
207                     };
208                     data.push(obj);
209                     map[obj.name] = obj;
210                 }
211             );
212
213             return { list : data, map : map };
214         }
215
216     });
217
218     fieldmapper._getAttributeNS = function (node,ns,attr) {
219         if (node.getAttributeNS) return node.getAttributeNS(ns,attr);
220         return node.getAttribute(attr);
221     };
222
223     window.fmclasses = {};
224     fieldmapper.IDL.load = function (list) { if (!list) list = []; return new fieldmapper.IDL(list); };
225     fieldmapper.IDL.loaded = false;
226
227     JSON2js.fallbackObjectifier = function (arg, key_name, val_name) {
228         console.log("Firing IDL loader for " + arg[key_name]);
229         fieldmapper.IDL.load([arg[key_name]]);
230         return decodeJS(arg);
231     }
232  
233 }
234