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