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('dijit.form.Textarea');
7 dojo.require('dijit.form.ComboBox');
8 dojo.require('dojox.grid.Grid');
9 dojo.require('fieldmapper.Fieldmapper');
10 dojo.require('fieldmapper.dojoData');
11 dojo.require('fieldmapper.OrgUtils');
12 dojo.require('dojo.cookie');
13 dojo.require('openils.CGI');
14 dojo.require('openils.User');
15 dojo.require('openils.Event');
16 dojo.require('openils.widget.OrgUnitFilteringSelect');
17 dojo.require('openils.PermaCrud');
18 dojo.require('openils.widget.AutoFieldWidget');
19 dojo.require('openils.widget.ProgressDialog');
25 var ouSettingValues = {};
29 var searchAssist = [];
31 function osInit(data) {
32 authtoken = new openils.CGI().param('ses') || dojo.cookie('ses');
33 user = new openils.User({authtoken:authtoken});
34 contextOrg = user.user.ws_ou();
35 openils.User.authtoken = authtoken;
37 var grps = new openils.PermaCrud({authtoken:authtoken}).retrieveAll('csg');
38 dojo.forEach(grps, function(grp) { osGroups[grp.name()] = grp.label(); });
41 var connect = function() {
42 dojo.connect(contextOrg, 'onChange', osChangeContext);
44 // don't draw the org settings grid unless the user has permission
45 // to view org settings in at least 1 org unit
46 osContextSelector.store.fetch({query: {}, start: 0, count: 0,
47 onBegin: function(size) {
48 if(size) { osDraw(); return; }
49 dojo.removeClass('no-perms', 'hide_me');
54 new openils.User().buildPermOrgSelector('VIEW_ORG_SETTINGS', osContextSelector, null, connect);
56 fieldmapper.standardRequest(
58 'open-ils.actor.permissions.retrieve'],
60 oncomplete: function(r) {
61 var data = r.recv().content();
62 if(e = openils.Event.parse(data))
65 perm_codes[data[key].id()] = data[key].code();
70 dojo.addOnLoad(osInit);
72 function showProcessingDialog(toggle) {
73 var proc = dojo.byId('proci18n').innerHTML;
75 progressDialog.show(true, proc);
77 progressDialog.hide();
80 function osDraw(specific_setting) {
81 showProcessingDialog(true);
84 if (specific_setting) {
86 for(var key in specific_setting)
90 var types = new openils.PermaCrud({authtoken:authtoken}).retrieveAll('coust');
96 osSettings[type.name()] = {
98 desc : type.description(),
99 type : type.datatype(),
100 fm_class : type.fm_class(),
101 update_perm : type.update_perm(),
102 grp : osGroups[type.grp()]
105 var tmp = "" + type.label() + "" + type.description() + "" + type.fm_class() + "" +
106 osGroups[type.grp()] + "" + type.name();
108 searchAssist[type.name()] = tmp.toLowerCase().replace(/[^a-z0-9]+/g, '');
112 for(var key in osSettings)
119 //Limits those functions seen to the ones that have similar text to
120 //that which is provided. Not case sensitive.
121 function osLimitSeen(text) {
122 showProcessingDialog(true);
124 text = text.split(' ');
127 text[t] = text[t].toLowerCase().replace(/[^a-z0-9]+/g, '');
129 numTerms = text.length;
132 for(var n in searchAssist) {
136 if(searchAssist[n].indexOf(text[t]) != -1)
139 if(numFound == numTerms)
143 //Don't update on an empty list as this causes bizarre errors.
144 if(names.length == 0) {
145 showProcessingDialog(false);
147 var noresults = dojo.byId('noresults').innerHTML;
148 myDialog = new dijit.Dialog({ content: noresults});
153 ouSettingValues = {}; // Clear the values.
157 function doSearch() {
158 var query = dojo.byId("searchBox").value;
161 return false; //Keep form from submitting
164 function clearSearch() {
165 dojo.byId("searchBox").value = "";
169 function osToJson() {
170 var out = dojo.fromJson(dojo.toJson(ouSettingValues)); // Easy deep copy
171 var context = osContextSelector.getValue();
173 // Set all of the nulls in the outputs to be part of the current org
174 // this keeps from overwriting later if this file is transfered to another lib.
177 out[key] = {'org':context, 'value':null};
179 dojo.byId('jsonOutput').value = dojo.toJson(out);
180 osJSONOutDialog.show();
183 function osJsonOutputCopy() {
184 document.popupNode = dojo.byId('jsonOutput');
185 document.getElementById('jsonOutput').focus();
186 document.getElementById('jsonOutput').select();
187 util.clipboard.copy();
190 function osJsonInputPaste() {
191 document.popupNode = dojo.byId('jsonInput');
192 document.popupNode.focus();
193 document.popupNode.select();
194 util.clipboard.paste();
197 function osFromJson() {
198 dojo.byId('jsonInput').value = '';
199 osJSONInDialog.show();
202 function osFromJsonSubmit() {
203 var input = dojo.byId('jsonInput').value;
204 var from = dojo.fromJson(input);
206 osJSONInDialog.hide();
208 showProcessingDialog(true);
211 //Check that there isn't already set to the same value (speed increase);
212 if( ouSettingValues[key] == null &&
213 from[key]['value'] == null &&
214 osContextSelector.getValue() == from[key]['org'])
217 if( ouSettingValues[key] != null &&
218 ouSettingValues[key]['value'] == from[key]['value'] &&
219 ouSettingValues[key]['org'] == from[key]['org'])
225 if(from[key] != null) {
226 obj[key] = from[key]['value'];
227 context = from[key]['org'];
230 osUpdateSetting(obj, context);
232 showProcessingDialog(false);
235 //Draws the grid based upon a given array of items to draw.
236 function osDrawNames(names) {
237 fieldmapper.standardRequest(
239 'open-ils.actor.ou_setting.ancestor_default.batch'],
241 params: [contextOrg, names, authtoken],
242 oncomplete: function(r) {
243 var data = r.recv().content();
244 if(e = openils.Event.parse(data))
247 ouSettingValues[key] = data[key];
248 osLoadGrid(ouSettingValues);
250 showProcessingDialog(false);
256 function osChangeContext() {
257 if(contextOrg == osContextSelector.getValue())
259 contextOrg = osContextSelector.getValue();
263 function osLoadGrid(data) {
264 var gridData = {items:[]}
265 for(var key in data) {
266 var setting = osSettings[key];
267 setting.context = null;
268 setting.value = null;
270 setting.context = data[key].org;
271 setting.value = data[key].value;
273 gridData.items.push({name:key});
275 gridData.items = gridData.items.sort(
277 var seta = osSettings[a.name];
278 var setb = osSettings[b.name];
279 if(seta.label > setb.label) return 1;
280 if(seta.label < setb.label) return -1;
284 gridData.identifier = 'name';
285 var store = new dojo.data.ItemFileReadStore({data:gridData});
286 var model = new dojox.grid.data.DojoData(
287 null, store, {rowsPerPage: 100, clientSort: true, query:{name:'*'}});
289 osGrid.setModel(model);
290 osGrid.setStructure(osGridLayout);
294 function osGetGridData(rowIdx) {
295 var data = this.grid.model.getRow(rowIdx);
297 var setting = osSettings[data.name];
298 var value = setting[this.field];
299 if(value == null) return '';
303 return fieldmapper.aou.findOrgUnit(value).shortname();
305 if(setting.noInherit)
309 if(setting.fm_class) {
310 var autoWidget = new openils.widget.AutoFieldWidget(
312 fmClass : setting.fm_class,
313 selfReference : true,
320 if(autoWidget.getDisplayString())
321 return autoWidget.getDisplayString();
324 if(setting.type == 'bool') {
326 return dojo.byId('os-true').innerHTML;
327 return dojo.byId('os-false').innerHTML;
334 function osGetEditLink(rowIdx) {
335 var data = this.grid.model.getRow(rowIdx);
340 function osFormatEditLink(name) {
341 return this.value.replace(/SETTING/, name);
344 function osLaunchEditor(name) {
345 osEditDialog._osattr = name;
347 var perms = ['UPDATE_ORG_UNIT_SETTING_ALL'];
348 if(osSettings[name].update_perm && perm_codes[osSettings[name].update_perm]) {
349 perms.push(perm_codes[osSettings[name].update_perm]);
351 user.buildPermOrgSelector(
353 osEditContextSelector, osSettings[name].context
355 dojo.byId('os-edit-name').innerHTML = osSettings[name].label;
356 dojo.byId('os-edit-desc').innerHTML = osSettings[name].desc || '';
358 dojo.style(osEditTextBox.domNode, 'display', 'none');
359 dojo.style(osEditCurrencyTextBox.domNode, 'display', 'none');
360 dojo.style(osEditNumberTextBox.domNode, 'display', 'none');
361 dojo.style(osEditBoolSelect.domNode, 'display', 'none');
363 var fmClass = osSettings[name].fm_class;
367 if(osEditAutoWidget) {
368 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
369 osEditAutoWidget.destroy();
372 var autoWidget = new openils.widget.AutoFieldWidget(
375 selfReference : true,
376 parentNode : dojo.create('div', null, dojo.byId('os-edit-auto-widget')),
377 widgetValue : osSettings[name].value
382 osEditAutoWidget = w;
388 switch(osSettings[name].type) {
390 widget = osEditNumberTextBox;
393 widget = osEditCurrencyTextBox;
396 widget = osEditBoolSelect;
399 widget = osEditTextBox;
402 dojo.style(widget.domNode, 'display', 'block');
403 widget.setValue(osSettings[name].value);
407 function osEditSetting(deleteMe) {
409 var name = osEditDialog._osattr;
417 if(osSettings[name].fm_class) {
418 var val = osEditAutoWidget.attr('value');
419 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
420 osEditAutoWidget.destroy();
421 osEditAutoWidget = null;
422 if(val == null || val == '') return;
426 switch(osSettings[name].type) {
428 obj[name] = osEditNumberTextBox.getValue();
429 if(obj[name] == null) return;
432 obj[name] = osEditCurrencyTextBox.getValue();
433 if(obj[name] == null) return;
436 var val = osEditBoolSelect.getValue();
437 obj[name] = (val == 'true') ? true : false;
440 obj[name] = osEditTextBox.getValue();
441 if(obj[name] == null) return;
445 osUpdateSetting(obj, osEditContextSelector.getValue());
448 function osUpdateSetting(obj, context) {
449 fieldmapper.standardRequest(
450 ['open-ils.actor', 'open-ils.actor.org_unit.settings.update'],
452 params: [authtoken, context, obj],
453 oncomplete: function(r) {
454 var res = r.recv().content();
455 if(e = openils.Event.parse(res))