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