@internetarchive/ia-book-actions 0.0.5-0 → 0.0.5-4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/demo/index.html CHANGED
@@ -83,12 +83,7 @@
83
83
  import '../src/ia-book-actions.js';
84
84
  import {
85
85
  defaultLendingStatus,
86
- canBrowse,
87
- browsed,
88
86
  canBrowseAndBorrow,
89
- browsedAndBorrow,
90
- canBrowseAndBorrowod,
91
- canBrowseAndJoinWaitlistForBorrow,
92
87
  } from '../src/assets/data/lending-get-status-service.js';
93
88
 
94
89
  const userid = '@neeraj-archive';
@@ -100,62 +95,64 @@
100
95
  // set defaultLendingStatus for unavailable (without borrowables) book
101
96
  iaBookActions.userid = '';
102
97
  iaBookActions.identifier = identifier;
103
- iaBookActions.lendingStatus = canBrowseAndBorrow;
104
- iaBookActions.bwbPurchaseUrl = 'sdf';
98
+ iaBookActions.lendingStatus = defaultLendingStatus;
99
+ iaBookActions.bwbPurchaseUrl = '';
100
+
101
+ let lendingStatus1 = iaBookActions.lendingStatus;
105
102
 
106
103
  document.querySelectorAll('.userState input[type=checkbox]').forEach((item) => {
107
104
  item.addEventListener('click', (e) => {
108
- let lendingStatus1 = defaultLendingStatus;
109
105
  if (e.target.checked) {
110
106
  if (e.target.value === 'isAdmin') lendingStatus1.isAdmin = true;
111
107
  if (e.target.value === 'isLoggedIn') iaBookActions.userid = '@neeraj';
112
- }
113
- if (e.target.checked === false) {
108
+ } else {
114
109
  if (e.target.value === 'isAdmin') lendingStatus1.isAdmin = false;
115
110
  if (e.target.value === 'isLoggedIn') iaBookActions.userid = '';
116
111
  }
117
- iaBookActions.lendingStatus = lendingStatus1;
112
+ let lending = {...defaultLendingStatus, ...lendingStatus1};
113
+ iaBookActions.lendingStatus = lending;
118
114
  });
119
115
  });
120
116
 
121
-
122
117
  document.querySelectorAll('.printDisabled input[type=checkbox]').forEach((item) => {
123
- const is_printdisabled = false;
124
- const user_is_printdisabled = false;
125
118
  item.addEventListener('click', (e) => {
126
- let lendingStatus1 = defaultLendingStatus;
127
- if (e.target.value === 'is_printdisabled') {
128
- lendingStatus1.is_printdisabled = true;
129
- }
130
- if (e.target.value === 'user_is_printdisabled') {
131
- lendingStatus1.user_is_printdisabled = true;
119
+ if (e.target.checked) {
120
+ if (e.target.value === 'is_printdisabled') lendingStatus1.is_printdisabled = true;
121
+ if (e.target.value === 'user_is_printdisabled') lendingStatus1.user_is_printdisabled = true;
122
+ } else {
123
+ if (e.target.value === 'is_printdisabled') lendingStatus1.is_printdisabled = false;
124
+ if (e.target.value === 'user_is_printdisabled') lendingStatus1.user_is_printdisabled = false;
132
125
  }
133
126
 
134
- if (lendingStatus1.user_is_printdisabled && lendingStatus1.is_printdisabled) {
135
- iaBookActions.lendingStatus = lendingStatus1;
136
- }
127
+ let lending = {...defaultLendingStatus, ...lendingStatus1};
128
+ iaBookActions.lendingStatus = lending;
137
129
  });
138
130
  });
139
131
 
140
132
  document.querySelectorAll('.availableToBrowse input[type=radio]').forEach((item) => {
141
133
  item.addEventListener('click', (e) => {
142
- let lendingStatus1 = defaultLendingStatus;
143
-
144
134
  if (e.target.value === 'user_has_browsed') {
145
135
  lendingStatus1.user_has_browsed = true;
146
136
  lendingStatus1.available_to_browse = false;
137
+ lendingStatus1.secondsLeftOnLoan = 10;
138
+ lendingStatus1.browsingExpired = false;
139
+ } else if(e.target.value === 'browsingExpired') {
140
+ lendingStatus1.user_has_browsed = true;
141
+ lendingStatus1.available_to_browse = false;
142
+ lendingStatus1.secondsLeftOnLoan = 0;
143
+ lendingStatus1.browsingExpired = true;
147
144
  } else if (e.target.value === 'available_to_browse') {
148
145
  lendingStatus1.available_to_browse = true;
149
146
  lendingStatus1.user_has_browsed = false;
150
147
  }
151
- iaBookActions.lendingStatus = lendingStatus1;
148
+
149
+ let lending = {...defaultLendingStatus, ...lendingStatus1};
150
+ iaBookActions.lendingStatus = lending;
152
151
  });
153
152
  });
154
153
 
155
154
  document.querySelectorAll('.availableToBorrow input[type=radio]').forEach((item) => {
156
155
  item.addEventListener('click', (e) => {
157
- let lendingStatus1 = defaultLendingStatus;
158
-
159
156
  if (e.target.value === 'available_to_borrow') {
160
157
  lendingStatus1.available_to_borrow = true;
161
158
  lendingStatus1.user_on_waitlist = false;
@@ -178,7 +175,8 @@
178
175
  lendingStatus1.user_has_borrowed = true;
179
176
  }
180
177
 
181
- iaBookActions.lendingStatus = lendingStatus1;
178
+ let lending = {...defaultLendingStatus, ...lendingStatus1};
179
+ iaBookActions.lendingStatus = lending;
182
180
  });
183
181
  });
184
182
 
@@ -210,6 +208,7 @@
210
208
  <td class="availableToBrowse">
211
209
  <label><input type="radio" name="browse" value="available_to_browse" />available_to_browse</label>
212
210
  <label><input type="radio" name="browse" value="user_has_browsed" />user_has_browsed</label>
211
+ <label><input type="radio" name="browse" value="browsingExpired" />browsingExpired</label>
213
212
  </td>
214
213
  <td class="availableToBorrow">
215
214
  <label><input type="radio" name="borrow" value="available_to_borrow" />available_to_borrow</label>
@@ -218,7 +217,7 @@
218
217
  <label><input type="radio" name="borrow" value="user_has_borrowed" />user_has_borrowed</label>
219
218
  </td>
220
219
  <td class="purchase">
221
- <label><input type="checkbox" name="purchase" value="purchase" />purchase (Click to reflect selection)</label>
220
+ <label><input type="checkbox" name="purchase" value="purchase" />purchase</label>
222
221
  </td>
223
222
 
224
223
  <td class="reflect">
@@ -229,30 +228,6 @@
229
228
  </td>
230
229
  </tr>
231
230
  </table>
232
-
233
- <table class="mode" style="display: none;">
234
- <tr>
235
- <td>
236
- <label><input type="radio" name="contact" value="canBrowse" />CanBrowse</label>
237
- </td>
238
- <td>
239
- <label><input type="radio" name="contact" value="browsed" />browsed</label>
240
- </td>
241
- <td>
242
- <label><input type="radio" name="contact" value="canBrowseAndBorrow" />canBrowseAndBorrow</label>
243
- </td>
244
- <td>
245
- <label><input type="radio" name="contact" value="browsedAndBorrow" />browsedAndBorrow</label>
246
- </td>
247
- <td>
248
- <label><input type="radio" name="contact" value="canBrowseAndBorrowod" />canBrowseAndBorrowod</label>
249
- </td>
250
- <td>
251
- <label><input type="radio" name="contact"
252
- id="canBrowseAndJoinWaitlistForBorrow" value="canBrowseAndJoinWaitlistForBorrow" />canBrowseAndJoinWaitlistForBorrow</label>
253
- </td>
254
- </tr>
255
- </table>
256
231
  </fieldset>
257
232
  </div>
258
233
  </body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@internetarchive/ia-book-actions",
3
- "version": "0.0.5-0",
3
+ "version": "0.0.5-4",
4
4
  "description": "Bookreader actions for borrowable book",
5
5
  "author": "Internet Archive",
6
6
  "license": "AGPL-3.0-only",
@@ -34,6 +34,7 @@ export const defaultLendingStatus = {
34
34
  users_on_waitlist: 0,
35
35
  // userid: "",
36
36
  bookUrl: '/details/practicalorganic00plim',
37
+ browsingExpired: false,
37
38
  daysLeftOnLoan: 0,
38
39
  isAdmin: false,
39
40
  isArchiveOrgLending: true,
@@ -47,7 +48,7 @@ export const defaultLendingStatus = {
47
48
  loanRecord: [],
48
49
  loansUrl: '/details/@neeraj-archive?tab=loans#loans-on-loan',
49
50
  maxLoans: 10,
50
- secondsLeftOnLoan: 0,
51
+ secondsLeftOnLoan: 10,
51
52
  shouldProtectImages: true,
52
53
  totalWaitlistCount: 0,
53
54
  userHasBorrowed: false,
@@ -58,139 +59,6 @@ export const defaultLendingStatus = {
58
59
  userWaitlistPosition: -1,
59
60
  userid: '@neeraj-archive',
60
61
  };
61
-
62
- export const canBrowse = {
63
- active_borrows: 0,
64
- active_browses: 0,
65
- available_borrowable_copies: 0,
66
- available_browsable_copies: 1,
67
- available_lendable_copies: 1,
68
- available_to_borrow: false,
69
- available_to_browse: true,
70
- available_to_waitlist: false,
71
- copies_reserved_for_waitlist: 0,
72
- is_lendable: true,
73
- is_login_required: false,
74
- is_printdisabled: true,
75
- is_readable: false,
76
- last_borrow: null,
77
- last_browse: null,
78
- last_waitlist: null,
79
- max_borrowable_copies: 0,
80
- max_browsable_copies: 1,
81
- max_lendable_copies: 1,
82
- next_borrow_expiration: null,
83
- next_browse_expiration: null,
84
- orphaned_acs_loans: 0,
85
- upgradable_browses: 0,
86
- user_at_max_loans: false,
87
- user_can_claim_waitlist: false,
88
- user_has_acs_borrowed: false,
89
- user_has_borrowed: false,
90
- user_has_browsed: false,
91
- user_is_printdisabled: false,
92
- user_loan_count: 0,
93
- user_loan_record: [],
94
- user_on_waitlist: false,
95
- users_on_waitlist: 0,
96
- // userid: "",
97
- bookUrl: '/details/practicalorganic00plim',
98
- daysLeftOnLoan: 0,
99
- isAdmin: false,
100
- isArchiveOrgLending: true,
101
- isAvailable: false,
102
- isAvailableForBrowsing: true,
103
- isBrowserBorrowable: true,
104
- isLendingRequired: true,
105
- isOpenLibraryLending: false,
106
- isPrintDisabledOnly: false,
107
- loanCount: 0,
108
- loanRecord: [],
109
- loansUrl: '/details/@neeraj-archive?tab=loans#loans-on-loan',
110
- maxLoans: 10,
111
- secondsLeftOnLoan: 0,
112
- shouldProtectImages: true,
113
- totalWaitlistCount: 0,
114
- userHasBorrowed: false,
115
- userHasBrowsed: false,
116
- userHoldIsReady: false,
117
- userIsPrintDisabled: false,
118
- userOnWaitingList: false,
119
- userWaitlistPosition: -1,
120
- userid: '@neeraj-archive',
121
- };
122
-
123
- export const browsed = {
124
- active_borrows: 0,
125
- active_browses: 1,
126
- available_borrowable_copies: 0,
127
- available_browsable_copies: 0,
128
- available_lendable_copies: 0,
129
- available_to_borrow: false,
130
- available_to_browse: false,
131
- available_to_waitlist: false,
132
- copies_reserved_for_waitlist: 0,
133
- is_lendable: true,
134
- is_login_required: false,
135
- is_printdisabled: true,
136
- is_readable: false,
137
- last_borrow: null,
138
- last_browse: '2021-07-30 09:57:40',
139
- last_waitlist: null,
140
- max_borrowable_copies: 0,
141
- max_browsable_copies: 1,
142
- max_lendable_copies: 1,
143
- next_borrow_expiration: null,
144
- next_browse_expiration: '2021-07-30 10:57:40',
145
- orphaned_acs_loans: 0,
146
- upgradable_browses: 0,
147
- user_at_max_loans: false,
148
- user_can_claim_waitlist: false,
149
- user_has_acs_borrowed: false,
150
- user_has_borrowed: false,
151
- user_has_browsed: true,
152
- user_is_printdisabled: false,
153
- user_loan_count: 1,
154
- user_loan_record: {
155
- userid: '@neeraj-archive',
156
- listname: 'loan',
157
- identifier: 'practicalorganic00plim',
158
- },
159
- user_on_waitlist: false,
160
- users_on_waitlist: 0,
161
- // userid: "",
162
- bookUrl: '/details/practicalorganic00plim',
163
- daysLeftOnLoan: 0,
164
- isAdmin: false,
165
- isArchiveOrgLending: true,
166
- isAvailable: false,
167
- isAvailableForBrowsing: false,
168
- isBrowserBorrowable: true,
169
- isLendingRequired: true,
170
- isOpenLibraryLending: false,
171
- isPrintDisabledOnly: false,
172
- loanCount: 1,
173
- loanId: '1ca15f92d07dfdae3f7b1516084aec5d603800b8',
174
- loanRecord: {
175
- userid: '@neeraj-archive',
176
- listname: 'loan',
177
- identifier: 'practicalorganic00plim',
178
- },
179
- loanStartDate: '2021-07-30 09:57:40',
180
- loansUrl: '/details/@neeraj-archive?tab=loans#loans-on-loan',
181
- maxLoans: 10,
182
- secondsLeftOnLoan: 3591,
183
- shouldProtectImages: true,
184
- totalWaitlistCount: 0,
185
- userHasBorrowed: false,
186
- userHasBrowsed: true,
187
- userHoldIsReady: false,
188
- userIsPrintDisabled: false,
189
- userOnWaitingList: false,
190
- userWaitlistPosition: -1,
191
- userid: '@neeraj-archive',
192
- };
193
-
194
62
  export const canBrowseAndBorrow = {
195
63
  active_borrows: 0,
196
64
  active_browses: 1,
@@ -261,206 +129,3 @@ export const canBrowseAndBorrow = {
261
129
  userWaitlistPosition: -1,
262
130
  userid: '@neeraj-archive',
263
131
  };
264
-
265
- export const browsedAndBorrow = {
266
- active_borrows: 0,
267
- active_browses: 1,
268
- available_borrowable_copies: 0,
269
- available_browsable_copies: 0,
270
- available_lendable_copies: 0,
271
- available_to_borrow: true,
272
- available_to_browse: true,
273
- available_to_waitlist: false,
274
- copies_reserved_for_waitlist: 0,
275
- is_lendable: true,
276
- is_login_required: false,
277
- is_printdisabled: true,
278
- is_readable: false,
279
- last_borrow: null,
280
- last_browse: '2021-07-30 09:57:40',
281
- last_waitlist: null,
282
- max_borrowable_copies: 0,
283
- max_browsable_copies: 1,
284
- max_lendable_copies: 1,
285
- next_borrow_expiration: null,
286
- next_browse_expiration: '2021-07-30 10:57:40',
287
- orphaned_acs_loans: 0,
288
- upgradable_browses: 0,
289
- user_at_max_loans: false,
290
- user_can_claim_waitlist: false,
291
- user_has_acs_borrowed: false,
292
- user_has_borrowed: false,
293
- user_has_browsed: true,
294
- user_is_printdisabled: false,
295
- user_loan_count: 1,
296
- user_loan_record: {
297
- userid: '@neeraj-archive',
298
- listname: 'loan',
299
- identifier: 'practicalorganic00plim',
300
- },
301
- user_on_waitlist: false,
302
- users_on_waitlist: 0,
303
- // userid: "",
304
- bookUrl: '/details/practicalorganic00plim',
305
- daysLeftOnLoan: 0,
306
- isAdmin: false,
307
- isArchiveOrgLending: true,
308
- isAvailable: false,
309
- isAvailableForBrowsing: false,
310
- isBrowserBorrowable: true,
311
- isLendingRequired: true,
312
- isOpenLibraryLending: false,
313
- isPrintDisabledOnly: false,
314
- loanCount: 1,
315
- loanId: '1ca15f92d07dfdae3f7b1516084aec5d603800b8',
316
- loanRecord: {
317
- userid: '@neeraj-archive',
318
- listname: 'loan',
319
- identifier: 'practicalorganic00plim',
320
- },
321
- loanStartDate: '2021-07-30 09:57:40',
322
- loansUrl: '/details/@neeraj-archive?tab=loans#loans-on-loan',
323
- maxLoans: 10,
324
- secondsLeftOnLoan: 3591,
325
- shouldProtectImages: true,
326
- totalWaitlistCount: 0,
327
- userHasBorrowed: false,
328
- userHasBrowsed: true,
329
- userHoldIsReady: false,
330
- userIsPrintDisabled: false,
331
- userOnWaitingList: false,
332
- userWaitlistPosition: -1,
333
- userid: '@neeraj-archive',
334
- };
335
-
336
- export const canBrowseAndBorrowod = {
337
- active_borrows: 0,
338
- active_browses: 1,
339
- available_borrowable_copies: 0,
340
- available_browsable_copies: 0,
341
- available_lendable_copies: 0,
342
- available_to_borrow: true,
343
- available_to_browse: true,
344
- available_to_waitlist: false,
345
- copies_reserved_for_waitlist: 0,
346
- is_lendable: true,
347
- is_login_required: false,
348
- is_printdisabled: true,
349
- is_readable: false,
350
- last_borrow: null,
351
- last_browse: '2021-07-30 09:57:40',
352
- last_waitlist: null,
353
- max_borrowable_copies: 0,
354
- max_browsable_copies: 1,
355
- max_lendable_copies: 1,
356
- next_borrow_expiration: null,
357
- next_browse_expiration: '2021-07-30 10:57:40',
358
- orphaned_acs_loans: 0,
359
- upgradable_browses: 0,
360
- user_at_max_loans: false,
361
- user_can_claim_waitlist: false,
362
- user_has_acs_borrowed: false,
363
- user_has_borrowed: true,
364
- user_has_browsed: false,
365
- user_is_printdisabled: false,
366
- user_loan_count: 1,
367
- user_loan_record: {
368
- userid: '@neeraj-archive',
369
- listname: 'loan',
370
- identifier: 'practicalorganic00plim',
371
- },
372
- user_on_waitlist: false,
373
- users_on_waitlist: 0,
374
- // userid: "",
375
- bookUrl: '/details/practicalorganic00plim',
376
- daysLeftOnLoan: 0,
377
- isAdmin: false,
378
- isArchiveOrgLending: true,
379
- isAvailable: false,
380
- isAvailableForBrowsing: false,
381
- isBrowserBorrowable: true,
382
- isLendingRequired: true,
383
- isOpenLibraryLending: false,
384
- isPrintDisabledOnly: false,
385
- loanCount: 1,
386
- loanId: '1ca15f92d07dfdae3f7b1516084aec5d603800b8',
387
- loanRecord: {
388
- userid: '@neeraj-archive',
389
- listname: 'loan',
390
- identifier: 'practicalorganic00plim',
391
- },
392
- loanStartDate: '2021-07-30 09:57:40',
393
- loansUrl: '/details/@neeraj-archive?tab=loans#loans-on-loan',
394
- maxLoans: 10,
395
- secondsLeftOnLoan: 3591,
396
- shouldProtectImages: true,
397
- totalWaitlistCount: 0,
398
- userHasBorrowed: false,
399
- userHasBrowsed: true,
400
- userHoldIsReady: false,
401
- userIsPrintDisabled: false,
402
- userOnWaitingList: false,
403
- userWaitlistPosition: -1,
404
- userid: '@neeraj-archive',
405
- };
406
-
407
- export const canBrowseAndJoinWaitlistForBorrow = {
408
- active_borrows: 1,
409
- active_browses: 0,
410
- available_borrowable_copies: 0,
411
- available_browsable_copies: 1,
412
- available_lendable_copies: 1,
413
- available_to_borrow: false,
414
- available_to_browse: true,
415
- available_to_waitlist: true,
416
- copies_reserved_for_waitlist: 0,
417
- is_lendable: true,
418
- is_login_required: false,
419
- is_printdisabled: true,
420
- is_readable: false,
421
- last_borrow: '2021-07-24 18:17:46',
422
- last_browse: null,
423
- last_waitlist: '2021-07-27 11:03:23',
424
- max_borrowable_copies: 1,
425
- max_browsable_copies: 2,
426
- max_lendable_copies: 2,
427
- next_borrow_expiration: '2021-08-02 18:29:41',
428
- next_browse_expiration: null,
429
- orphaned_acs_loans: 0,
430
- upgradable_browses: 0,
431
- user_at_max_loans: false,
432
- user_can_claim_waitlist: false,
433
- user_has_acs_borrowed: false,
434
- user_has_borrowed: false,
435
- user_has_browsed: false,
436
- user_is_printdisabled: false,
437
- user_loan_count: 0,
438
- user_loan_record: [],
439
- user_on_waitlist: false,
440
- users_on_waitlist: 2,
441
- // userid: "",
442
- bookUrl: '/details/worldletitutio0000vish',
443
- daysLeftOnLoan: 0,
444
- isAdmin: false,
445
- isArchiveOrgLending: true,
446
- isAvailable: false,
447
- isAvailableForBrowsing: true,
448
- isBrowserBorrowable: true,
449
- isLendingRequired: true,
450
- isOpenLibraryLending: false,
451
- isPrintDisabledOnly: false,
452
- loanCount: 0,
453
- loanRecord: [],
454
- loansUrl: '/details/@neeraj-archive?tab=loans#loans-on-loan',
455
- maxLoans: 10,
456
- secondsLeftOnLoan: 0,
457
- shouldProtectImages: true,
458
- totalWaitlistCount: 2,
459
- userHasBorrowed: false,
460
- userHasBrowsed: false,
461
- userHoldIsReady: false,
462
- userIsPrintDisabled: false,
463
- userOnWaitingList: false,
464
- userWaitlistPosition: -1,
465
- userid: '@neeraj-archive',
466
- };
@@ -6,9 +6,8 @@ export const analyticsCategories = {
6
6
  browse: 'BookReader-ReadingBrowse',
7
7
  preview: 'BookReader-Preview',
8
8
  satisfactionMetric: 'DetailsPage-Book',
9
- purchase: 'BookReaderHeader',
10
- unavailable: 'BookReader-Preview',
11
- admin: 'Admin',
9
+ bookReaderHeader: 'BookReader-Header',
10
+ adminAccess: 'Admin-Access',
12
11
  };
13
12
 
14
13
  export const analyticsActions = {
@@ -21,4 +20,5 @@ export const analyticsActions = {
21
20
  login: 'LogIn',
22
21
  purchase: 'BWBPurchase',
23
22
  unavailable: 'Book-Unavailable',
23
+ printDisability: 'Print-Disability',
24
24
  };
@@ -33,7 +33,7 @@ export default class ActionsConfig {
33
33
  this.analyticsActions = analyticsActions;
34
34
  }
35
35
 
36
- browseBookConfig() {
36
+ firstBrowseConfig() {
37
37
  return {
38
38
  id: 'browseBook',
39
39
  text: 'Borrow for 1 hour',
@@ -45,10 +45,22 @@ export default class ActionsConfig {
45
45
  };
46
46
  }
47
47
 
48
+ browseAgainConfig() {
49
+ return {
50
+ id: 'browseBookAgain',
51
+ text: 'Borrow again',
52
+ className: 'primary',
53
+ analyticsEvent: {
54
+ category: this.analyticsCategories.browse,
55
+ action: this.analyticsActions.browseAgain,
56
+ },
57
+ };
58
+ }
59
+
48
60
  returnBookConfig() {
49
61
  const eventCategory = this.lendingStatus.user_has_browsed
50
- ? 'browse'
51
- : 'borrow';
62
+ ? this.analyticsCategories.browse
63
+ : this.analyticsCategories.borrow;
52
64
 
53
65
  return {
54
66
  id: 'returnNow',
@@ -77,7 +89,7 @@ export default class ActionsConfig {
77
89
  analyticsEvent: {
78
90
  category: this.lendingStatus.user_has_browsed
79
91
  ? this.analyticsCategories.browse
80
- : this.analyticsCategories.borrow,
92
+ : this.analyticsCategories.preview,
81
93
  action: this.analyticsActions.borrow,
82
94
  },
83
95
  };
@@ -161,7 +173,7 @@ export default class ActionsConfig {
161
173
  target: '_blank',
162
174
  className: 'purchase dark',
163
175
  analyticsEvent: {
164
- category: this.analyticsCategories.purchase,
176
+ category: this.analyticsCategories.bookReaderHeader,
165
177
  action: this.analyticsActions.purchase,
166
178
  },
167
179
  };
@@ -179,8 +191,8 @@ export default class ActionsConfig {
179
191
  target: '_self',
180
192
  className: 'print-disability',
181
193
  analyticsEvent: {
182
- category: this.analyticsCategories.purchase,
183
- action: this.analyticsActions.purchase,
194
+ category: this.analyticsCategories.bookReaderHeader,
195
+ action: this.analyticsActions.printDisability,
184
196
  },
185
197
  };
186
198
  }
@@ -198,7 +210,7 @@ export default class ActionsConfig {
198
210
  target: '_self',
199
211
  className: 'danger',
200
212
  analyticsEvent: {
201
- category: this.analyticsCategories.admin,
213
+ category: this.analyticsCategories.adminAccess,
202
214
  action: this.analyticsActions.borrow,
203
215
  },
204
216
  };
@@ -216,7 +228,7 @@ export default class ActionsConfig {
216
228
  target: '_self',
217
229
  className: 'ia-button',
218
230
  analyticsEvent: {
219
- category: this.analyticsCategories.admin,
231
+ category: this.analyticsCategories.adminAccess,
220
232
  action: this.analyticsActions.doneBorrowing,
221
233
  },
222
234
  };
@@ -229,7 +241,7 @@ export default class ActionsConfig {
229
241
  className: 'primary unavailable',
230
242
  disabled: true,
231
243
  analyticsEvent: {
232
- category: this.analyticsCategories.unavailable,
244
+ category: this.analyticsCategories.preview,
233
245
  action: this.analyticsActions.unavailable,
234
246
  },
235
247
  };
@@ -17,7 +17,7 @@ export default class ActionsHandler extends LitElement {
17
17
  constructor(identifier) {
18
18
  super();
19
19
  this.identifier = identifier;
20
- this.ajaxTimeout = 5000;
20
+ this.ajaxTimeout = 6000;
21
21
  this.bindEvents();
22
22
  }
23
23
 
@@ -104,7 +104,7 @@ export default class GetLendingActions {
104
104
  const leaveWaitlist = this.actionsConfig.leaveWaitlistConfig();
105
105
  const borrowBook = this.actionsConfig.borrowBookConfig();
106
106
  const browseBook = lendingStatus.available_to_browse
107
- ? this.actionsConfig.browseBookConfig()
107
+ ? this.actionsConfig.firstBrowseConfig()
108
108
  : null;
109
109
 
110
110
  const dropdownOptions = browseBook ? [browseBook, borrowBook] : [];
@@ -150,7 +150,7 @@ export default class GetLendingActions {
150
150
  primaryTitle: 'You are on the waitlist for this book.',
151
151
  primaryActions: [
152
152
  this.actionsConfig.leaveWaitlistConfig(),
153
- this.actionsConfig.browseBookConfig(),
153
+ this.actionsConfig.firstBrowseConfig(),
154
154
  ],
155
155
  primaryColor: 'primary',
156
156
  secondaryActions: [
@@ -160,10 +160,18 @@ export default class GetLendingActions {
160
160
  };
161
161
  }
162
162
 
163
+ // check restricted item behaviour here /activemeasuresse0000ridt
163
164
  restrictedAction() {
164
- // check restricted item behaviour here /activemeasuresse0000ridt
165
+ const lendingStatus = this.lendingStatus || {};
166
+ const anotherPatronUsing =
167
+ lendingStatus.max_browsable_copies &&
168
+ !lendingStatus.available_lendable_copies;
169
+ const title = anotherPatronUsing
170
+ ? 'Another patron is using this book. Please check back later.'
171
+ : 'This book is not available at this time.';
172
+
165
173
  return {
166
- primaryTitle: 'This book is not available at this time.',
174
+ primaryTitle: title,
167
175
  primaryActions: [this.actionsConfig.unavailableBookConfig()],
168
176
  primaryColor: 'primary',
169
177
  secondaryActions: [
@@ -192,7 +200,9 @@ export default class GetLendingActions {
192
200
  borrow = this.actionsConfig.unavailableBookConfig();
193
201
  }
194
202
 
195
- const actions = [borrow, waitlist].filter(action => {
203
+ const printDisability = this.actionsConfig.printDisabilityConfig();
204
+
205
+ const actions = [borrow, waitlist, printDisability].filter(action => {
196
206
  return action !== null;
197
207
  });
198
208
 
@@ -255,25 +265,9 @@ export default class GetLendingActions {
255
265
  : possibleTitles.one_hour;
256
266
 
257
267
  // one hour borrow config
258
- const oneHrBorrowText = browsingHasExpired
259
- ? 'Borrow again'
260
- : 'Borrow for 1 hour';
261
- const browseAgainEvent = {
262
- category: this.analyticsCategories.browse,
263
- action: this.analyticsActions.browseAgain,
264
- };
265
- const firstBrowseEvent = {
266
- category: this.analyticsCategories.preview,
267
- action: this.analyticsActions.browse,
268
- };
269
- const oneHrBorrowEvent = browsingHasExpired
270
- ? browseAgainEvent
271
- : firstBrowseEvent;
272
-
273
- const oneHrBorrow = this.actionsConfig.browseBookConfig(
274
- oneHrBorrowText,
275
- oneHrBorrowEvent
276
- );
268
+ const oneHrBorrow = browsingHasExpired
269
+ ? this.actionsConfig.browseAgainConfig()
270
+ : this.actionsConfig.firstBrowseConfig();
277
271
 
278
272
  const borrow = this.actionsConfig.borrowBookConfig();
279
273
  const waitlist = this.actionsConfig.waitlistConfig();
@@ -308,10 +302,7 @@ export default class GetLendingActions {
308
302
  return this.loggedOutOptions();
309
303
  }
310
304
 
311
- const canBrowse =
312
- lendingStatus.available_to_browse ||
313
- (!lendingStatus.available_to_browse && lendingStatus.browsingExpired);
314
- if (canBrowse) {
305
+ if (lendingStatus.available_to_browse || lendingStatus.browsingExpired) {
315
306
  return this.borrow1HrAction();
316
307
  }
317
308
 
@@ -378,7 +369,8 @@ export default class GetLendingActions {
378
369
  lendingStatus.user_is_printdisabled;
379
370
 
380
371
  const patronIsReading =
381
- lendingStatus.user_has_borrowed || lendingStatus.user_has_browsed;
372
+ lendingStatus.user_has_borrowed ||
373
+ (lendingStatus.user_has_browsed && !lendingStatus.browsingExpired);
382
374
 
383
375
  const notBorrowed =
384
376
  !lendingStatus.user_has_borrowed && !lendingStatus.user_has_browsed;
@@ -414,7 +406,7 @@ export default class GetLendingActions {
414
406
  lendingActions = this.leaveWaitlistAction();
415
407
  } else if (userCanAccessPrintDisabled) {
416
408
  lendingActions = this.borrowPrintDisabledAction();
417
- } else if (canBorrow) {
409
+ } else if (canBorrow || lendingStatus.browsingExpired) {
418
410
  lendingActions = this.borrowAction();
419
411
  } else if (lendingStatus.isPrintDisabledOnly) {
420
412
  lendingActions = this.onlyPrintDisabledAction();
@@ -1,3 +1,4 @@
1
+ /* eslint-disable camelcase */
1
2
  import { html, css, LitElement } from 'lit-element';
2
3
 
3
4
  import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
@@ -32,7 +33,7 @@ export default class IABookActions extends LitElement {
32
33
  this.secondaryActions = [];
33
34
  this.width = 0;
34
35
  this.bwbPurchaseUrl = '';
35
- this.lendingOptions = [];
36
+ this.lendingOptions = {};
36
37
  this.sharedObserver = undefined;
37
38
  }
38
39
 
@@ -60,6 +61,28 @@ export default class IABookActions extends LitElement {
60
61
  }
61
62
  }
62
63
 
64
+ browseHasExpired() {
65
+ const browsingExpired = true;
66
+ const currStatus = { ...this.lendingStatus, browsingExpired };
67
+ this.lendingStatus = currStatus;
68
+ }
69
+
70
+ startBrowseTimer() {
71
+ const {
72
+ browsingExpired,
73
+ user_has_browsed,
74
+ secondsLeftOnLoan,
75
+ } = this.lendingStatus;
76
+ if (!user_has_browsed || browsingExpired) {
77
+ return;
78
+ }
79
+
80
+ const timeLeft = secondsLeftOnLoan * 1000;
81
+ setTimeout(() => {
82
+ this.browseHasExpired();
83
+ }, timeLeft);
84
+ }
85
+
63
86
  /** SharedObserver resize handler */
64
87
  handleResize(entry) {
65
88
  // if you are observing multiple targets,
@@ -111,6 +134,13 @@ export default class IABookActions extends LitElement {
111
134
  this.secondaryActions = actions.secondaryActions.filter(action => {
112
135
  return action != null;
113
136
  });
137
+
138
+ if (
139
+ this.lendingStatus.user_has_browsed &&
140
+ !this.lendingStatus.browseHasExpired
141
+ ) {
142
+ this.startBrowseTimer();
143
+ }
114
144
  }
115
145
 
116
146
  render() {
@@ -159,8 +189,8 @@ export default class IABookActions extends LitElement {
159
189
  return css`
160
190
  :host {
161
191
  display: block;
162
- background: var(--secondaryBGColor);
163
- color: var(--primaryTextColor);
192
+ background: var(--primaryBGColor, #000);
193
+ color: var(--primaryTextColor, #fff);
164
194
  }
165
195
  .lending-wrapper {
166
196
  width: 100%;
@@ -1,4 +1,5 @@
1
- import { html, fixture, expect } from '@open-wc/testing';
1
+ import { html, fixture, expect, aTimeout } from '@open-wc/testing';
2
+
2
3
  import '../src/ia-book-actions.js';
3
4
  import Sinon from 'sinon';
4
5
 
@@ -159,40 +160,79 @@ describe('Borrow status actions', () => {
159
160
  expect(el.primaryActions[0].text).to.equal(expectedPrimaryActions[0].text);
160
161
  expect(el.primaryActions[1].text).to.equal('Borrow for 14 days');
161
162
  });
163
+ });
162
164
 
163
- describe('Shared Resize Observer', () => {
164
- it('can receive a Shared Resize Observer', async () => {
165
- const sharedObserverStub = new SharedResizeObserver();
166
- const addObserverSpy = Sinon.spy(sharedObserverStub, 'addObserver');
167
- const component = await fixture(html` <ia-book-actions
168
- .userid=${'@userid'}
169
- .identifier=${'foo'}
170
- .lendingStatus=${{
165
+ describe('Browsing expired status', () => {
166
+ it('Book is browsed but not expired', async () => {
167
+ const el = await fixture(
168
+ container({
169
+ userid: '@userid',
170
+ lendingStatus: {
171
171
  is_lendable: true,
172
172
  user_has_browsed: true,
173
- available_to_browse: true,
174
- available_to_borrow: true,
175
- }}
176
- .sharedObserver=${sharedObserverStub}
177
- ></ia-book-actions>`);
178
- await component.updateComplete;
179
-
180
- expect(addObserverSpy.callCount).to.equal(1);
181
- });
182
- it('loads its own resize observer if it is not received', async () => {
183
- const component = await fixture(html` <ia-book-actions
184
- .userid=${'@userid'}
185
- .identifier=${'foo'}
186
- .lendingStatus=${{
173
+ browseHasExpired: false,
174
+ },
175
+ })
176
+ );
177
+ expect(el.primaryTitle).contains('Borrow ends at ');
178
+ expect(el.primaryActions[0].text).to.equal('Return now');
179
+ expect(el.primaryActions[1].text).to.equal('Print Disability Access');
180
+ });
181
+
182
+ it('Book is browsing and going to expire after 1 second', async () => {
183
+ const el = await fixture(
184
+ container({
185
+ userid: '@userid',
186
+ lendingStatus: {
187
187
  is_lendable: true,
188
188
  user_has_browsed: true,
189
- available_to_browse: true,
190
- available_to_borrow: true,
191
- }}
192
- ></ia-book-actions>`);
189
+ browseHasExpired: false,
190
+ secondsLeftOnLoan: 1,
191
+ },
192
+ })
193
+ );
194
+
195
+ await aTimeout(1500); // wait for 1.5 second
196
+ el.updateComplete;
197
+
198
+ expect(el.primaryTitle).contains('Your loan has expired.');
199
+ expect(el.primaryActions[0].text).to.equal('Borrow again');
200
+ });
201
+ });
202
+
203
+ describe('Shared Resize Observer', () => {
204
+ it('can receive a Shared Resize Observer', async () => {
205
+ const sharedObserverStub = new SharedResizeObserver();
206
+ const addObserverSpy = Sinon.spy(sharedObserverStub, 'addObserver');
207
+ const component = await fixture(html` <ia-book-actions
208
+ .userid=${'@userid'}
209
+ .identifier=${'foo'}
210
+ .lendingStatus=${{
211
+ is_lendable: true,
212
+ user_has_browsed: true,
213
+ available_to_browse: true,
214
+ available_to_borrow: true,
215
+ }}
216
+ .sharedObserver=${sharedObserverStub}
217
+ ></ia-book-actions>`);
218
+ await component.updateComplete;
219
+
220
+ expect(addObserverSpy.callCount).to.equal(1);
221
+ });
193
222
 
194
- await component.updateComplete;
195
- expect(component.sharedObserver).to.not.be.undefined;
196
- });
223
+ it('loads its own resize observer if it is not received', async () => {
224
+ const component = await fixture(html` <ia-book-actions
225
+ .userid=${'@userid'}
226
+ .identifier=${'foo'}
227
+ .lendingStatus=${{
228
+ is_lendable: true,
229
+ user_has_browsed: true,
230
+ available_to_browse: true,
231
+ available_to_borrow: true,
232
+ }}
233
+ ></ia-book-actions>`);
234
+
235
+ await component.updateComplete;
236
+ expect(component.sharedObserver).to.not.be.undefined;
197
237
  });
198
238
  });