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, {
7 _URL_PATH : '/reports/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',
12 constructor : function(classlist) {
15 if (window._preload_fieldmapper_IDL) {
16 if (!fieldmapper.IDL.fmclasses) fieldmapper.IDL.fmclasses = {};
17 if (!window.fmclasses) window.fmclasses = {};
19 for (var c in window._preload_fieldmapper_IDL) {
21 fieldmapper.IDL.fmclasses[c] = window._preload_fieldmapper_IDL[c];
23 if (!fieldmapper.IDL.fmclasses[c].label) {
24 fieldmapper.IDL.fmclasses[c].label =
25 fieldmapper.IDL.fmclasses[c].name;
28 window.fmclasses[c] = [];
29 dojo.forEach(fieldmapper.IDL.fmclasses[c].fields, function(obj){
30 if (!obj.label) obj.label = obj.name;
31 window.fmclasses[c].push(obj.name);
34 if (classlist && classlist.length)
35 classlist = dojo.filter(classlist, function(x){return x != c;});
38 fieldmapper.IDL.loaded = true;
39 window._preload_fieldmapper_IDL = null;
42 if(!fieldmapper.IDL.fmclasses ||
43 !Object.keys(fieldmapper.IDL.fmclasses).length ||
44 (classlist && classlist.length)) {
46 var idl_url = this._URL_PATH;
48 if (classlist.length && (classlist.length > 1 || classlist[0] != '*')) {
51 for (var i = 0; i < classlist.length; i++) {
52 var trim_class = classlist[i];
53 if (!trim_class) continue;
54 if (fieldmapper.IDL.fmclasses && fieldmapper.IDL.fmclasses[trim_class]) continue;
56 if (i > 0) idl_url += '&';
57 idl_url += 'class=' + trim_class;
61 if( !idl_url.match(/\?$/) ) { // make sure we have classes that need loading
69 headers : {"Accept-Language": OpenSRF.locale},
70 load : function (response) {
71 self._parse(response);
72 fieldmapper.IDL.loaded = true;
74 error : function (response) {
75 fieldmapper.IDL.loaded = false;
76 dojo.require('fieldmapper.fmall', true);
81 dojo.require('fieldmapper.Fieldmapper');
84 dojo.forEach( classlist, function (c) { fieldmapper.vivicateClass(c); } );
86 if (classlist && classlist.length)
87 dojo.forEach( classlist, function (c) { fieldmapper.vivicateClass(c); } );
90 _parse : function(xmlNode) {
91 var classes = dojo.query('class',xmlNode);
92 if (!fieldmapper.IDL || !fieldmapper.IDL.fmclasses)
93 fieldmapper.IDL.fmclasses = {};
95 for(var i = 0; i < classes.length; i++) {
96 var node = classes[i];
97 var id = node.getAttribute('id');
98 var fields = dojo.query('fields',node)[0];
99 window.fmclasses[id] = [];
101 var fieldData = this._parseFields(node, id);
104 fields : fieldData.list,
105 field_map : fieldData.map,
106 name : node.getAttribute('id'),
107 //table : fieldmapper._getAttributeNS(node,this.NS_PERSIST, 'tablename'),
108 //core : fieldmapper._getAttributeNS(node,this.NS_REPORTS, 'core'),
109 label : fieldmapper._getAttributeNS(node,this.NS_REPORTS, 'label'),
110 restrict_primary : fieldmapper._getAttributeNS(node,this.NS_PERSIST, 'restrict_primary'),
111 virtual : (fieldmapper._getAttributeNS(node,this.NS_PERSIST, 'virtual') == 'true'),
112 pkey : fieldmapper._getAttributeNS(fields,this.NS_PERSIST, 'primary'),
113 pkey_sequence : fieldmapper._getAttributeNS(fields,this.NS_PERSIST, 'sequence')
116 var valid = fieldmapper._getAttributeNS(node,this.NS_OBJ, 'validate');
117 if (valid) obj.validate = new RegExp( valid.replace(/\\/g, '\\\\') );
119 var permacrud = dojo.query('permacrud',node)[0];
121 var actions = ['create', 'retrieve', 'update', 'delete'];
123 for(var idx in actions) {
124 var action = actions[idx];
125 var pnode = dojo.query(action,permacrud)[0];
127 var permString = pnode.getAttribute('permission');
130 permList = (permString.match(/ /)) ? permString.split(' ') : [permString];
132 var contextString = pnode.getAttribute('context_field');
133 var contextList = null;
135 contextList = (contextString.match(/ /)) ? contextString.split(' ') : [contextString];
137 obj.permacrud[action] = {
139 localContextFields : contextList // need to add foreign context fields
140 }; // add more details as necessary
145 obj.core = (obj.core == 'true');
146 obj.label = (obj.label) ? obj.label : obj.name;
147 fieldmapper.IDL.fmclasses[id] = obj;
152 /* parses the links and fields portion of the IDL */
153 _parseFields : function(node, classname) {
157 var fields = dojo.query('fields',node)[0];
158 fields = dojo.query('field',fields);
160 var links = dojo.query('links',node)[0];
161 if( links ) links = dojo.query('link',links);
166 for(var i = 0; i < fields.length; i++) {
167 var field = fields[i];
168 var name = field.getAttribute('name');
170 if(name == 'isnew' || name == 'ischanged' || name == 'isdeleted')
176 label : fieldmapper._getAttributeNS(field,this.NS_REPORTS,'label'),
177 datatype : fieldmapper._getAttributeNS(field,this.NS_REPORTS,'datatype'),
178 primitive : fieldmapper._getAttributeNS(field,this.NS_PERSIST,'primitive'),
179 selector : fieldmapper._getAttributeNS(field,this.NS_REPORTS,'selector'),
180 array_position : position++,
182 virtual : (fieldmapper._getAttributeNS(fields[i],this.NS_PERSIST, 'virtual') == 'true'),
183 required : (fieldmapper._getAttributeNS(fields[i],this.NS_OBJ, 'required') == 'true'),
184 i18n : (fieldmapper._getAttributeNS(fields[i],this.NS_PERSIST, 'i18n') == 'true')
187 obj.label = obj.label || obj.name;
188 obj.datatype = obj.datatype || 'text';
190 window.fmclasses[classname].push(obj.name);
193 for(var l = 0; l < links.length; l++) {
194 if(links[l].getAttribute('field') == name) {
202 obj.key = link.getAttribute('key');
203 obj['class'] = link.getAttribute('class');
204 obj.reltype = link.getAttribute('reltype');
211 dojo.forEach(['isnew', 'ischanged', 'isdeleted'],
215 array_position : position++,
224 return { list : data, map : map };
229 fieldmapper._getAttributeNS = function (node,ns,attr) {
230 if (node.getAttributeNS) return node.getAttributeNS(ns,attr);
231 return node.getAttribute(attr);
234 window.fmclasses = {};
235 fieldmapper.IDL.load = function (list) {
236 if (!list) list = [];
237 return new fieldmapper.IDL(list);
239 fieldmapper.IDL.loaded = false;
241 JSON2js.fallbackObjectifier = function (arg, key_name, val_name) {
242 console.log("Firing IDL loader for " + arg[key_name]);
243 fieldmapper.IDL.load([arg[key_name]]);
244 return decodeJS(arg);