]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/org_unit_settings.js
Changed text in seed values to reflect addition of groups, added an update
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / admin / org_unit_settings.js
1 dojo.require('fieldmapper.AutoIDL');
2 dojo.require('dijit.layout.LayoutContainer');
3 dojo.require('dijit.layout.ContentPane');
4 dojo.require('dijit.form.FilteringSelect');
5 dojo.require('dijit.Dialog');
6 dojo.require('dijit.form.Textarea');
7 dojo.require('dijit.form.ComboBox');
8 dojo.require('dojox.grid.Grid');
9 dojo.require('fieldmapper.Fieldmapper');
10 dojo.require('fieldmapper.dojoData');
11 dojo.require('fieldmapper.OrgUtils');
12 dojo.require('dojo.cookie');
13 dojo.require('openils.CGI');
14 dojo.require('openils.User');
15 dojo.require('openils.Event');
16 dojo.require('openils.widget.OrgUnitFilteringSelect');
17 dojo.require('openils.PermaCrud');
18 dojo.require('openils.widget.AutoFieldWidget');
19 dojo.require('openils.widget.ProgressDialog');
20 dojo.require('dijit.Toolbar');
21
22 var authtoken;
23 var query;
24 var contextOrg;
25 var user;
26 var osSettings = {};
27 var ouSettingValues = {};
28 var ouSettingNames = {};
29 var ouNames = {};
30 var osEditAutoWidget;
31 var perm_codes = {};
32 var osGroups = {};
33 var searchAssist = [];
34 var pcrud;
35
36 function osInit(data) {
37     showProcessingDialog(true);
38     
39     authtoken = new openils.CGI().param('ses') || dojo.cookie('ses');
40     query = new openils.CGI().param('filter');
41     user = new openils.User({authtoken:authtoken});
42     contextOrg = user.user.ws_ou();
43     openils.User.authtoken = authtoken;
44     
45     pcrud = new openils.PermaCrud({authtoken:authtoken});
46     
47     var grps = pcrud.retrieveAll('csg');
48     dojo.forEach(grps, function(grp) { osGroups[grp.name()] = grp.label(); });
49     
50     var connect = function() { 
51         dojo.connect(contextOrg, 'onChange', osChangeContext); 
52
53         // don't draw the org settings grid unless the user has permission
54         // to view org settings in at least 1 org unit
55         osContextSelector.store.fetch({query: {}, start: 0, count: 0, 
56             onBegin: function(size) { 
57                 if(size) { osDraw();  return; }
58                 dojo.removeClass('no-perms', 'hide_me');
59             }
60         });
61         
62     };
63
64     new openils.User().buildPermOrgSelector('VIEW_ORG_SETTINGS', osContextSelector, null, connect);
65
66     fieldmapper.standardRequest(
67         [   'open-ils.actor',
68             'open-ils.actor.permissions.retrieve'],
69         {   async: true,
70             oncomplete: function(r) {
71                 var data = r.recv().content();
72                 if(e = openils.Event.parse(data))
73                     return alert(e);
74                 for(var key in data)
75                     perm_codes[data[key].id()] = data[key].code();
76             }
77         }
78     );
79     
80     var aous = pcrud.retrieveAll('aou');
81     dojo.forEach(aous, function(ou) { ouNames[ou.id()] = ou.shortname(); });
82     
83     showProcessingDialog(false);
84 }
85 dojo.addOnLoad(osInit);
86
87 function showProcessingDialog(toggle) {
88     var proc = dojo.byId('proci18n').innerHTML;
89     if(toggle)
90         progressDialog.show(true, proc);
91     else
92         progressDialog.hide();
93 }
94
95 function osDraw(specific_setting) {
96     showProcessingDialog(true);
97
98     var names = [];
99     if (specific_setting) {
100
101         for(var key in specific_setting)
102             names.push(key);
103
104     } else {
105         var types = new openils.PermaCrud({authtoken:authtoken}).retrieveAll('coust');
106
107         searchAssist =  [];
108         
109         dojo.forEach(types, 
110             function(type) {
111                 osSettings[type.name()] = {
112                     label : type.label(),
113                     desc : type.description(),
114                     type : type.datatype(),
115                     fm_class : type.fm_class(),
116                     update_perm : type.update_perm(),
117                     grp : osGroups[type.grp()]
118                 }
119                 
120                 var tmp = "" + type.label() + "" + type.description() + "" + type.fm_class() + "" + 
121                           osGroups[type.grp()] + "" + type.name();
122                 
123                 searchAssist[type.name()] = tmp.toLowerCase().replace(/[^a-z0-9]+/g, '');
124             }
125         );
126         
127         for(var key in osSettings)
128             names.push(key);
129     }
130     
131     osDrawNames(names);
132 }
133
134 //Limits those functions seen to the ones that have similar text to 
135 //that which is provided. Not case sensitive.
136 function osLimitSeen(text) {
137     showProcessingDialog(true);
138     
139     text = text.split(' ');
140     
141     for(t in text)
142         text[t] = text[t].toLowerCase().replace(/[^a-z0-9]+/g, '');
143     
144     numTerms = text.length;
145     
146     var names = [];
147     for(var n in searchAssist) {
148         var numFound = 0;
149         
150         for(var t in text) 
151             if(searchAssist[n].indexOf(text[t]) != -1)
152                 numFound++;
153                 
154         if(numFound == numTerms)
155             names.push(n);
156     }
157     
158     //Don't update on an empty list as this causes bizarre errors.
159     if(names.length == 0) {
160         showProcessingDialog(false);
161         showAlert(dojo.byId('noresults').innerHTML);
162         return;
163     }
164     
165     ouSettingValues = {}; // Clear the values.
166     osDrawNames(names); // Repopulate setting values with the ones we want.
167 }
168
169 function doSearch() {
170     var query = dojo.byId('searchBox').value;
171     
172     osLimitSeen(query);
173     
174     return false; //Keep form from submitting
175 }
176
177 function clearSearch() {
178     if(dojo.byId('searchBox').value != '') { // Don't refresh on blank.
179         dojo.byId('searchBox').value = '';
180         doSearch();
181     }
182 }
183
184 function osToJson() {
185     var out = dojo.fromJson(dojo.toJson(ouSettingValues)); // Easy deep copy
186     var context = osContextSelector.getValue();
187     
188     // Set all of the nulls in the outputs to be part of the current org
189     // this keeps from overwriting later if this file is transfered to another lib.
190     for(key in out)
191         if(out[key] == null)
192             out[key] = {'org':context, 'value':null};
193     
194     dojo.byId('jsonOutput').value = dojo.toJson(out);
195     osJSONOutDialog.show();
196 }
197
198 // Copies the text from the json output to the clipboard.
199 function osJsonOutputCopy() {
200     document.popupNode = dojo.byId('jsonOutput');
201     dojo.byId('jsonOutput').focus();
202     dojo.byId('jsonOutput').select();
203     util.clipboard.copy();
204     showAlert(dojo.byId('os-copy').innerHTML);
205 }
206
207 function osJsonInputPaste() {
208     document.popupNode = dojo.byId('jsonInput');
209     document.popupNode.focus();
210     document.popupNode.select();
211     util.clipboard.paste();
212 }
213
214 function osFromJson() {
215      dojo.byId('jsonInput').value = '';
216      osJSONInDialog.show();
217 }
218
219 function osFromJsonSubmit() {
220     var input = dojo.byId('jsonInput').value;
221     var from = dojo.fromJson(input);
222     
223     osJSONInDialog.hide();
224
225     showProcessingDialog(true);
226     for(key in from) {
227         
228         //Check that there isn't already set to the same value (speed increase);
229         if( ouSettingValues[key] == null && 
230             from[key]['value'] == null &&
231             osContextSelector.getValue() == from[key]['org'])
232             continue;
233                 
234         if( ouSettingValues[key] != null && 
235             ouSettingValues[key]['value'] == from[key]['value'] &&
236             ouSettingValues[key]['org'] == from[key]['org'])
237             continue;
238         
239         var obj = {};
240         var context;
241         
242         if(from[key] != null) { 
243             obj[key] = from[key]['value'];
244             context  = from[key]['org'];
245         }
246         
247         osUpdateSetting(obj, context);
248     }
249     showProcessingDialog(false);
250 }
251
252 //Draws the grid based upon a given array of items to draw.
253 function osDrawNames(names) {
254     fieldmapper.standardRequest(
255         [   'open-ils.actor', 
256             'open-ils.actor.ou_setting.ancestor_default.batch'],
257         {   async: true,
258             params: [contextOrg, names, authtoken],
259             oncomplete: function(r) {
260                 var data = r.recv().content();
261                 if(e = openils.Event.parse(data))
262                     return alert(e);
263                 for(var key in data)
264                     ouSettingValues[key] = data[key];
265                 osLoadGrid(ouSettingValues);
266                 
267                 showProcessingDialog(false);
268             }
269         }
270     );
271 }
272
273 function osChangeContext() {
274     if(contextOrg == osContextSelector.getValue())
275         return;
276     contextOrg = osContextSelector.getValue();
277     osDraw();
278 }
279
280 function osLoadGrid(data) {
281     var gridData = {items:[]}
282     for(var key in data) {
283         var setting = osSettings[key];
284         setting.context = null;
285         setting.value = null;
286         if(data[key]) {
287             setting.context = data[key].org;
288             setting.value = data[key].value;
289         }
290         gridData.items.push({name:key});
291     }
292     gridData.items = gridData.items.sort(
293         function(a, b) {
294             var seta = osSettings[a.name];
295             var setb = osSettings[b.name];
296             if(seta.grp + "" + seta.label > setb.grp + "" + setb.label) return 1;
297             if(seta.grp + "" + seta.label < setb.grp + "" + setb.label) return -1;
298             return 0;
299         }
300     );
301     gridData.identifier = 'name';
302     var store = new dojo.data.ItemFileReadStore({data:gridData});
303     var model = new dojox.grid.data.DojoData(
304         null, store, {rowsPerPage: 100, clientSort: true, query:{name:'*'}});
305
306     osGrid.setModel(model);
307     osGrid.setStructure(osGridLayout);
308     osGrid.update();
309 }
310
311 function osGetGridData(rowIdx) {
312     var data = this.grid.model.getRow(rowIdx);
313     if(!data) return '';
314     var setting = osSettings[data.name];
315     var value = setting[this.field];
316     if(value == null) return '';
317
318     switch(this.field) {
319         case 'context':
320             return fieldmapper.aou.findOrgUnit(value).shortname();
321         case 'label':
322             if(setting.noInherit)
323                 return value + ' *';
324             return value;
325         case 'value':
326             if(setting.fm_class) {
327                 var autoWidget = new openils.widget.AutoFieldWidget(
328                     {
329                         fmClass : setting.fm_class,
330                         selfReference : true,
331                         widgetValue : value,
332                         forceSync : true,
333                         readOnly : true
334                     }
335                 );
336                 autoWidget.build();
337                 if(autoWidget.getDisplayString())
338                     return autoWidget.getDisplayString();
339             }
340
341             if(setting.type == 'bool') {
342                 if(value) 
343                     return dojo.byId('os-true').innerHTML;
344                 return dojo.byId('os-false').innerHTML;
345             }
346         default:
347             return value;
348     }
349 }
350
351 function osGetEditLink(rowIdx) {
352     var data = this.grid.model.getRow(rowIdx);
353     if(!data) return '';
354     return data.name;
355 }
356
357 function osFormatEditLink(name) {
358     return this.value.replace(/SETTING/g, name);
359 }
360
361 function osLaunchEditor(name) {
362     osEditDialog._osattr = name;
363     osEditDialog.show();
364     var perms = ['UPDATE_ORG_UNIT_SETTING_ALL'];
365     if(osSettings[name].update_perm && perm_codes[osSettings[name].update_perm]) {
366         perms.push(perm_codes[osSettings[name].update_perm]);
367     }
368     user.buildPermOrgSelector(
369         perms,
370         osEditContextSelector, osSettings[name].context
371     );
372     dojo.byId('os-edit-name').innerHTML = osSettings[name].label;
373     dojo.byId('os-edit-desc').innerHTML = osSettings[name].desc || '';
374
375     dojo.style(osEditTextBox.domNode, 'display', 'none');
376     dojo.style(osEditCurrencyTextBox.domNode, 'display', 'none');
377     dojo.style(osEditNumberTextBox.domNode, 'display', 'none');
378     dojo.style(osEditBoolSelect.domNode, 'display', 'none');
379
380     var fmClass = osSettings[name].fm_class;
381
382     if(fmClass) {
383
384         if(osEditAutoWidget) {
385             osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
386             osEditAutoWidget.destroy();
387         }
388
389         var autoWidget = new openils.widget.AutoFieldWidget(
390             {
391                 fmClass : fmClass,
392                 selfReference : true,
393                 parentNode : dojo.create('div', null, dojo.byId('os-edit-auto-widget')),
394                 widgetValue : osSettings[name].value
395             }
396         );
397         autoWidget.build(
398             function(w) {
399                 osEditAutoWidget = w;
400             }
401         );
402
403     } else {
404         var widget;
405         switch(osSettings[name].type) {
406             case 'number':
407                 widget = osEditNumberTextBox; 
408                 break;
409             case 'currency':
410                 widget = osEditCurrencyTextBox; 
411                 break;
412             case 'bool':
413                 widget = osEditBoolSelect; 
414                 break;
415             default:
416                 widget = osEditTextBox;
417         }
418
419         dojo.style(widget.domNode, 'display', 'block');
420         widget.setValue(osSettings[name].value);
421     }
422 }
423
424 function osEditSetting(deleteMe) {
425     osEditDialog.hide();
426     var name = osEditDialog._osattr;
427
428     var obj = {};
429     if(deleteMe) {
430         obj[name] = null;
431
432     } else {
433
434         if(osSettings[name].fm_class) {
435             var val = osEditAutoWidget.attr('value');
436             osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
437             osEditAutoWidget.destroy();
438             osEditAutoWidget = null;
439             if(val == null || val == '') return;
440             obj[name] = val;
441
442         } else {
443             switch(osSettings[name].type) {
444                 case 'number':
445                     obj[name] = osEditNumberTextBox.getValue();
446                     if(obj[name] == null) return;
447                     break;
448                 case 'currency':
449                     obj[name] = osEditCurrencyTextBox.getValue();
450                     if(obj[name] == null) return;
451                     break;
452                 case 'bool':
453                     var val = osEditBoolSelect.getValue();
454                     obj[name] = (val == 'true') ? true : false;
455                     break;
456                 default:
457                     obj[name] = osEditTextBox.getValue();
458                     if(obj[name] == null) return;
459             }
460         }
461     }
462     osUpdateSetting(obj, osEditContextSelector.getValue(), name);
463 }
464
465 function osUpdateSetting(obj, context, name) {
466     fieldmapper.standardRequest(
467         ['open-ils.actor', 'open-ils.actor.org_unit.settings.update'],
468         {   async: true,
469             params: [authtoken, context, obj],
470             oncomplete: function(r) {
471                 var res = r.recv().content();
472                 if(e = openils.Event.parse(res))
473                     return alert(e);
474                 osDraw(obj);
475             }
476         }
477     );
478 }
479
480 function osGetHistoryLink(rowIdx) {
481     var data = this.grid.model.getRow(rowIdx);
482     if(!data) return '';
483     return data.name;
484 }
485
486 function osFormatHistoryLink(name) {
487     return this.value.replace(/SETTING/, name);
488 }
489
490 function osLaunchHistory(name) {
491     showProcessingDialog(true);
492     
493     dojo.byId('osHistName').innerHTML = osSettings[name].label;
494     
495     var data = dojo.byId('histTitle').innerHTML;
496     var thisHist = pcrud.search('coustl', {'field_name':name});
497     for(var i in thisHist) {
498          data += "<tr><td>" + thisHist[i].date_applied() + "</td><td>" + 
499          ouNames[thisHist[i].org()] + "</td><td>" + thisHist[i].original_value() +
500          "</td><td>" + thisHist[i].new_value() + "</td></tr>";
501     }
502         
503     dojo.byId('historyData').innerHTML = data;
504     
505     showProcessingDialog(false);
506     osHistDialog.show();
507
508 }
509
510 function showAlert(message, timeout) {
511      if(timeout == null)
512         timeout = 3000;
513         
514     dojo.removeClass('msgCont', 'hidden');
515     
516     dojo.byId('msgInner').innerHTML = message;
517     
518     var fadeArgs = { node: "msgCont" };
519     dojo.fadeIn(fadeArgs).play();
520     
521     window.setTimeout('hideAlert()', timeout);
522     
523 }
524
525 function hideAlert() {
526     var fadeArgs = { node: "msgCont" };
527     dojo.fadeOut(fadeArgs).play();
528     dojo.addClass('msgCont', 'hidden');
529 }