1 dojo.require('dojo.data.ItemFileReadStore');
2 dojo.require('dijit.layout.SplitContainer');
3 dojo.require('dijit.Dialog');
4 dojo.require('dijit.form.FilteringSelect');
5 dojo.require('dijit.form.Button');
6 dojo.require('dojox.grid.Grid');
7 dojo.require('dojo.date.locale');
8 dojo.require('dojo.date.stamp');
11 dojo.require("openils.User");
12 dojo.require("openils.acq.Fund");
13 dojo.require("openils.acq.Lineitem");
14 dojo.require('openils.acq.Provider');
15 dojo.require("openils.widget.FundSelector");
16 dojo.require('openils.editors');
17 dojo.require('openils.Event');
18 dojo.require("openils.widget.OrgUnitFilteringSelect");
19 dojo.require("fieldmapper.OrgUtils");
21 /* put all the accessors, etc. into a local object for namespacing */
24 lineitems : [], // full list of lineitem objects to display
25 getLi : function(id) {
26 // given an ID, returns the lineitem object from the list
27 for(var i in JUBGrid.lineitems) {
28 var li = JUBGrid.lineitems[i];
34 _getMARCAttr : function(rowIndex, attr) {
35 var data = JUBGrid.jubGrid.model.getRow(rowIndex);
37 return new openils.acq.Lineitem(
38 {lineitem:JUBGrid.getLi(data.id)}).findAttr(attr, 'lineitem_marc_attr_definition')
40 getJUBTitle : function(rowIndex) {
41 return JUBGrid._getMARCAttr(rowIndex, 'title');
43 getJUBAuthor : function(rowIndex) {
44 return JUBGrid._getMARCAttr(rowIndex, 'author');
46 getJUBIsbn : function(rowIndex) {
47 return JUBGrid._getMARCAttr(rowIndex, 'isbn');
49 getJUBActualPrice : function(rowIndex) {
50 var data = JUBGrid.jubGrid.model.getRow(rowIndex);
52 var price = new openils.acq.Lineitem(
53 {lineitem:JUBGrid.getLi(data.id)}).getActualPrice();
54 if(price) return price.price;
57 getJUBEstimatedPrice : function(rowIndex) {
58 var data = JUBGrid.jubGrid.model.getRow(rowIndex);
60 var price = new openils.acq.Lineitem(
61 {lineitem:JUBGrid.getLi(data.id)}).getEstimatedPrice();
62 if(price) return price.price;
65 getJUBPubdate : function(rowIndex) {
66 return JUBGrid._getMARCAttr(rowIndex, 'pubdate');
68 getProvider : function(rowIndex) {
69 data = JUBGrid.jubGrid.model.getRow(rowIndex);
70 if(!data || !data.provider) return;
71 return openils.acq.Provider.retrieve(data.provider).code();
73 getRecvTime : function(rowIndex) {
74 var data = JUBGrid.jubDetailGrid.model.getRow(rowIndex);
75 if (!(data && data.recv_time)) return '';
76 var date = dojo.date.stamp.fromISOString(data.recv_time);
77 return dojo.date.locale.format(date, {formatLength:'medium'});
79 getCopyLocation : function(rowIndex) {
80 var data = JUBGrid.jubDetailGrid.model.getRow(rowIndex);
81 if(!data || !data.location) return '';
82 return openils.CopyLocation.retrieve(data.location).name();
84 getLIDFundName : function(rowIndex) {
85 var data = JUBGrid.jubDetailGrid.model.getRow(rowIndex);
86 if (!data || !data.fund) return;
88 return openils.acq.Fund.retrieve(data.fund).name();
93 getLIDFundCode : function(rowIndex) {
94 var data = JUBGrid.jubDetailGrid.model.getRow(rowIndex);
95 if (!data || !data.fund) return;
97 return openils.acq.Fund.retrieve(data.fund).code();
102 getLIDLibName : function(rowIndex) {
103 var data = JUBGrid.jubDetailGrid.model.getRow(rowIndex);
104 if (!data || !data.owning_lib) return;
105 return fieldmapper.aou.findOrgUnit(data.owning_lib).shortname();
108 gridDataChanged : function(newVal, rowIdx, cellIdx) {
109 // cellIdx == -1 if you are editing a column that
110 // is not represented in the data model. Khaaaaaaan!!!
113 populate : function(gridWidget, model, lineitems) {
114 for (var i in lineitems) {
115 JUBGrid.lineitems[lineitems[i].id()] = lineitems[i];
117 JUBGrid.jubGrid = gridWidget;
118 JUBGrid.jubGrid.setModel(model);
119 if(JUBGrid.showDetails) {
120 dojo.connect(gridWidget, "onRowClick",
122 var jub = model.getRow(evt.rowIndex);
125 JUBGrid.jubDetailGrid.lineitemID = jub.id;
127 //if (jub.state == "approved") {
128 if (false) { // need finer grained control here
129 grid = JUBGrid.jubDetailGridLayoutReadOnly;
131 grid = JUBGrid.jubDetailGridLayout;
133 openils.acq.Lineitem.loadLIDGrid(
134 JUBGrid.jubDetailGrid,
135 JUBGrid.jubGrid.model.getRow(evt.rowIndex).id, grid);
139 // capture changes to lineitems
140 dojo.connect(model.store, "onSet", JUBGrid.onJUBSet);
144 approveJUB: function(evt) {
146 var selected = JUBGrid.jubGrid.selection.getSelected();
147 for (var idx = 0; idx < selected.length; idx++) {
148 var rowIdx = selected[idx];
149 JUBGrid.approveSingleJUB(JUBGrid.jubGrid.model.getRow(rowIdx));
153 approveSingleJUB: function(jub) {
154 var li = new openils.acq.Lineitem({lineitem:JUBGrid.getLi(jub.id)});
155 var approveStore = function(evt) {
157 // something bad happened
158 console.log("jubgrid.js: approveJUB: error:");
160 alert("Error: "+evt.desc);
162 var approveACQLI = function(jub, rq) {
163 JUBGrid.jubGrid.model.store.setValue(jub, "state", "approved");
164 JUBGrid.jubGrid.model.refresh();
165 JUBGrid.jubGrid.update();
166 // Reload lineitem details, read-only
167 //openils.acq.Lineitem.loadLIDGrid(JUBGrid.jubDetailGrid, li.id(), JUBGrid.jubDetailGridLayout);
168 //JUBGrid.jubDetailGridLayoutReadOnly);
170 JUBGrid.jubGrid.model.store.fetch({query:{id:jub.id}, onItem: approveACQLI});
174 li.approve(approveStore);
178 removeSelectedJUBs: function(evt) {
180 function deleteList(list, idx, oncomplete) {
181 if(idx >= list.length)
183 fieldmapper.standardRequest([
185 'open-ils.acq.lineitem.delete'],
187 params: [openils.User.authtoken, list[idx].id()],
188 oncomplete: function(r) {
189 var res = r.recv().content();
190 if(openils.Event.parse(res))
191 alert(openils.Event.parse(res));
192 deleteList(list, ++idx, oncomplete);
198 var lineitems = JUBGrid.lineitems;
201 var selected = JUBGrid.jubGrid.selection.getSelected();
203 for(var id in lineitems) {
205 for(var i = 0; i < selected.length; i++) {
206 var rowIdx = selected[i];
207 var jubid = JUBGrid.jubGrid.model.getRow(rowIdx).id;
209 if (lineitems[id].state() == 'new') {
210 deleteMe.push(lineitems[id]);
213 alert("Can not delete line item "+id+
214 ": item is "+lineitems[id].state());
219 keepMe[id] = lineitems[id];
222 JUBGrid.lineitems = keepMe;
223 deleteList(deleteMe, 0, function(){
224 JUBGrid.jubGrid.model.store =
225 new dojo.data.ItemFileReadStore({data:jub.toStoreData(keepMe)});
226 JUBGrid.jubGrid.model.refresh();
227 JUBGrid.jubGrid.update();
231 deleteLID: function(evt) {
233 var selected = JUBGrid.jubDetailGrid.selection.getSelected();
234 for (var idx = 0; idx < selected.length; idx++) {
235 var rowIdx = selected[idx];
236 var lid = JUBGrid.jubDetailGrid.model.getRow(rowIdx);
237 var deleteFromStore = function (evt) {
240 // something bad happened
241 alert("Error: "+evt.desc);
243 var deleteItem = function(item, rq) {
244 JUBGrid.jubDetailGrid.model.store.deleteItem(item);
246 var updateCount = function(item) {
247 var newval = JUBGrid.jubGrid.model.store.getValue(item, "item_count");
248 JUBGrid.jubGrid.model.store.setValue(item, "item_count", newval-1);
249 JUBGrid.jubGrid.update();
252 JUBGrid.jubDetailGrid.model.store.fetch({query:{id:lid.id},
253 onItem: deleteItem});
254 JUBGrid.jubGrid.model.store.fetch({query:{id:JUBGrid.jubDetailGrid.lineitemID},
255 onItem: updateCount});
257 JUBGrid.jubDetailGrid.update();
260 openils.acq.Lineitem.deleteLID(lid.id, deleteFromStore);
264 createLID: function(fields) {
265 fields['lineitem'] = JUBGrid.jubDetailGrid.lineitemID;
266 var addToStore = function (lid) {
267 JUBGrid.jubDetailGrid.model.store.newItem(acqlid.toStoreData([lid]).items[0]);
268 JUBGrid.jubDetailGrid.refresh();
269 JUBGrid.jubGrid.update();
270 JUBGrid.jubGrid.refresh();
272 openils.acq.Lineitem.createLID(fields, addToStore);
275 receiveLID: function(evt) {
277 var selected = JUBGrid.jubDetailGrid.selection.getSelected();
278 for (var idx = 0; idx < selected.length; idx++) {
279 var rowIdx = selected[idx];
280 var lid = JUBGrid.jubDetailGrid.model.getRow(rowIdx);
283 if(lid != null) { // is at least one selected?
284 JUBGrid._receiveLIDList(list, 0,
286 delete openils.acq.Lineitem.ModelCache[lid.lineitem];
287 openils.acq.Lineitem.loadLIDGrid(
288 JUBGrid.jubDetailGrid, lid.lineitem, JUBGrid.jubDetailGridLayout);
294 // loop through the list of LIDs and mark them as received
295 _receiveLIDList: function(list, idx, callback) {
296 if(idx >= list.length)
298 fieldmapper.standardRequest(
299 ['open-ils.acq', 'open-ils.acq.lineitem_detail.receive'],
301 params: [openils.User.authtoken, list[idx++]],
302 oncomplete: function(r) {
303 var res = r.recv().content();
304 if(e = openils.Event.parse(res))
306 JUBGrid._receiveLIDList(list, idx, callback);
313 // called when a lineitem is edited
314 onJUBSet: function (griditem, attr, oldVal,newVal) {
317 var updateDone = function(r) {
318 var stat = r.recv().content();
319 if(e = openils.Event.parse(stat))
323 // after an attribute has been updated
324 var attrUpdateDone = function(r, attr) {
325 var res = r.recv().content();
326 if(e = openils.Event.parse(res))
329 var oldVal = new openils.acq.Lineitem(
330 {lineitem:item}).findAttr(attr, 'lineitem_local_attr_definition');
333 // if this attr already exists on the object, just update the value
334 for(var i = 0; i < item.attributes().length; i++) {
335 var attrobj = item.attributes()[i];
336 if(attrobj.attr_type() == 'lineitem_local_attr_definition' && attrobj.attr_name() == attr) {
337 attrobj.attr_value(newVal);
341 // if this is a new attribute, create a new object to match reality
343 liad.attr_type('lineitem_local_attr_definition');
344 liad.attr_value(newVal);
345 liad.attr_name(attr);
347 item.attributes().push(liad);
351 if (oldVal == newVal) {
355 item = JUBGrid.lineitems[griditem.id];
356 if (attr == "provider") {
359 item.provider(newVal);
361 } else if(attr == 'estimated_price' || attr == 'actual_price') {
362 fieldmapper.standardRequest(
363 ['open-ils.acq', 'open-ils.acq.lineitem_local_attr.set'],
365 params: [openils.User.authtoken, item.id(), attr, newVal],
366 oncomplete: function(r) {attrUpdateDone(r, attr); }
370 //alert("Unexpected attr in Picklist.onSet: '"+attr+"'");
374 fieldmapper.standardRequest(
375 ["open-ils.acq", "open-ils.acq.lineitem.update"],
376 {params: [openils.User.authtoken, item],
377 oncomplete: updateDone