@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@internetarchive/ia-book-actions",
3
- "version": "0.0.29",
3
+ "version": "0.0.30-alpha1",
4
4
  "description": "Bookreader actions for borrowable book",
5
5
  "author": "Internet Archive",
6
6
  "license": "AGPL-3.0-only",
@@ -102,9 +102,9 @@ export class CollapsibleActionGroup extends ActionsHandler {
102
102
  return html`
103
103
  <div
104
104
  class="${classMap({
105
- actiongroup: true,
106
- disabled: this.disabled,
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.renderActionLink(action));
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
- this.clickHandler(action.id, action.analyticsEvent);
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
- actionloader: true,
248
- disabled: this.disabled,
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}">${this.texts}</span>
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: inline-block;
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',
@@ -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
- browsingExpired,
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
- .identifier}"
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>