1 dojo.require('dojo.date.locale');
2 dojo.require('dojo.date.stamp');
3 dojo.require('dijit.form.Button');
4 dojo.require('dijit.form.TextBox');
5 dojo.require('dijit.form.FilteringSelect');
6 dojo.require('dijit.form.Textarea');
7 dojo.require('dijit.ProgressBar');
8 dojo.require('openils.User');
9 dojo.require('openils.Util');
10 dojo.require('openils.acq.Lineitem');
11 dojo.require('openils.acq.PO');
12 dojo.require('openils.acq.Picklist');
13 dojo.require('openils.widget.AutoFieldWidget');
14 dojo.require('dojo.data.ItemFileReadStore');
15 dojo.require('openils.widget.ProgressDialog');
16 dojo.require('openils.PermaCrud');
17 dojo.require('openils.XUL');
19 dojo.requireLocalization('openils.acq', 'acq');
20 var localeStrings = dojo.i18n.getLocalization('openils.acq', 'acq');
21 const XUL_OPAC_WRAPPER = 'chrome://open_ils_staff_client/content/cat/opac.xul';
23 function nodeByName(name, context) {
24 return dojo.query('[name='+name+']', context)[0];
27 function AcqLiTable() {
31 this.toggleState = false;
32 this.tbody = dojo.byId('acq-lit-tbody');
34 this.authtoken = openils.User.authtoken;
35 this.rowTemplate = this.tbody.removeChild(dojo.byId('acq-lit-row'));
36 this.copyTbody = dojo.byId('acq-lit-li-details-tbody');
37 this.copyRow = this.copyTbody.removeChild(dojo.byId('acq-lit-li-details-row'));
38 this.copyBatchRow = dojo.byId('acq-lit-li-details-batch-row');
39 this.copyBatchWidgets = {};
40 this.liNotesTbody = dojo.byId('acq-lit-notes-tbody');
41 this.liNotesRow = this.liNotesTbody.removeChild(dojo.byId('acq-lit-notes-row'));
42 this.realCopiesTbody = dojo.byId('acq-lit-real-copies-tbody');
43 this.realCopiesRow = this.realCopiesTbody.removeChild(dojo.byId('acq-lit-real-copies-row'));
46 dojo.connect(acqLitLiActionsSelector, 'onChange',
48 self.applySelectedLiAction(this.attr('value'))
49 acqLitLiActionsSelector.attr('value', '_');
52 acqLitCreatePoSubmit.onClick = function() {
53 acqLitPoCreateDialog.hide();
54 self._createPO(acqLitPoCreateDialog.getValues());
57 acqLitSavePlButton.onClick = function() {
58 acqLitSavePlDialog.hide();
59 self._savePl(acqLitSavePlDialog.getValues());
63 //dojo.byId('acq-lit-notes-new-button').onclick = function(){acqLitCreateLiNoteDialog.show();}
65 dojo.byId('acq-lit-select-toggle').onclick = function(){self.toggleSelect()};
66 dojo.byId('acq-lit-info-back-button').onclick = function(){self.show('list')};
67 dojo.byId('acq-lit-copies-back-button').onclick = function(){self.show('list')};
68 dojo.byId('acq-lit-notes-back-button').onclick = function(){self.show('list')};
69 dojo.byId('acq-lit-real-copies-back-button').onclick = function(){self.show('list')};
71 this.reset = function() {
72 while(self.tbody.childNodes[0])
73 self.tbody.removeChild(self.tbody.childNodes[0]);
77 this.setNext = function(handler) {
78 var link = dojo.byId('acq-lit-next');
80 dojo.style(link, 'visibility', 'visible');
81 link.onclick = handler;
83 dojo.style(link, 'visibility', 'hidden');
87 this.setPrev = function(handler) {
88 var link = dojo.byId('acq-lit-prev');
90 dojo.style(link, 'visibility', 'visible');
91 link.onclick = handler;
93 dojo.style(link, 'visibility', 'hidden');
97 this.show = function(div) {
98 openils.Util.hide('acq-lit-table-div');
99 openils.Util.hide('acq-lit-info-div');
100 openils.Util.hide('acq-lit-li-details');
101 openils.Util.hide('acq-lit-notes-div');
102 openils.Util.hide('acq-lit-real-copies-div');
105 openils.Util.show('acq-lit-table-div');
108 openils.Util.show('acq-lit-info-div');
111 openils.Util.show('acq-lit-li-details');
114 openils.Util.show('acq-lit-real-copies-div');
117 openils.Util.show('acq-lit-notes-div');
121 openils.Util.show(div);
125 this.hide = function() {
129 this.toggleSelect = function() {
131 dojo.forEach(self.selectors, function(i){i.checked = false});
133 dojo.forEach(self.selectors, function(i){i.checked = true});
134 self.toggleState = !self.toggleState;
138 /** @param all If true, assume all are selected */
139 this.getSelected = function(all) {
141 dojo.forEach(self.selectors,
144 selected.push(self.liCache[i.parentNode.parentNode.getAttribute('li')]);
150 this.setRowAttr = function(td, liWrapper, field, type) {
151 var val = liWrapper.findAttr(field, type || 'lineitem_marc_attr_definition') || '';
152 td.appendChild(document.createTextNode(val));
155 this.addLineitem = function(li) {
156 this.liCache[li.id()] = li;
158 // sort the lineitem notes on edit_time
159 if(!li.lineitem_notes()) li.lineitem_notes([]);
161 var liWrapper = new openils.acq.Lineitem({lineitem:li});
162 var row = self.rowTemplate.cloneNode(true);
163 row.setAttribute('li', li.id());
164 var tds = dojo.query('[attr]', row);
165 dojo.forEach(tds, function(td) {self.setRowAttr(td, liWrapper, td.getAttribute('attr'), td.getAttribute('attr_type'));});
166 dojo.query('[name=source_label]', row)[0].appendChild(document.createTextNode(li.source_label()));
168 var isbn = liWrapper.findAttr('isbn', 'lineitem_marc_attr_definition');
170 // XXX media prefix for added content
171 dojo.query('[name=jacket]', row)[0].setAttribute('src', '/opac/extras/ac/jacket/small/' + isbn);
174 dojo.query('[attr=title]', row)[0].onclick = function() {self.drawInfo(li.id())};
175 dojo.query('[name=copieslink]', row)[0].onclick = function() {self.drawCopies(li.id())};
176 dojo.query('[name=count]', row)[0].innerHTML = li.item_count() || 0;
177 dojo.query('[name=notes_count]', row)[0].innerHTML = li.lineitem_notes().length;
178 dojo.query('[name=noteslink]', row)[0].onclick = function() {self.drawLiNotes(li)};
180 var priceInput = dojo.query('[name=price]', row)[0];
181 var priceData = liWrapper.getPrice();
182 priceInput.value = (priceData) ? priceData.price : '';
183 priceInput.onchange = function() { self.updateLiPrice(priceInput, li) };
185 var recv_link = dojo.query('[name=receive_link]', row)[0];
187 if(li.state() == 'received') {
188 // if the LI is received, hide the receive link and show the 'update barcodes' link
189 openils.Util.hide(recv_link)
190 var real_copies_link = dojo.query('[name=real_copies_link]', row)[0];
191 openils.Util.show(real_copies_link);
192 real_copies_link.onclick = function() {
193 self.showRealCopies(li);
197 recv_link.onclick = function() {
199 openils.Util.hide(recv_link)
203 self.tbody.appendChild(row);
204 self.selectors.push(dojo.query('[name=selectbox]', row)[0]);
207 this.drawLiNotes = function(li) {
211 li.lineitem_notes().sort(
213 if(a.edit_time() < b.edit_time()) return 1;
219 while(this.liNotesTbody.childNodes[0])
220 this.liNotesTbody.removeChild(this.liNotesTbody.childNodes[0]);
223 acqLitCreateLiNoteSubmit.onClick = function() {
224 var value = acqLitCreateNoteText.attr('value');
226 var note = new fieldmapper.acqlin();
229 note.lineitem(li.id());
230 self.updateLiNotes(li, note);
233 dojo.byId('acq-lit-notes-save-button').onclick = function() {
234 self.updateLiNotes(li);
237 dojo.forEach(li.lineitem_notes(), function(note) { self.addLiNote(li, note) });
240 this.addLiNote = function(li, note) {
241 if(note.isdeleted()) return;
243 var row = self.liNotesRow.cloneNode(true);
244 dojo.query('[name=value]', row)[0].innerHTML = note.value();
246 dojo.query('[name=delete]', row)[0].onclick = function() {
247 note.isdeleted(true);
248 self.liNotesTbody.removeChild(row);
251 if(note.edit_time()) {
252 dojo.query('[name=edit_time]', row)[0].innerHTML =
253 dojo.date.locale.format(
254 dojo.date.stamp.fromISOString(note.edit_time()),
255 {formatLength:'short'});
258 self.liNotesTbody.appendChild(row);
261 this.updateLiNotes = function(li, newNote) {
267 notes = li.lineitem_notes().filter(
269 if(note.ischanged() || note.isnew() || note.isdeleted())
275 if(notes.length == 0) return;
276 progressDialog.show();
278 fieldmapper.standardRequest(
279 ['open-ils.acq', 'open-ils.acq.lineitem_note.cud.batch'],
281 params : [this.authtoken, notes],
282 onresponse : function(r) {
283 var resp = openils.Util.readResponse(r);
288 // remove the old changed notes
290 dojo.forEach(li.lineitem_notes(),
292 if(!(note.ischanged() || note.isnew() || note.isdeleted()))
296 li.lineitem_notes(list);
299 progressDialog.hide();
300 self.drawLiNotes(li);
304 progressDialog.update(resp);
305 var newnote = resp.note;
307 if(!newnote.isdeleted()) {
308 newnote.isnew(false);
309 newnote.ischanged(false);
310 li.lineitem_notes().push(newnote);
317 this.updateLiPrice = function(input, li) {
319 var price = input.value;
320 var liWrapper = new openils.acq.Lineitem({lineitem:li});
321 var oldPrice = liWrapper.getPrice() || null;
323 if(oldPrice) oldPrice = oldPrice.price;
324 if(price == oldPrice) return;
326 fieldmapper.standardRequest(
327 ['open-ils.acq', 'open-ils.acq.lineitem.price.set'],
329 params : [this.authtoken, li.id(), price],
330 oncomplete : function(r) {
331 openils.Util.readResponse(r);
337 this.removeLineitem = function(liId) {
338 this.tbody.removeChild(dojo.query('[li='+liId+']', this.tbody)[0]);
339 delete this.liCache[liId];
342 this.drawInfo = function(liId) {
344 openils.acq.Lineitem.fetchAttrDefs(
346 self._fetchLineitem(liId, function(li){self._drawInfo(li);});
351 this._fetchLineitem = function(liId, handler) {
353 var li = this.liCache[liId];
354 if(li && li.marc() && li.lineitem_details())
357 fieldmapper.standardRequest(
358 ['open-ils.acq', 'open-ils.acq.lineitem.retrieve'],
361 params: [self.authtoken, liId, {
363 flesh_li_details: true,
364 flesh_fund_debit: true }],
366 oncomplete: function(r) {
367 var li = openils.Util.readResponse(r);
374 this._drawInfo = function(li) {
376 acqLitEditOrderMarc.onClick = function() { self.editOrderMarc(li); }
379 openils.Util.hide('acq-lit-marc-order-record-label');
380 openils.Util.hide(acqLitEditOrderMarc.domNode);
381 openils.Util.show('acq-lit-marc-real-record-label');
383 openils.Util.show('acq-lit-marc-order-record-label');
384 openils.Util.show(acqLitEditOrderMarc.domNode);
385 openils.Util.hide('acq-lit-marc-real-record-label');
388 this.drawMarcHTML(li);
389 this.infoTbody = dojo.byId('acq-lit-info-tbody');
392 this.infoRow = this.infoTbody.removeChild(dojo.byId('acq-lit-info-row'));
393 while(this.infoTbody.childNodes[0])
394 this.infoTbody.removeChild(this.infoTbody.childNodes[0]);
396 for(var i = 0; i < li.attributes().length; i++) {
397 var attr = li.attributes()[i];
398 var row = this.infoRow.cloneNode(true);
400 var type = attr.attr_type().replace(/lineitem_(.*)_attr_definition/, '$1');
401 var name = openils.acq.Lineitem.attrDefs[type].filter(
403 return (a.code() == attr.attr_name());
405 ).pop().description();
407 dojo.query('[name=label]', row)[0].appendChild(document.createTextNode(name));
408 dojo.query('[name=value]', row)[0].appendChild(document.createTextNode(attr.attr_value()));
409 this.infoTbody.appendChild(row);
413 openils.Util.show('acq-lit-info-cat-link');
414 var link = dojo.byId('acq-lit-info-cat-link').getElementsByTagName('a')[0];
416 if(openils.XUL.isXUL()) {
418 var makeRecTab = function() {
421 {tab_name: localeStrings.XUL_RECORD_DETAIL_PAGE, browser:false},
424 show_nav_buttons : true,
425 show_print_button : true,
426 opac_url : xulG.url_prefix(xulG.urls.opac_rdetail + '?r=' + li.eg_bib_id())
430 link.setAttribute('href', 'javascript:void(0);');
431 link.onclick = makeRecTab;
434 var href = link.getAttribute('href');
436 link.setAttribute('href', href + li.eg_bib_id());
439 openils.Util.hide('acq-lit-info-cat-link');
443 this.drawMarcHTML = function(li) {
444 var params = [null, true, li.marc()];
446 params = [li.eg_bib_id(), true];
448 fieldmapper.standardRequest(
449 ['open-ils.search', 'open-ils.search.biblio.record.html'],
452 oncomplete: function(r) {
453 dojo.byId('acq-lit-marc-div').innerHTML =
454 openils.Util.readResponse(r);
460 this.drawCopies = function(liId) {
464 this.copyWidgetCache = {};
466 acqLitSaveCopies.onClick = function() { self.saveCopyChanges(liId) };
467 acqLitBatchUpdateCopies.onClick = function() { self.batchCopyUpdate() };
469 while(this.copyTbody.childNodes[0])
470 this.copyTbody.removeChild(this.copyTbody.childNodes[0]);
472 this._drawBatchCopyWidgets();
474 this._fetchDistribFormulas(
476 openils.acq.Lineitem.fetchAttrDefs(
478 self._fetchLineitem(liId, function(li){self._drawCopies(li);});
485 this._fetchDistribFormulas = function(onload) {
486 if(this.distribForms) {
490 fieldmapper.standardRequest(
491 ['open-ils.acq', 'open-ils.acq.distribution_formula.ranged.retrieve.atomic'],
493 params: [openils.User.authtoken],
494 oncomplete: function(r) {
495 self.distribForms = openils.Util.readResponse(r);
496 self.distribFormulaStore =
497 new dojo.data.ItemFileReadStore(
498 {data:acqdf.toStoreData(self.distribForms)});
506 this._drawBatchCopyWidgets = function() {
507 var row = this.copyBatchRow;
508 dojo.forEach(['fund', 'owning_lib', 'location', 'circ_modifier', 'cn_label'],
510 if(self.copyBatchRowDrawn) {
511 self.copyBatchWidgets[field].attr('value', null);
513 var widget = new openils.widget.AutoFieldWidget({
516 parentNode : dojo.query('[name='+field+']', row)[0],
517 orgLimitPerms : ['CREATE_PICKLIST'],
518 dijitArgs : {required:false}
521 self.copyBatchWidgets[field] = widget.widget;
525 this.copyBatchRowDrawn = true;
528 this.batchCopyUpdate = function() {
530 var fields = ['fund', 'owning_lib', 'location', 'circ_modifier', 'cn_label'];
531 for(var k in this.copyWidgetCache) {
532 var cache = this.copyWidgetCache[k];
533 dojo.forEach(fields, function(f) {
534 var newval = self.copyBatchWidgets[f].attr('value');
535 if(newval) cache[f].attr('value', newval);
540 this._drawCopies = function(li) {
541 acqLitAddCopyCount.onClick = function() {
542 var count = acqLitCopyCountInput.attr('value');
543 for(var i = 0; i < count; i++)
546 if(li.lineitem_details().length > 0) {
547 dojo.forEach(li.lineitem_details(),
549 self.addCopy(li, copy);
557 this.virtCopyId = -1;
558 this.addCopy = function(li, copy) {
559 var row = this.copyRow.cloneNode(true);
560 this.copyTbody.appendChild(row);
564 copy = new fieldmapper.acqlid();
566 copy.id(this.virtCopyId--);
567 copy.lineitem(li.id());
570 this.copyCache[copy.id()] = copy;
571 row.setAttribute('copy_id', copy.id());
572 self.copyWidgetCache[copy.id()] = {};
574 dojo.forEach(['fund', 'owning_lib', 'location', 'barcode', 'cn_label', 'circ_modifier', 'note'],
576 var widget = new openils.widget.AutoFieldWidget({
580 parentNode : dojo.query('[name='+field+']', row)[0],
581 orgLimitPerms : ['CREATE_PICKLIST'],
585 // make sure we capture the value from any async widgets
586 function(w, ww) { copy[field](ww.getFormattedValue()) }
588 dojo.connect(widget.widget, 'onChange',
590 if(copy.isnew() || val != copy[field]()) {
591 // prevent setting ischanged() automatically on widget load for existing copies
592 copy[field](widget.getFormattedValue())
593 copy.ischanged(true);
597 self.copyWidgetCache[copy.id()][field] = widget.widget;
601 var recv_link = dojo.query('[name=receive]', row)[0];
602 if(copy.recv_time()) {
603 openils.Util.hide(recv_link);
605 recv_link.onclick = function() {
606 self.receiveLid(copy);
607 openils.Util.hide(recv_link);
612 openils.Util.hide(dojo.query('[name=delete]', row)[0].parentNode);
614 dojo.query('[name=delete]', row)[0].onclick =
615 function() { self.deleteCopy(row) };
619 this.deleteCopy = function(row) {
620 var copy = this.copyCache[row.getAttribute('copy_id')];
621 copy.isdeleted(true);
623 delete this.copyCache[copy.id()];
624 this.copyTbody.removeChild(row);
627 this.saveCopyChanges = function(liId) {
631 openils.Util.show('acq-lit-update-copies-progress');
633 for(var id in this.copyCache) {
634 var c = this.copyCache[id];
635 if(c.isnew() || c.ischanged() || c.isdeleted()) {
636 if(c.id() < 0) c.id(null);
641 if(copies.length == 0)
644 fieldmapper.standardRequest(
645 ['open-ils.acq', 'open-ils.acq.lineitem_detail.cud.batch'],
647 params: [openils.User.authtoken, copies],
648 onresponse: function(r) {
649 var res = openils.Util.readResponse(r);
650 litUpdateCopiesProgress.update(res);
652 oncomplete: function() {
653 openils.Util.hide('acq-lit-update-copies-progress');
654 self.drawCopies(liId);
660 this.applySelectedLiAction = function(action) {
664 case 'delete_selected':
665 this._deleteLiList(self.getSelected());
670 if(!this.createPoProviderSelector) {
671 var widget = new openils.widget.AutoFieldWidget({
672 fmField : 'provider',
674 parentNode : dojo.byId('acq-lit-po-provider'),
675 orgLimitPerms : ['CREATE_PURCHASE_ORDER'],
678 function(w) { self.createPoProviderSelector = w; }
682 acqLitPoCreateDialog.show();
685 case 'save_picklist':
686 this._loadPLSelect();
687 acqLitSavePlDialog.show();
698 case 'rollback_receive_po':
699 this.rollbackPoReceive();
702 case 'create_assets':
708 this.createAssets = function() {
709 if(!this.isPO) return;
710 if(!confirm(localeStrings.CREATE_PO_ASSETS_CONFIRM)) return;
711 this.show('acq-lit-progress-numbers');
713 fieldmapper.standardRequest(
714 ['open-ils.acq', 'open-ils.acq.purchase_order.assets.create'],
716 params: [this.authtoken, this.isPO],
717 onresponse: function(r) {
718 var resp = openils.Util.readResponse(r);
719 self._updateProgressNumbers(resp, true);
725 this.printPO = function() {
726 if(!this.isPO) return;
727 progressDialog.show(true);
728 fieldmapper.standardRequest(
729 ['open-ils.acq', 'open-ils.acq.purchase_order.format'],
731 params: [this.authtoken, this.isPO, 'html'],
732 oncomplete: function(r) {
733 progressDialog.hide();
734 var evt = openils.Util.readResponse(r);
735 if(evt && evt.template_output()) {
736 win = window.open('','', 'resizable,width=800,height=600,scrollbars=1');
737 win.document.body.innerHTML = evt.template_output().data();
745 this.receivePO = function() {
746 if(!this.isPO) return;
747 this.show('acq-lit-progress-numbers');
749 fieldmapper.standardRequest(
750 ['open-ils.acq', 'open-ils.acq.purchase_order.receive'],
752 params: [this.authtoken, this.isPO],
753 onresponse : function(r) {
754 var resp = openils.Util.readResponse(r);
755 self._updateProgressNumbers(resp, true);
761 this.receiveLi = function(li) {
762 if(!this.isPO) return;
763 progressDialog.show(true);
764 fieldmapper.standardRequest(
765 ['open-ils.acq', 'open-ils.acq.lineitem.receive'],
767 params: [this.authtoken, li.id()],
768 onresponse : function(r) {
769 var resp = openils.Util.readResponse(r);
770 progressDialog.hide();
776 this.receiveLid = function(li) {
777 if(!this.isPO) return;
778 progressDialog.show(true);
779 fieldmapper.standardRequest(
780 ['open-ils.acq', 'open-ils.acq.lineitem_detail.receive'],
782 params: [this.authtoken, li.id()],
783 onresponse : function(r) {
784 var resp = openils.Util.readResponse(r);
785 progressDialog.hide();
791 this.rollbackPoReceive = function() {
792 if(!this.isPO) return;
793 if(!confirm(localeStrings.ROLLBACK_PO_RECEIVE_CONFIRM)) return;
794 this.show('acq-lit-progress-numbers');
796 fieldmapper.standardRequest(
797 ['open-ils.acq', 'open-ils.acq.purchase_order.receive.rollback'],
799 params: [this.authtoken, this.isPO],
800 onresponse : function(r) {
801 var resp = openils.Util.readResponse(r);
802 self._updateProgressNumbers(resp, true);
808 this._updateProgressNumbers = function(resp, reloadOnComplete) {
810 dojo.byId('acq-pl-lit-li-processed').innerHTML = resp.li;
811 dojo.byId('acq-pl-lit-lid-processed').innerHTML = resp.lid;
812 dojo.byId('acq-pl-lit-debits-processed').innerHTML = resp.debits_accrued;
813 dojo.byId('acq-pl-lit-bibs-processed').innerHTML = resp.bibs;
814 dojo.byId('acq-pl-lit-indexed-processed').innerHTML = resp.indexed;
815 dojo.byId('acq-pl-lit-copies-processed').innerHTML = resp.copies;
816 if(resp.complete && reloadOnComplete)
817 location.href = location.href;
821 this._createPO = function(fields) {
822 this.show('acq-lit-progress-numbers');
823 var po = new fieldmapper.acqpo();
824 po.provider(this.createPoProviderSelector.attr('value'));
826 var selected = this.getSelected( (fields.create_from == 'all') );
827 if(selected.length == 0) return;
829 var max = selected.length * 3;
832 fieldmapper.standardRequest(
833 ['open-ils.acq', 'open-ils.acq.purchase_order.create'],
836 openils.User.authtoken,
839 lineitems : selected.map(function(li) { return li.id() }),
840 create_assets : fields.create_assets[0],
844 onresponse : function(r) {
845 var resp = openils.Util.readResponse(r);
846 self._updateProgressNumbers(resp);
848 location.href = oilsBasePath + '/eg/acq/po/view/' + resp.purchase_order.id();
854 this._deleteLiList = function(list, idx) {
855 if(idx == null) idx = 0;
856 if(idx >= list.length) return;
857 var liId = list[idx].id();
858 fieldmapper.standardRequest(
859 ['open-ils.acq', 'open-ils.acq.lineitem.delete'],
861 params: [openils.User.authtoken, liId],
862 oncomplete: function(r) {
863 self.removeLineitem(liId);
864 self._deleteLiList(list, ++idx);
870 this.editOrderMarc = function(li) {
872 /* To run in Firefox directly, must set signed.applets.codebase_principal_support
873 to true in about:config */
875 if(!openils.XUL.enableXPConnect()) return;
877 if(openils.XUL.isXUL()) {
878 win = window.open('/xul/' + openils.XUL.buildId() + '/server/cat/marcedit.xul');
881 win = window.open('/xul/server/cat/marcedit.xul');
884 record : {marc : li.marc()},
886 label: 'Save Record', // XXX I18N
887 func: function(xmlString) {
889 fieldmapper.standardRequest(
890 ['open-ils.acq', 'open-ils.acq.lineitem.update'],
892 params: [openils.User.authtoken, li],
893 oncomplete: function(r) {
894 openils.Util.readResponse(r);
896 self.drawInfo(li.id())
906 this._savePl = function(values) {
908 var selected = this.getSelected( (values.which == 'all') );
909 openils.Util.show('acq-lit-generic-progress');
911 if(values.new_name) {
912 openils.acq.Picklist.create(
913 {name: values.new_name},
915 self._updateLiList(id, selected, 0,
917 location.href = oilsBasePath + '/eg/acq/picklist/view/' + id;
921 } else if(values.existing_pl) {
922 // update lineitems to use an existing picklist
923 self._updateLiList(values.existing_pl, selected, 0,
925 location.href = oilsBasePath + '/eg/acq/picklist/view/' + values.existing_pl;
930 this._updateLiList = function(pl, list, idx, oncomplete) {
931 if(idx >= list.length) return oncomplete();
934 litGenericProgress.update({maximum: list.length, progress: idx});
935 new openils.acq.Lineitem({lineitem:li}).update(
937 self._updateLiList(pl, list, ++idx, oncomplete);
942 this._loadPLSelect = function() {
943 if(this._plSelectLoaded) return;
945 function handleResponse(r) {
946 plList.push(r.recv().content());
948 var method = 'open-ils.acq.picklist.user.retrieve';
949 fieldmapper.standardRequest(
950 ['open-ils.acq', method],
952 params: [this.authtoken],
953 onresponse: handleResponse,
954 oncomplete: function() {
955 self._plSelectLoaded = true;
956 acqLitAddExistingSelect.store =
957 new dojo.data.ItemFileReadStore({data:acqpl.toStoreData(plList)});
958 acqLitAddExistingSelect.setValue();
964 // grab the li-details for this lineitem, grab the linked copies and volumes, add them to the table
965 this.showRealCopies = function(li) {
966 this.show('real-copies');
967 var pcrud = new openils.PermaCrud({authtoken : this.authtoken});
971 this._fetchLineitem(li.id(),
973 li = self.liCache[li.id()] = fullLi;
977 id : li.lineitem_details().map(
978 function(item) { return item.eg_copy_id() }
983 onresponse : function(r) {
984 var copy = openils.Util.readResponse(r);
985 var volId = copy.call_number();
986 var volume = self.volCache[volId];
988 volume = self.volCache[volId] = pcrud.retrieve('acn', volId);
990 self.addRealCopy(volume, copy, tabIndex++);
998 this.addRealCopy = function(volume, copy, tabIndex) {
999 var row = this.realCopiesRow.cloneNode(true);
1003 ['owning_lib', 'location', 'circ_modifier', 'label', 'barcode'],
1005 var isvol = (field == 'owning_lib' || field == 'label');
1006 var widget = new openils.widget.AutoFieldWidget({
1008 fmObject : isvol ? volume : copy,
1009 parentNode : nodeByName(field, row),
1010 readOnly : (field != 'barcode')
1013 var widgetDrawn = null;
1015 if(field == 'barcode') {
1016 widgetDrawn = function(w, ww) {
1017 var node = w.domNode;
1018 node.setAttribute('tabindex', ''+tabIndex);
1020 // on enter, select the next barcode input
1021 dojo.connect(w, 'onKeyDown',
1023 if(e.keyCode == dojo.keys.ENTER) {
1024 var ti = node.getAttribute('tabindex');
1025 var nextNode = dojo.query('[tabindex=' + String(Number(ti) + 1) + ']', self.realCopiesTbody)[0];
1026 if(nextNode) nextNode.select();
1031 if(self.realCopiesTbody.getElementsByTagName('TR').length == 0)
1036 widget.build(widgetDrawn);
1040 this.realCopiesTbody.appendChild(row);
1041 if(selectNode) selectNode.select();