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');
24 var ouSettingValues = {};
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;
33 fieldmapper.standardRequest(
35 'open-ils.actor.user.get_work_ous.ids'],
38 oncomplete: function(r) {
39 var list = r.recv().content();
40 if(e = openils.Event.parse(list))
43 buildMergedOrgSelector(list);
50 dojo.addOnLoad(osInit);
52 function osDraw(specific_setting) {
53 progressDialog.show(true, "Processing..."); /* FIXME: I18N */
56 if (specific_setting) {
58 for(var key in specific_setting)
63 var types = new openils.PermaCrud({authtoken:authtoken}).retrieveAll('coust');
67 osSettings[type.name()] = {
69 desc : type.description(),
70 type : type.datatype(),
71 fm_class : type.fm_class()
76 for(var key in osSettings)
80 fieldmapper.standardRequest(
82 'open-ils.actor.ou_setting.ancestor_default.batch'],
84 params: [contextOrg, names],
85 oncomplete: function(r) {
86 var data = r.recv().content();
87 if(e = openils.Event.parse(data))
90 ouSettingValues[key] = data[key];
91 osLoadGrid(ouSettingValues);
92 progressDialog.hide();
98 function insertTreePath(target,newPath,ifield,cfield) {
99 var newTop = newPath.shift();
100 var child = newPath[0];
102 var subtarget = dojo.filter(target[cfield](), function (tc) {return tc[ifield]() == child[ifield]()});
104 if (subtarget.length == 0) {
105 target[cfield]().push(child);
109 if (newPath.length > 1) insertTreePath(subtarget[0],newPath,ifield,cfield);
112 function flattenTree(tree,cfield,sort_field,kill_kids,list) {
113 if (!list) list = [];
116 var kids = tree[cfield]();
117 if (sort_field) kids = kids.sort(function (a,b) { return a[sort_field]() > b[sort_field]() });
119 dojo.forEach(kids, function (c) { return flattenTree(c,cfield,sort_field,kill_kids,list) });
121 if (kill_kids) tree[cfield]([]);
125 function buildMergedOrgSelector(orgList) {
127 for(var i = 0; i < orgList.length; i++) {
128 // add the work org path
129 var node = fieldmapper.aou.findOrgUnit(orgList[i]).clone();
133 while(node.parent_ou() != null) {
134 node = fieldmapper.aou.findOrgUnit(node.parent_ou()).clone();
139 if (!orgTree) orgTree = path[0];
140 insertTreePath(orgTree, path.reverse(), 'id', 'children');
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());
150 function osChangeContext() {
151 if(contextOrg == osContextSelector.getValue())
153 contextOrg = osContextSelector.getValue();
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;
164 setting.context = data[key].org;
165 setting.value = data[key].value;
167 gridData.items.push({name:key});
169 gridData.items = gridData.items.sort(
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;
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:'*'}});
183 osGrid.setModel(model);
184 osGrid.setStructure(osGridLayout);
188 function osGetGridData(rowIdx) {
189 var data = this.grid.model.getRow(rowIdx);
191 var setting = osSettings[data.name];
192 var value = setting[this.field];
193 if(value == null) return '';
197 return fieldmapper.aou.findOrgUnit(value).shortname();
199 if(setting.noInherit)
203 if(setting.fm_class) {
204 var autoWidget = new openils.widget.AutoFieldWidget(
206 fmClass : setting.fm_class,
207 selfReference : true,
214 if(autoWidget.getDisplayString())
215 return autoWidget.getDisplayString();
218 if(setting.type == 'bool') {
220 return dojo.byId('os-true').innerHTML;
221 return dojo.byId('os-false').innerHTML;
228 function osGetEditLink(rowIdx) {
229 var data = this.grid.model.getRow(rowIdx);
234 function osFormatEditLink(name) {
235 return this.value.replace(/SETTING/, name);
238 function osLaunchEditor(name) {
239 osEditDialog._osattr = name;
241 user.buildPermOrgSelector(
242 ['UPDATE_ORG_UNIT_SETTING.' + name, 'UPDATE_ORG_UNIT_SETTING_ALL'],
243 osEditContextSelector, osSettings[name].context
245 dojo.byId('os-edit-name').innerHTML = osSettings[name].label;
246 dojo.byId('os-edit-desc').innerHTML = osSettings[name].desc || '';
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');
253 var fmClass = osSettings[name].fm_class;
257 if(osEditAutoWidget) {
258 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
259 osEditAutoWidget.destroy();
262 var autoWidget = new openils.widget.AutoFieldWidget(
265 selfReference : true,
266 parentNode : dojo.create('div', null, dojo.byId('os-edit-auto-widget')),
267 widgetValue : osSettings[name].value
272 osEditAutoWidget = w;
278 switch(osSettings[name].type) {
280 widget = osEditNumberTextBox;
283 widget = osEditCurrencyTextBox;
286 widget = osEditBoolSelect;
289 widget = osEditTextBox;
292 dojo.style(widget.domNode, 'display', 'block');
293 widget.setValue(osSettings[name].value);
297 function osEditSetting(deleteMe) {
299 var name = osEditDialog._osattr;
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;
316 switch(osSettings[name].type) {
318 obj[name] = osEditNumberTextBox.getValue();
319 if(obj[name] == null) return;
322 obj[name] = osEditCurrencyTextBox.getValue();
323 if(obj[name] == null) return;
326 var val = osEditBoolSelect.getValue();
327 obj[name] = (val == 'true') ? true : false;
330 obj[name] = osEditTextBox.getValue();
331 if(obj[name] == null) return;
336 fieldmapper.standardRequest(
337 ['open-ils.actor', 'open-ils.actor.org_unit.settings.update'],
339 params: [authtoken, osEditContextSelector.getValue(), obj],
340 oncomplete: function(r) {
341 var res = r.recv().content();
342 if(e = openils.Event.parse(res))