]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/serial/print_routing_list_users.js
Serials: improve routing slips per Dan Wells' suggestions on LP #1229349
[working/Evergreen.git] / Open-ILS / web / js / ui / default / serial / print_routing_list_users.js
1 dojo.require("dojo.string");
2 dojo.require("dijit.form.Button");
3
4 var list_renderer;
5
6 function n(name, ctx) { return dojo.query("[name='" + name + "']", ctx)[0]; }
7
8 function ListRenderer() {
9     var self = this;
10
11     this.render = function() {
12         for (var i = 0; i < this.streams.length; i++) {
13             var stream = this.streams[i];
14
15             if (!this.users_by_stream[stream.id()])
16                 continue; /* no users on this stream */
17
18             var list = dojo.clone(this.list_template);
19             n("title", list).innerHTML = this.mvr.title();
20             n("issuance_label", list).innerHTML = this.issuance.label();
21             n("distribution_holding_lib", list).innerHTML =
22                 stream.distribution().holding_lib().shortname();
23             n("distribution_label", list).innerHTML =
24                 stream.distribution().label();
25             if (stream.routing_label()) {
26                 n("stream_routing_label", list).innerHTML =
27                     stream.routing_label();
28                 openils.Util.show(
29                     n("stream_routing_label", list), "inline"
30                 );
31             } else {
32                 n("stream_id", list).innerHTML = stream.id();
33                 openils.Util.show(n("stream_id_container", list), "inline");
34             }
35
36             this.render_users(stream, list);
37
38             if (i) {
39                 dojo.create(
40                     "hr",
41                     {"style": "page-break-after: always"}, this.target, "last"
42                 );
43             }
44
45             dojo.place(list, this.target, "last");
46         }
47
48         return this; /* for chaining */
49     };
50
51     this._render_reader_addresses = function(reader, node) {
52         var used_ids = {};
53         ["mailing", "billing"].forEach(
54             function(addr_type) {
55                 var addr = reader[addr_type + "_address"]();
56                 if (!addr || !addr.valid() || used_ids[addr.id()])
57                     return;
58
59                 used_ids[addr.id()] = true;
60
61                 var prefix = addr_type + "_address_";
62                 var container = n(prefix + "container", node);
63                 if (container)
64                     openils.Util.show(container);
65
66                 ["street1", "street2", "city", "county", "state",
67                     "country", "post_code"].forEach(
68                     function(f) {
69                         var field = prefix + f;
70                         var target = n(field, node);
71                         if (target)
72                             target.innerHTML = addr[f]();
73                     }
74                 );
75             }
76         );
77     };
78
79     this.render_users = function(stream, list) {
80         for (var i = 0; i < this.users_by_stream[stream.id()].length; i++) {
81             var user = this.users_by_stream[stream.id()][i];
82             var node = dojo.clone(this.user_template);
83
84             if (user.reader()) {
85                 n("barcode", node).innerHTML = user.reader().card().barcode();
86                 n("name", node).innerHTML = dojo.string.substitute(
87                     "${0}, ${1} ${2}", [
88                         user.reader().family_name(),
89                         user.reader().first_given_name(),
90                         user.reader().second_given_name()
91                     ].map(function(n) { return n || ""; })
92                 );
93                 n("ou", node).innerHTML = user.reader().home_ou().shortname();
94
95                 this._render_reader_addresses(user.reader(), node);
96
97                 openils.Util.show(n("reader_container", node), "inline");
98             } else if (user.department()) {
99                 n("department", node).innerHTML = user.department();
100                 openils.Util.show(n("department_container", node), "inline");
101             }
102
103             if (user.note()) {
104                 n("note", node).innerHTML = user.note();
105                 openils.Util.show(n("note_container", node), "inline");
106             }
107
108             dojo.place(node, n("users", list), "last");
109         }
110     };
111
112     this.print = function() {
113         this.print_target.print();
114     }
115
116     this._sort_users = function() {
117         this.users_by_stream = {};
118         this.users.forEach(
119             function(user) {
120                 var key = user.stream();
121                 if (!self.users_by_stream[key])
122                     self.users_by_stream[key] = [];
123                 self.users_by_stream[key].push(user);
124             }
125         );
126     };
127
128     /* Unfortunately, when we print the main window with dijits
129      * wrapping everything, the page-break-* CSS properties don't work
130      * inside of there, so we need an iframe to print from.
131      */
132     this._prepare_iframe = function() {
133         var iframe = dojo.create(
134             "iframe", {
135                 "src": "", "width": "100%", "height": "500", "frameborder": 0
136             }, "iframe_in_here", "only"
137         );
138
139         iframe.contentWindow.document.open();
140         iframe.contentWindow.document.write(
141             "<html><head><link rel='stylesheet' href='" +
142             dojo.byId("serials_stylesheet_link").href +
143             "' type='text/css' />" +
144             "</style></head>\n<body></body></html>"
145         );
146         iframe.contentWindow.document.close();
147         this.target = iframe.contentWindow.document.body;
148         this.print_target = iframe.contentWindow;
149     };
150
151     this._init = function(data) {
152         this.user_template = dojo.byId("user_template");
153         this.user_template.removeAttribute("id");
154         this.user_template.parentNode.removeChild(this.user_template);
155
156         this.list_template = dojo.byId("list_template");
157         this.list_template.removeAttribute("id");
158         this.list_template.parentNode.removeChild(this.list_template);
159
160         dojo.mixin(this, data);
161
162         this._sort_users();
163         this._prepare_iframe();
164     }
165
166     this._init.apply(this, arguments);
167 }
168
169 openils.Util.addOnLoad(
170     function() {
171         if (!xulG) {
172             alert(
173                 "This interface is not designed for use outside " +
174                 "the staff client." /* XXX i18n */
175             );
176         } else {
177             list_renderer = new ListRenderer(xulG.routing_list_data);
178             list_renderer.render().print();
179         }
180     }
181 );