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