1 dojo.require('openils.widget.AutoFieldWidget');
2 dojo.require('openils.PermaCrud');
3 dojo.require('openils.XUL');
4 dojo.require('dojox.form.CheckedMultiSelect');
6 var xulStorage = openils.XUL.localStorage();
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 // load org unit persist setting values
57 fieldmapper.standardRequest(
58 ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default.batch'],
61 new openils.User().user.ws_ou(),
62 [ osetkey + 'create_po',
63 osetkey + 'activate_po',
65 osetkey + 'vandelay.match_set',
66 osetkey + 'vandelay.merge_profile',
67 osetkey + 'vandelay.import_non_matching',
68 osetkey + 'vandelay.merge_on_exact',
69 osetkey + 'vandelay.merge_on_best',
70 osetkey + 'vandelay.merge_on_single',
71 osetkey + 'vandelay.quality_ratio',
72 osetkey + 'vandelay.low_quality_fall_thru_profile',
73 osetkey + 'vandelay.load_item_for_imported'
76 oncomplete : function(r) {
77 persistOrgSettings = openils.Util.readResponse(r);
86 this.init2 = function() {
88 // fetch the strip field groups, then continue init-ing
90 var owner = fieldmapper.aou.orgNodeTrail(
91 fieldmapper.aou.findOrgUnit(new openils.User().user.ws_ou()));
93 new openils.PermaCrud().search('vibtg',
95 owner: owner.map(function(org) { return org.id(); })
97 { order_by : {vibtg : ['label']},
99 oncomplete: function(r) {
100 var trashGroups = openils.Util.readResponse(r);
101 var sel = dijit.byId('acq_vl:strip_field_groups');
103 var widg = self.widgets.filter(function(w) {
104 return w.key == 'strip_field_groups'})[0];
107 if (trashGroups.length == 0) {
108 openils.Util.hide('vl-trash-groups-row');
112 dojo.forEach(trashGroups, function(grp) {
113 var sn = fieldmapper.aou.findOrgUnit(
114 grp.owner()).shortname();
116 label : grp.label() + ' (' + sn + ')',
122 self.readCachedValue(sel, 'strip_field_groups');
132 this.init3 = function() {
135 dojo.forEach(this.widgets,
139 // strip-fields widget built above
140 if (key == 'strip_field_groups') return;
142 if (widg.cls) { // selectors
144 new openils.widget.AutoFieldWidget({
146 selfReference : true,
147 orgLimitPerms : [self.limitPerm || 'CREATE_PURCHASE_ORDER'],
148 parentNode : dojo.byId('acq_vl:' + key),
149 searchFilter : (widg.cls == 'vbq') ? {queue_type : 'acq'} : null,
150 useWriteStore : (widg.cls == 'vbq')
151 }).build(function(dij) {
153 if (!key.match(/queue/))
154 self.readCachedValue(dij, key);
155 self.attachOnChange(widg);
159 widg.dijit = dijit.byId('acq_vl:' + key);
160 if (!widg.dijit) return; // some fields optional
161 if (!key.match(/queue/))
162 self.readCachedValue(widg.dijit, key);
163 self.attachOnChange(widg);
168 // loaded != all widgets are done rendering,
169 // only that init() has been called.
173 this.attachOnChange = function(widg) {
177 var qSelChange = function(val) {
178 // user selected a queue from the selector; clear the text input
179 // and set the item import profile already defined for the queue
181 var qInput = self.getDijit('queue_name');
182 var matchSetSelector = self.getDijit('match_set');
183 var qSelector = self.getDijit('existing_queue');
186 qSelector.store.fetch({
187 query : {id : val+''},
188 onComplete : function(items) {
189 matchSetSelector.attr('value', items[0].match_set[0] || '');
190 matchSetSelector.attr('disabled', true);
194 matchSetSelector.attr('value', '');
195 matchSetSelector.attr('disabled', false);
198 // detach and reattach to avoid onchange firing while when we clear
199 dojo.disconnect(qInput._onchange);
200 qInput.attr('value', '');
201 qInput._onchange = dojo.connect(qInput, 'onChange', qInputChange);
204 qInputChange = function(val) {
206 var qSelector = self.getDijit('existing_queue');
207 var matchSetSelector = self.getDijit('match_set');
208 var foundMatch = false;
212 // if the user entered the name of an existing queue, update the
213 // queue selector to match the value (and clear the text input
214 // via qselector onchange)
215 qSelector.store.fetch({
217 onComplete:function(items) {
218 if(items.length == 0) return;
220 qSelector.attr('value', item.id);
227 self.getDijit('match_set').attr('disabled', false);
228 dojo.disconnect(qSelector._onchange);
229 qSelector.attr('value', '');
230 qSelector._onchange = dojo.connect(qSelector, 'onChange', qSelChange);
234 if (widg.key == 'existing_queue') {
235 var qSelector = self.getDijit('existing_queue');
236 qSelector._onchange = dojo.connect(qSelector, 'onChange', qSelChange);
237 } else if(widg.key == 'queue_name') {
238 var qInput = self.getDijit('queue_name');
239 qInput._onchange = dojo.connect(qInput, 'onChange', qInputChange);
243 this.getDijit = function(key) {
244 return this.widgets.filter(function(w) {return (w.key == key)})[0].dijit;
247 this.values = function() {
250 dojo.forEach(this.widgets,
253 values[widg.key] = widg.dijit.attr('value');
254 if (!widg.key.match(/queue/))
255 self.writeCachedValue(widg.dijit, widg.key);
262 this.handleResponse = function(resp, oncomplete) {
266 console.log('vandelay import returned : ' + js2JSON(resp));
268 // update the display counts
269 dojo.byId('acq_vl:li-processed').innerHTML = resp.li;
270 dojo.byId('acq_vl:vqbr-processed').innerHTML = resp.vqbr;
271 dojo.byId('acq_vl:bibs-processed').innerHTML = resp.bibs;
272 dojo.byId('acq_vl:lid-processed').innerHTML = resp.lid;
273 dojo.byId('acq_vl:debits-processed').innerHTML = resp.debits_accrued;
274 dojo.byId('acq_vl:copies-processed').innerHTML = resp.copies;
279 res.picklist_url = oilsBasePath + '/acq/picklist/view/' + resp.picklist.id();
282 if(resp.purchase_order) {
283 res.po_url = oilsBasePath + '/acq/po/view/' + resp.purchase_order.id();
287 var newQid = resp.queue.id();
288 res.queue_url = oilsBasePath + '/vandelay/vandelay?qtype=bib&qid=' + newQid;
290 var qInput = this.getDijit('queue_name');
292 if (newQName = qInput.attr('value')) {
293 // user created a new queue. Fetch the new queue object,
294 // replace the ReadStore with a WriteStore and insert.
295 qInput.attr('value', '');
296 var qSelector = this.getDijit('existing_queue');
297 var newQ = new openils.PermaCrud().retrieve('vbq', newQid);
298 qSelector.store.newItem(newQ.toStoreItem());
299 qSelector.attr('value', newQid);
304 oncomplete(resp, res);
309 return false; // not yet complete
312 this.readCachedValue = function(dij, key, ousOnly) {
314 var setname = osetkey + (setNameMap[key] ? setNameMap[key] : key);
316 if (ouSettingTrumpsPersist && persistOrgSettings[setname]) {
317 val = persistOrgSettings[setname].value;
320 val = xulStorage.getItem(storekey + key);
321 if (!val && persistOrgSettings[setname])
322 val = persistOrgSettings[setname].value;
325 if (val) dij.attr('value', val);
329 this.writeCachedValue = function(dij, key) {
330 var setname = osetkey + (setNameMap[key] ? setNameMap[key] : key);
332 if (ouSettingTrumpsPersist && persistOrgSettings[setname]) {
333 // don't muck up localStorage if we're using org settings
334 xulStorage.removeItem(storekey + key);
337 var val = dij.attr('value');
339 if (val === null || val === false || val == '') {
340 xulStorage.removeItem(storekey + key);
342 xulStorage.setItem(storekey + key, val);