]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
Merge branch 'master' of git.evergreen-ils.org:Evergreen
[working/Evergreen.git] / Open-ILS / web / js / ui / default / opac / ebook_api / loggedin.js
1 /*
2  * variables defined in base_js.tt2:
3  *
4  * ou
5  * vendor_list = [ 'ebook_test' ]
6  * authtoken
7  * patron_id (barcode)
8  * myopac_page
9  * progress_icon (probably not done right)
10  *
11  * base_js.tt2 also "imports" dojo.cookie and a bunch of ebook_api JS
12  */
13
14 // Array of objects representing this patron's relationship with a specific vendor.
15 var relations = [];
16
17 // Transaction cache.
18 var xacts = {
19     checkouts: [],
20     holds_pending: [],
21     holds_ready: []
22 };
23
24 dojo.addOnLoad(function() {
25
26     dojo.forEach(vendor_list, function(v) {
27         var rel = new Relation(v, patron_id);
28         relations.push(rel);
29     });
30
31     // Pull patron transaction info from cache (cookie), if available.
32     // Otherwise, do a live lookup against all enabled vendors.
33     if (dojo.cookie('ebook_xact_cache')) {
34         getCachedTransactions();
35         addTotalsToPage();
36         addTransactionsToPage();
37     } else {
38         console.log('retrieving patron transaction info for all vendors');
39         dojo.forEach(relations, function(rel) {
40             checkSession(rel.vendor, function(ses) {
41                 rel.getTransactions( function(r) {
42                     addTransactionsToCache(r);
43                 });
44             });
45         });
46     }
47
48 });
49
50 // Update current page with cross-vendor transaction totals.
51 function addTotalsToPage() {
52     console.log('updating page with transaction totals');
53     updateDashboard();
54     updateMyAccountSummary();
55 }
56
57 // Update current page with detailed transaction info, where appropriate.
58 function addTransactionsToPage() {
59     if (myopac_page) {
60         console.log('updating page with cached transaction details, if applicable');
61         if (myopac_page === 'ebook_circs')
62             updateCheckoutView();
63         if (myopac_page === 'ebook_holds')
64             updateHoldView();
65         if (myopac_page === 'ebook_holds_ready')
66             updateHoldReadyView();
67     }
68 }
69         
70 function updateDashboard() {
71     console.log('updating dashboard');
72     var total_checkouts = (typeof xacts.checkouts === 'undefined') ? '-' : xacts.checkouts.length;
73     var total_holds_pending = (typeof xacts.holds_pending === 'undefined') ? '-' : xacts.holds_pending.length;
74     var total_holds_ready = (typeof xacts.holds_ready === 'undefined') ? '-' : xacts.holds_ready.length;
75     // update totals
76     dojo.byId('dash_e_checked').innerHTML = total_checkouts;
77     dojo.byId('dash_e_holds').innerHTML = total_holds_pending;
78     dojo.byId('dash_e_pickup').innerHTML = total_holds_ready;
79     // unhide ebook dashboard
80     dojo.removeClass('dashboard_e', "hidden");
81 }
82
83 function updateMyAccountSummary() {
84     if (myopac_page === 'main') {
85         console.log('updating account summary');
86         var total_checkouts = (typeof xacts.checkouts === 'undefined') ? '-' : xacts.checkouts.length;
87         var total_holds_pending = (typeof xacts.holds_pending === 'undefined') ? '-' : xacts.holds_pending.length;
88         var total_holds_ready = (typeof xacts.holds_ready === 'undefined') ? '-' : xacts.holds_ready.length;
89         // update totals
90         dojo.byId('acct_sum_ebook_circ_total').innerHTML = total_checkouts;
91         dojo.byId('acct_sum_ebook_hold_total').innerHTML = total_holds_pending;
92         dojo.byId('acct_sum_ebook_hold_ready_total').innerHTML = total_holds_ready;
93         // unhide display elements
94         dojo.removeClass('acct_sum_ebook_circs', "hidden");
95         dojo.removeClass('acct_sum_ebook_holds', "hidden");
96         dojo.removeClass('acct_sum_ebook_holds_ready', "hidden");
97     }
98 }
99
100 function updateCheckoutView() {
101     if (xacts.checkouts.length < 1) {
102         dojo.removeClass('no_ebook_circs', "hidden");
103     } else {
104         dojo.forEach(xacts.checkouts, function(x) {
105             dojo.empty('ebook_circs_main_table_body');
106             var dl_link = '<a href="' + x.download_url + '">' + l_strings.download + '</a>';
107             var tr = dojo.create("tr", null, dojo.byId('ebook_circs_main_table_body'));
108             dojo.create("td", { innerHTML: x.title }, tr);
109             dojo.create("td", { innerHTML: x.author }, tr);
110             dojo.create("td", { innerHTML: x.due_date }, tr);
111             dojo.create("td", { innerHTML: dl_link}, tr);
112             // TODO: more actions (renew, checkin)
113         });
114         dojo.addClass('no_ebook_circs', "hidden");
115         dojo.removeClass('ebook_circs_main', "hidden");
116     }
117 }
118
119 function updateHoldView() {
120     var holds_pending = xacts.holds_pending;
121     var holds_ready = xacts.holds_ready;
122
123     // combine all holds into a single list, ready-for-checkout holds first
124     var holds = holds_ready.concat(holds_pending);
125
126     if (holds.length < 1) {
127         dojo.removeClass('no_ebook_holds', "hidden");
128     } else {
129         dojo.forEach(holds, function(h) {
130             var hold_status;
131             if (h.is_ready) {
132                 hold_status = l_strings.ready_for_checkout;
133             } else if (h.is_frozen) {
134                 hold_status = l_strings.suspended;
135             } else {
136                 hold_status = h.queue_position + ' / ' + h.queue_size;
137             }
138             dojo.empty('ebook_holds_main_table_body');
139             var tr = dojo.create("tr", null, dojo.byId('ebook_holds_main_table_body'));
140             dojo.create("td", { innerHTML: h.title }, tr);
141             dojo.create("td", { innerHTML: h.author }, tr);
142             dojo.create("td", { innerHTML: h.expire_date }, tr);
143             dojo.create("td", { innerHTML: hold_status }, tr);
144             dojo.create("td", null, tr); // TODO actions
145         });
146         dojo.addClass('no_ebook_holds', "hidden");
147         dojo.removeClass('ebook_holds_main', "hidden");
148     }
149 }
150
151 function updateHoldReadyView() {
152     var holds = xacts.holds_ready;
153     if (holds.length < 1) {
154         dojo.removeClass('no_ebook_holds', "hidden");
155     } else {
156         dojo.forEach(holds, function(h) {
157             dojo.empty('ebook_holds_main_table_body');
158             var tr = dojo.create("tr", null, dojo.byId('ebook_holds_main_table_body'));
159             dojo.create("td", { innerHTML: h.title }, tr);
160             dojo.create("td", { innerHTML: h.author }, tr);
161             dojo.create("td", { innerHTML: h.expire_date }, tr);
162             dojo.create("td", null, tr); // TODO actions
163         });
164         dojo.addClass('no_ebook_holds', "hidden");
165         dojo.removeClass('ebook_holds_main', "hidden");
166     }
167 }
168
169 // deserialize transactions from cache, returning them as a JS object
170 function getCachedTransactions() {
171     console.log('retrieving cached transaction details');
172     var cache_obj;
173     var current_cache = dojo.cookie('ebook_xact_cache');
174     if (current_cache) {
175         cache_obj = JSON.parse(current_cache);
176         xacts.checkouts = cache_obj.checkouts;
177         xacts.holds_pending = cache_obj.holds_pending;
178         xacts.holds_ready = cache_obj.holds_ready;
179     }
180     return cache_obj;
181 }
182
183 // add a single vendor's transactions to transaction cache
184 function addTransactionsToCache(rel) {
185     console.log('updating transaction cache');
186     var v = rel.vendor;
187     var updated_xacts = {
188         checkouts: [],
189         holds_pending: [],
190         holds_ready: []
191     };
192     // preserve any transactions with other vendors
193     dojo.forEach(xacts.checkouts, function(xact) {
194         if (xact.vendor !== v)
195             updated_xacts.checkouts.push(xact);
196     });
197     dojo.forEach(xacts.holds_pending, function(xact) {
198         if (xact.vendor !== v)
199             updated_xacts.holds_pending.push(xact);
200     });
201     dojo.forEach(xacts.holds_ready, function(xact) {
202         if (xact.vendor !== v)
203             updated_xacts.holds_ready.push(xact);
204     });
205     // add transactions from current vendor
206     dojo.forEach(rel.checkouts, function(xact) {
207         updated_xacts.checkouts.push(xact);
208     });
209     dojo.forEach(rel.holds_pending, function(xact) {
210         updated_xacts.holds_pending.push(xact);
211     });
212     dojo.forEach(rel.holds_ready, function(xact) {
213         updated_xacts.holds_ready.push(xact);
214     });
215     // TODO sort transactions by date
216     // save transactions to cache
217     xacts = updated_xacts;
218     var new_cache = JSON.stringify(xacts);
219     dojo.cookie('ebook_xact_cache', new_cache, {path: '/'});
220     // update current page
221     addTotalsToPage();
222     addTransactionsToPage();
223 }
224