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]+/, '');
112 for(var key in osSettings)
120 //Limits those functions seen to the ones that have similar text to
121 //that which is provided. Not case sensitive.
122 function osLimitSeen(text) {
123 showProcessingDialog(true);
125 text = text.toLowerCase().replace(/[^a-z0-9]+/, '');
130 for(var n in searchAssist)
131 if(searchAssist[n].indexOf(text) != -1)
134 //Don't update on an empty list as this causes bizarre errors.
135 if(names.length == 0) {
136 showProcessingDialog(false);
138 var noresults = dojo.byId('noresults').innerHTML;
139 myDialog = new dijit.Dialog({ content: noresults});
144 ouSettingValues = {}; // Clear the values.
148 function doSearch() {
149 var query = dojo.byId("searchBox").value;
152 return false; //Keep form from submitting
155 function clearSearch() {
156 dojo.byId("searchBox").value = "";
160 function osToJson() {
161 var out = dojo.fromJson(dojo.toJson(ouSettingValues)); // Easy deep copy
162 var context = osContextSelector.getValue();
164 // Set all of the nulls in the outputs to be part of the current org
165 // this keeps from overwriting later if this file is transfered to another lib.
168 out[key] = {'org':context, 'value':null};
170 dojo.byId('jsonOutput').value = dojo.toJson(out);
171 osJSONOutDialog.show();
174 function osJsonOutputCopy() {
175 document.popupNode = dojo.byId('jsonOutput');
176 document.getElementById('jsonOutput').focus();
177 document.getElementById('jsonOutput').select();
178 util.clipboard.copy();
181 function osJsonInputPaste() {
182 document.popupNode = dojo.byId('jsonInput');
183 document.popupNode.focus();
184 document.popupNode.select();
185 util.clipboard.paste();
188 function osFromJson() {
189 dojo.byId('jsonInput').value = '';
190 osJSONInDialog.show();
193 function osFromJsonSubmit() {
194 var input = dojo.byId('jsonInput').value;
195 var from = dojo.fromJson(input);
197 osJSONInDialog.hide();
199 showProcessingDialog(true);
202 //Check that there isn't already set to the same value (speed increase);
203 if( ouSettingValues[key] == null &&
204 from[key]['value'] == null &&
205 osContextSelector.getValue() == from[key]['org'])
208 if( ouSettingValues[key] != null &&
209 ouSettingValues[key]['value'] == from[key]['value'] &&
210 ouSettingValues[key]['org'] == from[key]['org'])
216 if(from[key] != null) {
217 obj[key] = from[key]['value'];
218 context = from[key]['org'];
221 osUpdateSetting(obj, context);
223 showProcessingDialog(false);
226 //Draws the grid based upon a given array of items to draw.
227 function osDrawNames(names) {
228 fieldmapper.standardRequest(
230 'open-ils.actor.ou_setting.ancestor_default.batch'],
232 params: [contextOrg, names, authtoken],
233 oncomplete: function(r) {
234 var data = r.recv().content();
235 if(e = openils.Event.parse(data))
238 ouSettingValues[key] = data[key];
239 osLoadGrid(ouSettingValues);
241 showProcessingDialog(false);
247 function osChangeContext() {
248 if(contextOrg == osContextSelector.getValue())
250 contextOrg = osContextSelector.getValue();
254 function osLoadGrid(data) {
255 var gridData = {items:[]}
256 for(var key in data) {
257 var setting = osSettings[key];
258 setting.context = null;
259 setting.value = null;
261 setting.context = data[key].org;
262 setting.value = data[key].value;
264 gridData.items.push({name:key});
266 gridData.items = gridData.items.sort(
268 var seta = osSettings[a.name];
269 var setb = osSettings[b.name];
270 if(seta.label > setb.label) return 1;
271 if(seta.label < setb.label) return -1;
275 gridData.identifier = 'name';
276 var store = new dojo.data.ItemFileReadStore({data:gridData});
277 var model = new dojox.grid.data.DojoData(
278 null, store, {rowsPerPage: 100, clientSort: true, query:{name:'*'}});
280 osGrid.setModel(model);
281 osGrid.setStructure(osGridLayout);
285 function osGetGridData(rowIdx) {
286 var data = this.grid.model.getRow(rowIdx);
288 var setting = osSettings[data.name];
289 var value = setting[this.field];
290 if(value == null) return '';
294 return fieldmapper.aou.findOrgUnit(value).shortname();
296 if(setting.noInherit)
300 if(setting.fm_class) {
301 var autoWidget = new openils.widget.AutoFieldWidget(
303 fmClass : setting.fm_class,
304 selfReference : true,
311 if(autoWidget.getDisplayString())
312 return autoWidget.getDisplayString();
315 if(setting.type == 'bool') {
317 return dojo.byId('os-true').innerHTML;
318 return dojo.byId('os-false').innerHTML;
325 function osGetEditLink(rowIdx) {
326 var data = this.grid.model.getRow(rowIdx);
331 function osFormatEditLink(name) {
332 return this.value.replace(/SETTING/, name);
335 function osLaunchEditor(name) {
336 osEditDialog._osattr = name;
338 var perms = ['UPDATE_ORG_UNIT_SETTING_ALL'];
339 if(osSettings[name].update_perm && perm_codes[osSettings[name].update_perm]) {
340 perms.push(perm_codes[osSettings[name].update_perm]);
342 user.buildPermOrgSelector(
344 osEditContextSelector, osSettings[name].context
346 dojo.byId('os-edit-name').innerHTML = osSettings[name].label;
347 dojo.byId('os-edit-desc').innerHTML = osSettings[name].desc || '';
349 dojo.style(osEditTextBox.domNode, 'display', 'none');
350 dojo.style(osEditCurrencyTextBox.domNode, 'display', 'none');
351 dojo.style(osEditNumberTextBox.domNode, 'display', 'none');
352 dojo.style(osEditBoolSelect.domNode, 'display', 'none');
354 var fmClass = osSettings[name].fm_class;
358 if(osEditAutoWidget) {
359 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
360 osEditAutoWidget.destroy();
363 var autoWidget = new openils.widget.AutoFieldWidget(
366 selfReference : true,
367 parentNode : dojo.create('div', null, dojo.byId('os-edit-auto-widget')),
368 widgetValue : osSettings[name].value
373 osEditAutoWidget = w;
379 switch(osSettings[name].type) {
381 widget = osEditNumberTextBox;
384 widget = osEditCurrencyTextBox;
387 widget = osEditBoolSelect;
390 widget = osEditTextBox;
393 dojo.style(widget.domNode, 'display', 'block');
394 widget.setValue(osSettings[name].value);
398 function osEditSetting(deleteMe) {
400 var name = osEditDialog._osattr;
408 if(osSettings[name].fm_class) {
409 var val = osEditAutoWidget.attr('value');
410 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
411 osEditAutoWidget.destroy();
412 osEditAutoWidget = null;
413 if(val == null || val == '') return;
417 switch(osSettings[name].type) {
419 obj[name] = osEditNumberTextBox.getValue();
420 if(obj[name] == null) return;
423 obj[name] = osEditCurrencyTextBox.getValue();
424 if(obj[name] == null) return;
427 var val = osEditBoolSelect.getValue();
428 obj[name] = (val == 'true') ? true : false;
431 obj[name] = osEditTextBox.getValue();
432 if(obj[name] == null) return;
436 osUpdateSetting(obj, osEditContextSelector.getValue());
439 function osUpdateSetting(obj, context) {
440 fieldmapper.standardRequest(
441 ['open-ils.actor', 'open-ils.actor.org_unit.settings.update'],
443 params: [authtoken, context, obj],
444 oncomplete: function(r) {
445 var res = r.recv().content();
446 if(e = openils.Event.parse(res))