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