]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/opac/extras/circ/alt_holds_print.js
Fix a problem in the clear holds shelf list printer
[Evergreen.git] / Open-ILS / web / opac / extras / circ / alt_holds_print.js
1 dojo.require("dojo.cookie");
2 dojo.require("dojox.xml.parser");
3 dojo.require("openils.BibTemplate");
4 dojo.require("openils.widget.ProgressDialog");
5
6 var authtoken;
7 var cgi;
8
9 function do_pull_list() {
10     progress_dialog.show(true);
11
12     var any = false;
13
14     fieldmapper.standardRequest(
15         ['open-ils.circ','open-ils.circ.hold_pull_list.print.stream'],
16         { async : true,
17           params: [
18             authtoken, {
19               org_id     : cgi.param('o'),
20               limit      : cgi.param('limit'),
21               offset     : cgi.param('offset'),
22               chunk_size : cgi.param('chunk_size'),
23               sort       : sort_order
24             }
25           ],
26           onresponse : function (r) {
27             any = true;
28             dojo.forEach( openils.Util.readResponse(r), function (hold_fm) {
29
30                 // hashify the hold
31                 var hold = hold_fm.toHash(true);
32                 hold.usr = hold_fm.usr().toHash(true);
33                 hold.usr.card = hold_fm.usr().card().toHash(true);
34                 hold.current_copy = hold_fm.current_copy().toHash(true);
35                 hold.current_copy.location = hold_fm.current_copy().location().toHash(true);
36                 hold.current_copy.call_number = hold_fm.current_copy().call_number().toHash(true);
37                 hold.current_copy.call_number.record = hold_fm.current_copy().call_number().record().toHash(true);
38                 hold.current_copy.call_number.prefix = hold_fm.current_copy().call_number().prefix().toHash(true);
39                 hold.current_copy.call_number.suffix = hold_fm.current_copy().call_number().suffix().toHash(true);
40                 hold.current_copy.parts_stringified = '';
41                 dojo.forEach( hold_fm.current_copy().parts(), function(part) {
42                     hold.current_copy.parts_stringified += ' ' + part.label();
43                 });
44
45
46                 // clone the template's html
47                 var tr = dojo.clone(
48                     dojo.query("tr", dojo.byId('template'))[0]
49                 );
50                 dojo.query("td:not([type])", tr).forEach(
51                     function(td) {
52                         td.innerHTML =
53                             dojo.string.substitute(td.innerHTML, hold);
54                     }
55                 );
56
57                 new openils.BibTemplate({
58                     root : tr,
59                     xml  : dojox.xml.parser.parse(hold.current_copy.call_number.record.marc),
60                     delay: false
61                 });
62
63                 dojo.place(tr, "target");
64             });
65           },
66           oncomplete : function () {
67             progress_dialog.hide();
68             setTimeout(
69                 function() {
70                     if (any) window.print();
71                     else alert(dojo.byId("no_results").innerHTML);
72                 }, 500  /* give the progress_dialog more time to go away */
73             );
74           }
75         }
76     );
77 }
78
79 function place_by_sortkey(node, container) {
80     /*Don't use a forEach() or anything like that here. too slow.*/
81     var sortkey = dojo.attr(node, "sortkey");
82     for (var i = 0; i < container.childNodes.length; i++) {
83         var rover = container.childNodes[i];
84         if (rover.nodeType != 1) continue;
85         if (dojo.attr(rover, "sortkey") > sortkey) {
86             dojo.place(node, rover, "before");
87             return;
88         }
89     }
90     dojo.place(node, container, "last");
91 }
92
93 function hashify_fields(fields) {
94     var hold  = {
95         "usr": {},
96         "current_copy": {
97             "barcode": fields.barcode,
98             "call_number": {
99                 "label": fields.label,
100                 "record": {"marc": fields.marc}
101             },
102             "location": {"name": fields.name}
103         }
104     };
105
106     if (fields.alias) {
107         hold.usr.display_name = fields.alias;
108     } else {
109         hold.usr.display_name = [
110             (fields.family_name ? fields.family_name : ""),
111             (fields.first_given_name ? fields.first_given_name : ""),
112             (fields.second_given_name ? fields.second_given_name : "")
113         ].join(" ");
114     }
115
116     ["first_given_name","second_given_name","family_name","alias"].forEach(
117         function(k) { hold.usr[k] = fields[k]; }
118     );
119
120     hold.current_copy.call_number.prefix = fields.prefix;
121     hold.current_copy.call_number.suffix = fields.suffix;
122     hold.current_copy.parts_stringified = '';   /* no real support for parts here */
123     return hold;
124 }
125
126 function do_clear_holds() {
127     progress_dialog.show(true);
128
129     var launcher;
130     fieldmapper.standardRequest(
131         ["open-ils.circ", "open-ils.circ.hold.clear_shelf.process"], {
132             "async": true,
133             "params": [authtoken, cgi.param("o")],
134             "onresponse": function(r) {
135                 if (r = openils.Util.readResponse(r)) {
136                     if (r.cache_key) { /* complete */
137                         launcher = dojo.byId("clear_holds_launcher");
138                         launcher.innerHTML = "Re-fetch for Printing"; /* XXX i18n */
139                         launcher.onclick =
140                             function() { do_clear_holds_from_cache(r.cache_key); };
141                         dojo.byId("clear_holds_set_label").innerHTML = r.cache_key;
142                     } else if (r.maximum) {
143                         progress_dialog.update(r);
144                     }
145                 }
146             },
147             "oncomplete": function() {
148                 progress_dialog.hide();
149                 if (launcher) launcher.onclick();
150                 else alert(dojo.byId("no_results").innerHTML);
151             }
152         }
153     );
154 }
155
156 function do_clear_holds_from_cache(cache_key) {
157     progress_dialog.show(true);
158
159     var any = 0;
160     var target = dojo.byId("target");
161     dojo.empty(target);
162     var template = dojo.query("tr", dojo.byId("template"))[0];
163     fieldmapper.standardRequest(
164         ["open-ils.circ",
165             "open-ils.circ.hold.clear_shelf.get_cache"], {
166             "async": true,
167             "params": [authtoken, cache_key, cgi.param("chunk_size")],
168             "onresponse": function(r) {
169                 dojo.forEach(
170                     openils.Util.readResponse(r),
171                     function(resp) {
172                         if (resp.maximum) {
173                             progress_dialog.update(resp);
174                             return;
175                         }
176
177                         var hold = hashify_fields(resp.hold_details);
178                         hold.action = resp.action;
179
180                         var tr = dojo.clone(template);
181                         any++;
182
183                         dojo.query("td:not([type])", tr).forEach(
184                             function(td) {
185                                 td.innerHTML =
186                                     dojo.string.substitute(td.innerHTML, hold);
187                             }
188                         );
189
190                         new openils.BibTemplate({
191                             "root": tr,
192                             "xml": dojox.xml.parser.parse(
193                                 hold.current_copy.call_number.record.marc
194                             ),
195                             "delay": false
196                         });
197
198                         dojo.attr(tr, "sortkey", hold.usr.display_name);
199                         place_by_sortkey(tr, target);
200                     }
201                 );
202                 progress_dialog.update({"progress": any});
203             },
204             "oncomplete": function() {
205                 progress_dialog.hide();
206                 setTimeout(
207                     function() {
208                         if (any) window.print();
209                         else alert(dojo.byId("no_results").innerHTML);
210                     }, 500  /* give the progress_dialog more time to go away */
211                 );
212             }
213         }
214     );
215 }
216