1 dojo.require('dijit.form.Button');
2 dojo.require('dijit.form.TextBox');
3 dojo.require('dijit.ProgressBar');
4 dojo.require('openils.User');
5 dojo.require('openils.Util');
6 dojo.require('openils.acq.Lineitem');
7 dojo.require('openils.widget.AutoFieldWidget');
9 function AcqLiTable() {
13 this.toggleState = false;
14 this.tbody = dojo.byId('acq-lit-tbody');
16 this.authtoken = openils.User.authtoken;
17 this.rowTemplate = this.tbody.removeChild(dojo.byId('acq-lit-row'));
18 this.copyTbody = dojo.byId('acq-lit-li-details-tbody');
19 this.copyRow = this.copyTbody.removeChild(dojo.byId('acq-lit-li-details-row'));
21 dojo.byId('acq-lit-select-toggle').onclick = function(){self.toggleSelect()};
22 dojo.byId('acq-lit-info-back-button').onclick = function(){self.show('list')};
24 this.reset = function() {
25 while(self.tbody.childNodes[0])
26 self.tbody.removeChild(self.tbody.childNodes[0]);
30 this.setNext = function(handler) {
31 var link = dojo.byId('acq-lit-next');
33 dojo.style(link, 'visibility', 'visible');
34 link.onclick = handler;
36 dojo.style(link, 'visibility', 'hidden');
40 this.setPrev = function(handler) {
41 var link = dojo.byId('acq-lit-prev');
43 dojo.style(link, 'visibility', 'visible');
44 link.onclick = handler;
46 dojo.style(link, 'visibility', 'hidden');
50 this.show = function(div) {
51 openils.Util.hide('acq-lit-table-div');
52 openils.Util.hide('acq-lit-info-div');
53 openils.Util.hide('acq-lit-li-details');
56 openils.Util.show('acq-lit-table-div');
59 openils.Util.show('acq-lit-info-div');
62 openils.Util.show('acq-lit-li-details');
67 this.hide = function() {
71 this.toggleSelect = function() {
73 dojo.forEach(self.selectors, function(i){i.checked = false});
75 dojo.forEach(self.selectors, function(i){i.checked = true});
76 self.toggleState = !self.toggleState;
79 /** @param all If true, assume all are selected */
80 this.getSelected = function(all) {
82 dojo.forEach(self.selectors,
85 selected.push(self.liCache[i.parentNode.parentNode.getAttribute('li')]);
91 this.setRowAttr = function(td, liWrapper, field) {
92 var val = liWrapper.findAttr(field, 'lineitem_marc_attr_definition') || '';
93 td.appendChild(document.createTextNode(val));
96 this.addLineitem = function(li) {
97 this.liCache[li.id()] = li;
98 var liWrapper = new openils.acq.Lineitem({lineitem:li});
99 var row = self.rowTemplate.cloneNode(true);
100 row.setAttribute('li', li.id());
101 var tds = dojo.query('[attr]', row);
102 dojo.forEach(tds, function(td) {self.setRowAttr(td, liWrapper, td.getAttribute('attr'));});
103 dojo.query('[name=source_label]', row)[0].appendChild(document.createTextNode(li.source_label()));
104 var isbn = liWrapper.findAttr('isbn', 'lineitem_marc_attr_definition');
106 // XXX media prefix for added content
107 dojo.query('[name=jacket]', row)[0].setAttribute('src', '/opac/extras/ac/jacket/small/' + isbn);
109 dojo.query('[name=infolink]', row)[0].onclick = function() {self.drawInfo(li.id())};
110 dojo.query('[name=copieslink]', row)[0].onclick = function() {self.drawCopies(li.id())};
111 self.tbody.appendChild(row);
112 self.selectors.push(dojo.query('[name=selectbox]', row)[0]);
115 this.drawInfo = function(liId) {
117 openils.acq.Lineitem.fetchAttrDefs(
119 self._fetchLineitem(liId, function(li){self._drawInfo(li);});
124 this._fetchLineitem = function(liId, handler) {
126 if(this.liCache[liId] && this.liCache[liId].marc()) {
127 return handler(this.liCache[liId]);
130 fieldmapper.standardRequest(
131 ['open-ils.acq', 'open-ils.acq.lineitem.retrieve'],
134 params: [self.authtoken, liId, {
136 flesh_li_details: true,
137 flesh_fund_debit: true }],
139 oncomplete: function(r) {
140 var li = openils.Util.readResponse(r);
147 this._drawInfo = function(li) {
148 this.drawMarcHTML(li);
149 this.infoTbody = dojo.byId('acq-lit-info-tbody');
151 this.infoRow = this.infoTbody.removeChild(dojo.byId('acq-lit-info-row'));
152 while(this.infoTbody.childNodes[0])
153 this.infoTbody.removeChild(this.infoTbody.childNodes[0]);
154 for(var i = 0; i < li.attributes().length; i++) {
155 var attr = li.attributes()[i];
156 var row = this.infoRow.cloneNode(true);
158 var type = attr.attr_type().replace(/lineitem_(.*)_attr_definition/, '$1');
159 var name = openils.acq.Lineitem.attrDefs[type].filter(
161 return (a.code() == attr.attr_name());
163 ).pop().description();
165 dojo.query('[name=label]', row)[0].appendChild(document.createTextNode(name));
166 dojo.query('[name=value]', row)[0].appendChild(document.createTextNode(attr.attr_value()));
167 this.infoTbody.appendChild(row);
171 this.drawMarcHTML = function(li) {
172 fieldmapper.standardRequest(
173 ['open-ils.search', 'open-ils.search.biblio.record.html'],
175 params: [null, true, li.marc()],
176 oncomplete: function(r) {
177 dojo.byId('acq-lit-marc-div').innerHTML =
178 openils.Util.readResponse(r);
184 this.drawCopies = function(liId) {
187 acqLitSaveCopies.onClick = function() { self.saveCopyChanges(liId) };
188 while(this.copyTbody.childNodes[0])
189 this.copyTbody.removeChild(this.copyTbody.childNodes[0]);
190 openils.acq.Lineitem.fetchAttrDefs(
192 self._fetchLineitem(liId, function(li){self._drawCopies(li);});
198 this._drawCopies = function(li) {
199 acqLitAddCopyCount.onClick = function() {
200 var count = acqLitCopyCountInput.attr('value');
201 for(var i = 0; i < count; i++)
204 if(li.lineitem_details().length > 0) {
205 dojo.forEach(li.lineitem_details(),
207 self.addCopy(li, copy);
215 this.virtCopyId = -1;
216 this.addCopy = function(li, copy) {
217 var row = this.copyRow.cloneNode(true);
218 this.copyTbody.appendChild(row);
221 copy = new fieldmapper.acqlid();
223 copy.id(this.virtCopyId--);
224 copy.lineitem(li.id());
227 this.copyCache[copy.id()] = copy;
228 row.setAttribute('copy_id', copy.id());
230 dojo.forEach(['fund', 'owning_lib', 'location', 'barcode', 'cn_label'],
232 var widget = new openils.widget.AutoFieldWidget({
236 parentNode : dojo.query('[name='+field+']', row)[0],
237 orgLimitPerms : ['CREATE_PICKLIST'],
240 dojo.connect(widget.widget, 'onChange',
242 if(val != copy[field]()) {
243 // prevent setting ischanged() automatically on widget load
244 copy[field](widget.getFormattedValue())
245 copy.ischanged(true);
253 dojo.query('[name=delete]', row)[0].onclick =
254 function() { self.deleteCopy(row) };
257 this.deleteCopy = function(row) {
258 var copy = this.copyCache[row.getAttribute('copy_id')];
259 copy.isdeleted(true);
261 delete this.copyCache[copy.id()];
262 this.copyTbody.removeChild(row);
265 this.saveCopyChanges = function(liId) {
269 openils.Util.show('acq-lit-update-copies-progress');
271 for(var id in this.copyCache) {
272 var c = this.copyCache[id];
273 if(c.isnew() || c.ischanged() || c.isdeleted()) {
274 if(c.id() < 0) c.id(null);
279 if(copies.length == 0)
282 fieldmapper.standardRequest(
283 ['open-ils.acq', 'open-ils.acq.lineitem_detail.cud.batch'],
285 params: [openils.User.authtoken, copies],
286 onresponse: function(r) {
287 var res = openils.Util.readResponse(r);
288 litUpdateCopiesProgress.update(res);
290 oncomplete: function() {
291 openils.Util.hide('acq-lit-update-copies-progress');
292 self.drawCopies(liId);