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