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');
27 var ouSettingValues = {};
28 var ouSettingNames = {};
33 var searchAssist = [];
36 function osInit(data) {
37 showProcessingDialog(true);
39 authtoken = new openils.CGI().param('ses') || dojo.cookie('ses');
40 query = new openils.CGI().param('filter');
41 user = new openils.User({authtoken:authtoken});
42 contextOrg = user.user.ws_ou();
43 openils.User.authtoken = authtoken;
45 pcrud = new openils.PermaCrud({authtoken:authtoken});
47 var grps = pcrud.retrieveAll('csg');
48 dojo.forEach(grps, function(grp) { osGroups[grp.name()] = grp.label(); });
50 var connect = function() {
51 dojo.connect(contextOrg, 'onChange', osChangeContext);
53 // don't draw the org settings grid unless the user has permission
54 // to view org settings in at least 1 org unit
55 osContextSelector.store.fetch({query: {}, start: 0, count: 0,
56 onBegin: function(size) {
57 if(size) { osDraw(); return; }
58 dojo.removeClass('no-perms', 'hide_me');
64 new openils.User().buildPermOrgSelector('VIEW_ORG_SETTINGS', osContextSelector, null, connect);
66 fieldmapper.standardRequest(
68 'open-ils.actor.permissions.retrieve'],
70 oncomplete: function(r) {
71 var data = r.recv().content();
72 if(e = openils.Event.parse(data))
75 perm_codes[data[key].id()] = data[key].code();
80 var aous = pcrud.retrieveAll('aou');
81 dojo.forEach(aous, function(ou) { ouNames[ou.id()] = ou.shortname(); });
83 showProcessingDialog(false);
85 dojo.addOnLoad(osInit);
87 function showProcessingDialog(toggle) {
88 var proc = dojo.byId('proci18n').innerHTML;
90 progressDialog.show(true, proc);
92 progressDialog.hide();
95 function osDraw(specific_setting) {
96 showProcessingDialog(true);
99 if (specific_setting) {
101 for(var key in specific_setting)
105 var types = new openils.PermaCrud({authtoken:authtoken}).retrieveAll('coust');
111 osSettings[type.name()] = {
112 label : type.label(),
113 desc : type.description(),
114 type : type.datatype(),
115 fm_class : type.fm_class(),
116 update_perm : type.update_perm(),
117 grp : osGroups[type.grp()]
120 var tmp = "" + type.label() + "" + type.description() + "" + type.fm_class() + "" +
121 osGroups[type.grp()] + "" + type.name();
123 searchAssist[type.name()] = tmp.toLowerCase().replace(/[^a-z0-9]+/g, '');
127 for(var key in osSettings)
134 //Limits those functions seen to the ones that have similar text to
135 //that which is provided. Not case sensitive.
136 function osLimitSeen(text) {
137 showProcessingDialog(true);
139 text = text.split(' ');
142 text[t] = text[t].toLowerCase().replace(/[^a-z0-9]+/g, '');
144 numTerms = text.length;
147 for(var n in searchAssist) {
151 if(searchAssist[n].indexOf(text[t]) != -1)
154 if(numFound == numTerms)
158 //Don't update on an empty list as this causes bizarre errors.
159 if(names.length == 0) {
160 showProcessingDialog(false);
161 showAlert(dojo.byId('noresults').innerHTML);
165 ouSettingValues = {}; // Clear the values.
166 osDrawNames(names); // Repopulate setting values with the ones we want.
169 function doSearch() {
170 var query = dojo.byId('searchBox').value;
174 return false; //Keep form from submitting
177 function clearSearch() {
178 if(dojo.byId('searchBox').value != '') { // Don't refresh on blank.
179 dojo.byId('searchBox').value = '';
184 function osToJson() {
185 var out = dojo.fromJson(dojo.toJson(ouSettingValues)); // Easy deep copy
186 var context = osContextSelector.getValue();
188 // Set all of the nulls in the outputs to be part of the current org
189 // this keeps from overwriting later if this file is transfered to another lib.
192 out[key] = {'org':context, 'value':null};
194 dojo.byId('jsonOutput').value = dojo.toJson(out);
195 osJSONOutDialog.show();
198 // Copies the text from the json output to the clipboard.
199 function osJsonOutputCopy() {
200 document.popupNode = dojo.byId('jsonOutput');
201 dojo.byId('jsonOutput').focus();
202 dojo.byId('jsonOutput').select();
203 util.clipboard.copy();
204 showAlert(dojo.byId('os-copy').innerHTML);
207 function osJsonInputPaste() {
208 document.popupNode = dojo.byId('jsonInput');
209 document.popupNode.focus();
210 document.popupNode.select();
211 util.clipboard.paste();
214 function osFromJson() {
215 dojo.byId('jsonInput').value = '';
216 osJSONInDialog.show();
219 function osFromJsonSubmit() {
220 var input = dojo.byId('jsonInput').value;
221 var from = dojo.fromJson(input);
223 osJSONInDialog.hide();
225 showProcessingDialog(true);
228 //Check that there isn't already set to the same value (speed increase);
229 if( ouSettingValues[key] == null &&
230 from[key]['value'] == null &&
231 osContextSelector.getValue() == from[key]['org'])
234 if( ouSettingValues[key] != null &&
235 ouSettingValues[key]['value'] == from[key]['value'] &&
236 ouSettingValues[key]['org'] == from[key]['org'])
242 if(from[key] != null) {
243 obj[key] = from[key]['value'];
244 context = from[key]['org'];
247 osUpdateSetting(obj, context);
249 showProcessingDialog(false);
252 //Draws the grid based upon a given array of items to draw.
253 function osDrawNames(names) {
254 fieldmapper.standardRequest(
256 'open-ils.actor.ou_setting.ancestor_default.batch'],
258 params: [contextOrg, names, authtoken],
259 oncomplete: function(r) {
260 var data = r.recv().content();
261 if(e = openils.Event.parse(data))
264 ouSettingValues[key] = data[key];
265 osLoadGrid(ouSettingValues);
267 showProcessingDialog(false);
273 function osChangeContext() {
274 if(contextOrg == osContextSelector.getValue())
276 contextOrg = osContextSelector.getValue();
280 function osLoadGrid(data) {
281 var gridData = {items:[]}
282 for(var key in data) {
283 var setting = osSettings[key];
284 setting.context = null;
285 setting.value = null;
287 setting.context = data[key].org;
288 setting.value = data[key].value;
290 gridData.items.push({name:key});
292 gridData.items = gridData.items.sort(
294 var seta = osSettings[a.name];
295 var setb = osSettings[b.name];
296 if(seta.grp + "" + seta.label > setb.grp + "" + setb.label) return 1;
297 if(seta.grp + "" + seta.label < setb.grp + "" + setb.label) return -1;
301 gridData.identifier = 'name';
302 var store = new dojo.data.ItemFileReadStore({data:gridData});
303 var model = new dojox.grid.data.DojoData(
304 null, store, {rowsPerPage: 100, clientSort: true, query:{name:'*'}});
306 osGrid.setModel(model);
307 osGrid.setStructure(osGridLayout);
311 function osGetGridData(rowIdx) {
312 var data = this.grid.model.getRow(rowIdx);
314 var setting = osSettings[data.name];
315 var value = setting[this.field];
316 if(value == null) return '';
320 return fieldmapper.aou.findOrgUnit(value).shortname();
322 if(setting.noInherit)
326 if(setting.fm_class) {
327 var autoWidget = new openils.widget.AutoFieldWidget(
329 fmClass : setting.fm_class,
330 selfReference : true,
337 if(autoWidget.getDisplayString())
338 return autoWidget.getDisplayString();
341 if(setting.type == 'bool') {
343 return dojo.byId('os-true').innerHTML;
344 return dojo.byId('os-false').innerHTML;
351 function osGetEditLink(rowIdx) {
352 var data = this.grid.model.getRow(rowIdx);
357 function osFormatEditLink(name) {
358 return this.value.replace(/SETTING/g, name);
361 function osLaunchEditor(name) {
362 osEditDialog._osattr = name;
364 var perms = ['UPDATE_ORG_UNIT_SETTING_ALL'];
365 if(osSettings[name].update_perm && perm_codes[osSettings[name].update_perm]) {
366 perms.push(perm_codes[osSettings[name].update_perm]);
368 user.buildPermOrgSelector(
370 osEditContextSelector, osSettings[name].context
372 dojo.byId('os-edit-name').innerHTML = osSettings[name].label;
373 dojo.byId('os-edit-desc').innerHTML = osSettings[name].desc || '';
375 dojo.style(osEditTextBox.domNode, 'display', 'none');
376 dojo.style(osEditCurrencyTextBox.domNode, 'display', 'none');
377 dojo.style(osEditNumberTextBox.domNode, 'display', 'none');
378 dojo.style(osEditBoolSelect.domNode, 'display', 'none');
380 var fmClass = osSettings[name].fm_class;
384 if(osEditAutoWidget) {
385 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
386 osEditAutoWidget.destroy();
389 var autoWidget = new openils.widget.AutoFieldWidget(
392 selfReference : true,
393 parentNode : dojo.create('div', null, dojo.byId('os-edit-auto-widget')),
394 widgetValue : osSettings[name].value
399 osEditAutoWidget = w;
405 switch(osSettings[name].type) {
407 widget = osEditNumberTextBox;
410 widget = osEditCurrencyTextBox;
413 widget = osEditBoolSelect;
416 widget = osEditTextBox;
419 dojo.style(widget.domNode, 'display', 'block');
420 widget.setValue(osSettings[name].value);
424 function osEditSetting(deleteMe) {
426 var name = osEditDialog._osattr;
434 if(osSettings[name].fm_class) {
435 var val = osEditAutoWidget.attr('value');
436 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
437 osEditAutoWidget.destroy();
438 osEditAutoWidget = null;
439 if(val == null || val == '') return;
443 switch(osSettings[name].type) {
445 obj[name] = osEditNumberTextBox.getValue();
446 if(obj[name] == null) return;
449 obj[name] = osEditCurrencyTextBox.getValue();
450 if(obj[name] == null) return;
453 var val = osEditBoolSelect.getValue();
454 obj[name] = (val == 'true') ? true : false;
457 obj[name] = osEditTextBox.getValue();
458 if(obj[name] == null) return;
462 osUpdateSetting(obj, osEditContextSelector.getValue(), name);
465 function osUpdateSetting(obj, context, name) {
466 fieldmapper.standardRequest(
467 ['open-ils.actor', 'open-ils.actor.org_unit.settings.update'],
469 params: [authtoken, context, obj],
470 oncomplete: function(r) {
471 var res = r.recv().content();
472 if(e = openils.Event.parse(res))
480 function osGetHistoryLink(rowIdx) {
481 var data = this.grid.model.getRow(rowIdx);
486 function osFormatHistoryLink(name) {
487 return this.value.replace(/SETTING/, name);
490 function osLaunchHistory(name) {
491 showProcessingDialog(true);
493 dojo.byId('osHistName').innerHTML = osSettings[name].label;
495 var data = dojo.byId('histTitle').innerHTML;
496 var thisHist = pcrud.search('coustl', {'field_name':name});
497 for(var i in thisHist) {
498 data += "<tr><td>" + thisHist[i].date_applied() + "</td><td>" +
499 ouNames[thisHist[i].org()] + "</td><td>" + thisHist[i].original_value() +
500 "</td><td>" + thisHist[i].new_value() + "</td></tr>";
503 dojo.byId('historyData').innerHTML = data;
505 showProcessingDialog(false);
510 function showAlert(message, timeout) {
514 dojo.removeClass('msgCont', 'hidden');
516 dojo.byId('msgInner').innerHTML = message;
518 var fadeArgs = { node: "msgCont" };
519 dojo.fadeIn(fadeArgs).play();
521 window.setTimeout('hideAlert()', timeout);
525 function hideAlert() {
526 var fadeArgs = { node: "msgCont" };
527 dojo.fadeOut(fadeArgs).play();
528 dojo.addClass('msgCont', 'hidden');