]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/org_unit_settings.js
Merge branch 'master' of git.evergreen-ils.org:Evergreen into template-toolkit-opac...
[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
27 function osInit(data) {
28     authtoken = new openils.CGI().param('ses') || dojo.cookie('ses');
29     user = new openils.User({authtoken:authtoken});
30     contextOrg = user.user.ws_ou();
31     openils.User.authtoken = authtoken;
32
33     var connect = function() { 
34         dojo.connect(contextOrg, 'onChange', osChangeContext); 
35
36         // don't draw the org settings grid unless the user has permission
37         // to view org settings in at least 1 org unit
38         osContextSelector.store.fetch({query: {}, start: 0, count: 0, 
39             onBegin: function(size) { 
40                 if(size) { osDraw();  return; }
41                 dojo.removeClass('no-perms', 'hide_me');
42             }
43         });
44     };
45
46     new openils.User().buildPermOrgSelector('VIEW_ORG_SETTINGS', osContextSelector, null, connect);
47
48     fieldmapper.standardRequest(
49         [   'open-ils.actor',
50             'open-ils.actor.permissions.retrieve'],
51         {   async: true,
52             oncomplete: function(r) {
53                 var data = r.recv().content();
54                 if(e = openils.Event.parse(data))
55                     return alert(e);
56                 for(var key in data)
57                     perm_codes[data[key].id()] = data[key].code();
58             }
59         }
60     );
61 }
62 dojo.addOnLoad(osInit);
63
64 function osDraw(specific_setting) {
65     progressDialog.show(true, "Processing..."); /* FIXME: I18N */
66
67     var names = [];
68     if (specific_setting) {
69
70         for(var key in specific_setting)
71             names.push(key);
72
73     } else {
74
75         var types = new openils.PermaCrud({authtoken:authtoken}).retrieveAll('coust');
76
77         dojo.forEach(types, 
78             function(type) {
79                 osSettings[type.name()] = {
80                     label : type.label(),
81                     desc : type.description(),
82                     type : type.datatype(),
83                     fm_class : type.fm_class(),
84                     update_perm : type.update_perm()
85                 }
86             }
87         );
88         
89         for(var key in osSettings)
90             names.push(key);
91     }
92
93     fieldmapper.standardRequest(
94         [   'open-ils.actor', 
95             'open-ils.actor.ou_setting.ancestor_default.batch'],
96         {   async: true,
97             params: [contextOrg, names, authtoken],
98             oncomplete: function(r) {
99                 var data = r.recv().content();
100                 if(e = openils.Event.parse(data))
101                     return alert(e);
102                 for(var key in data)
103                     ouSettingValues[key] = data[key];
104                 osLoadGrid(ouSettingValues);
105                 progressDialog.hide();
106             }
107         }
108     );
109 }
110
111 function osChangeContext() {
112     if(contextOrg == osContextSelector.getValue())
113         return;
114     contextOrg = osContextSelector.getValue();
115     osDraw();
116 }
117
118 function osLoadGrid(data) {
119     var gridData = {items:[]}
120     for(var key in data) {
121         var setting = osSettings[key];
122         setting.context = null;
123         setting.value = null;
124         if(data[key]) {
125             setting.context = data[key].org;
126             setting.value = data[key].value;
127         }
128         gridData.items.push({name:key});
129     }
130     gridData.items = gridData.items.sort(
131         function(a, b) {
132             var seta = osSettings[a.name];
133             var setb = osSettings[b.name];
134             if(seta.label > setb.label) return 1;
135             if(seta.label < setb.label) return -1;
136             return 0;
137         }
138     );
139     gridData.identifier = 'name';
140     var store = new dojo.data.ItemFileReadStore({data:gridData});
141     var model = new dojox.grid.data.DojoData(
142         null, store, {rowsPerPage: 100, clientSort: true, query:{name:'*'}});
143
144     osGrid.setModel(model);
145     osGrid.setStructure(osGridLayout);
146     osGrid.update();
147 }
148
149 function osGetGridData(rowIdx) {
150     var data = this.grid.model.getRow(rowIdx);
151     if(!data) return '';
152     var setting = osSettings[data.name];
153     var value = setting[this.field];
154     if(value == null) return '';
155
156     switch(this.field) {
157         case 'context':
158             return fieldmapper.aou.findOrgUnit(value).shortname();
159         case 'label':
160             if(setting.noInherit)
161                 return value + ' *';
162             return value;
163         case 'value':
164             if(setting.fm_class) {
165                 var autoWidget = new openils.widget.AutoFieldWidget(
166                     {
167                         fmClass : setting.fm_class,
168                         selfReference : true,
169                         widgetValue : value,
170                         forceSync : true,
171                         readOnly : true
172                     }
173                 );
174                 autoWidget.build();
175                 if(autoWidget.getDisplayString())
176                     return autoWidget.getDisplayString();
177             }
178
179             if(setting.type == 'bool') {
180                 if(value) 
181                     return dojo.byId('os-true').innerHTML;
182                 return dojo.byId('os-false').innerHTML;
183             }
184         default:
185             return value;
186     }
187 }
188
189 function osGetEditLink(rowIdx) {
190     var data = this.grid.model.getRow(rowIdx);
191     if(!data) return '';
192     return data.name;
193 }
194
195 function osFormatEditLink(name) {
196     return this.value.replace(/SETTING/, name);
197 }
198
199 function osLaunchEditor(name) {
200     osEditDialog._osattr = name;
201     osEditDialog.show();
202     var perms = ['UPDATE_ORG_UNIT_SETTING_ALL'];
203     if(osSettings[name].update_perm && perm_codes[osSettings[name].update_perm]) {
204         perms.push(perm_codes[osSettings[name].update_perm]);
205     }
206     user.buildPermOrgSelector(
207         perms,
208         osEditContextSelector, osSettings[name].context
209     );
210     dojo.byId('os-edit-name').innerHTML = osSettings[name].label;
211     dojo.byId('os-edit-desc').innerHTML = osSettings[name].desc || '';
212
213     dojo.style(osEditTextBox.domNode, 'display', 'none');
214     dojo.style(osEditCurrencyTextBox.domNode, 'display', 'none');
215     dojo.style(osEditNumberTextBox.domNode, 'display', 'none');
216     dojo.style(osEditBoolSelect.domNode, 'display', 'none');
217
218     var fmClass = osSettings[name].fm_class;
219
220     if(fmClass) {
221
222         if(osEditAutoWidget) {
223             osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
224             osEditAutoWidget.destroy();
225         }
226
227         var autoWidget = new openils.widget.AutoFieldWidget(
228             {
229                 fmClass : fmClass,
230                 selfReference : true,
231                 parentNode : dojo.create('div', null, dojo.byId('os-edit-auto-widget')),
232                 widgetValue : osSettings[name].value
233             }
234         );
235         autoWidget.build(
236             function(w) {
237                 osEditAutoWidget = w;
238             }
239         );
240
241     } else {
242         var widget;
243         switch(osSettings[name].type) {
244             case 'number':
245                 widget = osEditNumberTextBox; 
246                 break;
247             case 'currency':
248                 widget = osEditCurrencyTextBox; 
249                 break;
250             case 'bool':
251                 widget = osEditBoolSelect; 
252                 break;
253             default:
254                 widget = osEditTextBox;
255         }
256
257         dojo.style(widget.domNode, 'display', 'block');
258         widget.setValue(osSettings[name].value);
259     }
260 }
261
262 function osEditSetting(deleteMe) {
263     osEditDialog.hide();
264     var name = osEditDialog._osattr;
265
266     var obj = {};
267     if(deleteMe) {
268         obj[name] = null;
269
270     } else {
271
272         if(osSettings[name].fm_class) {
273             var val = osEditAutoWidget.attr('value');
274             osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
275             osEditAutoWidget.destroy();
276             osEditAutoWidget = null;
277             if(val == null || val == '') return;
278             obj[name] = val;
279
280         } else {
281             switch(osSettings[name].type) {
282                 case 'number':
283                     obj[name] = osEditNumberTextBox.getValue();
284                     if(obj[name] == null) return;
285                     break;
286                 case 'currency':
287                     obj[name] = osEditCurrencyTextBox.getValue();
288                     if(obj[name] == null) return;
289                     break;
290                 case 'bool':
291                     var val = osEditBoolSelect.getValue();
292                     obj[name] = (val == 'true') ? true : false;
293                     break;
294                 default:
295                     obj[name] = osEditTextBox.getValue();
296                     if(obj[name] == null) return;
297             }
298         }
299     }
300
301     fieldmapper.standardRequest(
302         ['open-ils.actor', 'open-ils.actor.org_unit.settings.update'],
303         {   async: true,
304             params: [authtoken, osEditContextSelector.getValue(), obj],
305             oncomplete: function(r) {
306                 var res = r.recv().content();
307                 if(e = openils.Event.parse(res))
308                     return alert(e);
309                 osDraw(obj);
310             }
311         }
312     );
313 }
314