@internetarchive/ia-book-actions 0.0.29 → 0.0.30-alpha1
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 +22 -0
- package/package.json +1 -1
- package/src/components/collapsible-action-group.js +9 -9
- package/src/components/text-group.js +9 -2
- package/src/core/services/actions-config.js +0 -2
- package/src/core/services/actions-handler/actions-handler.js +5 -0
- package/src/core/services/get-lending-actions.js +2 -1
- package/src/ia-book-actions.js +41 -7
- package/demo/with-bookreader.html +0 -146
package/demo/index.html
CHANGED
|
@@ -134,6 +134,25 @@
|
|
|
134
134
|
});
|
|
135
135
|
});
|
|
136
136
|
|
|
137
|
+
document.querySelectorAll('.searchParam input[type=checkbox]').forEach((item) => {
|
|
138
|
+
item.addEventListener('click', (e) => {
|
|
139
|
+
var searchParams = new URLSearchParams(window.location.search);
|
|
140
|
+
var separate = '';
|
|
141
|
+
if (e.target.checked) {
|
|
142
|
+
separate = '?';
|
|
143
|
+
searchParams.set('q', 'test');
|
|
144
|
+
} else {
|
|
145
|
+
separate = '';
|
|
146
|
+
searchParams.delete('q');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (history.pushState) {
|
|
150
|
+
var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + separate + searchParams;
|
|
151
|
+
window.history.pushState({path:newurl},'',newurl);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
137
156
|
document.querySelectorAll('.errorEnable input[type=checkbox]').forEach((item) => {
|
|
138
157
|
if (window.location.href.indexOf('?error=true') !== -1) {
|
|
139
158
|
item.checked = true;
|
|
@@ -263,6 +282,9 @@
|
|
|
263
282
|
<td class="titleBar">
|
|
264
283
|
<label><input type="checkbox" name="title" value="title" />Title Bar</label>
|
|
265
284
|
</td>
|
|
285
|
+
<td class="searchParam">
|
|
286
|
+
<label><input type="checkbox" name="search" value="Search Param" />Search Param</label>
|
|
287
|
+
</td>
|
|
266
288
|
</tr>
|
|
267
289
|
</table>
|
|
268
290
|
</fieldset>
|
package/package.json
CHANGED
|
@@ -102,9 +102,9 @@ export class CollapsibleActionGroup extends ActionsHandler {
|
|
|
102
102
|
return html`
|
|
103
103
|
<div
|
|
104
104
|
class="${classMap({
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
actiongroup: true,
|
|
106
|
+
disabled: this.disabled,
|
|
107
|
+
})}"
|
|
108
108
|
>
|
|
109
109
|
${this.getLoaderIcon}
|
|
110
110
|
<section class="action-buttons primary">
|
|
@@ -147,7 +147,7 @@ export class CollapsibleActionGroup extends ActionsHandler {
|
|
|
147
147
|
get renderSecondaryActions() {
|
|
148
148
|
if (!this.secondaryActions.length) return nothing;
|
|
149
149
|
|
|
150
|
-
return this.secondaryActions.map(action => this.
|
|
150
|
+
return this.secondaryActions.map(action => this.renderActionButton(action));
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
/**
|
|
@@ -163,8 +163,8 @@ export class CollapsibleActionGroup extends ActionsHandler {
|
|
|
163
163
|
href="${action.url}"
|
|
164
164
|
target=${action.target}
|
|
165
165
|
@click=${() => {
|
|
166
|
-
|
|
167
|
-
|
|
166
|
+
this.clickHandler(action.id, action.analyticsEvent);
|
|
167
|
+
}}
|
|
168
168
|
>
|
|
169
169
|
${action.id === 'purchaseBook' ? purchaseIcon : ''} ${action.text}
|
|
170
170
|
<small>${action.subText}</small>
|
|
@@ -244,9 +244,9 @@ export class CollapsibleActionGroup extends ActionsHandler {
|
|
|
244
244
|
get getLoaderIcon() {
|
|
245
245
|
return html`<img
|
|
246
246
|
class="${classMap({
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
247
|
+
actionloader: true,
|
|
248
|
+
disabled: this.disabled,
|
|
249
|
+
})}"
|
|
250
250
|
alt=""
|
|
251
251
|
src="${this.loaderIcon}"
|
|
252
252
|
/>`;
|
|
@@ -5,6 +5,7 @@ export class TextGroup extends LitElement {
|
|
|
5
5
|
return {
|
|
6
6
|
texts: { type: String },
|
|
7
7
|
textClass: { type: String },
|
|
8
|
+
hasAdminBorrowedAccess: { type: Boolean },
|
|
8
9
|
};
|
|
9
10
|
}
|
|
10
11
|
|
|
@@ -12,11 +13,16 @@ export class TextGroup extends LitElement {
|
|
|
12
13
|
super();
|
|
13
14
|
this.texts = '';
|
|
14
15
|
this.textClass = '';
|
|
16
|
+
this.hasAdminBorrowedAccess = false;
|
|
15
17
|
}
|
|
16
18
|
|
|
17
19
|
render() {
|
|
18
20
|
return html`
|
|
19
|
-
<span class="variable-texts ${this.textClass}"
|
|
21
|
+
<span class="variable-texts ${this.textClass}">
|
|
22
|
+
${this.hasAdminBorrowedAccess
|
|
23
|
+
? html`<slot name="sticky-access-checkbox">${this.texts}</slot>`
|
|
24
|
+
: this.texts}
|
|
25
|
+
</span>
|
|
20
26
|
`;
|
|
21
27
|
}
|
|
22
28
|
|
|
@@ -29,12 +35,13 @@ export class TextGroup extends LitElement {
|
|
|
29
35
|
margin-left: 10px;
|
|
30
36
|
vertical-align: middle;
|
|
31
37
|
font-size: 1.7rem;
|
|
38
|
+
align-items: center;
|
|
32
39
|
}
|
|
33
40
|
.hidden {
|
|
34
41
|
display: none;
|
|
35
42
|
}
|
|
36
43
|
.visible {
|
|
37
|
-
display:
|
|
44
|
+
display: flex;
|
|
38
45
|
}
|
|
39
46
|
`;
|
|
40
47
|
}
|
|
@@ -206,8 +206,6 @@ export default class ActionsConfig {
|
|
|
206
206
|
id: 'adminAccess',
|
|
207
207
|
text: 'Admin Access',
|
|
208
208
|
title: 'You have administrative privileges to read this book',
|
|
209
|
-
url: '?admin=1',
|
|
210
|
-
target: '_self',
|
|
211
209
|
className: 'danger',
|
|
212
210
|
analyticsEvent: {
|
|
213
211
|
category: this.analyticsCategories.adminAccess,
|
|
@@ -82,6 +82,11 @@ export default class ActionsHandler extends LitElement {
|
|
|
82
82
|
this.addEventListener('adminAccess', ({ detail }) => {
|
|
83
83
|
const { category, action } = detail.event;
|
|
84
84
|
this.sendEvent(category, action);
|
|
85
|
+
|
|
86
|
+
// keep existing params and add new one
|
|
87
|
+
const url = new URL(window.location.href);
|
|
88
|
+
url.searchParams.append('admin', 1);
|
|
89
|
+
window.location.search = url.search;
|
|
85
90
|
});
|
|
86
91
|
|
|
87
92
|
this.addEventListener('exitAdminAccess', ({ detail }) => {
|
|
@@ -51,6 +51,7 @@ export const bookTitles = {
|
|
|
51
51
|
on_waitlist: 'You are on the waitlist for this book.',
|
|
52
52
|
session_expired: 'Your loan has expired.',
|
|
53
53
|
unavailable: 'This book is not available at this time.',
|
|
54
|
+
admin_borrowed: 'Default to admin access mode',
|
|
54
55
|
};
|
|
55
56
|
|
|
56
57
|
export class GetLendingActions {
|
|
@@ -83,7 +84,7 @@ export class GetLendingActions {
|
|
|
83
84
|
|
|
84
85
|
adminOrPrintDisabledReadingAction() {
|
|
85
86
|
return {
|
|
86
|
-
primaryTitle:
|
|
87
|
+
primaryTitle: bookTitles.admin_borrowed,
|
|
87
88
|
primaryActions: [],
|
|
88
89
|
secondaryActions: [this.actionsConfig.adminOrPrintDisabledExitConfig()],
|
|
89
90
|
borrowType: 'adminBorrowed',
|
package/src/ia-book-actions.js
CHANGED
|
@@ -12,6 +12,7 @@ import './components/info-icon.js';
|
|
|
12
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
|
+
import { getItem, setItem } from './core/services/doc-cookies.js';
|
|
15
16
|
|
|
16
17
|
export const events = {
|
|
17
18
|
browseExpired: 'IABookReader:BrowsingHasExpired',
|
|
@@ -48,7 +49,7 @@ export default class IABookActions extends LitElement {
|
|
|
48
49
|
this.lendingStatus = {};
|
|
49
50
|
this.width = 0;
|
|
50
51
|
this.bwbPurchaseUrl = '';
|
|
51
|
-
this.lendingBarPostInit = () => {};
|
|
52
|
+
this.lendingBarPostInit = () => { };
|
|
52
53
|
this.barType = 'action'; // 'title'|'action'
|
|
53
54
|
this.sharedObserver = undefined;
|
|
54
55
|
this.disableActionGroup = false;
|
|
@@ -96,11 +97,8 @@ export default class IABookActions extends LitElement {
|
|
|
96
97
|
}
|
|
97
98
|
|
|
98
99
|
startBrowseTimer() {
|
|
99
|
-
const {
|
|
100
|
-
|
|
101
|
-
user_has_browsed,
|
|
102
|
-
secondsLeftOnLoan,
|
|
103
|
-
} = this.lendingStatus;
|
|
100
|
+
const { browsingExpired, user_has_browsed, secondsLeftOnLoan } =
|
|
101
|
+
this.lendingStatus;
|
|
104
102
|
if (!user_has_browsed || browsingExpired) {
|
|
105
103
|
return;
|
|
106
104
|
}
|
|
@@ -356,7 +354,7 @@ export default class IABookActions extends LitElement {
|
|
|
356
354
|
Please ${refreshButton} to try again or send us an email to
|
|
357
355
|
<a
|
|
358
356
|
href="mailto:info@archive.org?subject=Help: cannot access my borrowed book: ${this
|
|
359
|
-
|
|
357
|
+
.identifier}"
|
|
360
358
|
>info@archive.org</a
|
|
361
359
|
>`;
|
|
362
360
|
}
|
|
@@ -366,6 +364,12 @@ export default class IABookActions extends LitElement {
|
|
|
366
364
|
});
|
|
367
365
|
}
|
|
368
366
|
|
|
367
|
+
// eslint-disable-next-line class-methods-use-this
|
|
368
|
+
toggleStickyAdminAccess() {
|
|
369
|
+
const currentValue = getItem('sticky-admin-access') === 'true';
|
|
370
|
+
setItem('sticky-admin-access', !currentValue);
|
|
371
|
+
}
|
|
372
|
+
|
|
369
373
|
get iconClass() {
|
|
370
374
|
return this.width <= mobileContainerWidth ? 'mobile' : 'desktop';
|
|
371
375
|
}
|
|
@@ -382,10 +386,36 @@ export default class IABookActions extends LitElement {
|
|
|
382
386
|
return html`<text-group
|
|
383
387
|
textClass=${this.textClass}
|
|
384
388
|
texts=${this.primaryTitle}
|
|
389
|
+
?hasAdminBorrowedAccess=${this.hasAdminBorrowedAccess}
|
|
385
390
|
>
|
|
391
|
+
${this.hasAdminBorrowedAccess
|
|
392
|
+
? html`<div slot="sticky-access-checkbox">
|
|
393
|
+
${this.stickyAdminAccess}
|
|
394
|
+
</div>`
|
|
395
|
+
: ''}
|
|
386
396
|
</text-group>`;
|
|
387
397
|
}
|
|
388
398
|
|
|
399
|
+
get stickyAdminAccess() {
|
|
400
|
+
return html`
|
|
401
|
+
<label class="stick-admin" for="sticky-admin-access">
|
|
402
|
+
<input
|
|
403
|
+
type="checkbox"
|
|
404
|
+
id="sticky-admin-access"
|
|
405
|
+
aria-label="Checkbox"
|
|
406
|
+
@click=${this.toggleStickyAdminAccess}
|
|
407
|
+
/>
|
|
408
|
+
<span>${this.primaryTitle}</span>
|
|
409
|
+
</label>
|
|
410
|
+
`;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
get hasAdminBorrowedAccess() {
|
|
414
|
+
return this.secondaryActions.some(
|
|
415
|
+
action => action.id === 'exitAdminAccess'
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
|
|
389
419
|
get hasAdminAccess() {
|
|
390
420
|
return !this.lendingStatus.userHasBorrowed && this.lendingStatus.isAdmin;
|
|
391
421
|
}
|
|
@@ -405,6 +435,10 @@ export default class IABookActions extends LitElement {
|
|
|
405
435
|
justify-content: center;
|
|
406
436
|
flex-wrap: wrap;
|
|
407
437
|
}
|
|
438
|
+
.stick-admin {
|
|
439
|
+
user-select: none;
|
|
440
|
+
cursor: pointer;
|
|
441
|
+
}
|
|
408
442
|
`;
|
|
409
443
|
}
|
|
410
444
|
}
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en-GB">
|
|
3
|
-
|
|
4
|
-
<head>
|
|
5
|
-
<meta charset="utf-8">
|
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
|
7
|
-
<style>
|
|
8
|
-
html {
|
|
9
|
-
font-size: 10px;
|
|
10
|
-
/* This is to match petabox's base font size */
|
|
11
|
-
}
|
|
12
|
-
body {
|
|
13
|
-
margin: 0;
|
|
14
|
-
text-align: center;
|
|
15
|
-
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
|
16
|
-
}
|
|
17
|
-
#demo {
|
|
18
|
-
height: 50px;
|
|
19
|
-
}
|
|
20
|
-
ia-book-actions {
|
|
21
|
-
--white: #fff;
|
|
22
|
-
--black: #000;
|
|
23
|
-
--primaryBGColor: var(--black);
|
|
24
|
-
--secondaryBGColor: #222;
|
|
25
|
-
--tertiaryBGColor: #333;
|
|
26
|
-
--primaryTextColor: var(--white);
|
|
27
|
-
--primaryCTAFill: #194880;
|
|
28
|
-
--primaryCTABorder: #c5d1df;
|
|
29
|
-
--secondaryCTAFill: #333;
|
|
30
|
-
--secondaryCTABorder: #999;
|
|
31
|
-
--secondaryCTAFillRGB: 51, 51, 51;
|
|
32
|
-
--primaryErrorCTAFill: #e51c26;
|
|
33
|
-
--primaryErrorCTABorder: #f8c6c8;
|
|
34
|
-
--primaryCTAFillRGB: 25, 72, 128;
|
|
35
|
-
--primaryErrorCTAFillRGB: 229, 28, 38;
|
|
36
|
-
--primaryDisableCTAFill: #767676;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
fieldset {
|
|
40
|
-
width: fit-content;
|
|
41
|
-
margin-top: 50px;
|
|
42
|
-
}
|
|
43
|
-
fieldset legend {
|
|
44
|
-
text-align: left;
|
|
45
|
-
font-size: 12px;
|
|
46
|
-
}
|
|
47
|
-
td {
|
|
48
|
-
color: white;
|
|
49
|
-
font-size: 14px;
|
|
50
|
-
border-radius: 5%;
|
|
51
|
-
display: table-cell;
|
|
52
|
-
text-align: initial;
|
|
53
|
-
margin: 5px 0;
|
|
54
|
-
width: max-content;
|
|
55
|
-
display: block;
|
|
56
|
-
}
|
|
57
|
-
label {
|
|
58
|
-
padding: 10px;
|
|
59
|
-
display: block;
|
|
60
|
-
cursor: pointer;
|
|
61
|
-
margin: 2px;
|
|
62
|
-
background: #4e545a;
|
|
63
|
-
border-radius: 10px;
|
|
64
|
-
}
|
|
65
|
-
input[type="radio"], input[type="checkbox"] {
|
|
66
|
-
margin-top: 0;
|
|
67
|
-
vertical-align: middle;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
.initial td {
|
|
71
|
-
float: left;
|
|
72
|
-
margin: 2px;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
body.modal-manager-open {
|
|
76
|
-
overflow: hidden;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
modal-manager[mode='closed'] {
|
|
80
|
-
display: none;
|
|
81
|
-
}
|
|
82
|
-
</style>
|
|
83
|
-
</head>
|
|
84
|
-
|
|
85
|
-
<body>
|
|
86
|
-
<ia-bookreader class="focus-on-child-only" signedin="" fullscreen="">
|
|
87
|
-
<div slot="header">
|
|
88
|
-
<ia-book-actions></ia-book-actions>
|
|
89
|
-
</div>
|
|
90
|
-
<div slot="main">
|
|
91
|
-
<div id="BookReader"></div>
|
|
92
|
-
</div>
|
|
93
|
-
</ia-bookreader>
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
<script type="module">
|
|
97
|
-
/* eslint-disable */
|
|
98
|
-
import '@internetarchive/bookreader';
|
|
99
|
-
import '@internetarchive/bookreader/BookReader/jquery-1.10.1.js';
|
|
100
|
-
import '@internetarchive/bookreader/BookReader/BookReader.js';
|
|
101
|
-
import '../src/ia-book-actions.js';
|
|
102
|
-
import {
|
|
103
|
-
defaultLendingStatus,
|
|
104
|
-
canBrowseAndBorrow,
|
|
105
|
-
} from '../src/assets/data/lending-get-status-service.js';
|
|
106
|
-
import { ModalConfig } from '@internetarchive/modal-manager';
|
|
107
|
-
|
|
108
|
-
const userid = '@neeraj-archive';
|
|
109
|
-
const identifier = 'naturalhistoryof00unse_4111';
|
|
110
|
-
let bwbPurchaseUrl = 'https://www.betterworldbooks.com/product/detail/cambridge-ancient-hist-v04-0521044863';
|
|
111
|
-
|
|
112
|
-
let iaBookActions = document.querySelector('ia-book-actions');
|
|
113
|
-
|
|
114
|
-
// for debugging
|
|
115
|
-
window.iaBookActions = iaBookActions;
|
|
116
|
-
|
|
117
|
-
const modalConfig = new ModalConfig();
|
|
118
|
-
modalConfig.headerColor = '#d9534f';
|
|
119
|
-
|
|
120
|
-
let lendingBarPostInit = function lendingBarPostInit() {
|
|
121
|
-
setTimeout(function() {
|
|
122
|
-
console.log('executed', 'br.init()');
|
|
123
|
-
}, 100);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// set defaultLendingStatus for unavailable (without borrowables) book
|
|
127
|
-
iaBookActions.userid = userid;
|
|
128
|
-
iaBookActions.identifier = identifier;
|
|
129
|
-
iaBookActions.bookTitle = 'Contemporary Black biography. Volume 39 : profiles from the interContemporary Black biography. Volume 39';
|
|
130
|
-
iaBookActions.lendingStatus = canBrowseAndBorrow;
|
|
131
|
-
iaBookActions.bwbPurchaseUrl = '';
|
|
132
|
-
iaBookActions.modalConfig = modalConfig;
|
|
133
|
-
iaBookActions.lendingBarPostInit = lendingBarPostInit;
|
|
134
|
-
iaBookActions.tokenDelay = 2000; // 2 seconds
|
|
135
|
-
iaBookActions.returnUrl = 'https://openlibrary.org';
|
|
136
|
-
|
|
137
|
-
let lendingStatus1 = iaBookActions.lendingStatus;
|
|
138
|
-
|
|
139
|
-
const manifest = await fetch('https://ia801302.us.archive.org/BookReader/BookReaderJSIA.php?id=goody&itemPath=/29/items/goody&server=ia801302.us.archive.org&format=jsonp&subPrefix=goody&requestUri=/details/goody/mode/1up%3Fview%3Dtheater%26ui%3Dembed%26wrapper%3Dfalse');
|
|
140
|
-
|
|
141
|
-
console.log('manifest ****', manifest).then(res => res.json());
|
|
142
|
-
</script>
|
|
143
|
-
|
|
144
|
-
</div>
|
|
145
|
-
</body>
|
|
146
|
-
</html>
|