@internetarchive/ia-book-actions 0.0.19 → 0.0.20
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
|
@@ -101,6 +101,9 @@
|
|
|
101
101
|
|
|
102
102
|
let iaBookActions = document.querySelector('ia-book-actions');
|
|
103
103
|
|
|
104
|
+
// for debugging
|
|
105
|
+
window.iaBookActions = iaBookActions;
|
|
106
|
+
|
|
104
107
|
const modalConfig = new ModalConfig();
|
|
105
108
|
modalConfig.headerColor = '#d9534f';
|
|
106
109
|
|
|
@@ -214,6 +217,12 @@
|
|
|
214
217
|
lendingStatus1.user_on_waitlist = false;
|
|
215
218
|
lendingStatus1.available_to_waitlist = false;
|
|
216
219
|
lendingStatus1.user_has_borrowed = false;
|
|
220
|
+
} else if (e.target.value === 'user_can_claim_waitlist') {
|
|
221
|
+
lendingStatus1.available_to_borrow = true;
|
|
222
|
+
lendingStatus1.user_on_waitlist = true;
|
|
223
|
+
lendingStatus1.user_can_claim_waitlist = true;
|
|
224
|
+
lendingStatus1.user_has_borrowed = false;
|
|
225
|
+
lendingStatus1.available_to_waitlist = false;
|
|
217
226
|
} else if (e.target.value === 'user_on_waitlist') {
|
|
218
227
|
lendingStatus1.available_to_borrow = false;
|
|
219
228
|
lendingStatus1.user_on_waitlist = true;
|
|
@@ -283,6 +292,7 @@
|
|
|
283
292
|
<td class="availableToBorrow">
|
|
284
293
|
<label><input type="radio" name="borrow" value="available_to_borrow" />available_to_borrow</label>
|
|
285
294
|
<label><input type="radio" name="borrow" value="user_on_waitlist" />user_on_waitlist</label>
|
|
295
|
+
<label><input type="radio" name="borrow" value="user_can_claim_waitlist" />user_can_claim_waitlist</label>
|
|
286
296
|
<label><input type="radio" name="borrow" value="available_to_waitlist" />available_to_waitlist</label>
|
|
287
297
|
<label><input type="radio" name="borrow" value="user_has_borrowed" />user_has_borrowed</label>
|
|
288
298
|
</td>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@internetarchive/ia-book-actions",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.20",
|
|
4
4
|
"description": "Bookreader actions for borrowable book",
|
|
5
5
|
"author": "Internet Archive",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"husky": "^1.0.0",
|
|
41
41
|
"lint-staged": "^10.0.0",
|
|
42
42
|
"prettier": "^2.0.4",
|
|
43
|
-
"sinon": "^
|
|
43
|
+
"sinon": "^13.0.2"
|
|
44
44
|
},
|
|
45
45
|
"eslintConfig": {
|
|
46
46
|
"extends": [
|
|
@@ -34,7 +34,26 @@ import ActionsConfig from './actions-config.js';
|
|
|
34
34
|
* The action buttons configuration is coming from ActionsConfig class.
|
|
35
35
|
*/
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Enum: Book Titles
|
|
39
|
+
* @readonly
|
|
40
|
+
* @enum {string}
|
|
41
|
+
*/
|
|
42
|
+
export const bookTitles = {
|
|
43
|
+
available_1hr: 'Renewable every hour, pending availability.',
|
|
44
|
+
available_14d: 'This book can be borrowed for 14 days.',
|
|
45
|
+
available_pd: 'Book available to patrons with print disabilities.',
|
|
46
|
+
available_waitlist: 'A waitlist is available.',
|
|
47
|
+
admin_access: 'You have administrative privileges to read this book.',
|
|
48
|
+
claim_waitlist: 'You are at the top of the waitlist for this book.',
|
|
49
|
+
being_borrowed: 'Another patron is using this book. Please check back later.',
|
|
50
|
+
eligible_pd: 'You are eligible for print-disabled access.',
|
|
51
|
+
on_waitlist: 'You are on the waitlist for this book.',
|
|
52
|
+
session_expired: 'Your loan has expired.',
|
|
53
|
+
unavailable: 'This book is not available at this time.',
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export class GetLendingActions {
|
|
38
57
|
constructor(userid, identifier, lendingStatus, bwbPurchaseUrl) {
|
|
39
58
|
this.userid = userid;
|
|
40
59
|
this.identifier = identifier;
|
|
@@ -52,7 +71,7 @@ export default class GetLendingActions {
|
|
|
52
71
|
|
|
53
72
|
onlyAdminAction() {
|
|
54
73
|
return {
|
|
55
|
-
primaryTitle:
|
|
74
|
+
primaryTitle: bookTitles.admin_access,
|
|
56
75
|
primaryActions: [],
|
|
57
76
|
primaryColor: 'primary',
|
|
58
77
|
secondaryActions: [
|
|
@@ -100,7 +119,7 @@ export default class GetLendingActions {
|
|
|
100
119
|
};
|
|
101
120
|
}
|
|
102
121
|
|
|
103
|
-
|
|
122
|
+
claimWaitlistAction() {
|
|
104
123
|
const lendingStatus = this.lendingStatus || {};
|
|
105
124
|
|
|
106
125
|
const leaveWaitlist = this.actionsConfig.leaveWaitlistConfig();
|
|
@@ -109,12 +128,13 @@ export default class GetLendingActions {
|
|
|
109
128
|
? this.actionsConfig.firstBrowseConfig()
|
|
110
129
|
: null;
|
|
111
130
|
|
|
112
|
-
|
|
113
|
-
|
|
131
|
+
let actions = [borrowBook];
|
|
132
|
+
if (browseBook) actions.push(browseBook);
|
|
133
|
+
actions.push(leaveWaitlist);
|
|
114
134
|
|
|
115
135
|
return {
|
|
116
|
-
primaryTitle:
|
|
117
|
-
primaryActions: actions
|
|
136
|
+
primaryTitle: bookTitles.claim_waitlist,
|
|
137
|
+
primaryActions: actions,
|
|
118
138
|
primaryColor: 'primary',
|
|
119
139
|
footer: 'printDisabilityLine()',
|
|
120
140
|
secondaryActions: [
|
|
@@ -126,7 +146,7 @@ export default class GetLendingActions {
|
|
|
126
146
|
|
|
127
147
|
borrowPrintDisabledAction() {
|
|
128
148
|
return {
|
|
129
|
-
primaryTitle:
|
|
149
|
+
primaryTitle: bookTitles.eligible_pd,
|
|
130
150
|
primaryActions: [this.actionsConfig.borrowBookConfig()],
|
|
131
151
|
primaryColor: 'primary',
|
|
132
152
|
secondaryActions: [
|
|
@@ -141,7 +161,7 @@ export default class GetLendingActions {
|
|
|
141
161
|
? this.actionsConfig.unavailableBookConfig()
|
|
142
162
|
: [];
|
|
143
163
|
return {
|
|
144
|
-
primaryTitle:
|
|
164
|
+
primaryTitle: bookTitles.available_pd,
|
|
145
165
|
primaryActions: [unavailable],
|
|
146
166
|
primaryColor: 'primary',
|
|
147
167
|
secondaryActions: [],
|
|
@@ -150,7 +170,7 @@ export default class GetLendingActions {
|
|
|
150
170
|
|
|
151
171
|
onWaitlistAction() {
|
|
152
172
|
return {
|
|
153
|
-
primaryTitle:
|
|
173
|
+
primaryTitle: bookTitles.on_waitlist,
|
|
154
174
|
primaryActions: [
|
|
155
175
|
this.actionsConfig.leaveWaitlistConfig(),
|
|
156
176
|
this.actionsConfig.firstBrowseConfig(),
|
|
@@ -170,8 +190,8 @@ export default class GetLendingActions {
|
|
|
170
190
|
lendingStatus.max_browsable_copies &&
|
|
171
191
|
!lendingStatus.available_lendable_copies;
|
|
172
192
|
const title = anotherPatronUsing
|
|
173
|
-
?
|
|
174
|
-
:
|
|
193
|
+
? bookTitles.being_borrowed
|
|
194
|
+
: bookTitles.unavailable;
|
|
175
195
|
|
|
176
196
|
return {
|
|
177
197
|
primaryTitle: title,
|
|
@@ -210,10 +230,10 @@ export default class GetLendingActions {
|
|
|
210
230
|
});
|
|
211
231
|
|
|
212
232
|
const title = lendingStatus.available_to_browse
|
|
213
|
-
?
|
|
233
|
+
? bookTitles.available_1hr
|
|
214
234
|
: lendingStatus.available_to_borrow
|
|
215
|
-
?
|
|
216
|
-
:
|
|
235
|
+
? bookTitles.available_14d
|
|
236
|
+
: bookTitles.unavailable;
|
|
217
237
|
|
|
218
238
|
return {
|
|
219
239
|
primaryTitle: title,
|
|
@@ -260,12 +280,12 @@ export default class GetLendingActions {
|
|
|
260
280
|
// end config
|
|
261
281
|
|
|
262
282
|
const title = browsingHasExpired
|
|
263
|
-
?
|
|
283
|
+
? bookTitles.session_expired
|
|
264
284
|
: !canBrowse && allBrowsableCopiesTaken
|
|
265
|
-
?
|
|
285
|
+
? bookTitles.being_borrowed
|
|
266
286
|
: !canBrowse && lendingStatus.available_to_waitlist
|
|
267
|
-
?
|
|
268
|
-
:
|
|
287
|
+
? bookTitles.available_waitlist
|
|
288
|
+
: bookTitles.available_1hr;
|
|
269
289
|
|
|
270
290
|
// one hour borrow config
|
|
271
291
|
const oneHrBorrow = browsingHasExpired
|
|
@@ -332,7 +352,7 @@ export default class GetLendingActions {
|
|
|
332
352
|
});
|
|
333
353
|
|
|
334
354
|
return {
|
|
335
|
-
primaryTitle: waitlist ?
|
|
355
|
+
primaryTitle: waitlist ? bookTitles.being_borrowed : '',
|
|
336
356
|
primaryActions: actions,
|
|
337
357
|
primaryColor: 'primary',
|
|
338
358
|
secondaryActions: [
|
|
@@ -406,7 +426,7 @@ export default class GetLendingActions {
|
|
|
406
426
|
} else if (patronIsReading) {
|
|
407
427
|
lendingActions = this.patronIsReadingAction();
|
|
408
428
|
} else if (lendingStatus.user_can_claim_waitlist) {
|
|
409
|
-
lendingActions = this.
|
|
429
|
+
lendingActions = this.claimWaitlistAction();
|
|
410
430
|
} else if (userCanAccessPrintDisabled) {
|
|
411
431
|
lendingActions = this.borrowPrintDisabledAction();
|
|
412
432
|
} else if (canBorrow || lendingStatus.browsingExpired) {
|
package/src/ia-book-actions.js
CHANGED
|
@@ -9,7 +9,7 @@ import './components/book-title-bar.js';
|
|
|
9
9
|
import './components/text-group.js';
|
|
10
10
|
import './components/info-icon.js';
|
|
11
11
|
|
|
12
|
-
import GetLendingActions from './core/services/get-lending-actions.js';
|
|
12
|
+
import { GetLendingActions } from './core/services/get-lending-actions.js';
|
|
13
13
|
import { mobileContainerWidth } from './core/config/constants.js';
|
|
14
14
|
import { LoanTokenPoller } from './core/services/loan-token-poller.js';
|
|
15
15
|
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { expect } from '@open-wc/testing';
|
|
2
|
-
import
|
|
2
|
+
import sinon from 'sinon';
|
|
3
|
+
import {
|
|
4
|
+
GetLendingActions,
|
|
5
|
+
bookTitles,
|
|
6
|
+
} from '../../../src/core/services/get-lending-actions.js';
|
|
7
|
+
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
sinon.restore();
|
|
10
|
+
});
|
|
3
11
|
|
|
4
12
|
describe('Get Lending Actions', () => {
|
|
5
13
|
it('Browsable and Borrowable with purchase link', async () => {
|
|
@@ -15,9 +23,7 @@ describe('Get Lending Actions', () => {
|
|
|
15
23
|
);
|
|
16
24
|
const actions = lendingOptions.getCurrentLendingActions();
|
|
17
25
|
|
|
18
|
-
expect(actions.primaryTitle).to.equal(
|
|
19
|
-
'Renewable every hour, pending availability.'
|
|
20
|
-
);
|
|
26
|
+
expect(actions.primaryTitle).to.equal(bookTitles.available_1hr);
|
|
21
27
|
expect(actions.primaryActions.length).to.equal(3);
|
|
22
28
|
expect(actions.primaryActions[0].text).to.equal('Borrow for 1 hour');
|
|
23
29
|
expect(actions.primaryActions[1].text).to.equal('Borrow for 14 days');
|
|
@@ -37,9 +43,7 @@ describe('Get Lending Actions', () => {
|
|
|
37
43
|
const actions = lendingOptions.getCurrentLendingActions();
|
|
38
44
|
|
|
39
45
|
expect(actions.primaryActions.length).to.equal(2);
|
|
40
|
-
expect(actions.primaryTitle).to.equal(
|
|
41
|
-
'This book can be borrowed for 14 days.'
|
|
42
|
-
);
|
|
46
|
+
expect(actions.primaryTitle).to.equal(bookTitles.available_14d);
|
|
43
47
|
expect(actions.primaryActions[0].text).to.equal('Log In and Borrow');
|
|
44
48
|
});
|
|
45
49
|
|
|
@@ -64,24 +68,104 @@ describe('Get Lending Actions', () => {
|
|
|
64
68
|
expect(actions.primaryActions[0].text).to.equal('Return now');
|
|
65
69
|
});
|
|
66
70
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
'
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
71
|
+
describe('WAITLIST', () => {
|
|
72
|
+
describe('`user_can_claim_waitlist = true`', () => {
|
|
73
|
+
it('top of waitlist & cannot browse', async () => {
|
|
74
|
+
const lendingOptions = new GetLendingActions(
|
|
75
|
+
'@user',
|
|
76
|
+
'identifier',
|
|
77
|
+
{
|
|
78
|
+
is_lendable: true,
|
|
79
|
+
available_to_borrow: true,
|
|
80
|
+
user_can_claim_waitlist: true,
|
|
81
|
+
},
|
|
82
|
+
''
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const spy = sinon.spy(lendingOptions, 'claimWaitlistAction');
|
|
86
|
+
const actions = lendingOptions.getCurrentLendingActions();
|
|
87
|
+
|
|
88
|
+
expect(actions.primaryTitle).to.equal(bookTitles.claim_waitlist);
|
|
89
|
+
expect(actions.primaryActions.length).to.equal(2);
|
|
90
|
+
expect(actions.primaryActions[0].text).to.equal('Borrow for 14 days');
|
|
91
|
+
expect(actions.primaryActions[1].text).to.equal('Leave Waitlist');
|
|
92
|
+
|
|
93
|
+
expect(spy.called).to.be.true;
|
|
94
|
+
});
|
|
95
|
+
it('top of waitlist & can browse', async () => {
|
|
96
|
+
const lendingOptions = new GetLendingActions(
|
|
97
|
+
'@user',
|
|
98
|
+
'identifier',
|
|
99
|
+
{
|
|
100
|
+
is_lendable: true,
|
|
101
|
+
available_to_borrow: true,
|
|
102
|
+
available_to_browse: true,
|
|
103
|
+
user_can_claim_waitlist: true,
|
|
104
|
+
},
|
|
105
|
+
''
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const spy = sinon.spy(lendingOptions, 'claimWaitlistAction');
|
|
109
|
+
const actions = lendingOptions.getCurrentLendingActions();
|
|
110
|
+
|
|
111
|
+
expect(actions.primaryTitle).to.equal(bookTitles.claim_waitlist);
|
|
112
|
+
expect(actions.primaryActions.length).to.equal(3);
|
|
113
|
+
expect(actions.primaryActions[0].text).to.equal('Borrow for 14 days');
|
|
114
|
+
expect(actions.primaryActions[1].text).to.equal('Borrow for 1 hour');
|
|
115
|
+
expect(actions.primaryActions[2].text).to.equal('Leave Waitlist');
|
|
116
|
+
expect(spy.called).to.be.true;
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('`user_on_waitlist = true`', () => {
|
|
120
|
+
it('on waitlist && cannot browse', async () => {
|
|
121
|
+
const lendingOptions = new GetLendingActions(
|
|
122
|
+
'@user',
|
|
123
|
+
'identifier',
|
|
124
|
+
{
|
|
125
|
+
is_lendable: true,
|
|
126
|
+
available_to_borrow: false,
|
|
127
|
+
available_to_browse: false,
|
|
128
|
+
user_can_claim_waitlist: false,
|
|
129
|
+
user_on_waitlist: true,
|
|
130
|
+
},
|
|
131
|
+
''
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const claimSpy = sinon.spy(lendingOptions, 'claimWaitlistAction');
|
|
135
|
+
const waitlistSpy = sinon.spy(lendingOptions, 'onWaitlistAction');
|
|
136
|
+
const actions = lendingOptions.getCurrentLendingActions();
|
|
137
|
+
|
|
138
|
+
expect(actions.primaryTitle).to.equal(bookTitles.on_waitlist);
|
|
139
|
+
expect(actions.primaryActions.length).to.equal(2);
|
|
140
|
+
expect(actions.primaryActions[0].text).to.equal('Leave Waitlist');
|
|
141
|
+
expect(actions.primaryActions[1].text).to.equal('Borrow for 1 hour');
|
|
142
|
+
expect(claimSpy.called).to.be.false;
|
|
143
|
+
expect(waitlistSpy.called).to.be.true;
|
|
144
|
+
});
|
|
145
|
+
it('on waitlist && can browse', async () => {
|
|
146
|
+
const lendingOptions = new GetLendingActions(
|
|
147
|
+
'@user',
|
|
148
|
+
'identifier',
|
|
149
|
+
{
|
|
150
|
+
is_lendable: true,
|
|
151
|
+
available_to_borrow: false,
|
|
152
|
+
available_to_browse: true,
|
|
153
|
+
user_can_claim_waitlist: false,
|
|
154
|
+
user_on_waitlist: true,
|
|
155
|
+
},
|
|
156
|
+
''
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
const waitlistSpy = sinon.spy(lendingOptions, 'onWaitlistAction');
|
|
160
|
+
const actions = lendingOptions.getCurrentLendingActions();
|
|
161
|
+
|
|
162
|
+
expect(actions.primaryTitle).to.equal(bookTitles.on_waitlist);
|
|
163
|
+
expect(actions.primaryActions.length).to.equal(2);
|
|
164
|
+
expect(actions.primaryActions[0].text).to.equal('Leave Waitlist');
|
|
165
|
+
expect(actions.primaryActions[1].text).to.equal('Borrow for 1 hour');
|
|
166
|
+
expect(waitlistSpy.called).to.be.true;
|
|
167
|
+
});
|
|
168
|
+
});
|
|
85
169
|
});
|
|
86
170
|
|
|
87
171
|
it('User can access print disabled', async () => {
|
|
@@ -99,9 +183,7 @@ describe('Get Lending Actions', () => {
|
|
|
99
183
|
const actions = lendingOptions.getCurrentLendingActions();
|
|
100
184
|
|
|
101
185
|
// in-case of print-disabled, we show 14 days borrow
|
|
102
|
-
expect(actions.primaryTitle).to.equal(
|
|
103
|
-
'You are eligible for print-disabled access.'
|
|
104
|
-
);
|
|
186
|
+
expect(actions.primaryTitle).to.equal(bookTitles.eligible_pd);
|
|
105
187
|
expect(actions.primaryActions.length).to.equal(1);
|
|
106
188
|
expect(actions.primaryActions[0].text).to.equal('Borrow for 14 days');
|
|
107
189
|
});
|
|
@@ -117,39 +199,16 @@ describe('Get Lending Actions', () => {
|
|
|
117
199
|
);
|
|
118
200
|
const actions = lendingOptions.getCurrentLendingActions();
|
|
119
201
|
|
|
120
|
-
expect(actions.primaryTitle).to.equal(
|
|
121
|
-
'Book available to patrons with print disabilities.'
|
|
122
|
-
);
|
|
202
|
+
expect(actions.primaryTitle).to.equal(bookTitles.available_pd);
|
|
123
203
|
expect(actions.primaryActions.length).to.equal(1);
|
|
124
204
|
expect(actions.primaryActions[0].text).to.equal('Borrow Unavailable');
|
|
125
205
|
});
|
|
126
206
|
|
|
127
|
-
it('If user is on waitlist', async () => {
|
|
128
|
-
const lendingOptions = new GetLendingActions(
|
|
129
|
-
'@user',
|
|
130
|
-
'identifier',
|
|
131
|
-
{
|
|
132
|
-
user_on_waitlist: true,
|
|
133
|
-
user_can_claim_waitlist: false,
|
|
134
|
-
},
|
|
135
|
-
''
|
|
136
|
-
);
|
|
137
|
-
const actions = lendingOptions.getCurrentLendingActions();
|
|
138
|
-
|
|
139
|
-
expect(actions.primaryTitle).to.equal(
|
|
140
|
-
'You are on the waitlist for this book.'
|
|
141
|
-
);
|
|
142
|
-
expect(actions.primaryActions.length).to.equal(2);
|
|
143
|
-
expect(actions.primaryActions[0].text).to.equal('Leave Waitlist');
|
|
144
|
-
});
|
|
145
|
-
|
|
146
207
|
it('If book borrow is not available', async () => {
|
|
147
208
|
const lendingOptions = new GetLendingActions('@user', 'identifier', {}, '');
|
|
148
209
|
const actions = lendingOptions.getCurrentLendingActions();
|
|
149
210
|
|
|
150
|
-
expect(actions.primaryTitle).to.equal(
|
|
151
|
-
'This book is not available at this time.'
|
|
152
|
-
);
|
|
211
|
+
expect(actions.primaryTitle).to.equal(bookTitles.unavailable);
|
|
153
212
|
expect(actions.primaryActions.length).to.equal(1);
|
|
154
213
|
expect(actions.primaryActions[0].text).to.equal('Borrow Unavailable');
|
|
155
214
|
});
|