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