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