]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/ui/default/acq/po/view_po.js
Acq: make provider indicator in PO viewing interface a link to provider iface
[Evergreen.git] / Open-ILS / web / js / ui / default / acq / po / view_po.js
1 dojo.require('dijit.layout.ContentPane');
2 dojo.require('openils.User');
3 dojo.require('openils.Util');
4 dojo.require('openils.PermaCrud');
5
6 var pcrud = new openils.PermaCrud();
7 var PO = null;
8 var liTable;
9 var poNoteTable;
10
11 function AcqPoNoteTable() {
12     var self = this;
13
14     this.notesTbody = dojo.byId("acq-po-notes-tbody");
15     this.notesRow = this.notesTbody.removeChild(dojo.byId("acq-po-notes-row"));
16
17     dojo.byId("acq-po-notes-back-button").onclick = function() { self.hide(); };
18     dojo.byId("acq-po-view-notes").onclick = function() { self.show(); };
19
20     /* widgets' event properties are cased likeThis */
21     acqPoCreateNoteSubmit.onClick = function() {
22         if (!acqPoCreateNoteText.attr("value")) return;
23
24         /* prep new note */
25         var note = new acqpon();
26         note.vendor_public(
27             Boolean(acqPoCreateNoteVendorPublic.attr('checked'))
28         );
29         note.value(acqPoCreateNoteText.attr("value"));
30         note.purchase_order(PO.id());
31         note.isnew(true);
32
33         /* save it */
34         self.updatePoNotes(note);
35
36         /* reset fields for next use */
37         acqPoCreateNoteText.attr("value", "");
38         acqPoCreateNoteVendorPublic.attr("checked", false);
39     };
40
41     this.drawPoNote = function(note) {
42         if (note.isdeleted())
43             return;
44
45         var row = dojo.clone(this.notesRow);
46
47         nodeByName("value", row).innerHTML = note.value();
48
49         if (openils.Util.isTrue(note.vendor_public()))
50             nodeByName("vendor_public", row).innerHTML =
51                 localeStrings.VENDOR_PUBLIC;
52
53         nodeByName("delete", row).onclick = function() {
54             note.isdeleted(true);
55             self.notesTbody.removeChild(row);
56             self.updatePoNotes();
57         };
58
59         if (note.edit_time()) {
60             nodeByName("edit_time", row).innerHTML =
61                 dojo.date.locale.format(
62                     dojo.date.stamp.fromISOString(note.edit_time()),
63                     {"formatLength": "short"}
64                 );
65         }
66
67         self.notesTbody.appendChild(row);
68     };
69
70     this.drawPoNotes = function() {
71         /* sort */
72         PO.notes(
73             PO.notes().sort(
74                 function(a, b) {
75                     return (a.edit_time() < b.edit_time()) ? 1 : -1;
76                 }
77             )
78         );
79
80         /* remove old renderings of notes */
81         dojo.empty(this.notesTbody);
82
83         PO.notes().forEach(function(o) { self.drawPoNote(o); });
84     };
85
86     this.updatePoNotesCount = function() {
87         dojo.byId("acq-po-view-notes").innerHTML = PO.notes().length;
88     };
89
90     this.updatePoNotes = function(newNote) {
91         var notes = newNote ?
92             [newNote] :
93             PO.notes().filter(
94                 function(o) {
95                     if (o.ischanged() || o.isnew() || o.isdeleted())
96                         return o;
97                 }
98             );
99
100         if (notes.length < 1)
101             return;
102
103         progressDialog.show();
104
105         fieldmapper.standardRequest(
106             ["open-ils.acq", "open-ils.acq.po_note.cud.batch"], {
107                 "async": true,
108                 "params": [openils.User.authtoken, notes],
109                 "onresponse": function(r) {
110                     var resp = openils.Util.readResponse(r);
111                     if (resp) {
112                         progressDialog.update(resp);
113
114                         if (!resp.note.isdeleted()) {
115                             resp.note.isnew(false);
116                             resp.note.ischanged(false);
117                             PO.notes().push(resp.note);
118                         }
119                     }
120                 },
121                 "oncomplete": function() {
122                     if (!newNote) {
123                         /* remove the old changed notes */
124                         var list = [];
125                         PO.notes(
126                             PO.notes().filter(
127                                 function(o) {
128                                     return (!(
129                                         o.ischanged() || o.isnew() ||
130                                         o.isdeleted()
131                                     ));
132                                 }
133                             )
134                         );
135                     }
136
137                     progressDialog.hide();
138                     self.updatePoNotesCount();
139                     self.drawPoNotes();
140                 }
141             }
142         );
143     };
144
145     this.hide = function() {
146         openils.Util.hide("acq-po-notes-div");
147         liTable.show("list");
148     };
149
150     this.show = function() {
151         liTable.hide();
152         self.drawPoNotes();
153         openils.Util.show("acq-po-notes-div");
154     };
155 }
156
157 function updatePoState(po_info) {
158     var data = po_info[PO.id()];
159     if (data) {
160         for (var key in data)
161             PO[key](data[key]);
162         renderPo();
163     }
164 }
165
166 function cancellationUpdater(r) {
167     var r = openils.Util.readResponse(r);
168     if (r) {
169         if (r.po) updatePoState(r.po);
170         if (r.li) {
171             for (var id in r.li) {
172                 liTable.liCache[id].state(r.li[id].state);
173                 liTable.liCache[id].cancel_reason(r.li[id].cancel_reason);
174                 liTable.updateLiState(liTable.liCache[id]);
175             }
176         }
177         if (r.lid && liTable.copyCache) {
178             for (var id in r.lid) {
179                 if (liTable.copyCache[id]) {
180                     liTable.copyCache[id].cancel_reason(
181                         r.lid[id].cancel_reason
182                     );
183                     liTable.updateLidState(liTable.copyCache[id]);
184                 }
185             }
186         }
187     }
188 }
189
190 function makeProviderLink(node, provider) {
191     return dojo.create(
192         "a", {
193             "href": "/eg/conify/global/acq/provider/" + provider.id(),
194             "innerHTML": provider.name() + " (" + provider.code() + ")",
195         },
196         node,
197         "only"
198     );
199 }
200 function makePrepayWidget(node, prepay) {
201     if (prepay) {
202         openils.Util.addCSSClass(node, "oils-acq-po-prepay");
203         node.innerHTML = localeStrings.YES;
204     } else {
205         openils.Util.removeCSSClass(node, "oils-acq-po-prepay");
206         node.innerHTML = localeStrings.NO;
207     }
208 }
209
210 function makeCancelWidget(node, labelnode) {
211     openils.Util.hide("acq-po-choose-cancel-reason");
212
213     if (PO.cancel_reason()) {
214         labelnode.innerHTML = localeStrings.CANCEL_REASON;
215         node.innerHTML = PO.cancel_reason().description() + " (" +
216             PO.cancel_reason().label() + ")";
217     } else if (["on-order", "pending"].indexOf(PO.state()) == -1) {
218         dojo.destroy(this.oldTip);
219         labelnode.innerHTML = "";
220         node.innerHTML = "";
221     } else {
222         dojo.destroy(this.oldTip);
223         labelnode.innerHTML = localeStrings.CANCEL;
224         node.innerHTML = "";
225         if (!acqPoCancelReasonSubmit._prepared) {
226             var widget = new openils.widget.AutoFieldWidget({
227                 "fmField": "cancel_reason",
228                 "fmClass": "acqpo",
229                 "parentNode": dojo.byId("acq-po-cancel-reason"),
230                 "orgLimitPerms": ["CREATE_PURCHASE_ORDER"],
231                 "forceSync": true
232             });
233             widget.build(
234                 function(w, ww) {
235                     acqPoCancelReasonSubmit.onClick = function() {
236                         if (w.attr("value")) {
237                             if (confirm(localeStrings.PO_CANCEL_CONFIRM)) {
238                                 fieldmapper.standardRequest(
239                                     ["open-ils.acq",
240                                         "open-ils.acq.purchase_order.cancel"],
241                                     {
242                                         "params": [
243                                             openils.User.authtoken,
244                                             PO.id(), 
245                                             w.attr("value")
246                                         ],
247                                         "async": true,
248                                         "oncomplete": cancellationUpdater
249                                     }
250                                 );
251                             }
252                         }
253                     };
254                     acqPoCancelReasonSubmit._prepared = true;
255                 }
256             );
257         }
258         openils.Util.show("acq-po-choose-cancel-reason", "inline");
259     }
260 }
261
262 function renderPo() {
263     dojo.byId("acq-po-view-id").innerHTML = PO.id();
264     dojo.byId("acq-po-view-name").innerHTML = PO.name();
265     makeProviderLink(
266         dojo.byId("acq-po-view-provider"),
267         PO.provider()
268     );
269     dojo.byId("acq-po-view-total-li").innerHTML = PO.lineitem_count();
270     dojo.byId("acq-po-view-total-enc").innerHTML = PO.amount_encumbered();
271     dojo.byId("acq-po-view-total-spent").innerHTML = PO.amount_spent();
272     dojo.byId("acq-po-view-state").innerHTML = PO.state(); // TODO i18n
273     makePrepayWidget(
274         dojo.byId("acq-po-view-prepay"),
275         openils.Util.isTrue(PO.prepayment_required())
276     );
277     makeCancelWidget(
278         dojo.byId("acq-po-view-cancel-reason"),
279         dojo.byId("acq-po-cancel-label")
280     );
281     dojo.byId("acq-po-view-notes").innerHTML = PO.notes().length;
282
283     if(PO.state() == "pending") {
284         openils.Util.show("acq-po-activate");
285         if (PO.lineitem_count() > 1)
286             openils.Util.show("acq-po-split");
287     }
288 }
289
290
291 function init() {
292     /* set up li table */
293     liTable = new AcqLiTable();
294     liTable.reset();
295     liTable.isPO = poId;
296     liTable.poUpdateCallback = updatePoState;
297
298     /* set up po notes table */
299     poNoteTable = new AcqPoNoteTable();
300
301     /* retrieve data and populate */
302     fieldmapper.standardRequest(
303         ['open-ils.acq', 'open-ils.acq.purchase_order.retrieve'],
304         {   async: true,
305             params: [openils.User.authtoken, poId, {
306                 "flesh_provider": true,
307                 "flesh_price_summary": true,
308                 "flesh_lineitem_count": true,
309                 "flesh_notes": true
310             }],
311             oncomplete: function(r) {
312                 PO = openils.Util.readResponse(r); /* save PO globally */
313                 renderPo();
314             }
315         }
316     );
317
318     fieldmapper.standardRequest(
319         ['open-ils.acq', 'open-ils.acq.lineitem.search'],
320         {   async: true,
321 params: [openils.User.authtoken, {purchase_order:poId}, {flesh_attrs:true, flesh_notes:true, flesh_cancel_reason:true}],
322             onresponse: function(r) {
323                 liTable.show('list');
324                 liTable.addLineitem(openils.Util.readResponse(r));
325             }
326         }
327     );
328 }
329
330 function activatePo() {
331     if (
332         openils.Util.isTrue(PO.prepayment_required()) &&
333         !confirm(localeStrings.PREPAYMENT_REQUIRED_REMINDER)
334     ) return false;
335
336     progressDialog.show(true);
337     try {
338         fieldmapper.standardRequest(
339             ['open-ils.acq', 'open-ils.acq.purchase_order.activate'],
340             {   async: true,
341                 params: [openils.User.authtoken, PO.id()],
342                 oncomplete : function() {
343                     location.href = location.href;
344                 }
345             }
346         );
347     } catch(E) {
348         progressDialog.hide();
349     }
350 }
351
352 function splitPo() {
353     progressDialog.show(true);
354     try {
355         var list;
356         fieldmapper.standardRequest(
357             ['open-ils.acq', 'open-ils.acq.purchase_order.split_by_lineitems'],
358             {   async: true,
359                 params: [openils.User.authtoken, PO.id()],
360                 onresponse : function(r) {
361                     list = openils.Util.readResponse(r);
362                 },
363                 oncomplete : function() {
364                     progressDialog.hide();
365                     if (list) {
366                         location.href = oilsBasePath + '/eg/acq/po/search/' +
367                             list.join(",");
368                     }
369                 }
370             }
371         );
372     } catch(E) {
373         progressDialog.hide();
374         alert(E);
375     }
376 }
377
378 function updatePoName() {
379     var value = prompt('Enter new purchase order name:', PO.name()); // TODO i18n
380     if(!value || value == PO.name()) return;
381     PO.name(value);
382     pcrud.update(PO, {
383         oncomplete : function(r, cudResults) {
384             var stat = cudResults[0];
385             if(stat)
386                 dojo.byId('acq-po-view-name').innerHTML = value;
387         }
388     });
389 }
390
391 openils.Util.addOnLoad(init);