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');
26 var ouSettingValues = {};
27 var ouSettingNames = {};
31 var searchAssist = [];
34 function osInit(data) {
35 showProcessingDialog(true);
37 authtoken = new openils.CGI().param('ses') || dojo.cookie('ses');
38 user = new openils.User({authtoken:authtoken});
39 contextOrg = user.user.ws_ou();
40 openils.User.authtoken = authtoken;
42 pcrud = new openils.PermaCrud({authtoken:authtoken});
44 var grps = pcrud.retrieveAll('csg');
45 dojo.forEach(grps, function(grp) { osGroups[grp.name()] = grp.label(); });
47 var connect = function() {
48 dojo.connect(contextOrg, 'onChange', osChangeContext);
50 // don't draw the org settings grid unless the user has permission
51 // to view org settings in at least 1 org unit
52 osContextSelector.store.fetch({query: {}, start: 0, count: 0,
53 onBegin: function(size) {
54 if(size) { osDraw(); return; }
55 dojo.removeClass('no-perms', 'hide_me');
60 new openils.User().buildPermOrgSelector('VIEW_ORG_SETTINGS', osContextSelector, null, connect);
62 fieldmapper.standardRequest(
64 'open-ils.actor.permissions.retrieve'],
66 oncomplete: function(r) {
67 var data = r.recv().content();
68 if(e = openils.Event.parse(data))
71 perm_codes[data[key].id()] = data[key].code();
76 showProcessingDialog(false);
78 dojo.addOnLoad(osInit);
80 function showProcessingDialog(toggle) {
81 var proc = dojo.byId('proci18n').innerHTML;
83 progressDialog.show(true, proc);
85 progressDialog.hide();
88 function osDraw(specific_setting) {
89 showProcessingDialog(true);
92 if (specific_setting) {
94 for(var key in specific_setting)
98 var types = new openils.PermaCrud({authtoken:authtoken}).retrieveAll('coust');
104 osSettings[type.name()] = {
105 label : type.label(),
106 desc : type.description(),
107 type : type.datatype(),
108 fm_class : type.fm_class(),
109 update_perm : type.update_perm(),
110 grp : osGroups[type.grp()]
113 var tmp = "" + type.label() + "" + type.description() + "" + type.fm_class() + "" +
114 osGroups[type.grp()] + "" + type.name();
116 searchAssist[type.name()] = tmp.toLowerCase().replace(/[^a-z0-9]+/g, '');
120 for(var key in osSettings)
127 //Limits those functions seen to the ones that have similar text to
128 //that which is provided. Not case sensitive.
129 function osLimitSeen(text) {
130 showProcessingDialog(true);
132 text = text.split(' ');
135 text[t] = text[t].toLowerCase().replace(/[^a-z0-9]+/g, '');
137 numTerms = text.length;
140 for(var n in searchAssist) {
144 if(searchAssist[n].indexOf(text[t]) != -1)
147 if(numFound == numTerms)
151 //Don't update on an empty list as this causes bizarre errors.
152 if(names.length == 0) {
153 showProcessingDialog(false);
154 showAlert(dojo.byId('noresults').innerHTML);
158 ouSettingValues = {}; // Clear the values.
159 osDrawNames(names); // Repopulate setting values with the ones we want.
162 function doSearch() {
163 var query = dojo.byId('searchBox').value;
167 return false; //Keep form from submitting
170 function clearSearch() {
171 if(dojo.byId('searchBox').value != '') { // Don't refresh on blank.
172 dojo.byId('searchBox').value = '';
177 function osToJson() {
178 var out = dojo.fromJson(dojo.toJson(ouSettingValues)); // Easy deep copy
179 var context = osContextSelector.getValue();
181 // Set all of the nulls in the outputs to be part of the current org
182 // this keeps from overwriting later if this file is transfered to another lib.
185 out[key] = {'org':context, 'value':null};
187 dojo.byId('jsonOutput').value = dojo.toJson(out);
188 osJSONOutDialog.show();
191 // Copies the text from the json output to the clipboard.
192 function osJsonOutputCopy() {
193 document.popupNode = dojo.byId('jsonOutput');
194 dojo.byId('jsonOutput').focus();
195 dojo.byId('jsonOutput').select();
196 util.clipboard.copy();
197 showAlert(dojo.byId('os-copy').innerHTML);
200 function osJsonInputPaste() {
201 document.popupNode = dojo.byId('jsonInput');
202 document.popupNode.focus();
203 document.popupNode.select();
204 util.clipboard.paste();
207 function osFromJson() {
208 dojo.byId('jsonInput').value = '';
209 osJSONInDialog.show();
212 function osFromJsonSubmit() {
213 var input = dojo.byId('jsonInput').value;
214 var from = dojo.fromJson(input);
216 osJSONInDialog.hide();
218 showProcessingDialog(true);
221 //Check that there isn't already set to the same value (speed increase);
222 if( ouSettingValues[key] == null &&
223 from[key]['value'] == null &&
224 osContextSelector.getValue() == from[key]['org'])
227 if( ouSettingValues[key] != null &&
228 ouSettingValues[key]['value'] == from[key]['value'] &&
229 ouSettingValues[key]['org'] == from[key]['org'])
235 if(from[key] != null) {
236 obj[key] = from[key]['value'];
237 context = from[key]['org'];
240 osUpdateSetting(obj, context);
242 showProcessingDialog(false);
245 //Draws the grid based upon a given array of items to draw.
246 function osDrawNames(names) {
247 fieldmapper.standardRequest(
249 'open-ils.actor.ou_setting.ancestor_default.batch'],
251 params: [contextOrg, names, authtoken],
252 oncomplete: function(r) {
253 var data = r.recv().content();
254 if(e = openils.Event.parse(data))
257 ouSettingValues[key] = data[key];
258 osLoadGrid(ouSettingValues);
260 showProcessingDialog(false);
266 function osChangeContext() {
267 if(contextOrg == osContextSelector.getValue())
269 contextOrg = osContextSelector.getValue();
273 function osLoadGrid(data) {
274 var gridData = {items:[]}
275 for(var key in data) {
276 var setting = osSettings[key];
277 setting.context = null;
278 setting.value = null;
280 setting.context = data[key].org;
281 setting.value = data[key].value;
283 gridData.items.push({name:key});
285 gridData.items = gridData.items.sort(
287 var seta = osSettings[a.name];
288 var setb = osSettings[b.name];
289 if(seta.label > setb.label) return 1;
290 if(seta.label < setb.label) return -1;
294 gridData.identifier = 'name';
295 var store = new dojo.data.ItemFileReadStore({data:gridData});
296 var model = new dojox.grid.data.DojoData(
297 null, store, {rowsPerPage: 100, clientSort: true, query:{name:'*'}});
299 osGrid.setModel(model);
300 osGrid.setStructure(osGridLayout);
304 function osGetGridData(rowIdx) {
305 var data = this.grid.model.getRow(rowIdx);
307 var setting = osSettings[data.name];
308 var value = setting[this.field];
309 if(value == null) return '';
313 return fieldmapper.aou.findOrgUnit(value).shortname();
315 if(setting.noInherit)
319 if(setting.fm_class) {
320 var autoWidget = new openils.widget.AutoFieldWidget(
322 fmClass : setting.fm_class,
323 selfReference : true,
330 if(autoWidget.getDisplayString())
331 return autoWidget.getDisplayString();
334 if(setting.type == 'bool') {
336 return dojo.byId('os-true').innerHTML;
337 return dojo.byId('os-false').innerHTML;
344 function osGetEditLink(rowIdx) {
345 var data = this.grid.model.getRow(rowIdx);
350 function osFormatEditLink(name) {
351 return this.value.replace(/SETTING/, name);
354 function osLaunchEditor(name) {
355 osEditDialog._osattr = name;
357 var perms = ['UPDATE_ORG_UNIT_SETTING_ALL'];
358 if(osSettings[name].update_perm && perm_codes[osSettings[name].update_perm]) {
359 perms.push(perm_codes[osSettings[name].update_perm]);
361 user.buildPermOrgSelector(
363 osEditContextSelector, osSettings[name].context
365 dojo.byId('os-edit-name').innerHTML = osSettings[name].label;
366 dojo.byId('os-edit-desc').innerHTML = osSettings[name].desc || '';
368 dojo.style(osEditTextBox.domNode, 'display', 'none');
369 dojo.style(osEditCurrencyTextBox.domNode, 'display', 'none');
370 dojo.style(osEditNumberTextBox.domNode, 'display', 'none');
371 dojo.style(osEditBoolSelect.domNode, 'display', 'none');
373 var fmClass = osSettings[name].fm_class;
377 if(osEditAutoWidget) {
378 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
379 osEditAutoWidget.destroy();
382 var autoWidget = new openils.widget.AutoFieldWidget(
385 selfReference : true,
386 parentNode : dojo.create('div', null, dojo.byId('os-edit-auto-widget')),
387 widgetValue : osSettings[name].value
392 osEditAutoWidget = w;
398 switch(osSettings[name].type) {
400 widget = osEditNumberTextBox;
403 widget = osEditCurrencyTextBox;
406 widget = osEditBoolSelect;
409 widget = osEditTextBox;
412 dojo.style(widget.domNode, 'display', 'block');
413 widget.setValue(osSettings[name].value);
417 function osEditSetting(deleteMe) {
419 var name = osEditDialog._osattr;
427 if(osSettings[name].fm_class) {
428 var val = osEditAutoWidget.attr('value');
429 osEditAutoWidget.domNode.parentNode.removeChild(osEditAutoWidget.domNode);
430 osEditAutoWidget.destroy();
431 osEditAutoWidget = null;
432 if(val == null || val == '') return;
436 switch(osSettings[name].type) {
438 obj[name] = osEditNumberTextBox.getValue();
439 if(obj[name] == null) return;
442 obj[name] = osEditCurrencyTextBox.getValue();
443 if(obj[name] == null) return;
446 var val = osEditBoolSelect.getValue();
447 obj[name] = (val == 'true') ? true : false;
450 obj[name] = osEditTextBox.getValue();
451 if(obj[name] == null) return;
455 osUpdateSetting(obj, osEditContextSelector.getValue(), name);
458 function osUpdateSetting(obj, context, name) {
459 fieldmapper.standardRequest(
460 ['open-ils.actor', 'open-ils.actor.org_unit.settings.update'],
462 params: [authtoken, context, obj],
463 oncomplete: function(r) {
464 var res = r.recv().content();
465 if(e = openils.Event.parse(res))
473 function osGetHistoryLink(rowIdx) {
474 var data = this.grid.model.getRow(rowIdx);
479 function osFormatHistoryLink(name) {
480 return this.value.replace(/SETTING/, name);
483 function osLaunchHistory(name) {
484 showProcessingDialog(true);
486 dojo.byId('osHistName').innerHTML = osSettings[name].label;
488 var data = dojo.byId('histTitle').innerHTML;
489 var thisHist = pcrud.search('coustl', {'field_name':name});
490 for(var i in thisHist) {
491 data += "<tr><td>" + thisHist[i].date_applied() + "</td><td>" +
492 thisHist[i].org() + "</td><td>" + thisHist[i].original_value() +
493 "</td><td>" + thisHist[i].new_value() + "</td></tr>";
496 dojo.byId('historyData').innerHTML = data;
498 showProcessingDialog(false);
503 function showAlert(message, timeout) {
507 dojo.removeClass('msgCont', 'hidden');
509 dojo.byId('msgInner').innerHTML = message;
514 dojo.fadeIn(fadeArgs).play();
516 window.setTimeout('hideAlert()', timeout);
520 function hideAlert() {
524 dojo.fadeOut(fadeArgs).play();
525 dojo.addClass('msgCont', 'hidden');