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