]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/serial/print_routing_list_users.js
Serials: add ability to print routing lists from the batch receive interface
[working/Evergreen.git] / Open-ILS / web / js / ui / default / serial / print_routing_list_users.js
1 dojo.require("dojo.string");
2
3 var list_renderer;
4
5 function n(name, ctx) { return dojo.query("[name='" + name + "']", ctx)[0]; }
6
7 function ListRenderer() {
8     var self = this;
9
10     this.render = function() {
11         for (var i = 0; i < this.streams.length; i++) {
12             var stream = this.streams[i];
13             var list = dojo.clone(this.list_template);
14             n("title", list).innerHTML = this.mvr.title();
15             n("issuance_label", list).innerHTML = this.issuance.label();
16             n("distribution_holding_lib", list).innerHTML =
17                 stream.distribution().holding_lib().shortname();
18             n("distribution_label", list).innerHTML =
19                 stream.distribution().label();
20             if (stream.routing_label()) {
21                 n("stream_routing_label", list).innerHTML =
22                     stream.routing_label();
23                 openils.Util.show(
24                     n("stream_routing_label", list), "inline"
25                 );
26             } else {
27                 n("stream_id", list).innerHTML = stream.id();
28                 openils.Util.show(n("stream_id_container", list), "inline");
29             }
30
31             this.render_users(stream, list);
32
33             if (i) {
34                 dojo.create(
35                     "hr",
36                     {"style": "page-break-after: always"}, this.target, "last"
37                 );
38             }
39
40             dojo.place(list, this.target, "last");
41         }
42
43         return this; /* for chaining */
44     };
45
46     this.render_users = function(stream, list) {
47         for (var i = 0; i < this.users_by_stream[stream.id()].length; i++) {
48             var user = this.users_by_stream[stream.id()][i];
49             var node = dojo.clone(this.user_template);
50
51             if (user.reader()) {
52                 n("barcode", node).innerHTML = user.reader().card().barcode();
53                 n("name", node).innerHTML = dojo.string.substitute(
54                     "${0}, ${1} ${2}", [
55                         user.reader().family_name(),
56                         user.reader().first_given_name(),
57                         user.reader().second_given_name()
58                     ].map(function(n) { return n || ""; })
59                 );
60                 n("ou", node).innerHTML = user.reader().home_ou().shortname();
61                 openils.Util.show(n("reader_container", node), "inline");
62             } else if (user.department()) {
63                 n("department", node).innerHTML = user.department();
64                 openils.Util.show(n("department_container", node), "inline");
65             }
66
67             if (user.note()) {
68                 n("note", node).innerHTML = user.note();
69                 openils.Util.show(n("note_container", node), "inline");
70             }
71
72             dojo.place(node, n("users", list), "last");
73         }
74     };
75
76     this.print = function() {
77         this.print_target.print();
78     }
79
80     this._sort_users = function() {
81         this.users_by_stream = {};
82         this.users.forEach(
83             function(user) {
84                 var key = user.stream();
85                 if (!self.users_by_stream[key])
86                     self.users_by_stream[key] = [];
87                 self.users_by_stream[key].push(user);
88             }
89         );
90     };
91
92     /* Unfortunately, when we print the main window with dijits
93      * wrapping everything, the page-break-* CSS properties don't work
94      * inside of there, so we need an iframe to print from.
95      */
96     this._prepare_iframe = function() {
97         var iframe = dojo.create(
98             "iframe", {
99                 "src": "", "width": "100%", "height": "500", "frameborder": 0
100             }, "iframe_in_here", "only"
101         );
102
103         iframe.contentWindow.document.open();
104         iframe.contentWindow.document.write(
105             "<html><head><style type='text/css'>" +
106             ".item-title { font-size: 130%; font-weight: bold; }\n" +
107             ".item-issuance-label { font-size: 120%; }\n" +
108             ".item-dist-and-stream { font-size: 110%; }\n" +
109             ".hidden { display: none; }\n" +
110             "</style></head>\n<body></body></html>"
111         );
112         iframe.contentWindow.document.close();
113         this.target = iframe.contentWindow.document.body;
114         this.print_target = iframe.contentWindow;
115     };
116
117     this._init = function(data) {
118         this.user_template = dojo.byId("user_template");
119         this.user_template.removeAttribute("id");
120         this.user_template.parentNode.removeChild(this.user_template);
121
122         this.list_template = dojo.byId("list_template");
123         this.list_template.removeAttribute("id");
124         this.list_template.parentNode.removeChild(this.list_template);
125
126         dojo.mixin(this, data);
127
128         this._sort_users();
129         this._prepare_iframe();
130     }
131
132     this._init.apply(this, arguments);
133 }
134
135 openils.Util.addOnLoad(
136     function() {
137         if (!xulG) {
138             alert(
139                 "This interface is not designed for use outside " +
140                 "the staff client." /* XXX i18n */
141             );
142         } else {
143             list_renderer = new ListRenderer(xulG.routing_list_data);
144             list_renderer.render().print();
145         }
146     }
147 );