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');
20 dojo.require('dijit.Toolbar');
21 dojo.require('openils.XUL');
28 var ouSettingValues = {};
29 var ouSettingNames = {};
34 var searchAssist = [];
37 function osInit(data) {
38 showProcessingDialog(true);
40 authtoken = new openils.CGI().param('ses') || dojo.cookie('ses');
41 if(!authtoken && openils.XUL.isXUL()) {
42 var stash = openils.XUL.getStash();
43 authtoken = stash.session.key;
45 query = new openils.CGI().param('filter');
46 user = new openils.User({authtoken:authtoken});
47 contextOrg = user.user.ws_ou();
48 openils.User.authtoken = authtoken;
50 pcrud = new openils.PermaCrud({authtoken:authtoken});
52 var grps = pcrud.retrieveAll('csg');
53 dojo.forEach(grps, function(grp) { osGroups[grp.name()] = grp.label(); });
55 var connect = function() {
56 dojo.connect(contextOrg, 'onChange', osChangeContext);
58 // don't draw the org settings grid unless the user has permission
59 // to view org settings in at least 1 org unit
60 osContextSelector.store.fetch({query: {}, start: 0, count: 0,
61 onBegin: function(size) {
62 if(size) { osDraw(); return; }
63 dojo.removeClass('no-perms', 'hide_me');
69 new openils.User().buildPermOrgSelector('VIEW_ORG_SETTINGS', osContextSelector, null, connect);
71 fieldmapper.standardRequest(
73 'open-ils.actor.permissions.retrieve'],
75 oncomplete: function(r) {
76 var data = r.recv().content();
77 if(e = openils.Event.parse(data))
80 perm_codes[data[key].id()] = data[key].code();
85 var aous = pcrud.retrieveAll('aou');
86 dojo.forEach(aous, function(ou) { ouNames[ou.id()] = ou.shortname(); });
88 showProcessingDialog(false);
90 dojo.addOnLoad(osInit);
92 function showProcessingDialog(toggle) {
93 var proc = dojo.byId('proci18n').innerHTML;
95 progressDialog.show(true, proc);
97 progressDialog.hide();
100 function osDraw(specific_setting) {
101 showProcessingDialog(true);
104 if (specific_setting) {
106 for(var key in specific_setting)
110 var types = new openils.PermaCrud({authtoken:authtoken}).retrieveAll('coust');
116 osSettings[type.name()] = {
117 label : type.label(),
118 desc : type.description(),
119 type : type.datatype(),
120 fm_class : type.fm_class(),
121 update_perm : type.update_perm(),
122 grp : osGroups[type.grp()]
125 var tmp = "" + type.label() + "" + type.description() + "" + type.fm_class() + "" +
126 osGroups[type.grp()] + "" + type.name();
128 searchAssist[type.name()] = tmp.toLowerCase().replace(/[^a-z0-9]+/g, '');
132 for(var key in osSettings)
136 if(dojo.byId('isFiltered').value == 'true') {
137 osLimitSeen(dojo.byId('searchBox').value);
144 * Auto searches 500ms after entering text.
146 var osCurrentSearchTimeout;
147 function osSearchChange() {
148 if(osCurrentSearchTimeout != null)
149 clearTimeout(osCurrentSearchTimeout);
151 dojo.byId('isFiltered').value = 'true';
152 osCurrentSearchTimeout = setTimeout("doSearch()", 500);
155 //Limits those functions seen to the ones that have similar text to
156 //that which is provided. Not case sensitive.
157 function osLimitSeen(text) {
158 showProcessingDialog(true);
160 text = text.split(' ');
163 text[t] = text[t].toLowerCase().replace(/[^a-z0-9]+/g, '');
165 numTerms = text.length;
168 for(var n in searchAssist) {
172 if(searchAssist[n].indexOf(text[t]) != -1)
175 if(numFound == numTerms)
179 //Don't update on an empty list as this causes bizarre errors.
180 if(names.length == 0) {
181 showProcessingDialog(false);
182 showAlert(dojo.byId('noresults').innerHTML);
186 ouSettingValues = {}; // Clear the values.
187 osDrawNames(names); // Repopulate setting values with the ones we want.
190 function doSearch() {
191 osCurrentSearchTimeout = null;
193 var query = dojo.byId('searchBox').value;
197 return false; //Keep form from submitting
200 function clearSearch() {
201 dojo.byId('isFiltered').value = 'false';
202 if(dojo.byId('searchBox').value != '') { // Don't refresh on blank.
203 dojo.byId('searchBox').value = '';
208 function osToJson() {
209 var out = dojo.fromJson(dojo.toJson(ouSettingValues)); // Easy deep copy
210 var context = osContextSelector.getValue();
212 // Set all of the nulls in the outputs to be part of the current org
213 // this keeps from overwriting later if this file is transfered to another lib.
216 out[key] = {'org':context, 'value':null};
218 dojo.byId('jsonOutput').value = dojo.toJson(out);
219 osJSONOutDialog.show();
222 // Copies the text from the json output to the clipboard.
223 function osJsonOutputCopy() {
224 document.popupNode = dojo.byId('jsonOutput');
225 dojo.byId('jsonOutput').focus();
226 dojo.byId('jsonOutput').select();
227 util.clipboard.copy();
228 showAlert(dojo.byId('os-copy').innerHTML);
231 function osJsonInputPaste() {
232 document.popupNode = dojo.byId('jsonInput');
233 document.popupNode.focus();
234 document.popupNode.select();
235 util.clipboard.paste();
238 function osFromJson() {
239 dojo.byId('jsonInput').value = '';
240 osJSONInDialog.show();
243 function osFromJsonSubmit() {
244 var input = dojo.byId('jsonInput').value;
245 var from = dojo.fromJson(input);
247 osJSONInDialog.hide();
249 showProcessingDialog(true);
252 //Check that there isn't already set to the same value (speed increase);
253 if( ouSettingValues[key] == null &&
254 from[key]['value'] == null &&
255 osContextSelector.getValue() == from[key]['org'])
258 if( ouSettingValues[key] != null &&
259 ouSettingValues[key]['value'] == from[key]['value'] &&
260 ouSettingValues[key]['org'] == from[key]['org'])
266 if(from[key] != null) {
267 obj[key] = from[key]['value'];
268 context = from[key]['org'];
271 osUpdateSetting(obj, context);
273 showProcessingDialog(false);
276 //Draws the grid based upon a given array of items to draw.
277 function osDrawNames(names) {
278 fieldmapper.standardRequest(
280 'open-ils.actor.ou_setting.ancestor_default.batch'],
282 params: [contextOrg, names, authtoken],
283 oncomplete: function(r) {
284 var data = r.recv().content();
285 if(e = openils.Event.parse(data))
288 ouSettingValues[key] = data[key];
289 osLoadGrid(ouSettingValues);
291 showProcessingDialog(false);
297 function osChangeContext() {
298 if(contextOrg == osContextSelector.getValue())
300 contextOrg = osContextSelector.getValue();
304 function osLoadGrid(data) {
305 var gridData = {items:[]}
306 for(var key in data) {
307 var setting = osSettings[key];
308 setting.context = null;
309 setting.value = null;
311 setting.context = data[key].org;
312 setting.value = data[key].value;
314 gridData.items.push({name:key});
316 gridData.items = gridData.items.sort(
318 var seta = osSettings[a.name];
319 var setb = osSettings[b.name];
320 if(seta.grp + "" + seta.label > setb.grp + "" + setb.label) return 1;
321 if(seta.grp + "" + seta.label < setb.grp + "" + setb.label) return -1;
325 gridData.identifier = 'name';
326 var store = new dojo.data.ItemFileReadStore({data:gridData});
327 var model = new dojox.grid.data.DojoData(
328 null, store, {rowsPerPage: 100, clientSort: true, query:{name:'*'}});
330 osGrid.setModel(model);
331 osGrid.setStructure(osGridLayout);
335 function osGetGridData(rowIdx) {
336 var data = this.grid.model.getRow(rowIdx);
338 var setting = osSettings[data.name];
339 var value = setting[this.field];
340 if(value == null) return '';
344 return fieldmapper.aou.findOrgUnit(value).shortname();
346 if(setting.noInherit)
350 if(setting.fm_class) {
351 var autoWidget = new openils.widget.AutoFieldWidget(
353 fmClass : setting.fm_class,
354 selfReference : true,
361 if(autoWidget.getDisplayString())
362 return autoWidget.getDisplayString();
365 if(setting.type == 'bool') {
367 return dojo.byId('os-true').innerHTML;
368 return dojo.byId('os-false').innerHTML;
375 function osGetEditLink(rowIdx) {
376 var data = this.grid.model.getRow(rowIdx);
381 function osFormatEditLink(name) {
382 return this.value.replace(/SETTING/g, name);
385 function osLaunchEditor(name) {
386 osEditDialog._osattr = name;
388 var perms = ['UPDATE_ORG_UNIT_SETTING_ALL'];
389 if(osSettings[name].update_perm && perm_codes[osSettings[name].update_perm]) {
390 perms.push(perm_codes[osSettings[name].update_perm]);
392 user.buildPermOrgSelector(
394 osEditContextSelector, osSettings[name].context
396 dojo.byId('os-edit-name').innerHTML = osSettings[name].label;
397 dojo.byId('os-edit-desc').innerHTML = osSettings[name].desc || '';
399 dojo.style(osEditTextBox.domNode, 'display', 'none');
400 dojo.style(osEditCurrencyTextBox.domNode, 'display', 'none');
401 dojo.style(osEditNumberTextBox.domNode, 'display', 'none');
402 dojo.style(osEditBoolSelect.domNode, 'display', 'none');
404 var fmClass = osSettings[name].fm_class;
406 if(osEditAutoWidget) {
407 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
408 osEditAutoWidget.destroy();
409 osEditAutoWidget = null;
414 if(osEditAutoWidget) {
415 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
416 osEditAutoWidget.destroy();
419 var autoWidget = new openils.widget.AutoFieldWidget(
422 selfReference : true,
423 parentNode : dojo.create('div', null, dojo.byId('os-edit-auto-widget')),
424 widgetValue : osSettings[name].value
429 osEditAutoWidget = w;
435 switch(osSettings[name].type) {
437 widget = osEditNumberTextBox;
440 widget = osEditCurrencyTextBox;
443 widget = osEditBoolSelect;
446 widget = osEditTextBox;
449 dojo.style(widget.domNode, 'display', 'block');
450 widget.setValue(osSettings[name].value);
454 function osEditSetting(deleteMe) {
456 var name = osEditDialog._osattr;
462 if(osSettings[name].fm_class) {
463 var val = osEditAutoWidget.attr('value');
464 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
465 osEditAutoWidget.destroy();
466 osEditAutoWidget = null;
467 if(val == null || val == '') return;
471 switch(osSettings[name].type) {
473 obj[name] = osEditNumberTextBox.getValue();
474 if(obj[name] == null) return;
477 obj[name] = osEditCurrencyTextBox.getValue();
478 if(obj[name] == null) return;
481 var val = osEditBoolSelect.getValue();
482 obj[name] = (val == 'true') ? true : false;
485 obj[name] = osEditTextBox.getValue();
486 if(obj[name] == null) return;
490 osUpdateSetting(obj, osEditContextSelector.getValue(), name);
493 function osUpdateSetting(obj, context, name) {
494 fieldmapper.standardRequest(
495 ['open-ils.actor', 'open-ils.actor.org_unit.settings.update'],
497 params: [authtoken, context, obj],
498 oncomplete: function(r) {
499 var res = r.recv().content();
500 if(e = openils.Event.parse(res))
503 if(context != osContextSelector.getValue())
504 showAlert(dojo.byId('os-not-chosen').innerHTML);
510 function osRevertSetting(context, name, value) {
515 if(value == 'null' || value == null)
520 osUpdateSetting(obj, context, name);
523 function osGetHistoryLink(rowIdx) {
524 var data = this.grid.model.getRow(rowIdx);
529 function osFormatHistoryLink(name) {
530 return this.value.replace(/SETTING/, name);
533 function osLaunchHistory(name) {
534 showProcessingDialog(true);
536 dojo.byId('osHistName').innerHTML = osSettings[name].label;
538 var data = dojo.byId('histTitle').innerHTML;
539 var thisHist = pcrud.search('coustl', {'field_name':name});
540 for(var i in thisHist.reverse()) {
541 d = thisHist[i].date_applied();
542 a = ouNames[thisHist[i].org()];
543 o = thisHist[i].original_value();
544 if(o) o=o.replace(/\&/g,'&').replace(/</g,'<').replace(/>/g,'>');
545 n = thisHist[i].new_value();
546 if(n) n=n.replace(/\&/g,'&').replace(/</g,'<').replace(/>/g,'>');
547 r = thisHist[i].org();
548 // Table is: Date | Org Name | Orig Value | New Value | Revert
549 data += "<tr><td>" + d + "</td><td>" + a + "</td><td>" + o +
550 "</td><td>" + n + "</td><td>" +
551 "<a href='javascript:void(0);' onclick='osRevertSetting(" + r + ", "" + name +"","+o+");'>"+dojo.byId('os-revert').innerHTML+"</a></td></tr>";
554 dojo.byId('historyData').innerHTML = data;
556 showProcessingDialog(false);
560 function showAlert(message, timeout) {
561 if(timeout == null) {
563 if(message.length > 50)
565 if(message.length > 80)
569 dojo.removeClass('msgCont', 'hidden');
571 dojo.byId('msgInner').innerHTML = message;
573 var fadeArgs = { node: "msgCont" };
574 dojo.fadeIn(fadeArgs).play();
576 window.setTimeout('hideAlert()', timeout);
580 function hideAlert() {
581 var fadeArgs = { node: "msgCont" };
582 dojo.fadeOut(fadeArgs).play();
583 dojo.addClass('msgCont', 'hidden');