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