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