1 if(!dojo._hasResource["fieldmapper.IDL"]) {
2 dojo.require("DojoSRF");
3 dojo.provide("fieldmapper.IDL");
4 dojo.declare('fieldmapper.IDL', null, {
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',
12 constructor : function(classlist) {
14 if(!fieldmapper.IDL.fmclasses || (classlist && classlist.length)) {
15 var idl_url = this._URL_PATH;
17 if (classlist.length) {
20 for (var i = 0; i < classlist.length; i++) {
21 var trim_class = classlist[i];
22 if (!trim_class) continue;
24 if (i > 0) idl_url += '&';
25 idl_url += 'class=' + trim_class;
28 JSON2js.fallbackObjectifier = function (arg, key_name, val_name) {
29 fieldmapper.IDL.load([arg[key_name]]);
41 load : function (response) {
42 self._parse(response);
43 fieldmapper.IDL.loaded = true;
45 error : function (response) {
46 fieldmapper.IDL.loaded = false;
47 dojo.require('fieldmapper.fmall', true);
51 dojo.require('fieldmapper.Fieldmapper');
53 if (classlist && classlist.length)
54 dojo.forEach( classlist, function (c) { fieldmapper.vivicateClass(c); } );
57 _parse : function(xmlNode) {
58 var classes = xmlNode.getElementsByTagName('class');
59 if (!fieldmapper.IDL || !fieldmapper.IDL.fmclasses)
60 fieldmapper.IDL.fmclasses = {};
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] = [];
68 var fieldData = this._parseFields(node, id);
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')
84 var valid = fieldmapper._getAttributeNS(node,this.NS_OBJ, 'validate');
85 if (valid) obj.validate = new RegExp( valid );
87 var permacrud = node.getElementsByTagName('permacrud')[0];
89 var actions = ['create', 'retrieve', 'update', 'delete'];
91 for(var idx in actions) {
92 var action = actions[idx];
93 var pnode = permacrud.getElementsByTagName(action)[0];
95 var permString = pnode.getAttribute('permission');
98 permList = (permString.match(/ /)) ? permString.split(' ') : [permString];
100 var contextString = pnode.getAttribute('context_field');
101 var contextList = null;
103 contextList = (contextString.match(/ /)) ? contextString.split(' ') : [contextString];
105 obj.permacrud[action] = {
107 localContextFields : contextList // need to add foreign context fields
108 }; // add more details as necessary
113 obj.core = (obj.core == 'true');
114 obj.label = (obj.label) ? obj.label : obj.name;
115 fieldmapper.IDL.fmclasses[id] = obj;
120 /* parses the links and fields portion of the IDL */
121 _parseFields : function(node, classname) {
125 var fields = node.getElementsByTagName('fields')[0];
126 fields = fields.getElementsByTagName('field');
128 var links = node.getElementsByTagName('links')[0];
129 if( links ) links = links.getElementsByTagName('link');
134 for(var i = 0; i < fields.length; i++) {
135 var field = fields[i];
136 var name = field.getAttribute('name');
138 if(name == 'isnew' || name == 'ischanged' || name == 'isdeleted')
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++,
150 virtual : (fieldmapper._getAttributeNS(fields[i],this.NS_PERSIST, 'virtual') == 'true')
153 obj.label = obj.label || obj.name;
154 obj.datatype = obj.datatype || 'text';
156 window.fmclasses[classname].push(obj.name);
159 for(var l = 0; l < links.length; l++) {
160 if(links[l].getAttribute('field') == name) {
168 obj.key = link.getAttribute('key');
169 obj['class'] = link.getAttribute('class');
170 obj.reltype = link.getAttribute('reltype');
177 dojo.forEach(['isnew', 'ischanged', 'isdeleted'],
181 array_position : position++,
190 return { list : data, map : map };
195 fieldmapper._getAttributeNS = function (node,ns,attr) {
196 if (node.getAttributeNS) return node.getAttributeNS(ns,attr);
197 return node.getAttribute(attr);
200 window.fmclasses = {};
201 fieldmapper.IDL.load = function (list) { if (!list) list = []; return new fieldmapper.IDL(list); };
202 fieldmapper.IDL.loaded = false;