]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/org_unit_settings.js
e7e7243a43a4959f62cc8adaa4b234ff7aa2bbff
[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 insertTreePath(target,newPath,ifield,cfield) {
99     var newTop = newPath.shift();
100     var child = newPath[0];
101
102     var subtarget = dojo.filter(target[cfield](), function (tc) {return tc[ifield]() == child[ifield]()});
103
104     if (subtarget.length == 0) {
105         target[cfield]().push(child);
106         subtarget = [child];
107     }
108
109     if (newPath.length > 1) insertTreePath(subtarget[0],newPath,ifield,cfield);
110 }
111
112 function flattenTree(tree,cfield,sort_field,kill_kids,list) {
113     if (!list) list = [];
114     list.push(tree);
115
116     var kids = tree[cfield]();
117     if (sort_field) kids = kids.sort(function (a,b) { return a[sort_field]() > b[sort_field]() });
118
119     dojo.forEach(kids, function (c) { return flattenTree(c,cfield,sort_field,kill_kids,list) });
120
121     if (kill_kids) tree[cfield]([]);
122     return list;
123 }
124
125 function buildMergedOrgSelector(orgList) {
126     var orgTree;
127     for(var i = 0; i < orgList.length; i++) {
128         // add the work org path
129         var node = fieldmapper.aou.findOrgUnit(orgList[i]).clone();
130         node.children([]);
131
132         var path = [node];
133         while(node.parent_ou() != null) {
134             node = fieldmapper.aou.findOrgUnit(node.parent_ou()).clone();
135             node.children([]);
136             path.push(node);
137         }
138
139         if (!orgTree) orgTree = path[0];
140         insertTreePath(orgTree, path.reverse(), 'id', 'children');
141
142     }
143
144     var store = new dojo.data.ItemFileReadStore({data:aou.toStoreData(flattenTree(orgTree, 'children', 'shortname', true))});
145     osContextSelector.store = store;
146     osContextSelector.startup();
147     osContextSelector.setValue(user.user.ws_ou());
148 }
149
150 function osChangeContext() {
151     if(contextOrg == osContextSelector.getValue())
152         return;
153     contextOrg = osContextSelector.getValue();
154     osDraw();
155 }
156
157 function osLoadGrid(data) {
158     var gridData = {items:[]}
159     for(var key in data) {
160         var setting = osSettings[key];
161         setting.context = null;
162         setting.value = null;
163         if(data[key]) {
164             setting.context = data[key].org;
165             setting.value = data[key].value;
166         }
167         gridData.items.push({name:key});
168     }
169     gridData.items = gridData.items.sort(
170         function(a, b) {
171             var seta = osSettings[a.name];
172             var setb = osSettings[b.name];
173             if(seta.label > setb.label) return 1;
174             if(seta.label < setb.label) return -1;
175             return 0;
176         }
177     );
178     gridData.identifier = 'name';
179     var store = new dojo.data.ItemFileReadStore({data:gridData});
180     var model = new dojox.grid.data.DojoData(
181         null, store, {rowsPerPage: 100, clientSort: true, query:{name:'*'}});
182
183     osGrid.setModel(model);
184     osGrid.setStructure(osGridLayout);
185     osGrid.update();
186 }
187
188 function osGetGridData(rowIdx) {
189     var data = this.grid.model.getRow(rowIdx);
190     if(!data) return '';
191     var setting = osSettings[data.name];
192     var value = setting[this.field];
193     if(value == null) return '';
194
195     switch(this.field) {
196         case 'context':
197             return fieldmapper.aou.findOrgUnit(value).shortname();
198         case 'label':
199             if(setting.noInherit)
200                 return value + ' *';
201             return value;
202         case 'value':
203             if(setting.fm_class) {
204                 var autoWidget = new openils.widget.AutoFieldWidget(
205                     {
206                         fmClass : setting.fm_class,
207                         selfReference : true,
208                         widgetValue : value,
209                         forceSync : true,
210                         readOnly : true
211                     }
212                 );
213                 autoWidget.build();
214                 if(autoWidget.getDisplayString())
215                     return autoWidget.getDisplayString();
216             }
217
218             if(setting.type == 'bool') {
219                 if(value) 
220                     return dojo.byId('os-true').innerHTML;
221                 return dojo.byId('os-false').innerHTML;
222             }
223         default:
224             return value;
225     }
226 }
227
228 function osGetEditLink(rowIdx) {
229     var data = this.grid.model.getRow(rowIdx);
230     if(!data) return '';
231     return data.name;
232 }
233
234 function osFormatEditLink(name) {
235     return this.value.replace(/SETTING/, name);
236 }
237
238 function osLaunchEditor(name) {
239     osEditDialog._osattr = name;
240     osEditDialog.show();
241     user.buildPermOrgSelector(
242         ['UPDATE_ORG_UNIT_SETTING.' + name, 'UPDATE_ORG_UNIT_SETTING_ALL'],
243         osEditContextSelector, osSettings[name].context
244     );
245     dojo.byId('os-edit-name').innerHTML = osSettings[name].label;
246     dojo.byId('os-edit-desc').innerHTML = osSettings[name].desc || '';
247
248     dojo.style(osEditTextBox.domNode, 'display', 'none');
249     dojo.style(osEditCurrencyTextBox.domNode, 'display', 'none');
250     dojo.style(osEditNumberTextBox.domNode, 'display', 'none');
251     dojo.style(osEditBoolSelect.domNode, 'display', 'none');
252
253     var fmClass = osSettings[name].fm_class;
254
255     if(fmClass) {
256
257         if(osEditAutoWidget) {
258             osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
259             osEditAutoWidget.destroy();
260         }
261
262         var autoWidget = new openils.widget.AutoFieldWidget(
263             {
264                 fmClass : fmClass,
265                 selfReference : true,
266                 parentNode : dojo.create('div', null, dojo.byId('os-edit-auto-widget')),
267                 widgetValue : osSettings[name].value
268             }
269         );
270         autoWidget.build(
271             function(w) {
272                 osEditAutoWidget = w;
273             }
274         );
275
276     } else {
277         var widget;
278         switch(osSettings[name].type) {
279             case 'number':
280                 widget = osEditNumberTextBox; 
281                 break;
282             case 'currency':
283                 widget = osEditCurrencyTextBox; 
284                 break;
285             case 'bool':
286                 widget = osEditBoolSelect; 
287                 break;
288             default:
289                 widget = osEditTextBox;
290         }
291
292         dojo.style(widget.domNode, 'display', 'block');
293         widget.setValue(osSettings[name].value);
294     }
295 }
296
297 function osEditSetting(deleteMe) {
298     osEditDialog.hide();
299     var name = osEditDialog._osattr;
300
301     var obj = {};
302     if(deleteMe) {
303         obj[name] = null;
304
305     } else {
306
307         if(osSettings[name].fm_class) {
308             var val = osEditAutoWidget.attr('value');
309             osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
310             osEditAutoWidget.destroy();
311             osEditAutoWidget = null;
312             if(val == null || val == '') return;
313             obj[name] = val;
314
315         } else {
316             switch(osSettings[name].type) {
317                 case 'number':
318                     obj[name] = osEditNumberTextBox.getValue();
319                     if(obj[name] == null) return;
320                     break;
321                 case 'currency':
322                     obj[name] = osEditCurrencyTextBox.getValue();
323                     if(obj[name] == null) return;
324                     break;
325                 case 'bool':
326                     var val = osEditBoolSelect.getValue();
327                     obj[name] = (val == 'true') ? true : false;
328                     break;
329                 default:
330                     obj[name] = osEditTextBox.getValue();
331                     if(obj[name] == null) return;
332             }
333         }
334     }
335
336     fieldmapper.standardRequest(
337         ['open-ils.actor', 'open-ils.actor.org_unit.settings.update'],
338         {   async: true,
339             params: [authtoken, osEditContextSelector.getValue(), obj],
340             oncomplete: function(r) {
341                 var res = r.recv().content();
342                 if(e = openils.Event.parse(res))
343                     return alert(e);
344                 osDraw(obj);
345             }
346         }
347     );
348 }
349