1 dojo.require('openils.widget.AutoFieldWidget');
2 dojo.require('openils.PermaCrud');
3 dojo.require('openils.XUL');
4 dojo.require('dojox.form.CheckedMultiSelect');
7 var storekey = 'eg.acq.upload.';
8 var osetkey = 'acq.upload.default.';
9 var persistOrgSettings;
11 // map local dijit keys/names to their org setting counterparts
13 match_set : 'vandelay.match_set',
14 merge_profile : 'vandelay.merge_profile',
15 create_assets : 'vandelay.load_item_for_imported',
16 match_quality_ratio : 'vandelay.quality_ratio',
17 auto_overlay_1match : 'vandelay.merge_on_single',
18 import_no_match : 'vandelay.import_non_matching',
19 fall_through_merge_profile : 'vandelay.low_quality_fall_thru_profile',
20 auto_overlay_exact : 'vandelay.merge_on_exact',
21 auto_overlay_best_match : 'vandelay.merge_on_best'
24 // per-UI setting to change this?
25 // if true, set default widget values from org settings
26 // (when defined) regardless of any locally persisted value
27 var ouSettingTrumpsPersist = true;
29 function VLAgent(args) {
31 for (var key in args) {
32 this[key] = args[key];
36 {key : 'import_no_match'},
37 {key : 'auto_overlay_exact'},
38 {key : 'auto_overlay_1match'},
39 {key : 'auto_overlay_best_match'},
40 {key : 'match_quality_ratio'},
42 {key : 'create_assets'},
43 {key : 'match_set', cls : 'vms'},
44 {key : 'bib_source', cls : 'cbs'},
45 {key : 'merge_profile', cls : 'vmp'},
46 {key : 'fall_through_merge_profile', cls : 'vmp'},
47 {key : 'existing_queue', cls : 'vbq'},
48 {key : 'strip_field_groups', cls : 'vibtg'}
53 this.init = function(oncomplete) {
56 xulStorage = openils.XUL.localStorage();
58 // load org unit persist setting values
59 fieldmapper.standardRequest(
60 ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default.batch'],
63 new openils.User().user.ws_ou(),
64 [ osetkey + 'create_po',
65 osetkey + 'activate_po',
67 osetkey + 'vandelay.match_set',
68 osetkey + 'vandelay.merge_profile',
69 osetkey + 'vandelay.import_non_matching',
70 osetkey + 'vandelay.merge_on_exact',
71 osetkey + 'vandelay.merge_on_best',
72 osetkey + 'vandelay.merge_on_single',
73 osetkey + 'vandelay.quality_ratio',
74 osetkey + 'vandelay.low_quality_fall_thru_profile',
75 osetkey + 'vandelay.load_item_for_imported'
78 oncomplete : function(r) {
79 persistOrgSettings = openils.Util.readResponse(r);
88 this.init2 = function() {
90 // fetch the strip field groups, then continue init-ing
92 var owner = fieldmapper.aou.orgNodeTrail(
93 fieldmapper.aou.findOrgUnit(new openils.User().user.ws_ou()));
95 new openils.PermaCrud().search('vibtg',
97 owner: owner.map(function(org) { return org.id(); })
99 { order_by : {vibtg : ['label']},
101 oncomplete: function(r) {
102 var trashGroups = openils.Util.readResponse(r);
103 var sel = dijit.byId('acq_vl:strip_field_groups');
105 var widg = self.widgets.filter(function(w) {
106 return w.key == 'strip_field_groups'})[0];
109 if (trashGroups.length == 0) {
110 openils.Util.hide('vl-trash-groups-row');
114 dojo.forEach(trashGroups, function(grp) {
115 var sn = fieldmapper.aou.findOrgUnit(
116 grp.owner()).shortname();
118 label : grp.label() + ' (' + sn + ')',
124 self.readCachedValue(sel, 'strip_field_groups');
134 this.init3 = function() {
137 dojo.forEach(this.widgets,
141 // strip-fields widget built above
142 if (key == 'strip_field_groups') return;
144 if (widg.cls) { // selectors
146 new openils.widget.AutoFieldWidget({
148 selfReference : true,
149 orgLimitPerms : [self.limitPerm || 'CREATE_PURCHASE_ORDER'],
150 parentNode : dojo.byId('acq_vl:' + key),
151 searchFilter : (widg.cls == 'vbq') ? {queue_type : 'acq'} : null,
152 useWriteStore : (widg.cls == 'vbq')
153 }).build(function(dij) {
155 if (!key.match(/queue/))
156 self.readCachedValue(dij, key);
157 self.attachOnChange(widg);
161 widg.dijit = dijit.byId('acq_vl:' + key);
162 if (!widg.dijit) return; // some fields optional
163 if (!key.match(/queue/))
164 self.readCachedValue(widg.dijit, key);
165 self.attachOnChange(widg);
170 // loaded != all widgets are done rendering,
171 // only that init() has been called.
175 this.attachOnChange = function(widg) {
179 var qSelChange = function(val) {
180 // user selected a queue from the selector; clear the text input
181 // and set the item import profile already defined for the queue
183 var qInput = self.getDijit('queue_name');
184 var matchSetSelector = self.getDijit('match_set');
185 var qSelector = self.getDijit('existing_queue');
188 qSelector.store.fetch({
189 query : {id : val+''},
190 onComplete : function(items) {
191 matchSetSelector.attr('value', items[0].match_set[0] || '');
192 matchSetSelector.attr('disabled', true);
196 matchSetSelector.attr('value', '');
197 matchSetSelector.attr('disabled', false);
200 // detach and reattach to avoid onchange firing while when we clear
201 dojo.disconnect(qInput._onchange);
202 qInput.attr('value', '');
203 qInput._onchange = dojo.connect(qInput, 'onChange', qInputChange);
206 qInputChange = function(val) {
208 var qSelector = self.getDijit('existing_queue');
209 var matchSetSelector = self.getDijit('match_set');
210 var foundMatch = false;
214 // if the user entered the name of an existing queue, update the
215 // queue selector to match the value (and clear the text input
216 // via qselector onchange)
217 qSelector.store.fetch({
219 onComplete:function(items) {
220 if(items.length == 0) return;
222 qSelector.attr('value', item.id);
229 self.getDijit('match_set').attr('disabled', false);
230 dojo.disconnect(qSelector._onchange);
231 qSelector.attr('value', '');
232 qSelector._onchange = dojo.connect(qSelector, 'onChange', qSelChange);
236 if (widg.key == 'existing_queue') {
237 var qSelector = self.getDijit('existing_queue');
238 qSelector._onchange = dojo.connect(qSelector, 'onChange', qSelChange);
239 } else if(widg.key == 'queue_name') {
240 var qInput = self.getDijit('queue_name');
241 qInput._onchange = dojo.connect(qInput, 'onChange', qInputChange);
245 this.getDijit = function(key) {
246 return this.widgets.filter(function(w) {return (w.key == key)})[0].dijit;
249 this.values = function() {
252 dojo.forEach(this.widgets,
255 values[widg.key] = widg.dijit.attr('value');
256 if (!widg.key.match(/queue/))
257 self.writeCachedValue(widg.dijit, widg.key);
264 this.handleResponse = function(resp, oncomplete) {
268 console.log('vandelay import returned : ' + js2JSON(resp));
270 // update the display counts
271 dojo.byId('acq_vl:li-processed').innerHTML = resp.li;
272 dojo.byId('acq_vl:vqbr-processed').innerHTML = resp.vqbr;
273 dojo.byId('acq_vl:bibs-processed').innerHTML = resp.bibs;
274 dojo.byId('acq_vl:lid-processed').innerHTML = resp.lid;
275 dojo.byId('acq_vl:debits-processed').innerHTML = resp.debits_accrued;
276 dojo.byId('acq_vl:copies-processed').innerHTML = resp.copies;
281 res.picklist_url = oilsBasePath + '/acq/picklist/view/' + resp.picklist.id();
284 if(resp.purchase_order) {
285 res.po_url = oilsBasePath + '/acq/po/view/' + resp.purchase_order.id();
289 var newQid = resp.queue.id();
290 res.queue_url = oilsBasePath + '/vandelay/vandelay?qtype=bib&qid=' + newQid;
292 var qInput = this.getDijit('queue_name');
294 if (newQName = qInput.attr('value')) {
295 // user created a new queue. Fetch the new queue object,
296 // replace the ReadStore with a WriteStore and insert.
297 qInput.attr('value', '');
298 var qSelector = this.getDijit('existing_queue');
299 var newQ = new openils.PermaCrud().retrieve('vbq', newQid);
300 qSelector.store.newItem(newQ.toStoreItem());
301 qSelector.attr('value', newQid);
306 oncomplete(resp, res);
311 return false; // not yet complete
314 this.readCachedValue = function(dij, key, ousOnly) {
316 var setname = osetkey + (setNameMap[key] ? setNameMap[key] : key);
318 if (ouSettingTrumpsPersist && persistOrgSettings[setname]) {
319 val = persistOrgSettings[setname].value;
322 val = xulStorage.getItem(storekey + key);
323 if (!val && persistOrgSettings[setname])
324 val = persistOrgSettings[setname].value;
327 if (val) dij.attr('value', val);
331 this.writeCachedValue = function(dij, key) {
332 var setname = osetkey + (setNameMap[key] ? setNameMap[key] : key);
334 if (ouSettingTrumpsPersist && persistOrgSettings[setname]) {
335 // don't muck up localStorage if we're using org settings
336 xulStorage.removeItem(storekey + key);
339 var val = dij.attr('value');
341 if (val === null || val === false || val == '') {
342 xulStorage.removeItem(storekey + key);
344 xulStorage.setItem(storekey + key, val);