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