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