]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/ui/default/opac/record_selectors.js
6116b39a41dcd2ce9c7e9143a42e27c3e2491401
[Evergreen.git] / Open-ILS / web / js / ui / default / opac / record_selectors.js
1 ;(function () {
2
3     var rec_selector_block = document.getElementById("record_selector_block");
4     var rec_selectors = document.getElementsByClassName("result_record_selector");
5     var mylist_action_links = document.getElementsByClassName("mylist_action");
6     var record_basket_count_el = document.getElementById('record_basket_count');
7     var selected_records_count_el = document.getElementById('selected_records_count');
8     var select_all_records_el = document.getElementById('select_all_records');
9     var clear_basket_el = document.getElementById('clear_basket');
10     var select_action_el = document.getElementById('select_basket_action');
11     var do_basket_action_el = document.getElementById('do_basket_action');
12     var mylist = [];
13
14     function initialize() {
15         var req = new window.XMLHttpRequest();
16         req.open('GET', '/eg/opac/api/mylist/retrieve');
17         if (('responseType' in req) && (req.responseType = 'json')) {
18             req.onload = function (evt) {
19                 var result = req.response;
20                 handleUpdate(result);
21                 syncPageState();
22             }
23         } else {
24             // IE 10/11
25             req.onload = function (evt) {
26                 var result = JSON.parse(req.responseText);
27                 handleUpdate(result);
28                 syncPageState();
29             }
30         }
31         req.send();
32     }
33     initialize();
34
35     function syncPageState() {
36         var all_checked = true;
37         var legacy_adjusted = false;
38         [].forEach.call(rec_selectors, function(el) {
39             el.checked = mylist.includes(parseInt(el.value));
40             if (el.checked) {
41                 adjustLegacyControlsVis('checked', el.value);
42             } else {
43                 all_checked = false;
44                 adjustLegacyControlsVis('unchecked', el.value);
45             }
46             toggleRowHighlighting(el);
47             legacy_adjusted = true;
48         });
49         if (!legacy_adjusted) {
50             [].forEach.call(mylist_action_links, function(el) {
51                 if ('dataset' in el) {
52                     if (el.dataset.action == 'delete') return;
53                     // only need to do this once
54                     var op = mylist.includes(parseInt(el.dataset.recid)) ? 'checked' : 'unchecked';
55                     adjustLegacyControlsVis(op, el.dataset.recid);
56                 }
57             });
58         }
59         if (select_all_records_el && rec_selectors.length) {
60             select_all_records_el.checked = all_checked;
61         }
62         checkMaxCartSize();
63     }
64
65     function handleUpdate(result) {
66         if (result) {
67             mylist = result.mylist;
68             if (selected_records_count_el) {
69                 selected_records_count_el.innerHTML = mylist.length;
70             }
71             if (clear_basket_el) {
72                 if (mylist.length > 0) {
73                     clear_basket_el.classList.remove('hidden');
74                 } else {
75                     clear_basket_el.classList.add('hidden');
76                 }
77             }
78             if (select_action_el) {
79                 if (mylist.length > 0) {
80                     select_action_el.removeAttribute('disabled');
81                 } else {
82                     select_action_el.setAttribute('disabled', 'disabled');
83                 }
84             }
85             if (do_basket_action_el) {
86                 if (mylist.length > 0) {
87                     do_basket_action_el.removeAttribute('disabled');
88                 } else {
89                     do_basket_action_el.setAttribute('disabled', 'disabled');
90                 }
91             }
92             if (record_basket_count_el) {
93                 record_basket_count_el.innerHTML = mylist.length;
94             }
95             checkMaxCartSize();
96         }
97     }
98
99     function mungeList(op, rec, resync) {
100         console.debug('calling mungeList to ' + op + ' record ' + rec);
101         var req = new window.XMLHttpRequest();
102         if (Array.isArray(rec)) {
103             var qrec = rec.map(function(rec) {
104                          return 'record=' + encodeURIComponent(rec);
105                        }).join('&');
106         } else {
107             var qrec = 'record=' + encodeURIComponent(rec);
108         }
109         req.open('GET', '/eg/opac/api/mylist/' + op + '?' + qrec);
110         if (('responseType' in req) && (req.responseType = 'json')) {
111             req.onload = function (evt) {
112                 var result = req.response;
113                 handleUpdate(result);
114                 if (resync) syncPageState();
115             }
116         } else {
117             // IE 10/11
118             req.onload = function (evt) {
119                 var result = JSON.parse(req.responseText);
120                 handleUpdate(result);
121                 if (resync) syncPageState();
122             }
123         }
124         req.send();
125     }
126
127     function adjustLegacyControlsVis(op, rec) {
128         if (op == 'add' || op == 'checked') {
129             var t;
130             if (t = document.getElementById('mylist_add_' + rec)) t.classList.add('hidden');
131             if (t = document.getElementById('mylist_delete_' + rec)) t.classList.remove('hidden');
132         } else if (op == 'delete' || op == 'unchecked') {
133             if (t = document.getElementById('mylist_add_' + rec)) t.classList.remove('hidden');
134             if (t = document.getElementById('mylist_delete_' + rec)) t.classList.add('hidden');
135         }
136     }
137
138     function findAncestorWithClass(el, cls) {
139         while ((el = el.parentElement) && !el.classList.contains(cls));
140         return el;
141     }
142     function toggleRowHighlighting(el) {
143         var row = findAncestorWithClass(el, "result_table_row");
144         if (!row) return;
145         if (el.checked) {
146             row.classList.add('result_table_row_selected');
147         } else {
148             row.classList.remove('result_table_row_selected');
149         }
150     }
151
152     function checkMaxCartSize() {
153         if ((typeof max_cart_size === 'undefined') || !max_cart_size) return;
154         var alertel = document.getElementById('hit_selected_record_limit');
155         [].forEach.call(rec_selectors, function(el) {
156             if (!el.checked) el.disabled = (mylist.length >= max_cart_size);
157         });
158         [].forEach.call(mylist_action_links, function(el) {
159             if ('dataset' in el && el.dataset.action == 'add') {
160                 if (mylist.length >= max_cart_size) {
161                     // hide the add link
162                     el.classList.add('hidden');
163                 } else {
164                     // show the add link unless the record is
165                     // already in the cart
166                     if (!mylist.includes(parseInt(el.dataset.recid))) el.classList.remove('hidden');
167                 }
168             }
169         });
170         if (mylist.length >= max_cart_size) {
171             if (alertel) alertel.classList.remove('hidden');
172             if (select_all_records_el && !select_all_records_el.checked) {
173                 select_all_records_el.disabled = true;
174             }
175         } else {
176             if (alertel) alertel.classList.add('hidden');
177             if (select_all_records_el) select_all_records_el.disabled = false;
178         }
179     }
180
181     var all_checked = true;
182     [].forEach.call(rec_selectors, function(el) {
183         el.addEventListener("click", function() {
184             if (this.checked) {
185                 mungeList('add', this.value);
186                 adjustLegacyControlsVis('add', this.value);
187             } else {
188                 mungeList('delete', this.value);
189                 adjustLegacyControlsVis('delete', this.value);
190             }
191             toggleRowHighlighting(el);
192         }, false);
193         el.classList.remove("hidden");
194         if (!el.checked) all_checked = false;
195     });
196     if (select_all_records_el && rec_selectors.length) {
197         select_all_records_el.checked = all_checked;
198     }
199     if (rec_selector_block) rec_selector_block.classList.remove("hidden");
200
201     function deselectSelectedOnPage() {
202         [].forEach.call(rec_selectors, function(el) {
203             if (el.checked) {
204                 el.checked = false;
205                 adjustLegacyControlsVis('delete', el.value);
206                 toggleRowHighlighting(el);
207             }
208         });
209     }
210
211     if (select_all_records_el) {
212         select_all_records_el.addEventListener('click', function() {
213             if (this.checked) {
214                 // adding
215                 var to_add = [];
216                 [].forEach.call(rec_selectors, function(el) {
217                     if (!el.checked) {
218                         el.checked = true;
219                         adjustLegacyControlsVis('add', el.value);
220                         toggleRowHighlighting(el);
221                         to_add.push(el.value);
222                     }
223                 });
224                 if (to_add.length > 0) {
225                     mungeList('add', to_add);
226                 }
227             } else {
228                 // deleting
229                 deselectSelectedOnPage();
230             }
231         });
232     }
233
234     function clearCart() {
235         var req = new window.XMLHttpRequest();
236         req.open('GET', '/eg/opac/api/mylist/clear');
237         if (('responseType' in req) && (req.responseType = 'json')) {
238             req.onload = function (evt) {
239                 var result = req.response;
240                 handleUpdate(result);
241                 syncPageState();
242             }
243         } else {
244             // IE 10/11
245             req.onload = function (evt) {
246                 var result = JSON.parse(req.responseText);
247                 handleUpdate(result);
248                 syncPageState();
249             }
250         }
251         req.send();
252     }
253
254     if (clear_basket_el) {
255         clear_basket_el.addEventListener('click', function() {
256             if (confirm(window.egStrings['CONFIRM_BASKET_EMPTY'])) {
257                 clearCart();
258             }
259         });
260     }
261
262     [].forEach.call(mylist_action_links, function(el) {
263         el.addEventListener("click", function(evt) {
264             var recid;
265             var action;
266             if ('dataset' in el) {
267                 recid = el.dataset.recid;
268                 action = el.dataset.action;
269                 mungeList(action, recid, true);
270                 evt.preventDefault();
271             }
272         });
273     });
274
275     if (do_basket_action_el) {
276         do_basket_action_el.addEventListener('click', function(evt) {
277             if (select_action_el.options[select_action_el.selectedIndex].value) { 
278                 window.location.href = select_action_el.options[select_action_el.selectedIndex].value;
279             }
280             evt.preventDefault();
281         });
282     }
283
284 })();