]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/serial/print_routing_list_users.js
Serials: printing routing slips fails with Javascript error
[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_users = function(stream, list) {
52         for (var i = 0; i < this.users_by_stream[stream.id()].length; i++) {
53             var user = this.users_by_stream[stream.id()][i];
54             var node = dojo.clone(this.user_template);
55
56             if (user.reader()) {
57                 n("barcode", node).innerHTML = user.reader().card().barcode();
58                 n("name", node).innerHTML = dojo.string.substitute(
59                     "${0}, ${1} ${2}", [
60                         user.reader().family_name(),
61                         user.reader().first_given_name(),
62                         user.reader().second_given_name()
63                     ].map(function(n) { return n || ""; })
64                 );
65                 n("ou", node).innerHTML = user.reader().home_ou().shortname();
66                 openils.Util.show(n("reader_container", node), "inline");
67             } else if (user.department()) {
68                 n("department", node).innerHTML = user.department();
69                 openils.Util.show(n("department_container", node), "inline");
70             }
71
72             if (user.note()) {
73                 n("note", node).innerHTML = user.note();
74                 openils.Util.show(n("note_container", node), "inline");
75             }
76
77             dojo.place(node, n("users", list), "last");
78         }
79     };
80
81     this.print = function() {
82         this.print_target.print();
83     }
84
85     this._sort_users = function() {
86         this.users_by_stream = {};
87         this.users.forEach(
88             function(user) {
89                 var key = user.stream();
90                 if (!self.users_by_stream[key])
91                     self.users_by_stream[key] = [];
92                 self.users_by_stream[key].push(user);
93             }
94         );
95     };
96
97     /* Unfortunately, when we print the main window with dijits
98      * wrapping everything, the page-break-* CSS properties don't work
99      * inside of there, so we need an iframe to print from.
100      */
101     this._prepare_iframe = function() {
102         var iframe = dojo.create(
103             "iframe", {
104                 "src": "", "width": "100%", "height": "500", "frameborder": 0
105             }, "iframe_in_here", "only"
106         );
107
108         iframe.contentWindow.document.open();
109         iframe.contentWindow.document.write(
110             "<html><head><style type='text/css'>" +
111             ".item-title { font-size: 130%; font-weight: bold; }\n" +
112             ".item-issuance-label { font-size: 120%; }\n" +
113             ".item-dist-and-stream { font-size: 110%; }\n" +
114             ".hidden { display: none; }\n" +
115             "</style></head>\n<body></body></html>"
116         );
117         iframe.contentWindow.document.close();
118         this.target = iframe.contentWindow.document.body;
119         this.print_target = iframe.contentWindow;
120     };
121
122     this._init = function(data) {
123         this.user_template = dojo.byId("user_template");
124         this.user_template.removeAttribute("id");
125         this.user_template.parentNode.removeChild(this.user_template);
126
127         this.list_template = dojo.byId("list_template");
128         this.list_template.removeAttribute("id");
129         this.list_template.parentNode.removeChild(this.list_template);
130
131         dojo.mixin(this, data);
132
133         this._sort_users();
134         this._prepare_iframe();
135     }
136
137     this._init.apply(this, arguments);
138 }
139
140 openils.Util.addOnLoad(
141     function() {
142         if (!xulG) {
143             alert(
144                 "This interface is not designed for use outside " +
145                 "the staff client." /* XXX i18n */
146             );
147         } else {
148             list_renderer = new ListRenderer(xulG.routing_list_data);
149             list_renderer.render().print();
150         }
151     }
152 );