]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/acq/common/jubgrid.js
LP#1380803 Update PO summary amounts
[working/Evergreen.git] / Open-ILS / web / js / ui / default / acq / common / jubgrid.js
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');
9
10
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");
20
21 /* put all the accessors, etc. into a local object for namespacing */
22 var JUBGrid = {
23     jubGrid : null,
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];
29             if(li.id() == id)
30                 return li;
31         }
32     },
33
34     _getMARCAttr : function(rowIndex, attr) {
35         var data = JUBGrid.jubGrid.model.getRow(rowIndex);
36         if (!data) return '';
37         return new openils.acq.Lineitem(
38             {lineitem:JUBGrid.getLi(data.id)}).findAttr(attr, 'lineitem_marc_attr_definition')
39     },
40     getJUBTitle : function(rowIndex) {
41         return JUBGrid._getMARCAttr(rowIndex, 'title');
42     },
43     getJUBAuthor : function(rowIndex) {
44         return JUBGrid._getMARCAttr(rowIndex, 'author');
45     },
46     getJUBIsbn : function(rowIndex) {
47         return JUBGrid._getMARCAttr(rowIndex, 'isbn');
48     },
49     getJUBActualPrice : function(rowIndex) {
50         var data = JUBGrid.jubGrid.model.getRow(rowIndex);
51         if (!data) return '';
52         var price = new openils.acq.Lineitem(
53             {lineitem:JUBGrid.getLi(data.id)}).getActualPrice();
54         if(price) return price.price;
55         return ''
56     },
57     getJUBEstimatedPrice : function(rowIndex) {
58         var data = JUBGrid.jubGrid.model.getRow(rowIndex);
59         if (!data) return '';
60             var price = new openils.acq.Lineitem(
61             {lineitem:JUBGrid.getLi(data.id)}).getEstimatedPrice();
62         if(price) return price.price;
63         return ''
64     },
65     getJUBPubdate : function(rowIndex) {
66         return JUBGrid._getMARCAttr(rowIndex, 'pubdate');
67     },
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();
72     },
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'});
78     },
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();
83     },
84     getLIDFundName : function(rowIndex) {
85         var data = JUBGrid.jubDetailGrid.model.getRow(rowIndex);
86         if (!data || !data.fund) return;
87         try {
88             return openils.acq.Fund.retrieve(data.fund).name();
89         } catch (evt) {
90             return data.fund;
91         }
92     },
93     getLIDFundCode : function(rowIndex) {
94         var data = JUBGrid.jubDetailGrid.model.getRow(rowIndex);
95         if (!data || !data.fund) return;
96         try {
97             return openils.acq.Fund.retrieve(data.fund).code();
98         } catch (evt) {
99             return data.fund;
100         }
101     },
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();
106     },
107
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!!! 
111     },
112
113     populate : function(gridWidget, model, lineitems) {
114         for (var i in lineitems) {
115             JUBGrid.lineitems[lineitems[i].id()] = lineitems[i];
116         }
117         JUBGrid.jubGrid = gridWidget;
118         JUBGrid.jubGrid.setModel(model);
119         if(JUBGrid.showDetails) {
120             dojo.connect(gridWidget, "onRowClick", 
121                 function(evt) {
122                     var jub = model.getRow(evt.rowIndex);
123                     var grid;
124
125                     JUBGrid.jubDetailGrid.lineitemID = jub.id;
126
127                     //if (jub.state == "approved") {
128                     if (false) { // need finer grained control here
129                         grid = JUBGrid.jubDetailGridLayoutReadOnly;
130                     } else {
131                         grid = JUBGrid.jubDetailGridLayout;
132                     }
133                     openils.acq.Lineitem.loadLIDGrid(
134                         JUBGrid.jubDetailGrid, 
135                         JUBGrid.jubGrid.model.getRow(evt.rowIndex).id, grid);
136                 }
137             );
138         }
139         // capture changes to lineitems
140         dojo.connect(model.store, "onSet", JUBGrid.onJUBSet);
141         gridWidget.update();
142     },
143
144     approveJUB: function(evt) {
145         var list = [];
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));
150         }
151     },
152
153     approveSingleJUB: function(jub) {
154         var li = new openils.acq.Lineitem({lineitem:JUBGrid.getLi(jub.id)});
155         var approveStore = function(evt) {
156             if (evt) {
157                 // something bad happened
158                 console.log("jubgrid.js: approveJUB: error:");
159                 console.dir(evt);
160                 alert("Error: "+evt.desc);
161             } else {
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);
169                 };
170                 JUBGrid.jubGrid.model.store.fetch({query:{id:jub.id}, onItem: approveACQLI});
171             }
172         };
173
174         li.approve(approveStore);
175     },
176
177
178     removeSelectedJUBs: function(evt) {
179
180         function deleteList(list, idx, oncomplete) {
181             if(idx >= list.length) 
182                 return oncomplete();
183             fieldmapper.standardRequest([
184                 'open-ils.acq',
185                 'open-ils.acq.lineitem.delete'], 
186                 {   async: true,
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);
193                     }
194                 }
195             );
196         }
197
198         var lineitems = JUBGrid.lineitems;
199         var deleteMe = [];
200         var keepMe = [];
201         var selected = JUBGrid.jubGrid.selection.getSelected();
202
203         for(var id in lineitems) {
204             var deleted = false;
205             for(var i = 0; i < selected.length; i++) {
206                 var rowIdx = selected[i];
207                     var jubid = JUBGrid.jubGrid.model.getRow(rowIdx).id;
208                 if(jubid == id) {
209                     if (lineitems[id].state() == 'new') {
210                         deleteMe.push(lineitems[id]);
211                         deleted = true;
212                     } else {
213                         alert("Can not delete line item "+id+
214                               ": item is "+lineitems[id].state());
215                     }
216                 }
217             }
218             if(!deleted) 
219                 keepMe[id] = lineitems[id];
220         }
221
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();
228         });
229     },
230
231     deleteLID: function(evt) {
232         var list =[];
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) {
238
239                 if (evt) {
240                     // something bad happened
241                     alert("Error: "+evt.desc);
242                 } else {
243                     var deleteItem = function(item, rq) {
244                         JUBGrid.jubDetailGrid.model.store.deleteItem(item);
245                     };
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();
250                     };
251
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});
256                 }
257                 JUBGrid.jubDetailGrid.update(); 
258             };
259
260             openils.acq.Lineitem.deleteLID(lid.id, deleteFromStore);
261         }
262     },
263
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();
271         }
272         openils.acq.Lineitem.createLID(fields, addToStore);
273     },
274
275     receiveLID: function(evt) {
276             var list =[];
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);
281             list.push(lid.id);
282         }
283         if(lid != null) { // is at least one selected?
284             JUBGrid._receiveLIDList(list, 0, 
285                 function() {
286                     delete openils.acq.Lineitem.ModelCache[lid.lineitem];
287                     openils.acq.Lineitem.loadLIDGrid(
288                         JUBGrid.jubDetailGrid, lid.lineitem, JUBGrid.jubDetailGridLayout);
289                 }
290             );
291         }
292     },
293
294     // loop through the list of LIDs and mark them as received
295     _receiveLIDList: function(list, idx, callback) {
296         if(idx >= list.length)
297             return callback();
298         fieldmapper.standardRequest(
299             ['open-ils.acq', 'open-ils.acq.lineitem_detail.receive'],
300             {   asnync: true,
301                 params: [openils.User.authtoken, list[idx++]],
302                 oncomplete: function(r) {
303                     var res = r.recv().content();
304                     if(e = openils.Event.parse(res))
305                         return alert(e);
306                     JUBGrid._receiveLIDList(list, idx, callback);
307                 }
308             }
309         );
310     },
311
312
313     // called when a lineitem is edited
314     onJUBSet: function (griditem, attr, oldVal,newVal) {
315         var item;
316
317         var updateDone = function(r) {
318             var stat = r.recv().content();
319             if(e = openils.Event.parse(stat)) 
320                 console.dir(e);
321         };
322
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))
327                 return alert(e);
328
329             var oldVal = new openils.acq.Lineitem(
330                 {lineitem:item}).findAttr(attr, 'lineitem_local_attr_definition');
331
332             if(oldVal) {
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);
338                     }
339                 }
340             } else {
341                 // if this is a new attribute, create a new object to match reality
342                 liad = new acqlia();
343                 liad.attr_type('lineitem_local_attr_definition');
344                 liad.attr_value(newVal);
345                 liad.attr_name(attr);
346                 liad.id(res);
347                 item.attributes().push(liad);
348             }
349         }
350
351         if (oldVal == newVal) {
352             return;
353         }
354
355         item = JUBGrid.lineitems[griditem.id];
356         if (attr == "provider") {
357             if(newVal == '') 
358                 newVal = null;
359             item.provider(newVal);
360
361         } else if(attr == 'estimated_price' || attr == 'actual_price') {
362             fieldmapper.standardRequest(
363                 ['open-ils.acq', 'open-ils.acq.lineitem_local_attr.set'],
364                 {   async: true,
365                     params: [openils.User.authtoken, item.id(), attr, newVal],
366                     oncomplete: function(r) {attrUpdateDone(r, attr); }
367                 }
368             );
369         } else {
370             //alert("Unexpected attr in Picklist.onSet: '"+attr+"'");
371             return;
372         }
373
374         fieldmapper.standardRequest(
375             ["open-ils.acq", "open-ils.acq.lineitem.update"],
376             {params: [openils.User.authtoken, item],
377              oncomplete: updateDone
378             }
379         );
380     },
381 };
382