]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/xul/staff_client/server/admin/org_unit_settings.js
better handling of sets of work_ou's. will probably shove some of this logic into...
[working/Evergreen.git] / Open-ILS / xul / staff_client / server / admin / org_unit_settings.js
1 dojo.require("dijit.layout.LayoutContainer");
2 dojo.require("dijit.layout.ContentPane");
3 dojo.require('dijit.form.FilteringSelect');
4 dojo.require('dijit.Dialog');
5 dojo.require("dojox.grid.Grid");
6 dojo.require("fieldmapper.Fieldmapper");
7 dojo.require("fieldmapper.dojoData");
8 dojo.require("fieldmapper.OrgUtils");
9 dojo.require('dojo.cookie');
10 dojo.require('openils.CGI');
11 dojo.require('openils.User');
12 dojo.require('openils.Event');
13 dojo.require('openils.widget.OrgUnitFilteringSelect');
14
15 var authtoken;
16 var contextOrg;
17 var user;
18 var workOrgs;
19
20 function osInit(data) {
21     authtoken = dojo.cookie('ses') || new openils.CGI().param('ses');
22     user = new openils.User({authtoken:authtoken});
23     contextOrg = user.user.ws_ou();
24
25     fieldmapper.standardRequest(
26         [   'open-ils.actor',
27             'open-ils.actor.user.get_work_ous.ids'],
28         {   async: true,
29             params: [authtoken],
30             oncomplete: function(r) {
31                 var list = r.recv().content();
32                 if(e = openils.Event.parse(list))
33                     return alert(e);
34                 workOrgs = list;
35                 buildMergedOrgSelector(list);
36             }
37         }
38     );
39
40     osDraw();
41 }
42 dojo.addOnLoad(osInit);
43
44 function osDraw() {
45     var names = [];
46     for(var key in osSettings)
47         names.push(key);
48
49     fieldmapper.standardRequest(
50         [   'open-ils.actor', 
51             'open-ils.actor.ou_setting.ancestor_default.batch'],
52         {   async: true,
53             params: [contextOrg, names],
54             oncomplete: function(r) {
55                 var data = r.recv().content();
56                 if(e = openils.Event.parse(data))
57                     return alert(e);
58                 osLoadGrid(data);
59             }
60         }
61     );
62 }
63
64 function buildMergedOrgSelector(orgList) {
65     var orgNodeList = [];
66     for(var i = 0; i < orgList.length; i++) {
67         // add the work org parents
68         var parents = [];
69         var node = fieldmapper.aou.findOrgUnit(orgList[i]);
70         while(node.parent_ou() != null) {
71             node = fieldmapper.aou.findOrgUnit(node.parent_ou());
72             parents.push(node);
73         }
74         orgNodeList = orgNodeList.concat(parents.reverse());
75
76         // add the work org children
77         orgNodeList = orgNodeList.concat(
78             fieldmapper.aou.descendantNodeList(orgList[i]));
79     }
80
81     var list = [];
82     dojo.forEach(orgNodeList, function(item) {
83         if(list.filter(function(i){return (i.id() == item.id())}).length == 0)
84             list.push(item);
85     });
86
87     var store = new dojo.data.ItemFileReadStore({data:aou.toStoreData(list)});
88     osContextSelector.store = store;
89     osContextSelector.startup();
90     osContextSelector.setValue(user.user.ws_ou());
91 }
92
93 function osChangeContext() {
94     if(contextOrg == osContextSelector.getValue())
95         return;
96     contextOrg = osContextSelector.getValue();
97     osDraw();
98 }
99
100 function osLoadGrid(data) {
101     var gridData = {items:[]}
102     for(var key in data) {
103         var setting = osSettings[key];
104         setting.context = null;
105         setting.value = null;
106         if(data[key]) {
107             setting.context = data[key].org;
108             setting.value = data[key].value;
109         }
110         gridData.items.push({name:key});
111     }
112     gridData.items = gridData.items.sort(
113         function(a, b) {
114             var seta = osSettings[a.name];
115             var setb = osSettings[b.name];
116             if(seta.label > setb.label) return 1;
117             if(seta.label < setb.label) return -1;
118             return 0;
119         }
120     );
121     gridData.identifier = 'name';
122     var store = new dojo.data.ItemFileReadStore({data:gridData});
123     var model = new dojox.grid.data.DojoData(
124         null, store, {rowsPerPage: 100, clientSort: true, query:{name:'*'}});
125
126     osGrid.setModel(model);
127     osGrid.setStructure(osGridLayout);
128     osGrid.update();
129 }
130
131 function osGetGridData(rowIdx) {
132     var data = this.grid.model.getRow(rowIdx);
133     if(!data) return '';
134     var setting = osSettings[data.name];
135     var value = setting[this.field];
136     if(value == null) return '';
137     switch(this.field) {
138         case 'context':
139             return fieldmapper.aou.findOrgUnit(value).shortname();
140         case 'label':
141             if(setting.noInherit)
142                 return value + ' *';
143             return value;
144         case 'value':
145             if(setting.type == 'bool') {
146                 if(value) 
147                     return dojo.byId('os-true').innerHTML;
148                 return dojo.byId('os-false').innerHTML;
149             }
150         default:
151             return value;
152     }
153 }
154
155 function osGetEditLink(rowIdx) {
156     var data = this.grid.model.getRow(rowIdx);
157     if(!data) return '';
158     return this.value.replace(/SETTING/, data.name);
159 }
160
161 function osLaunchEditor(name) {
162     osEditDialog._osattr = name;
163     osEditDialog.show();
164     user.buildPermOrgSelector(
165         ['UPDATE_ORG_UNIT_SETTING.' + name, 'UPDATE_ORG_UNIT_SETTING_ALL'],
166         osEditContextSelector, osSettings[name].context
167     );
168     dojo.byId('os-edit-name').innerHTML = osSettings[name].label;
169     dojo.byId('os-edit-desc').innerHTML = osSettings[name].desc || '';
170
171     dojo.style(osEditTextBox.domNode, 'display', 'none');
172     dojo.style(osEditCurrencyTextBox.domNode, 'display', 'none');
173     dojo.style(osEditNumberTextBox.domNode, 'display', 'none');
174     dojo.style(osEditBoolSelect.domNode, 'display', 'none');
175
176     var widget;
177     switch(osSettings[name].type) {
178         case 'number':
179             widget = osEditNumberTextBox; 
180             break;
181         case 'currency':
182             widget = osEditCurrencyTextBox; 
183             break;
184         case 'bool':
185             widget = osEditBoolSelect; 
186             break;
187         default:
188             widget = osEditTextBox;
189     }
190
191     dojo.style(widget.domNode, 'display', 'block');
192     widget.setValue(osSettings[name].value);
193 }
194
195 function osEditSetting(deleteMe) {
196     osEditDialog.hide();
197     var name = osEditDialog._osattr;
198
199     var obj = {};
200     if(deleteMe) {
201         obj[name] = null;
202
203     } else {
204
205         switch(osSettings[name].type) {
206             case 'number':
207                 obj[name] = osEditNumberTextBox.getValue();
208                 if(obj[name] == null) return;
209                 break;
210             case 'currency':
211                 obj[name] = osEditCurrencyTextBox.getValue();
212                 if(obj[name] == null) return;
213                 break;
214             case 'bool':
215                 var val = osEditBoolSelect.getValue();
216                 obj[name] = (val == 'true') ? true : false;
217                 break;
218             default:
219                 obj[name] = osEditTextBox.getValue();
220                 if(obj[name] == null) return;
221         }
222     }
223
224     fieldmapper.standardRequest(
225         ['open-ils.actor', 'open-ils.actor.org_unit.settings.update'],
226         {   async: true,
227             params: [authtoken, osEditContextSelector.getValue(), obj],
228             oncomplete: function(r) {
229                 var res = r.recv().content();
230                 if(e = openils.Event.parse(res))
231                     return alert(e);
232                 osDraw();
233             }
234         }
235     );
236 }
237