@internetarchive/bookreader 5.0.0-5-multiple-files → 5.0.0-50-a1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (289) hide show
  1. package/.eslintrc.js +17 -15
  2. package/.github/workflows/node.js.yml +77 -6
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +131 -339
  6. package/BookReader/BookReader.js +2 -21564
  7. package/BookReader/BookReader.js.LICENSE.txt +24 -0
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1493 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +17 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/1up.svg +1 -12
  13. package/BookReader/icons/2up.svg +1 -15
  14. package/BookReader/icons/advance.svg +3 -26
  15. package/BookReader/icons/chevron-right.svg +1 -1
  16. package/BookReader/icons/close-circle-dark.svg +1 -0
  17. package/BookReader/icons/close-circle.svg +1 -1
  18. package/BookReader/icons/fullscreen.svg +1 -17
  19. package/BookReader/icons/fullscreen_exit.svg +1 -17
  20. package/BookReader/icons/hamburger.svg +1 -15
  21. package/BookReader/icons/left-arrow.svg +1 -12
  22. package/BookReader/icons/magnify-minus.svg +1 -16
  23. package/BookReader/icons/magnify-plus.svg +1 -17
  24. package/BookReader/icons/magnify.svg +1 -15
  25. package/BookReader/icons/pause.svg +1 -23
  26. package/BookReader/icons/play.svg +1 -22
  27. package/BookReader/icons/playback-speed.svg +1 -34
  28. package/BookReader/icons/read-aloud.svg +1 -22
  29. package/BookReader/icons/review.svg +3 -22
  30. package/BookReader/icons/thumbnails.svg +1 -17
  31. package/BookReader/icons/voice.svg +1 -0
  32. package/BookReader/icons/volume-full.svg +1 -22
  33. package/BookReader/images/BRicons.svg +5 -94
  34. package/BookReader/images/books_graphic.svg +1 -177
  35. package/BookReader/images/icon_book.svg +1 -12
  36. package/BookReader/images/icon_bookmark.svg +1 -12
  37. package/BookReader/images/icon_gear.svg +1 -14
  38. package/BookReader/images/icon_hamburger.svg +1 -20
  39. package/BookReader/images/icon_home.svg +1 -21
  40. package/BookReader/images/icon_info.svg +1 -11
  41. package/BookReader/images/icon_one_page.svg +1 -8
  42. package/BookReader/images/icon_pause.svg +1 -1
  43. package/BookReader/images/icon_play.svg +1 -1
  44. package/BookReader/images/icon_playback-rate.svg +1 -15
  45. package/BookReader/images/icon_search_button.svg +1 -8
  46. package/BookReader/images/icon_share.svg +1 -9
  47. package/BookReader/images/icon_skip-ahead.svg +1 -6
  48. package/BookReader/images/icon_skip-back.svg +2 -13
  49. package/BookReader/images/icon_speaker.svg +1 -18
  50. package/BookReader/images/icon_speaker_open.svg +1 -10
  51. package/BookReader/images/icon_thumbnails.svg +1 -12
  52. package/BookReader/images/icon_toc.svg +1 -5
  53. package/BookReader/images/icon_two_pages.svg +1 -9
  54. package/BookReader/images/marker_chap-off.svg +1 -11
  55. package/BookReader/images/marker_chap-on.svg +1 -11
  56. package/BookReader/images/marker_srch-on.svg +1 -11
  57. package/BookReader/jquery-3.js +2 -0
  58. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  59. package/BookReader/plugins/plugin.archive_analytics.js +1 -172
  60. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  61. package/BookReader/plugins/plugin.autoplay.js +1 -165
  62. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  63. package/BookReader/plugins/plugin.chapters.js +1 -304
  64. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  65. package/BookReader/plugins/plugin.iframe.js +1 -74
  66. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  67. package/BookReader/plugins/plugin.mobile_nav.js +1 -334
  68. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  69. package/BookReader/plugins/plugin.resume.js +1 -368
  70. package/BookReader/plugins/plugin.resume.js.map +1 -1
  71. package/BookReader/plugins/plugin.search.js +1 -1420
  72. package/BookReader/plugins/plugin.search.js.map +1 -1
  73. package/BookReader/plugins/plugin.text_selection.js +1 -1080
  74. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  75. package/BookReader/plugins/plugin.tts.js +2 -9193
  76. package/BookReader/plugins/plugin.tts.js.map +1 -1
  77. package/BookReader/plugins/plugin.url.js +1 -269
  78. package/BookReader/plugins/plugin.url.js.map +1 -1
  79. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
  80. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  81. package/BookReader/webcomponents-bundle.js +3 -0
  82. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  83. package/BookReader/webcomponents-bundle.js.map +1 -0
  84. package/BookReaderDemo/BookReaderDemo.css +14 -1
  85. package/BookReaderDemo/IADemoBr.js +148 -0
  86. package/BookReaderDemo/demo-advanced.html +2 -2
  87. package/BookReaderDemo/demo-autoplay.html +2 -1
  88. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  89. package/BookReaderDemo/demo-fullscreen-mobile.html +2 -1
  90. package/BookReaderDemo/demo-fullscreen.html +2 -1
  91. package/BookReaderDemo/demo-iiif.html +2 -1
  92. package/BookReaderDemo/demo-internetarchive.html +84 -17
  93. package/BookReaderDemo/demo-multiple.html +2 -1
  94. package/BookReaderDemo/demo-preview-pages.html +2 -1
  95. package/BookReaderDemo/demo-simple.html +2 -1
  96. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -1
  97. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  98. package/BookReaderDemo/immersion-1up.html +2 -1
  99. package/BookReaderDemo/immersion-mode.html +2 -1
  100. package/BookReaderDemo/toggle_controls.html +2 -1
  101. package/BookReaderDemo/view_mode.html +2 -1
  102. package/BookReaderDemo/viewmode-cycle.html +2 -3
  103. package/CHANGELOG.md +202 -0
  104. package/README.md +14 -1
  105. package/babel.config.js +18 -0
  106. package/codecov.yml +6 -0
  107. package/index.html +3 -0
  108. package/jsconfig.json +19 -0
  109. package/package.json +66 -56
  110. package/renovate.json +52 -0
  111. package/scripts/preversion.js +4 -1
  112. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  113. package/src/BookNavigator/assets/button-base.js +9 -2
  114. package/src/BookNavigator/assets/ia-logo.js +17 -0
  115. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  116. package/src/BookNavigator/assets/icon_close.js +1 -1
  117. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  118. package/src/BookNavigator/assets/{icon_sort_ascending.js → icon_sort_desc.js} +2 -2
  119. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  120. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  121. package/src/BookNavigator/book-navigator.js +583 -0
  122. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  123. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  124. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  125. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
  126. package/src/BookNavigator/bookmarks/bookmarks-provider.js +21 -8
  127. package/src/BookNavigator/bookmarks/ia-bookmarks.js +102 -66
  128. package/src/BookNavigator/delete-modal-actions.js +1 -1
  129. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  130. package/src/BookNavigator/downloads/downloads.js +41 -25
  131. package/src/BookNavigator/search/a-search-result.js +18 -13
  132. package/src/BookNavigator/search/search-provider.js +80 -28
  133. package/src/BookNavigator/search/search-results.js +10 -18
  134. package/src/BookNavigator/sharing.js +27 -0
  135. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
  136. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  137. package/src/BookNavigator/volumes/volumes-provider.js +93 -63
  138. package/src/BookNavigator/volumes/volumes.js +40 -46
  139. package/src/BookReader/BookModel.js +0 -29
  140. package/src/BookReader/DebugConsole.js +3 -3
  141. package/src/BookReader/DragScrollable.js +233 -0
  142. package/src/BookReader/Mode1Up.js +51 -351
  143. package/src/BookReader/Mode1UpLit.js +441 -0
  144. package/src/BookReader/Mode2Up.js +120 -105
  145. package/src/BookReader/ModeSmoothZoom.js +179 -0
  146. package/src/BookReader/ModeThumb.js +17 -11
  147. package/src/BookReader/Navbar/Navbar.js +10 -36
  148. package/src/BookReader/PageContainer.js +69 -6
  149. package/src/BookReader/ReduceSet.js +1 -1
  150. package/src/BookReader/Toolbar/Toolbar.js +10 -37
  151. package/src/BookReader/options.js +10 -0
  152. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  153. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  154. package/src/BookReader/utils.js +92 -13
  155. package/src/BookReader.js +431 -620
  156. package/src/assets/icons/close-circle-dark.svg +1 -0
  157. package/src/assets/icons/magnify-minus.svg +3 -7
  158. package/src/assets/icons/magnify-plus.svg +3 -7
  159. package/src/assets/icons/voice.svg +1 -0
  160. package/src/css/BookReader.scss +0 -12
  161. package/src/css/_BRComponent.scss +1 -1
  162. package/src/css/_BRmain.scss +19 -24
  163. package/src/css/_BRnav.scss +4 -26
  164. package/src/css/_BRpages.scss +35 -0
  165. package/src/css/_BRsearch.scss +25 -216
  166. package/src/css/_TextSelection.scss +14 -17
  167. package/src/css/_colorbox.scss +2 -2
  168. package/src/css/_controls.scss +17 -5
  169. package/src/css/_icons.scss +6 -0
  170. package/src/ia-bookreader/ia-bookreader.js +224 -0
  171. package/src/plugins/plugin.autoplay.js +4 -4
  172. package/src/plugins/plugin.chapters.js +28 -35
  173. package/src/plugins/plugin.mobile_nav.js +11 -10
  174. package/src/plugins/plugin.resume.js +3 -3
  175. package/src/plugins/plugin.text_selection.js +26 -39
  176. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  177. package/src/plugins/search/plugin.search.js +174 -116
  178. package/src/plugins/search/view.js +63 -179
  179. package/src/plugins/tts/AbstractTTSEngine.js +46 -37
  180. package/src/plugins/tts/FestivalTTSEngine.js +13 -14
  181. package/src/plugins/tts/PageChunk.js +15 -21
  182. package/src/plugins/tts/PageChunkIterator.js +8 -12
  183. package/src/plugins/tts/WebTTSEngine.js +66 -69
  184. package/src/plugins/tts/plugin.tts.js +92 -109
  185. package/src/plugins/tts/utils.js +0 -9
  186. package/src/plugins/url/UrlPlugin.js +184 -0
  187. package/src/plugins/{plugin.url.js → url/plugin.url.js} +28 -6
  188. package/src/util/manifestGenerator.js +0 -0
  189. package/tests/e2e/README.md +37 -0
  190. package/tests/e2e/autoplay.test.js +2 -2
  191. package/tests/e2e/base.test.js +7 -7
  192. package/tests/e2e/helpers/base.js +9 -3
  193. package/tests/e2e/helpers/debug.js +1 -1
  194. package/tests/e2e/helpers/desktopSearch.js +14 -13
  195. package/tests/e2e/helpers/mobileSearch.js +3 -3
  196. package/tests/e2e/helpers/params.js +17 -0
  197. package/tests/e2e/models/Navigation.js +13 -4
  198. package/tests/e2e/rightToLeft.test.js +4 -5
  199. package/tests/e2e/viewmode.test.js +38 -33
  200. package/tests/jest/BookNavigator/book-navigator.test.js +634 -0
  201. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  202. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  203. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  204. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  205. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  206. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  207. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  208. package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +102 -58
  209. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  210. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  211. package/tests/jest/BookNavigator/volumes/volumes-provider.test.js +184 -0
  212. package/tests/jest/BookNavigator/volumes/volumes.test.js +97 -0
  213. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +34 -14
  214. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +176 -0
  215. package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
  216. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  217. package/tests/jest/BookReader/Mode1UpLit.test.js +92 -0
  218. package/tests/{BookReader → jest/BookReader}/Mode2Up.test.js +36 -15
  219. package/tests/jest/BookReader/ModeSmoothZoom.test.js +149 -0
  220. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  221. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +7 -7
  222. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
  223. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  224. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  225. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  226. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  227. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  228. package/tests/jest/BookReader/utils.test.js +186 -0
  229. package/tests/jest/BookReader.keyboard.test.js +190 -0
  230. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  231. package/tests/{BookReader.test.js → jest/BookReader.test.js} +18 -37
  232. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  233. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
  234. package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +10 -11
  235. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  236. package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
  237. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  238. package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +39 -47
  239. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  240. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +63 -47
  241. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +35 -6
  242. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +9 -9
  243. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  244. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  245. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  246. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +1 -1
  247. package/tests/{plugins → jest/plugins}/tts/utils.test.js +3 -28
  248. package/tests/jest/plugins/url/UrlPlugin.test.js +190 -0
  249. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +33 -14
  250. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  251. package/tests/{util → jest/util}/docCookies.test.js +1 -1
  252. package/tests/{util → jest/util}/strings.test.js +1 -1
  253. package/tests/{utils.js → jest/utils.js} +38 -0
  254. package/webpack.config.js +11 -5
  255. package/.babelrc +0 -12
  256. package/.dependabot/config.yml +0 -6
  257. package/.testcaferc.json +0 -5
  258. package/BookReader/bookreader-component-bundle.js +0 -14275
  259. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  260. package/BookReader/bookreader-component-bundle.js.map +0 -1
  261. package/BookReader/icons/sort-ascending.svg +0 -1
  262. package/BookReader/icons/sort-descending.svg +0 -1
  263. package/BookReader/jquery-1.10.1.js +0 -108
  264. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  265. package/BookReader/plugins/plugin.menu_toggle.js +0 -369
  266. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  267. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  268. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  269. package/karma.conf.js +0 -23
  270. package/src/BookNavigator/BookModel.js +0 -14
  271. package/src/BookNavigator/BookNavigator.js +0 -448
  272. package/src/BookNavigator/assets/book-loader.js +0 -27
  273. package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
  274. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  275. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  276. package/src/ItemNavigator/ItemNavigator.js +0 -373
  277. package/src/ItemNavigator/providers/sharing.js +0 -29
  278. package/src/assets/icons/sort-ascending.svg +0 -1
  279. package/src/assets/icons/sort-descending.svg +0 -1
  280. package/src/dragscrollable-br.js +0 -261
  281. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  282. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  283. package/tests/BookReader/Mode1Up.test.js +0 -164
  284. package/tests/BookReader/utils.test.js +0 -109
  285. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  286. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  287. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  288. package/tests/karma/BookNavigator/volumes.test.js +0 -101
  289. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
@@ -1,34 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>bookreader demo</title>
5
-
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
7
- <meta name="apple-mobile-web-app-capable" content="yes">
8
-
9
- <!-- JS dependencies -->
10
- <script src="../BookReader/jquery-1.10.1.js"></script>
11
-
12
-
13
- <!-- BookReader and plugins -->
14
- <link rel="stylesheet" href="../BookReader/BookReader.css"/>
15
- <script src="../BookReader/BookReader.js"></script>
16
- <script type="text/javascript" src="../BookReader/plugins/plugin.url.js"></script>
17
- <script type="text/javascript" src="../BookReader/plugins/plugin.menu_toggle.js"></script>
18
-
19
- <!-- Custom CSS overrides -->
20
- <link rel="stylesheet" href="BookReaderDemo.css"/>
21
- </head>
22
- <body>
23
- <div id="BookReader">
24
- Internet Archive BookReader Demo<br/>
25
- plugin: Fullscreen menu toggle<br/>
26
- <noscript>
27
- <p>
28
- The BookReader requires JavaScript to be enabled. Please check that your browser supports JavaScript and that it is enabled in the browser settings. You can also try one of the <a href="https://archive.org/details/goodytwoshoes00newyiala"> other formats of the book</a>.
29
- </p>
30
- </noscript>
31
- </div>
32
- <script type="text/javascript" src="BookReaderJSAdvanced.js"></script>
33
- </body>
34
- </html>
package/karma.conf.js DELETED
@@ -1,23 +0,0 @@
1
- const { createDefaultConfig } = require('@open-wc/testing-karma');
2
- const merge = require('deepmerge');
3
-
4
- module.exports = (config) => {
5
- config.set(
6
- merge(createDefaultConfig(config), {
7
- files: [
8
- // runs all files ending with .test in the test folder,
9
- // can be overwritten by passing a --grep flag. examples:
10
- //
11
- // npm run test -- --grep test/foo/bar.test.js
12
- // npm run test -- --grep test/bar/*
13
- { pattern: config.grep ? config.grep : 'tests/karma/**/*.test.js', type: 'module' },
14
- ],
15
-
16
- esm: {
17
- nodeResolve: true,
18
- },
19
- // you can overwrite/extend the config further
20
- }),
21
- );
22
- return config;
23
- };
@@ -1,14 +0,0 @@
1
- export class Book {
2
- constructor() {
3
- this.metadata = {};
4
- this.isRestricted = null;
5
- }
6
-
7
- setMetadata(itemMetadata) {
8
- this.metadata = itemMetadata;
9
- }
10
-
11
- setRestriction(isRestricted) {
12
- this.isRestricted = isRestricted;
13
- }
14
- }
@@ -1,448 +0,0 @@
1
- import { css, html, LitElement } from 'lit-element';
2
- import { nothing } from 'lit-html';
3
- import SearchProvider from './search/search-provider.js';
4
- import DownloadProvider from './downloads/downloads-provider.js';
5
- import VisualAdjustmentProvider from './visual-adjustments/visual-adjustments-provider.js';
6
- import BookmarksProvider from './bookmarks/bookmarks-provider.js';
7
- import SharingProvider from '../ItemNavigator/providers/sharing.js';
8
- import VolumesProvider from './volumes/volumes-provider.js';
9
- import BRFullscreenMgr from './br-fullscreen-mgr.js';
10
- import { Book } from './BookModel.js';
11
- import bookLoader from './assets/book-loader.js';
12
-
13
- const events = {
14
- menuUpdated: 'menuUpdated',
15
- updateSideMenu: 'updateSideMenu',
16
- PostInit: 'PostInit',
17
- ViewportInFullScreen: 'ViewportInFullScreen',
18
- };
19
- export class BookNavigator extends LitElement {
20
- static get properties() {
21
- return {
22
- book: { type: Object },
23
- pageContainerSelector: { type: String },
24
- brWidth: { type: Number },
25
- bookReaderLoaded: { type: Boolean },
26
- bookreader: { type: Object },
27
- downloadableTypes: { type: Array },
28
- isAdmin: { type: Boolean },
29
- lendingInitialized: { type: Boolean },
30
- lendingStatus: { type: Object },
31
- menuProviders: { type: Object },
32
- menuShortcuts: { type: Array },
33
- sideMenuOpen: { type: Boolean },
34
- signedIn: { type: Boolean },
35
- };
36
- }
37
-
38
- constructor() {
39
- super();
40
- this.book = {};
41
- this.pageContainerSelector = '.BRcontainer';
42
- this.brWidth = 0;
43
- this.bookReaderCannotLoad = false;
44
- this.bookReaderLoaded = false;
45
- this.bookreader = null;
46
- this.downloadableTypes = [];
47
- this.isAdmin = false;
48
- this.lendingInitialized = false;
49
- this.lendingStatus = {};
50
- this.menuProviders = {};
51
- this.menuShortcuts = [];
52
- this.sideMenuOpen = false;
53
- this.signedIn = false;
54
-
55
- // Untracked properties
56
- this.fullscreenMgr = null;
57
- this.brResizeObserver = null;
58
- this.model = new Book();
59
- this.shortcutOrder = ['volumes', 'search', 'bookmarks'];
60
- }
61
-
62
- firstUpdated() {
63
- this.model.setMetadata(this.book);
64
- this.bindEventListeners();
65
- this.emitPostInit();
66
- }
67
-
68
- updated(changed) {
69
- if (!this.bookreader) {
70
- return;
71
- }
72
- const isFirstSideMenuUpdate = changed.has('sideMenuOpen') && (changed.get('sideMenuOpen') === undefined);
73
- if (!isFirstSideMenuUpdate) {
74
- // realign image
75
- if (this.bookreader.animating) {
76
- return;
77
- }
78
- this.bookreader.resize();
79
- const curIndex = this.bookreader.currentIndex();
80
- this.bookreader.jumpToIndex(curIndex);
81
- }
82
- }
83
-
84
- /**
85
- * Global event emitter for when Book Navigator loads
86
- */
87
- emitPostInit() {
88
- // emit global event when book nav has loaded with current bookreader selector
89
- this.dispatchEvent(new CustomEvent(`BrBookNav:${events.PostInit}`, {
90
- detail: { brSelector: this.bookreader?.el },
91
- bubbles: true,
92
- composed: true,
93
- }));
94
- }
95
-
96
- /**
97
- * Instantiates books submenus & their update callbacks
98
- *
99
- * NOTE: we are doing our best to scope bookreader's instance.
100
- * If your submenu provider uses a bookreader instance to read, manually
101
- * manipulate BookReader, please update the navigator's instance of it
102
- * to keep it in sync.
103
- */
104
- initializeBookSubmenus() {
105
- const bookreaderOptions = {...this.bookreader.options.multipleFilesList, baseHost: this.baseHost}
106
- this.menuProviders = {
107
- search: new SearchProvider(
108
- (brInstance = null) => {
109
- if (brInstance) {
110
- /* refresh br instance reference */
111
- this.bookreader = brInstance;
112
- }
113
- this.updateMenuContents();
114
- if (this.brWidth >= 640) { /* open side search menu */
115
- this.openSideSearchMenu();
116
- }
117
- },
118
- this.bookreader,
119
- ),
120
- downloads: new DownloadProvider(),
121
- visualAdjustments: new VisualAdjustmentProvider({
122
- onOptionChange: (event, brInstance = null) => {
123
- if (brInstance) {
124
- /* refresh br instance reference */
125
- this.bookreader = brInstance;
126
- }
127
- this.updateMenuContents();
128
- },
129
- bookContainerSelector: this.pageContainerSelector,
130
- bookreader: this.bookreader,
131
- }),
132
- share: new SharingProvider(this.book.metadata, this.baseHost, this.itemType),
133
- bookmarks: new BookmarksProvider(this.bookmarksOptions, this.bookreader),
134
- };
135
-
136
- // add shortcut for volumes if multipleBooksList exists
137
- console.log('br: ', this.bookreader.options.multipleBooksList)
138
- if (this.bookreader.options.multipleBooksList !== undefined) {
139
- this.menuProviders['volumes'] = new VolumesProvider(this.menuProviders, bookreaderOptions, this.bookreader),
140
- this.addMenuShortcut('volumes');
141
- }
142
- this.addMenuShortcut('search'); /* start with search as a shortcut */
143
- this.updateMenuContents();
144
- }
145
-
146
- /** gets element that houses the bookreader in light dom */
147
- get mainBRContainer() {
148
- return document.querySelector(this.bookreader.el);
149
- }
150
-
151
- get bookmarksOptions() {
152
- const referrerStr = `referer=${encodeURIComponent(location.href)}`
153
- return {
154
- loginUrl: `https://${this.baseHost}/account/login?${referrerStr}`,
155
- displayMode: this.signedIn ? 'bookmarks' : 'login',
156
- showItemNavigatorModal: this.showItemNavigatorModal.bind(this),
157
- closeItemNavigatorModal: this.closeItemNavigatorModal.bind(this),
158
- onBookmarksChanged: (bookmarks) => {
159
- const method = Object.keys(bookmarks).length ? 'add' : 'remove';
160
- this[`${method}MenuShortcut`]('bookmarks');
161
- this.updateMenuContents();
162
- },
163
- };
164
- }
165
-
166
- /**
167
- * Open side search menu
168
- */
169
- openSideSearchMenu() {
170
- const event = new CustomEvent(
171
- events.updateSideMenu, {
172
- detail: { menuId: 'search', action: 'open' },
173
- },
174
- );
175
- this.dispatchEvent(event);
176
- }
177
-
178
- /**
179
- * Sets order of menu and emits custom event when done
180
- */
181
- updateMenuContents() {
182
- const {
183
- search, downloads, visualAdjustments, share, bookmarks, volumes
184
- } = this.menuProviders;
185
- const availableMenus = [volumes, search, bookmarks, visualAdjustments, share].filter((menu) => !!menu);
186
-
187
- if (this.shouldShowDownloadsMenu()) {
188
- downloads.update(this.downloadableTypes);
189
- availableMenus.splice(1, 0, downloads);
190
- }
191
-
192
- const event = new CustomEvent(
193
- events.menuUpdated, {
194
- detail: availableMenus,
195
- },
196
- );
197
- console.log('availableMenus: ', availableMenus)
198
- this.dispatchEvent(event);
199
- }
200
-
201
- /**
202
- * Confirms if we should show the downloads menu
203
- * @returns {bool}
204
- */
205
- shouldShowDownloadsMenu() {
206
- if (this.model.isRestricted === false) { return true; }
207
- if (this.isAdmin) { return true; }
208
- const { user_loan_record = {} } = this.lendingStatus;
209
- const hasNoLoanRecord = Array.isArray(user_loan_record); /* (bc PHP assoc. arrays) */
210
-
211
- if (hasNoLoanRecord) { return false; }
212
-
213
- const hasValidLoan = user_loan_record.type && (user_loan_record.type !== 'SESSION_LOAN');
214
- return hasValidLoan;
215
- }
216
-
217
- /**
218
- * Adds a provider object to the menuShortcuts array property if it isn't
219
- * already added. menuShortcuts are then sorted by shortcutOrder and
220
- * a menuShortcutsUpdated event is emitted.
221
- *
222
- * @param {string} menuId - a string matching the id property of a provider
223
- */
224
- addMenuShortcut(menuId) {
225
- if (this.menuShortcuts.find((m) => m.id === menuId)) { return; }
226
-
227
- this.menuShortcuts.push(this.menuProviders[menuId]);
228
- this.sortMenuShortcuts();
229
- this.emitMenuShortcutsUpdated();
230
- }
231
-
232
- /**
233
- * Removes a provider object from the menuShortcuts array and emits a
234
- * menuShortcutsUpdated event.
235
- *
236
- * @param {string} menuId - a string matching the id property of a provider
237
- */
238
- removeMenuShortcut(menuId) {
239
- this.menuShortcuts = this.menuShortcuts.filter((m) => m.id !== menuId);
240
- this.emitMenuShortcutsUpdated();
241
- }
242
-
243
- /**
244
- * Sorts the menuShortcuts property by comparing each provider's id to
245
- * the id in each iteration over the shortcutOrder array.
246
- */
247
- sortMenuShortcuts() {
248
- console.log('this.menuShortcuts: ', this.menuShortcuts)
249
- this.menuShortcuts = this.shortcutOrder.reduce((shortcuts, id) => {
250
- const menu = this.menuShortcuts.find((m) => m.id === id);
251
- if (menu) { shortcuts.push(menu); }
252
- return shortcuts;
253
- }, []);
254
- }
255
-
256
- emitMenuShortcutsUpdated() {
257
- const event = new CustomEvent('menuShortcutsUpdated', {
258
- detail: this.menuShortcuts,
259
- });
260
- this.dispatchEvent(event);
261
- }
262
-
263
- /**
264
- * Core bookreader event handler registry
265
- *
266
- * NOTE: we are trying to keep bookreader's instance in scope
267
- * Please update Book Navigator's instance reference of it to keep it current
268
- */
269
- bindEventListeners() {
270
- window.addEventListener('BookReader:PostInit', (e) => {
271
- this.bookreader = e.detail.props;
272
- this.bookReaderLoaded = true;
273
- this.bookReaderCannotLoad = false;
274
- this.fullscreenMgr = new BRFullscreenMgr(this.bookreader.el);
275
-
276
- this.initializeBookSubmenus();
277
- setTimeout(() => this.bookreader.resize(), 0);
278
- this.brResizeObserver = new ResizeObserver((elements) => this.reactToBrResize(elements));
279
- this.brResizeObserver.observe(this.mainBRContainer);
280
- });
281
- window.addEventListener('BookReader:fullscreenToggled', (event) => {
282
- const { detail: { props: brInstance = null } } = event;
283
- if (brInstance) {
284
- this.bookreader = brInstance;
285
- }
286
- this.manageFullScreenBehavior(event);
287
- }, { passive: true });
288
- window.addEventListener('BookReader:ToggleSearchMenu', (event) => {
289
- this.dispatchEvent(new CustomEvent(events.updateSideMenu, {
290
- detail: { menuId: 'search', action: 'toggle' },
291
- }));
292
- });
293
- window.addEventListener('LendingFlow:PostInit', ({ detail }) => {
294
- const {
295
- downloadTypesAvailable, lendingStatus, isAdmin, previewType,
296
- } = detail;
297
- this.lendingInitialized = true;
298
- this.downloadableTypes = downloadTypesAvailable;
299
- this.lendingStatus = lendingStatus;
300
- this.isAdmin = isAdmin;
301
- this.bookReaderCannotLoad = previewType === 'singlePagePreview';
302
- });
303
- window.addEventListener('BRJSIA:PostInit', ({ detail }) => {
304
- const { isRestricted, downloadURLs } = detail;
305
- this.bookReaderLoaded = true;
306
- this.downloadableTypes = downloadURLs;
307
- this.model.setRestriction(isRestricted);
308
- });
309
- }
310
-
311
- /**
312
- * Uses resize observer to fire BookReader's `resize` functionality
313
- * We do not want to trigger resize IF:
314
- * - book animation is happening
315
- * - book is in fullscreen (fullscreen is handled separately)
316
- *
317
- * @param { Object } entries - resize observer entries
318
- */
319
- reactToBrResize(entries = []) {
320
- const startBrWidth = this.brWidth;
321
- const { animating } = this.bookreader;
322
-
323
- entries.forEach(({ contentRect, target }) => {
324
- if (target === this.mainBRContainer) {
325
- this.brWidth = contentRect.width;
326
- }
327
- });
328
- setTimeout(() => {
329
- if (startBrWidth && !animating) {
330
- this.bookreader.resize();
331
- }
332
- }, 0);
333
- }
334
-
335
- /**
336
- * Manages Fullscreen behavior
337
- * This makes sure that controls are _always_ in view
338
- * We need this to accommodate LOAN BAR during fullscreen
339
- */
340
- manageFullScreenBehavior() {
341
- this.emitFullScreenState();
342
-
343
- if (!this.bookreader.isFullscreen()) {
344
- this.fullscreenMgr.teardown();
345
- } else {
346
- this.fullscreenMgr.setup(this.bookreader);
347
- }
348
- }
349
-
350
- /**
351
- * Intercepts and relays fullscreen toggle events
352
- */
353
- emitFullScreenState() {
354
- const isFullScreen = this.bookreader.isFullscreen();
355
- const event = new CustomEvent('ViewportInFullScreen', {
356
- detail: { isFullScreen },
357
- });
358
- this.dispatchEvent(event);
359
- }
360
-
361
- emitShowItemNavigatorModal(e) {
362
- this.dispatchEvent(new CustomEvent('showItemNavigatorModal', {
363
- detail: e.detail,
364
- }));
365
- }
366
-
367
- emitCloseItemNavigatorModal() {
368
- this.dispatchEvent(new CustomEvent('closeItemNavigatorModal'));
369
- }
370
-
371
- showItemNavigatorModal(e) {
372
- this.emitShowItemNavigatorModal(e);
373
- }
374
-
375
- closeItemNavigatorModal() {
376
- this.emitCloseItemNavigatorModal();
377
- }
378
-
379
- get loader() {
380
- const loader = html`
381
- <div class="book-loader">${bookLoader}<div>
382
- <h3>Loading viewer</h3>
383
- `;
384
- return !this.bookReaderLoaded ? loader : nothing;
385
- }
386
-
387
- get loadingClass() {
388
- return !this.bookReaderLoaded ? 'loading' : '';
389
- }
390
-
391
- get itemImage() {
392
- const url = `https://${this.baseHost}/services/img/${this.book.metadata.identifier}`;
393
- return html`<img src="${url}" alt="cover image for ${this.book.metadata.identifier}">`;
394
- }
395
-
396
- render() {
397
- const placeholder = this.bookReaderCannotLoad ? this.itemImage : this.loader;
398
- return html`<div id="book-navigator" class="${this.loadingClass}">
399
- ${placeholder}
400
- <slot name="bookreader"></slot>
401
- </div>
402
- `;
403
- }
404
-
405
- static get styles() {
406
- return css`
407
- #book-navigator.loading {
408
- display: flex;
409
- align-items: center;
410
- justify-content: center;
411
- min-height: 30vh;
412
- }
413
-
414
- #book-navigator .book-loader {
415
- width: 30%;
416
- margin: auto;
417
- text-align: center;
418
- color: var(--primaryTextColor);
419
- }
420
-
421
- .book-loader svg {
422
- display: block;
423
- width: 60%;
424
- max-width: 100px;
425
- height: auto;
426
- margin: auto;
427
- }
428
-
429
- svg * {
430
- fill: var(--primaryTextColor);
431
- }
432
-
433
- svg .ring {
434
- animation: rotate 1.3s infinite linear;
435
- transform-origin: 50px 50px;
436
- transform-box: fill-box;
437
- }
438
-
439
- @keyframes rotate {
440
- 0% {
441
- transform: rotate(-360deg);
442
- }
443
- }
444
- `
445
- }
446
- }
447
-
448
- customElements.define('book-navigator', BookNavigator);
@@ -1,27 +0,0 @@
1
- import { html } from 'lit-element';
2
-
3
- export default html`
4
- <svg
5
- height="100"
6
- viewBox="0 0 100 100"
7
- width="100"
8
- xmlns="http://www.w3.org/2000/svg"
9
- aria-labelledby="bookreader-loading"
10
- >
11
- <title id="bookreader-loading">Currently loading viewer.</title>
12
- <desc>Please wait while we load book reader.</desc>
13
- <g fill="#333" fill-rule="evenodd" class="book-icon">
14
- <g transform="matrix(1 0 0 -1 28 67.362264)">
15
- <path d="m44.71698 31.6981124v-29.99320678s-18.0956599.30735848-18.6322637-.7171698c-.0633962-.12226414-1.890566-.59207545-2.9745282-.59207545-1.3228302 0-3.5122641 0-4.1286791.74547168-.9707547 1.17452827-18.82811278.71660375-18.82811278.71660375v30.040754l1.83849052.7867924.29094339-28.48188608s15.94981097.15339622 17.09094297-1.10716978c.8145283-.90056602 4.997547-.91641507 5.3450942-.3526415.9611321 1.55716977 14.7101883 1.31716978 17.6077354 1.45981128l.3266038 28.22830118z"/>
16
- <path d="m40.1129424 33.5957539h-12.8337733c-1.8690565 0-3.1098112-.7545283-3.9299999-1.6279245v-26.70452764l1.2362264-.00792453c.4584906.72962262 3.0922641 1.39415091 3.0922641 1.39415091h10.1298111s1.0381131.01754717 1.5141509.47377357c.5643396.54056602.7913207 1.36981129.7913207 1.36981129z"/>
17
- <path d="m17.3354713 33.5957539h-12.8337733v-25.37660316s0-.75283017.49358489-1.14113205c.52867924-.41433961 1.3415094-.42849055 1.3415094-.42849055h10.59905631s2.2075471-.52698112 3.0928301-1.39415091l1.2.00792453v26.74245214c-.8201886.8581132-2.0530188 1.59-3.8932074 1.59"/>
18
- </g>
19
- <path
20
- class="ring"
21
- d="m17.8618849 11.6970233c18.5864635-15.59603144 45.6875867-15.59603102 64.2740497.000001 1.9271446 1.6170806 2.1785128 4.4902567.5614466 6.4174186-1.6170661 1.9271618-4.4902166 2.1785323-6.4173612.5614517-15.1996922-12.75416882-37.3625282-12.75416916-52.5622206-.000001-15.19969387 12.7541707-19.04823077 34.5805019-9.1273354 51.7641499 9.9208955 17.183646 30.7471499 24.7638499 49.3923323 17.9774983 18.6451823-6.7863521 29.7266014-25.9801026 26.2811129-45.5206248-.436848-2.4775114 1.2174186-4.8400696 3.6949079-5.2769215 2.4774893-.4368518 4.8400264 1.2174296 5.2768744 3.694941 4.2132065 23.8945096-9.3373563 47.3649806-32.137028 55.6634567-22.799672 8.2984758-48.2663986-.9707372-60.39785211-21.9832155-12.1314534-21.012481-7.42539173-47.7021198 11.16107351-63.2981544z"
22
- fill-rule="nonzero"
23
- />
24
- </g>
25
- </svg>
26
- `;
27
-
@@ -1,5 +0,0 @@
1
- import { html } from 'lit-html';
2
-
3
- export default html`
4
- <svg name="descending" height="18" viewBox="0 0 18 18" width="18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m2.32514544 8.30769231.7756949-2.08468003h2.92824822l.75630252 2.08468003h1.01809955l-2.70523594-6.92307693h-1.01809955l-2.69553976 6.92307693zm3.41305753-2.86037492h-2.34647705l1.17323853-3.22883h.01939237z" fill="#fff" fill-rule="nonzero"/><path d="m7.1689722 16.6153846v-.7756949h-4.4117647l4.29541047-5.3716871v-.77569491h-5.06140918v.77569491h3.97543633l-4.30510666 5.3716871v.7756949z" fill="#fff" fill-rule="nonzero"/><path d="m10.3846154 11.0769231 2.7692308 5.5384615 2.7692307-5.5384615m-2.7692307 4.1538461v-13.15384612" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.661538" transform="matrix(1 0 0 -1 0 18.692308)"/></g></svg>
5
- `;
@@ -1,83 +0,0 @@
1
- import Debouncer from '../util/debouncer';
2
-
3
- /**
4
- * Manages fullscreen size
5
- * so that bookreader chrome is always visible
6
- * This is a shim to hold us until we update loan bar
7
- * https://drive.google.com/drive/folders/1Ym9FDMZPiM4EbNh3NU-_2h8kizIYaLWt
8
- */
9
- export default class BRFullscreenMgr {
10
- constructor(brSelector = '#BookReader') {
11
- this.debounceTime = 250;
12
- this.savedScrollY = 0;
13
- this.savedScrollX = 0;
14
- this.brSelector = brSelector;
15
-
16
- this.setup = this.setup.bind(this);
17
- this.teardown = this.teardown.bind(this);
18
- this.resizeBookReaderContainer = this.resizeBookReaderContainer.bind(this);
19
-
20
- this.handleResizeEvent = this.handleResizeEvent.bind(this);
21
-
22
- this.handleBookReaderHeight = new Debouncer(
23
- this.resizeBookReaderContainer, this.debounceTime, this,
24
- );
25
- }
26
-
27
- get brDom() {
28
- return document.querySelector(this.brSelector);
29
- }
30
-
31
- /**
32
- * Sets bookreader height
33
- * & adds resize, orientationchange listeners
34
- * & passes captured scroll positions
35
- *
36
- * @param {object} brInstance
37
- */
38
- setup(brInstance) {
39
- this.bookreader = brInstance;
40
-
41
- this.resizeBookReaderContainer();
42
- window.addEventListener('resize', this.handleResizeEvent);
43
- }
44
-
45
- /**
46
- * Resets BookReader height
47
- * & removes event handlers, resets captured scroll positions
48
- */
49
- teardown() {
50
- this.brDom.setAttribute('style', '');
51
- window.removeEventListener('resize', this.handleResizeEvent);
52
- window.scrollTo(this.savedScrollX, this.savedScrollY);
53
- this.savedScrollX = 0;
54
- this.savedScrollY = 0;
55
- }
56
-
57
- /**
58
- * Event listener for resize & orientationchange
59
- */
60
- handleResizeEvent() {
61
- this.handleBookReaderHeight.execute();
62
- }
63
-
64
- /**
65
- * Calculates & sets BookReader's needed height to
66
- * take the loan bar into account
67
- * + appends fullscreen classes to DOM
68
- */
69
- resizeBookReaderContainer() {
70
- const { scrollX, scrollY } = window;
71
- this.savedScrollX = scrollX;
72
- this.savedScrollY = scrollY;
73
- this.bookreader.updateBrClasses();
74
-
75
- const loanbar = document.querySelector('.BookReaderMessage');
76
- const loanbarHeight = loanbar?.offsetHeight ?? 0;
77
- const windowHeight = window.innerHeight;
78
- const newHeight = `${(windowHeight - loanbarHeight)}px`;
79
- this.brDom.style.height = newHeight;
80
- this.brDom.style.top = loanbarHeight;
81
- window.scrollTo(0, 0);
82
- }
83
- }