]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/opac/ebook_api/loggedin.js
LP#1541559: ebook API integration for TPAC
[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             var dl_link = '<a href="' + x.download_url + '">' + l_strings.download + '</a>';
106             var tr = dojo.create("tr", null, dojo.byId('ebook_circs_main_table_body'));
107             dojo.create("td", { innerHTML: x.title }, tr);
108             dojo.create("td", { innerHTML: x.author }, tr);
109             dojo.create("td", { innerHTML: x.due_date }, tr);
110             dojo.create("td", { innerHTML: dl_link}, tr);
111             // TODO: more actions (renew, checkin)
112         });
113         dojo.addClass('no_ebook_circs', "hidden");
114         dojo.removeClass('ebook_circs_main', "hidden");
115     }
116 }
117
118 function updateHoldView() {
119     var holds_pending = xacts.holds_pending;
120     var holds_ready = xacts.holds_ready;
121
122     // combine all holds into a single list, ready-for-checkout holds first
123     var holds = holds_ready.concat(holds_pending);
124
125     if (holds.length < 1) {
126         dojo.removeClass('no_ebook_holds', "hidden");
127     } else {
128         dojo.forEach(holds, function(h) {
129             var hold_status;
130             if (h.is_ready) {
131                 hold_status = l_strings.ready_for_checkout;
132             } else if (h.is_frozen) {
133                 hold_status = l_strings.suspended;
134             } else {
135                 hold_status = h.queue_position + ' / ' + h.queue_size;
136             }
137             var tr = dojo.create("tr", null, dojo.byId('ebook_holds_main_table_body'));
138             dojo.create("td", { innerHTML: h.title }, tr);
139             dojo.create("td", { innerHTML: h.author }, tr);
140             dojo.create("td", { innerHTML: h.expire_date }, tr);
141             dojo.create("td", { innerHTML: hold_status }, tr);
142             dojo.create("td", null, tr); // TODO actions
143         });
144         dojo.addClass('no_ebook_holds', "hidden");
145         dojo.removeClass('ebook_holds_main', "hidden");
146     }
147 }
148
149 function updateHoldReadyView() {
150     var holds = xacts.holds_ready;
151     if (holds.length < 1) {
152         dojo.removeClass('no_ebook_holds', "hidden");
153     } else {
154         dojo.forEach(holds, function(h) {
155             var tr = dojo.create("tr", null, dojo.byId('ebook_holds_main_table_body'));
156             dojo.create("td", { innerHTML: h.title }, tr);
157             dojo.create("td", { innerHTML: h.author }, tr);
158             dojo.create("td", { innerHTML: h.expire_date }, tr);
159             dojo.create("td", null, tr); // TODO actions
160         });
161         dojo.addClass('no_ebook_holds', "hidden");
162         dojo.removeClass('ebook_holds_main', "hidden");
163     }
164 }
165
166 // deserialize transactions from cache, returning them as a JS object
167 function getCachedTransactions() {
168     console.log('retrieving cached transaction details');
169     var cache_obj;
170     var current_cache = dojo.cookie('ebook_xact_cache');
171     if (current_cache) {
172         cache_obj = JSON.parse(current_cache);
173         xacts.checkouts = cache_obj.checkouts;
174         xacts.holds_pending = cache_obj.holds_pending;
175         xacts.holds_ready = cache_obj.holds_ready;
176     }
177     return cache_obj;
178 }
179
180 // add a single vendor's transactions to transaction cache
181 function addTransactionsToCache(rel) {
182     console.log('updating transaction cache');
183     var v = rel.vendor;
184     var updated_xacts = {
185         checkouts: [],
186         holds_pending: [],
187         holds_ready: []
188     };
189     // preserve any transactions with other vendors
190     dojo.forEach(xacts.checkouts, function(xact) {
191         if (xact.vendor !== v)
192             updated_xacts.checkouts.push(xact);
193     });
194     dojo.forEach(xacts.holds_pending, function(xact) {
195         if (xact.vendor !== v)
196             updated_xacts.holds_pending.push(xact);
197     });
198     dojo.forEach(xacts.holds_ready, function(xact) {
199         if (xact.vendor !== v)
200             updated_xacts.holds_ready.push(xact);
201     });
202     // add transactions from current vendor
203     dojo.forEach(rel.checkouts, function(xact) {
204         updated_xacts.checkouts.push(xact);
205     });
206     dojo.forEach(rel.holds_pending, function(xact) {
207         updated_xacts.holds_pending.push(xact);
208     });
209     dojo.forEach(rel.holds_ready, function(xact) {
210         updated_xacts.holds_ready.push(xact);
211     });
212     // TODO sort transactions by date
213     // save transactions to cache
214     xacts = updated_xacts;
215     var new_cache = JSON.stringify(xacts);
216     dojo.cookie('ebook_xact_cache', new_cache, {path: '/'});
217     // update current page
218     addTotalsToPage();
219     addTransactionsToPage();
220 }
221