1 dojo.require('dijit.form.Button');
2 dojo.require('dijit.form.TextBox');
3 dojo.require('dijit.form.FilteringSelect');
4 dojo.require('dijit.ProgressBar');
5 dojo.require('openils.User');
6 dojo.require('openils.Util');
7 dojo.require('openils.acq.Lineitem');
8 dojo.require('openils.widget.AutoFieldWidget');
10 function AcqLiTable() {
14 this.toggleState = false;
15 this.tbody = dojo.byId('acq-lit-tbody');
17 this.authtoken = openils.User.authtoken;
18 this.rowTemplate = this.tbody.removeChild(dojo.byId('acq-lit-row'));
19 this.copyTbody = dojo.byId('acq-lit-li-details-tbody');
20 this.copyRow = this.copyTbody.removeChild(dojo.byId('acq-lit-li-details-row'));
21 this.copyBatchRow = dojo.byId('acq-lit-li-details-batch-row');
22 this.copyBatchWidgets = {};
24 dojo.byId('acq-lit-select-toggle').onclick = function(){self.toggleSelect()};
25 dojo.byId('acq-lit-info-back-button').onclick = function(){self.show('list')};
26 dojo.byId('acq-lit-copies-back-button').onclick = function(){self.show('list')};
28 this.reset = function() {
29 while(self.tbody.childNodes[0])
30 self.tbody.removeChild(self.tbody.childNodes[0]);
34 this.setNext = function(handler) {
35 var link = dojo.byId('acq-lit-next');
37 dojo.style(link, 'visibility', 'visible');
38 link.onclick = handler;
40 dojo.style(link, 'visibility', 'hidden');
44 this.setPrev = function(handler) {
45 var link = dojo.byId('acq-lit-prev');
47 dojo.style(link, 'visibility', 'visible');
48 link.onclick = handler;
50 dojo.style(link, 'visibility', 'hidden');
54 this.show = function(div) {
55 openils.Util.hide('acq-lit-table-div');
56 openils.Util.hide('acq-lit-info-div');
57 openils.Util.hide('acq-lit-li-details');
60 openils.Util.show('acq-lit-table-div');
63 openils.Util.show('acq-lit-info-div');
66 openils.Util.show('acq-lit-li-details');
71 this.hide = function() {
75 this.toggleSelect = function() {
77 dojo.forEach(self.selectors, function(i){i.checked = false});
79 dojo.forEach(self.selectors, function(i){i.checked = true});
80 self.toggleState = !self.toggleState;
83 /** @param all If true, assume all are selected */
84 this.getSelected = function(all) {
86 dojo.forEach(self.selectors,
89 selected.push(self.liCache[i.parentNode.parentNode.getAttribute('li')]);
95 this.setRowAttr = function(td, liWrapper, field) {
96 var val = liWrapper.findAttr(field, 'lineitem_marc_attr_definition') || '';
97 td.appendChild(document.createTextNode(val));
100 this.addLineitem = function(li) {
101 this.liCache[li.id()] = li;
102 var liWrapper = new openils.acq.Lineitem({lineitem:li});
103 var row = self.rowTemplate.cloneNode(true);
104 row.setAttribute('li', li.id());
105 var tds = dojo.query('[attr]', row);
106 dojo.forEach(tds, function(td) {self.setRowAttr(td, liWrapper, td.getAttribute('attr'));});
107 dojo.query('[name=source_label]', row)[0].appendChild(document.createTextNode(li.source_label()));
108 var isbn = liWrapper.findAttr('isbn', 'lineitem_marc_attr_definition');
110 // XXX media prefix for added content
111 dojo.query('[name=jacket]', row)[0].setAttribute('src', '/opac/extras/ac/jacket/small/' + isbn);
113 dojo.query('[name=infolink]', row)[0].onclick = function() {self.drawInfo(li.id())};
114 dojo.query('[name=copieslink]', row)[0].onclick = function() {self.drawCopies(li.id())};
115 dojo.query('[name=count]', row)[0].appendChild(document.createTextNode(li.item_count()));
116 self.tbody.appendChild(row);
117 self.selectors.push(dojo.query('[name=selectbox]', row)[0]);
120 this.drawInfo = function(liId) {
122 openils.acq.Lineitem.fetchAttrDefs(
124 self._fetchLineitem(liId, function(li){self._drawInfo(li);});
129 this._fetchLineitem = function(liId, handler) {
131 if(this.liCache[liId] && this.liCache[liId].marc()) {
132 return handler(this.liCache[liId]);
135 fieldmapper.standardRequest(
136 ['open-ils.acq', 'open-ils.acq.lineitem.retrieve'],
139 params: [self.authtoken, liId, {
141 flesh_li_details: true,
142 flesh_fund_debit: true }],
144 oncomplete: function(r) {
145 var li = openils.Util.readResponse(r);
152 this._drawInfo = function(li) {
153 this.drawMarcHTML(li);
154 this.infoTbody = dojo.byId('acq-lit-info-tbody');
156 this.infoRow = this.infoTbody.removeChild(dojo.byId('acq-lit-info-row'));
157 while(this.infoTbody.childNodes[0])
158 this.infoTbody.removeChild(this.infoTbody.childNodes[0]);
159 for(var i = 0; i < li.attributes().length; i++) {
160 var attr = li.attributes()[i];
161 var row = this.infoRow.cloneNode(true);
163 var type = attr.attr_type().replace(/lineitem_(.*)_attr_definition/, '$1');
164 var name = openils.acq.Lineitem.attrDefs[type].filter(
166 return (a.code() == attr.attr_name());
168 ).pop().description();
170 dojo.query('[name=label]', row)[0].appendChild(document.createTextNode(name));
171 dojo.query('[name=value]', row)[0].appendChild(document.createTextNode(attr.attr_value()));
172 this.infoTbody.appendChild(row);
176 this.drawMarcHTML = function(li) {
177 fieldmapper.standardRequest(
178 ['open-ils.search', 'open-ils.search.biblio.record.html'],
180 params: [null, true, li.marc()],
181 oncomplete: function(r) {
182 dojo.byId('acq-lit-marc-div').innerHTML =
183 openils.Util.readResponse(r);
189 this.drawCopies = function(liId) {
193 this.copyWidgetCache = {};
195 acqLitSaveCopies.onClick = function() { self.saveCopyChanges(liId) };
196 acqLitBatchUpdateCopies.onClick = function() { self.batchCopyUpdate() };
198 while(this.copyTbody.childNodes[0])
199 this.copyTbody.removeChild(this.copyTbody.childNodes[0]);
201 var row = this.copyBatchRow;
202 dojo.forEach(['fund', 'owning_lib', 'location'],
204 if(self.copyBatchRowDrawn) {
205 self.copyBatchWidgets[field].attr('value', null);
207 var widget = new openils.widget.AutoFieldWidget({
210 parentNode : dojo.query('[name='+field+']', row)[0],
211 orgLimitPerms : ['CREATE_PICKLIST'],
212 dijitArgs : {required:false}
215 self.copyBatchWidgets[field] = widget.widget;
219 this.copyBatchRowDrawn = true;
222 openils.acq.Lineitem.fetchAttrDefs(
224 self._fetchLineitem(liId, function(li){self._drawCopies(li);});
229 this.batchCopyUpdate = function() {
231 var fields = ['fund', 'owning_lib', 'location'];
232 for(var k in this.copyWidgetCache) {
233 var cache = this.copyWidgetCache[k];
234 dojo.forEach(fields, function(f) {
235 var newval = self.copyBatchWidgets[f].attr('value');
236 if(newval) cache[f].attr('value', newval);
241 this._drawCopies = function(li) {
242 acqLitAddCopyCount.onClick = function() {
243 var count = acqLitCopyCountInput.attr('value');
244 for(var i = 0; i < count; i++)
247 if(li.lineitem_details().length > 0) {
248 dojo.forEach(li.lineitem_details(),
250 self.addCopy(li, copy);
258 this.virtCopyId = -1;
259 this.addCopy = function(li, copy) {
260 var row = this.copyRow.cloneNode(true);
261 this.copyTbody.appendChild(row);
265 copy = new fieldmapper.acqlid();
267 copy.id(this.virtCopyId--);
268 copy.lineitem(li.id());
271 this.copyCache[copy.id()] = copy;
272 row.setAttribute('copy_id', copy.id());
273 self.copyWidgetCache[copy.id()] = {};
275 dojo.forEach(['fund', 'owning_lib', 'location', 'barcode', 'cn_label'],
277 var widget = new openils.widget.AutoFieldWidget({
281 parentNode : dojo.query('[name='+field+']', row)[0],
282 orgLimitPerms : ['CREATE_PICKLIST'],
285 dojo.connect(widget.widget, 'onChange',
287 if(val != copy[field]()) {
288 // prevent setting ischanged() automatically on widget load
289 copy[field](widget.getFormattedValue())
290 copy.ischanged(true);
294 self.copyWidgetCache[copy.id()][field] = widget.widget;
298 dojo.query('[name=delete]', row)[0].onclick =
299 function() { self.deleteCopy(row) };
302 this.deleteCopy = function(row) {
303 var copy = this.copyCache[row.getAttribute('copy_id')];
304 copy.isdeleted(true);
306 delete this.copyCache[copy.id()];
307 this.copyTbody.removeChild(row);
310 this.saveCopyChanges = function(liId) {
314 openils.Util.show('acq-lit-update-copies-progress');
316 for(var id in this.copyCache) {
317 var c = this.copyCache[id];
318 if(c.isnew() || c.ischanged() || c.isdeleted()) {
319 if(c.id() < 0) c.id(null);
324 if(copies.length == 0)
327 fieldmapper.standardRequest(
328 ['open-ils.acq', 'open-ils.acq.lineitem_detail.cud.batch'],
330 params: [openils.User.authtoken, copies],
331 onresponse: function(r) {
332 var res = openils.Util.readResponse(r);
333 litUpdateCopiesProgress.update(res);
335 oncomplete: function() {
336 openils.Util.hide('acq-lit-update-copies-progress');
337 self.drawCopies(liId);