]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/reports/xul/source-setup.js
Make it possible to suppress IDL fields
[working/Evergreen.git] / Open-ILS / web / reports / xul / source-setup.js
1 dojo.requireLocalization("openils.reports", "reports");
2 dojo.require('openils.XUL');
3
4 var rpt_strings = dojo.i18n.getLocalization("openils.reports", "reports");
5 var idlNS       = "http://opensrf.org/spec/IDL/base/v1";
6 var persistNS   = "http://open-ils.org/spec/opensrf/IDL/persistence/v1";
7 var objNS       = "http://open-ils.org/spec/opensrf/IDL/objects/v1";
8 var rptNS       = "http://open-ils.org/spec/opensrf/IDL/reporter/v1";
9 var gwNS        = "http://opensrf.org/-/namespaces/gateway/v1";
10 var xulNS       = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
11
12 var oilsIDL;
13 var rpt_rel_cache = {};
14
15 function sortHashLabels (a,b) { return a.label.toLowerCase() < b.label.toLowerCase() ? -1 : 1; }
16
17 function sortNames (a,b) {
18         var aname =  a.name.toLowerCase();
19         if (!aname) aname = a.idlclass.toLowerCase();
20
21         var bname =  b.name.toLowerCase();
22         if (!bname) bname = b.idlclass.toLowerCase();
23
24         return aname < bname ? -1 : 1;
25 }
26
27 function sortLabels (a,b) {
28         var aname =  a.getAttributeNS(rptNS, 'label');
29
30         if (aname) {
31                 aname = aname.toLowerCase();
32         } else {
33                 aname = a.getAttribute('name') || a.getAttribute('id');
34         }
35
36         var bname =  b.getAttributeNS(rptNS, 'label');
37
38         if (bname) {
39                 bname = bname.toLowerCase();
40         } else {
41                 bname = b.getAttribute('name') || b.getAttribute('id');
42         }
43
44         return aname < bname ? -1 : 1;
45 }
46
47
48 function loadTemplate(id) {
49         var cgi = new CGI();
50         var session = cgi.param('ses');
51     if(!session && openils.XUL.isXUL()) {
52         var stash = openils.XUL.getStash();
53         session = stash.session.key;
54     }
55         var r = new Request('open-ils.reporter:open-ils.reporter.template.retrieve', session, id);
56
57         r.callback(
58                 function(res) {
59                         var tmpl = res.getResultObject();
60                         var template = JSON2js( tmpl.data() );
61
62                         resetUI( template.core_class );
63
64                         $('template-name').value = tmpl.name() + ' (clone)';
65                         $('template-description').value = tmpl.description();
66
67                         rpt_rel_cache = template.rel_cache;
68                         renderSources();
69                 }
70         );
71
72         r.send();
73 }
74
75
76 function loadIDL() {
77         var req = new XMLHttpRequest();
78         req.open('GET', '../fm_IDL.xml', true);
79         req.onreadystatechange = function() {
80                 if( req.readyState == 4 ) {
81                         oilsIDL = req.responseXML;
82                         populateSourcesMenu(
83                                 filterByAttributeNS( oilsIDL.getElementsByTagName('class'), rptNS, 'core', 'true' )
84                         );
85
86                         var cgi = new CGI();
87                         var template_id = cgi.param('ct');
88                         if (template_id) loadTemplate(template_id);
89                 }
90         }
91         req.send(null);
92
93 }
94
95 function getIDLClass (id) { return filterByAttribute( oilsIDL.getElementsByTagName('class'), 'id', id )[0] }
96 function getIDLField (classNode,field) { return filterByAttribute( classNode.getElementsByTagName('field'), 'name', field )[0] }
97 function getIDLLink (classNode,field) { return filterByAttribute( classNode.getElementsByTagName('link'), 'field', field )[0] }
98
99 function resetUI (idlclass) {
100         if (getKeys(rpt_rel_cache).length > 0) {
101                 if (!confirm( rpt_strings.SOURCE_SETUP_CONFIRM_EXIT)) return false;
102         }
103
104         rpt_rel_cache = {};
105         try { renderSources(); } catch (e) {}
106
107         populateSourcesTree( idlclass );
108
109         var tree = $('sources-treetop').parentNode;
110         tree.focus();
111         tree.view.selection.select(0);
112         tree.click();
113 }
114
115 function populateSourcesMenu (classList) {
116         classList.sort( sortLabels );
117
118         var menu = $('source-menu');
119
120         menu.appendChild(
121                 createMenuItem(
122                         { label : rpt_strings.SOURCE_SETUP_CORE_SOURCES,
123                           disabled : 'true',
124                           style : 'color: black; text-decoration: underline;'
125                         }
126                 )
127         );
128
129
130         for (var i in classList) {
131
132                 var name = classList[i].getAttributeNS(rptNS,'label');
133                 var id = classList[i].getAttribute('id');
134                 if (!name) name = id;
135
136                 menu.appendChild(
137                         createMenuItem(
138                                 { container : 'true',
139                                   idlclass : id,
140                                   label : name,
141                                   onmouseup : 'resetUI( "' + id + '");'
142                                 }
143                         )
144                 );
145
146         }
147
148         menu.appendChild( createMenuSeparator() );
149
150         var _m = createMenu(
151                 { label : rpt_strings.SOURCE_SETUP_ALL_AVAIL_SOURCES },
152                 createMenuPopup(
153                         {},
154                         createMenuItem(
155                                 { label : rpt_strings.SOURCE_SETUP_ALL_AVAIL_SOURCES,
156                                   disabled : 'true',
157                                   style : 'color: black; '
158                                 }
159                         ),
160                         createMenuSeparator()
161                 )
162         );
163
164         menu.appendChild( _m );
165         menu = _m.firstChild;
166
167         var all = map(function(x){return x;}, oilsIDL.getElementsByTagNameNS(idlNS,'class'));
168         all.sort( sortLabels );
169
170         for (var i = 0; i < all.length; i++) {
171
172                 if (all[i].getAttributeNS(persistNS,'virtual') == 'true') continue;
173
174                 var name = all[i].getAttributeNS(rptNS,'label');
175                 var id = all[i].getAttribute('id');
176                 if (!name) name = id;
177
178                 menu.appendChild(
179                         createMenuItem(
180                                 { container : 'true',
181                                   idlclass : id,
182                                   label : name,
183                                   onmouseup : 'resetUI( "' + id + '");'
184                                 }
185                         )
186                 );
187
188         }
189
190
191 }
192
193 function populateSourcesTree (idlclass) {
194
195         var tcNode = $('sources-treetop');
196         while (tcNode.childNodes.length) tcNode.removeChild(tcNode.lastChild);
197
198         var c = getIDLClass( idlclass );
199         var name = c.getAttributeNS(rptNS,'label');
200         if (!name) name = idlclass;
201
202         tcNode.appendChild(
203                 createTreeItem(
204                         { container : 'true',
205                           idlclass : idlclass,
206                           fullpath : idlclass
207                         },
208                         createTreeRow(
209                                 { },
210                                 createTreeCell( { label : '' } ),
211                                 createTreeCell( { label : name } )
212                         ),
213                         createTreeChildren( { alternatingbackground : true } )
214                 )
215         );
216 }
217
218 function populateSourcesSubtree (tcNode, classList) {
219         classList.sort(sortNames);
220         for (var i in classList) {
221                 var obj = classList[i];
222
223                 var p = getIDLClass( obj.idlclass );
224                 var cont = p.getElementsByTagName('link').length ? 'true' : 'false';
225
226                 tcNode.appendChild(
227                         createTreeItem(
228                                 { container : cont,
229                                   idlclass : obj.idlclass,
230                                   map : obj.map,
231                                   key : obj.key,
232                                   field : obj.field,
233                                   link : obj.link,
234                                   join : obj['join'],
235                                   reltype : obj.reltype,
236                                   fullpath : obj.fullpath
237                                 },
238                                 createTreeRow(
239                                         { },
240                                         createTreeCell( { label : obj.nullable } ),
241                                         createTreeCell( { label : obj.name } )
242                                 ),
243                                 createTreeChildren( { alternatingbackground : true } )
244                         )
245                 );
246
247
248         }
249 }
250
251 function populateDetailTree (tcNode, c, item) {
252         var fullpath = item.getAttribute('fullpath');
253         var reltype = item.getAttribute('reltype');
254
255         var fields = nodelistToArray(c.getElementsByTagName('field'));
256         fields.sort( sortLabels );
257
258         var id = c.getAttribute('id');
259         var path_label = [];
260
261         var steps = fullpath.split('.');
262         for (var k in steps) {
263
264                 if (!steps[k]) continue;
265
266                 var atom = steps[k].split('-');
267                 var classNode = getIDLClass(atom[0]);
268
269                 var _cname = classNode.getAttributeNS(rptNS, 'label');
270                 if (!_cname) _cname = classNode.getAttribute('id');
271
272                 var _label = _cname; 
273
274                 if (atom.length > 1 && k == steps.length - 1) {
275                         var field_name = atom[1];
276                         var join_type = field_name;
277
278                         field_name = field_name.split(/>/)[0];
279                         join_type = join_type.split(/>/)[1];
280
281                         var _f = getIDLField(classNode, field_name);
282                         var _fname = _f.getAttributeNS(rptNS, 'label');
283                         if (!_fname) _fname = _f.getAttribute('name');
284                         if (_fname) _label += ' :: ' + _fname; 
285                         if (join_type) _label += ' (' + join_type + ')'; 
286
287                 } else if (atom[1]) {
288                         var field_name = atom[1];
289                         var join_type = field_name;
290
291                         switch (join_type) {
292                                 case 'right':
293                                         _label += ' (' + rpt_strings.LINK_NULLABLE_RIGHT + ')'; 
294                                         break;
295                                 case 'left':
296                                         _label += ' (' + rpt_strings.LINK_NULLABLE_LEFT + ')'; 
297                                         break;
298                                 case 'inner':
299                                         _label += ' (' + rpt_strings.LINK_NULLABLE_NONE + ')'; 
300                                         break;
301                         }
302                 }
303
304                 path_label.push(_label); 
305         }
306
307         $('path-label').value = path_label.join(' -> ');
308         $('path-label').setAttribute('reltype',reltype);
309
310         for (var i in fields) {
311
312                 var type = fields[i].getAttributeNS(rptNS, 'datatype');
313                 //if (!type) type = 'text';
314
315                 var suppress = fields[i].getAttribute('suppress_controller');
316                 if (suppress && suppress.indexOf('open-ils.reporter-store') > -1) continue;
317
318                 var label = fields[i].getAttributeNS(rptNS, 'label');
319                 var name = fields[i].getAttribute('name');
320                 if (!label) label = name;
321
322                 tcNode.appendChild(
323                         createTreeItem(
324                                 { idlclass : id,
325                                   idlfield : name,
326                                   datatype : type,
327                                   fullpath : fullpath
328                                 },
329                                 createTreeRow(
330                                         { },
331                                         createTreeCell( { label : label } ),
332                                         createTreeCell( { label : type } )
333                                 )
334                         )
335                 );
336         }
337 }
338
339