1 dojo.require('openils.widget.AutoFieldWidget');
2 dojo.require('openils.PermaCrud');
3 dojo.require('openils.XUL');
5 var xulStorage = openils.XUL.localStorage();
6 var storekey = 'eg.acq.upload.';
7 var osetkey = 'acq.upload.default.';
8 var persistOrgSettings;
10 // map local dijit keys/names to their org setting counterparts
12 match_set : 'vandelay.match_set',
13 merge_profile : 'vandelay.merge_profile',
14 create_assets : 'vandelay.load_item_for_imported',
15 match_quality_ratio : 'vandelay.quality_ratio',
16 auto_overlay_1match : 'vandelay.merge_on_single',
17 import_no_match : 'vandelay.import_non_matching',
18 fall_through_merge_profile : 'vandelay.low_quality_fall_thru_profile',
19 auto_overlay_exact : 'vandelay.merge_on_exact',
20 auto_overlay_best_match : 'vandelay.merge_on_best'
23 // per-UI setting to change this?
24 // if true, set default widget values from org settings
25 // (when defined) regardless of any locally persisted value
26 var ouSettingTrumpsPersist = true;
28 function VLAgent(args) {
30 for (var key in args) {
31 this[key] = args[key];
35 {key : 'import_no_match'},
36 {key : 'auto_overlay_exact'},
37 {key : 'auto_overlay_1match'},
38 {key : 'auto_overlay_best_match'},
39 {key : 'match_quality_ratio'},
41 {key : 'create_assets'},
42 {key : 'match_set', cls : 'vms'},
43 {key : 'bib_source', cls : 'cbs'},
44 {key : 'merge_profile', cls : 'vmp'},
45 {key : 'fall_through_merge_profile', cls : 'vmp'},
46 {key : 'existing_queue', cls : 'vbq'}
51 this.init = function(oncomplete) {
54 // load org unit persist setting values
55 fieldmapper.standardRequest(
56 ['open-ils.actor','open-ils.actor.ou_setting.ancestor_default.batch'],
59 new openils.User().user.ws_ou(),
60 [ osetkey + 'create_po',
61 osetkey + 'activate_po',
63 osetkey + 'vandelay.match_set',
64 osetkey + 'vandelay.merge_profile',
65 osetkey + 'vandelay.import_non_matching',
66 osetkey + 'vandelay.merge_on_exact',
67 osetkey + 'vandelay.merge_on_best',
68 osetkey + 'vandelay.merge_on_single',
69 osetkey + 'vandelay.quality_ratio',
70 osetkey + 'vandelay.low_quality_fall_thru_profile',
71 osetkey + 'vandelay.load_item_for_imported'
74 oncomplete : function(r) {
75 persistOrgSettings = openils.Util.readResponse(r);
84 this.init2 = function() {
87 dojo.forEach(this.widgets,
91 if (widg.cls) { // selectors
93 new openils.widget.AutoFieldWidget({
96 orgLimitPerms : [self.limitPerm || 'CREATE_PURCHASE_ORDER'],
97 parentNode : dojo.byId('acq_vl:' + key),
98 searchFilter : (widg.cls == 'vbq') ? {queue_type : 'acq'} : null,
99 useWriteStore : (widg.cls == 'vbq')
100 }).build(function(dij) {
102 if (!key.match(/queue/))
103 self.readCachedValue(dij, key);
104 self.attachOnChange(widg);
108 widg.dijit = dijit.byId('acq_vl:' + key);
109 if (!widg.dijit) return; // some fields optional
110 if (!key.match(/queue/))
111 self.readCachedValue(widg.dijit, key);
112 self.attachOnChange(widg);
117 // loaded != all widgets are done rendering,
118 // only that init() has been called.
122 this.attachOnChange = function(widg) {
126 var qSelChange = function(val) {
127 // user selected a queue from the selector; clear the text input
128 // and set the item import profile already defined for the queue
130 var qInput = self.getDijit('queue_name');
131 var matchSetSelector = self.getDijit('match_set');
132 var qSelector = self.getDijit('existing_queue');
135 qSelector.store.fetch({
136 query : {id : val+''},
137 onComplete : function(items) {
138 matchSetSelector.attr('value', items[0].match_set[0] || '');
139 matchSetSelector.attr('disabled', true);
143 matchSetSelector.attr('value', '');
144 matchSetSelector.attr('disabled', false);
147 // detach and reattach to avoid onchange firing while when we clear
148 dojo.disconnect(qInput._onchange);
149 qInput.attr('value', '');
150 qInput._onchange = dojo.connect(qInput, 'onChange', qInputChange);
153 qInputChange = function(val) {
155 var qSelector = self.getDijit('existing_queue');
156 var matchSetSelector = self.getDijit('match_set');
157 var foundMatch = false;
161 // if the user entered the name of an existing queue, update the
162 // queue selector to match the value (and clear the text input
163 // via qselector onchange)
164 qSelector.store.fetch({
166 onComplete:function(items) {
167 if(items.length == 0) return;
169 qSelector.attr('value', item.id);
176 self.getDijit('match_set').attr('disabled', false);
177 dojo.disconnect(qSelector._onchange);
178 qSelector.attr('value', '');
179 qSelector._onchange = dojo.connect(qSelector, 'onChange', qSelChange);
183 if (widg.key == 'existing_queue') {
184 var qSelector = self.getDijit('existing_queue');
185 qSelector._onchange = dojo.connect(qSelector, 'onChange', qSelChange);
186 } else if(widg.key == 'queue_name') {
187 var qInput = self.getDijit('queue_name');
188 qInput._onchange = dojo.connect(qInput, 'onChange', qInputChange);
192 this.getDijit = function(key) {
193 return this.widgets.filter(function(w) {return (w.key == key)})[0].dijit;
196 this.values = function() {
199 dojo.forEach(this.widgets,
202 values[widg.key] = widg.dijit.attr('value');
203 if (!widg.key.match(/queue/))
204 self.writeCachedValue(widg.dijit, widg.key);
211 this.handleResponse = function(resp, oncomplete) {
215 console.log('vandelay import returned : ' + js2JSON(resp));
217 // update the display counts
218 dojo.byId('acq_vl:li-processed').innerHTML = resp.li;
219 dojo.byId('acq_vl:vqbr-processed').innerHTML = resp.vqbr;
220 dojo.byId('acq_vl:bibs-processed').innerHTML = resp.bibs;
221 dojo.byId('acq_vl:lid-processed').innerHTML = resp.lid;
222 dojo.byId('acq_vl:debits-processed').innerHTML = resp.debits_accrued;
223 dojo.byId('acq_vl:copies-processed').innerHTML = resp.copies;
228 res.picklist_url = oilsBasePath + '/acq/picklist/view/' + resp.picklist.id();
231 if(resp.purchase_order) {
232 res.po_url = oilsBasePath + '/acq/po/view/' + resp.purchase_order.id();
236 var newQid = resp.queue.id();
237 res.queue_url = oilsBasePath + '/vandelay/vandelay?qtype=bib&qid=' + newQid;
239 var qInput = this.getDijit('queue_name');
241 if (newQName = qInput.attr('value')) {
242 // user created a new queue. Fetch the new queue object,
243 // replace the ReadStore with a WriteStore and insert.
244 qInput.attr('value', '');
245 var qSelector = this.getDijit('existing_queue');
246 var newQ = new openils.PermaCrud().retrieve('vbq', newQid);
247 qSelector.store.newItem(newQ.toStoreItem());
248 qSelector.attr('value', newQid);
253 oncomplete(resp, res);
258 return false; // not yet complete
261 this.readCachedValue = function(dij, key) {
263 var setname = osetkey + (setNameMap[key] ? setNameMap[key] : key);
265 if (ouSettingTrumpsPersist && persistOrgSettings[setname]) {
266 val = persistOrgSettings[setname].value;
268 val = xulStorage.getItem(storekey + key);
269 if (!val && persistOrgSettings[setname])
270 val = persistOrgSettings[setname].value;
273 if (val) dij.attr('value', val);
277 this.writeCachedValue = function(dij, key) {
278 var setname = osetkey + (setNameMap[key] ? setNameMap[key] : key);
280 if (ouSettingTrumpsPersist && persistOrgSettings[setname]) {
281 // don't muck up localStorage if we're using org settings
282 xulStorage.removeItem(storekey + key);
285 var val = dij.attr('value');
287 if (val === null || val === false || val == '') {
288 xulStorage.removeItem(storekey + key);
290 xulStorage.setItem(storekey + key, val);