@internetarchive/bookreader 5.0.0-88-alpha.7 → 5.0.0-88-alpha.9

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.
Files changed (183) hide show
  1. package/babel.config.js +30 -12
  2. package/dist/esm/BookNavigator/assets/bookmark-colors.js +4 -0
  3. package/dist/esm/BookNavigator/assets/button-base.js +4 -0
  4. package/dist/esm/BookNavigator/assets/ia-logo.js +4 -0
  5. package/dist/esm/BookNavigator/assets/icon_checkmark.js +8 -0
  6. package/dist/esm/BookNavigator/assets/icon_close.js +4 -0
  7. package/dist/esm/BookNavigator/book-navigator.js +612 -0
  8. package/dist/esm/BookNavigator/bookmarks/bookmark-button.js +35 -0
  9. package/dist/esm/BookNavigator/bookmarks/bookmark-edit.js +78 -0
  10. package/dist/esm/BookNavigator/bookmarks/bookmarks-list.js +160 -0
  11. package/dist/esm/BookNavigator/bookmarks/bookmarks-loginCTA.js +24 -0
  12. package/dist/esm/BookNavigator/bookmarks/bookmarks-provider.js +55 -0
  13. package/dist/esm/BookNavigator/bookmarks/ia-bookmarks.js +521 -0
  14. package/dist/esm/BookNavigator/delete-modal-actions.js +29 -0
  15. package/dist/esm/BookNavigator/downloads/downloads-provider.js +84 -0
  16. package/dist/esm/BookNavigator/downloads/downloads.js +69 -0
  17. package/dist/esm/BookNavigator/search/search-provider.js +238 -0
  18. package/dist/esm/BookNavigator/search/search-results.js +161 -0
  19. package/dist/esm/BookNavigator/sharing.js +26 -0
  20. package/dist/esm/BookNavigator/viewable-files.js +94 -0
  21. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments-provider.js +83 -0
  22. package/dist/esm/BookNavigator/visual-adjustments/visual-adjustments.js +131 -0
  23. package/dist/esm/BookReader/BookModel.js +575 -0
  24. package/dist/esm/BookReader/DragScrollable.js +224 -0
  25. package/dist/esm/BookReader/ImageCache.js +122 -0
  26. package/dist/esm/BookReader/Mode1Up.js +114 -0
  27. package/dist/esm/BookReader/Mode1UpLit.js +579 -0
  28. package/dist/esm/BookReader/Mode2Up.js +106 -0
  29. package/dist/esm/BookReader/Mode2UpLit.js +1020 -0
  30. package/dist/esm/BookReader/ModeCoordinateSpace.js +28 -0
  31. package/dist/esm/BookReader/ModeSmoothZoom.js +318 -0
  32. package/dist/esm/BookReader/ModeThumb.js +366 -0
  33. package/dist/esm/BookReader/Navbar/Navbar.js +253 -0
  34. package/dist/esm/BookReader/PageContainer.js +165 -0
  35. package/dist/esm/BookReader/ReduceSet.js +27 -0
  36. package/dist/esm/BookReader/Toolbar/Toolbar.js +242 -0
  37. package/dist/esm/BookReader/events.js +20 -0
  38. package/dist/esm/BookReader/options.js +331 -0
  39. package/dist/esm/BookReader/utils/HTMLDimensionsCacher.js +48 -0
  40. package/dist/esm/BookReader/utils/ScrollClassAdder.js +31 -0
  41. package/dist/esm/BookReader/utils/SelectionObserver.js +42 -0
  42. package/dist/esm/BookReader/utils/classes.js +37 -0
  43. package/dist/esm/BookReader/utils.js +315 -0
  44. package/dist/esm/BookReader.js +1827 -0
  45. package/dist/esm/assets/icons/1up.svg +12 -0
  46. package/dist/esm/assets/icons/2up.svg +15 -0
  47. package/dist/esm/assets/icons/advance.svg +26 -0
  48. package/dist/esm/assets/icons/chevron-right.svg +1 -0
  49. package/dist/esm/assets/icons/close-circle-dark.svg +1 -0
  50. package/dist/esm/assets/icons/close-circle.svg +1 -0
  51. package/dist/esm/assets/icons/fullscreen.svg +17 -0
  52. package/dist/esm/assets/icons/fullscreen_exit.svg +17 -0
  53. package/dist/esm/assets/icons/hamburger.svg +15 -0
  54. package/dist/esm/assets/icons/left-arrow.svg +12 -0
  55. package/dist/esm/assets/icons/magnify-minus.svg +12 -0
  56. package/dist/esm/assets/icons/magnify-plus.svg +13 -0
  57. package/dist/esm/assets/icons/magnify.svg +15 -0
  58. package/dist/esm/assets/icons/pause.svg +23 -0
  59. package/dist/esm/assets/icons/play.svg +22 -0
  60. package/dist/esm/assets/icons/playback-speed.svg +34 -0
  61. package/dist/esm/assets/icons/read-aloud.svg +22 -0
  62. package/dist/esm/assets/icons/review.svg +22 -0
  63. package/dist/esm/assets/icons/thumbnails.svg +17 -0
  64. package/dist/esm/assets/icons/voice.svg +1 -0
  65. package/dist/esm/assets/icons/volume-full.svg +22 -0
  66. package/dist/esm/assets/images/BRicons.png +0 -0
  67. package/dist/esm/assets/images/BRicons.svg +94 -0
  68. package/dist/esm/assets/images/BRicons_ia.png +0 -0
  69. package/dist/esm/assets/images/back_pages.png +0 -0
  70. package/dist/esm/assets/images/book_bottom_icon.png +0 -0
  71. package/dist/esm/assets/images/book_down_icon.png +0 -0
  72. package/dist/esm/assets/images/book_left_icon.png +0 -0
  73. package/dist/esm/assets/images/book_leftmost_icon.png +0 -0
  74. package/dist/esm/assets/images/book_right_icon.png +0 -0
  75. package/dist/esm/assets/images/book_rightmost_icon.png +0 -0
  76. package/dist/esm/assets/images/book_top_icon.png +0 -0
  77. package/dist/esm/assets/images/book_up_icon.png +0 -0
  78. package/dist/esm/assets/images/books_graphic.svg +177 -0
  79. package/dist/esm/assets/images/booksplit.png +0 -0
  80. package/dist/esm/assets/images/control_pause_icon.png +0 -0
  81. package/dist/esm/assets/images/control_play_icon.png +0 -0
  82. package/dist/esm/assets/images/embed_icon.png +0 -0
  83. package/dist/esm/assets/images/icon-home-ia.png +0 -0
  84. package/dist/esm/assets/images/icon_OL-logo-xs.png +0 -0
  85. package/dist/esm/assets/images/icon_alert-xs.png +0 -0
  86. package/dist/esm/assets/images/icon_book.svg +12 -0
  87. package/dist/esm/assets/images/icon_bookmark.svg +12 -0
  88. package/dist/esm/assets/images/icon_close-pop.png +0 -0
  89. package/dist/esm/assets/images/icon_download.png +0 -0
  90. package/dist/esm/assets/images/icon_gear.svg +14 -0
  91. package/dist/esm/assets/images/icon_hamburger.svg +20 -0
  92. package/dist/esm/assets/images/icon_home.png +0 -0
  93. package/dist/esm/assets/images/icon_home.svg +21 -0
  94. package/dist/esm/assets/images/icon_home_ia.png +0 -0
  95. package/dist/esm/assets/images/icon_indicator.png +0 -0
  96. package/dist/esm/assets/images/icon_info.svg +11 -0
  97. package/dist/esm/assets/images/icon_one_page.svg +8 -0
  98. package/dist/esm/assets/images/icon_pause.svg +1 -0
  99. package/dist/esm/assets/images/icon_play.svg +1 -0
  100. package/dist/esm/assets/images/icon_playback-rate.svg +15 -0
  101. package/dist/esm/assets/images/icon_return.png +0 -0
  102. package/dist/esm/assets/images/icon_search_button.svg +8 -0
  103. package/dist/esm/assets/images/icon_share.svg +9 -0
  104. package/dist/esm/assets/images/icon_skip-ahead.svg +6 -0
  105. package/dist/esm/assets/images/icon_skip-back.svg +13 -0
  106. package/dist/esm/assets/images/icon_speaker.svg +18 -0
  107. package/dist/esm/assets/images/icon_speaker_open.svg +10 -0
  108. package/dist/esm/assets/images/icon_thumbnails.svg +12 -0
  109. package/dist/esm/assets/images/icon_toc.svg +5 -0
  110. package/dist/esm/assets/images/icon_two_pages.svg +9 -0
  111. package/dist/esm/assets/images/icon_zoomer.png +0 -0
  112. package/dist/esm/assets/images/loading.gif +0 -0
  113. package/dist/esm/assets/images/logo_icon.png +0 -0
  114. package/dist/esm/assets/images/marker_chap-off.png +0 -0
  115. package/dist/esm/assets/images/marker_chap-off.svg +11 -0
  116. package/dist/esm/assets/images/marker_chap-off_ia.png +0 -0
  117. package/dist/esm/assets/images/marker_chap-on.png +0 -0
  118. package/dist/esm/assets/images/marker_chap-on.svg +11 -0
  119. package/dist/esm/assets/images/marker_srch-on.svg +11 -0
  120. package/dist/esm/assets/images/marker_srchchap-off.png +0 -0
  121. package/dist/esm/assets/images/marker_srchchap-on.png +0 -0
  122. package/dist/esm/assets/images/nav_control-dn.png +0 -0
  123. package/dist/esm/assets/images/nav_control-dn_ia.png +0 -0
  124. package/dist/esm/assets/images/nav_control-up.png +0 -0
  125. package/dist/esm/assets/images/nav_control-up_ia.png +0 -0
  126. package/dist/esm/assets/images/nav_control.png +0 -0
  127. package/dist/esm/assets/images/one_page_mode_icon.png +0 -0
  128. package/dist/esm/assets/images/paper-badge.png +0 -0
  129. package/dist/esm/assets/images/print_icon.png +0 -0
  130. package/dist/esm/assets/images/progressbar.gif +0 -0
  131. package/dist/esm/assets/images/right_edges.png +0 -0
  132. package/dist/esm/assets/images/slider.png +0 -0
  133. package/dist/esm/assets/images/slider_ia.png +0 -0
  134. package/dist/esm/assets/images/thumbnail_mode_icon.png +0 -0
  135. package/dist/esm/assets/images/transparent.png +0 -0
  136. package/dist/esm/assets/images/two_page_mode_icon.png +0 -0
  137. package/dist/esm/assets/images/unviewable_page.png +0 -0
  138. package/dist/esm/assets/images/zoom_in_icon.png +0 -0
  139. package/dist/esm/assets/images/zoom_out_icon.png +0 -0
  140. package/dist/esm/css/BookReader.scss +85 -0
  141. package/dist/esm/css/_BRBookmarks.scss +29 -0
  142. package/dist/esm/css/_BRComponent.scss +13 -0
  143. package/dist/esm/css/_BRfloat.scss +197 -0
  144. package/dist/esm/css/_BRicon.scss +54 -0
  145. package/dist/esm/css/_BRmain.scss +262 -0
  146. package/dist/esm/css/_BRnav.scss +354 -0
  147. package/dist/esm/css/_BRpages.scss +213 -0
  148. package/dist/esm/css/_BRsearch.scss +268 -0
  149. package/dist/esm/css/_BRtoolbar.scss +84 -0
  150. package/dist/esm/css/_BRvendor.scss +5 -0
  151. package/dist/esm/css/_TextSelection.scss +108 -0
  152. package/dist/esm/css/_colorbox.scss +52 -0
  153. package/dist/esm/css/_controls.scss +257 -0
  154. package/dist/esm/css/_icons.scss +121 -0
  155. package/dist/esm/ia-bookreader/ia-bookreader.js +141 -0
  156. package/dist/esm/jquery-wrapper.js +3 -0
  157. package/dist/esm/plugins/plugin.archive_analytics.js +72 -0
  158. package/dist/esm/plugins/plugin.autoplay.js +119 -0
  159. package/dist/esm/plugins/plugin.chapters.js +288 -0
  160. package/dist/esm/plugins/plugin.iframe.js +44 -0
  161. package/dist/esm/plugins/plugin.iiif.js +146 -0
  162. package/dist/esm/plugins/plugin.resume.js +66 -0
  163. package/dist/esm/plugins/plugin.text_selection.js +621 -0
  164. package/dist/esm/plugins/plugin.vendor-fullscreen.js +227 -0
  165. package/dist/esm/plugins/search/plugin.search.js +499 -0
  166. package/dist/esm/plugins/search/utils.js +42 -0
  167. package/dist/esm/plugins/search/view.js +360 -0
  168. package/dist/esm/plugins/tts/AbstractTTSEngine.js +282 -0
  169. package/dist/esm/plugins/tts/FestivalTTSEngine.js +192 -0
  170. package/dist/esm/plugins/tts/PageChunk.js +105 -0
  171. package/dist/esm/plugins/tts/PageChunkIterator.js +155 -0
  172. package/dist/esm/plugins/tts/WebTTSEngine.js +364 -0
  173. package/dist/esm/plugins/tts/plugin.tts.js +315 -0
  174. package/dist/esm/plugins/tts/tooltip_dict.js +14 -0
  175. package/dist/esm/plugins/tts/utils.js +79 -0
  176. package/dist/esm/plugins/url/UrlPlugin.js +197 -0
  177. package/dist/esm/plugins/url/plugin.url.js +212 -0
  178. package/dist/esm/util/browserSniffing.js +56 -0
  179. package/dist/esm/util/debouncer.js +25 -0
  180. package/dist/esm/util/docCookies.js +75 -0
  181. package/dist/esm/util/strings.js +34 -0
  182. package/jsconfig.json +1 -0
  183. package/package.json +13 -6
@@ -0,0 +1,521 @@
1
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9;
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
8
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
9
+ function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
10
+ import { LitElement, html, css, render } from 'lit';
11
+ // eslint-disable-next-line no-unused-vars
12
+ import { ModalConfig, ModalManager } from '@internetarchive/modal-manager';
13
+ import buttonStyles from '../assets/button-base.js';
14
+ import './bookmarks-loginCTA.js';
15
+ var api = {
16
+ endpoint: '/services/bookmarks.php',
17
+ headers: {
18
+ 'Content-Type': 'application/json'
19
+ },
20
+ delete(page) {
21
+ return fetch("".concat(this.endpoint, "?identifier=").concat(this.identifier, "&page_num=").concat(page), {
22
+ credentials: 'same-origin',
23
+ method: 'DELETE',
24
+ headers: this.headers
25
+ });
26
+ },
27
+ get(page) {
28
+ return fetch("".concat(this.endpoint, "?identifier=").concat(this.identifier, "&page_num=").concat(page), {
29
+ credentials: 'same-origin',
30
+ method: 'GET',
31
+ headers: this.headers
32
+ });
33
+ },
34
+ getAll() {
35
+ return fetch("".concat(this.endpoint, "?identifier=").concat(this.identifier), {
36
+ credentials: 'same-origin',
37
+ method: 'GET',
38
+ headers: this.headers
39
+ });
40
+ },
41
+ post(bookmark) {
42
+ return this.sendBookmarkData(bookmark, 'POST');
43
+ },
44
+ put(bookmark) {
45
+ return this.sendBookmarkData(bookmark, 'POST');
46
+ },
47
+ sendBookmarkData(bookmark, method) {
48
+ var notes = {
49
+ note: bookmark.note,
50
+ color: bookmark.color
51
+ };
52
+ return fetch("".concat(this.endpoint, "?identifier=").concat(this.identifier, "&page_num=").concat(bookmark.id), {
53
+ credentials: 'same-origin',
54
+ method,
55
+ headers: this.headers,
56
+ body: JSON.stringify({
57
+ notes
58
+ })
59
+ });
60
+ }
61
+ };
62
+ class IABookmarks extends LitElement {
63
+ static get properties() {
64
+ return {
65
+ activeBookmarkID: {
66
+ type: String
67
+ },
68
+ bookmarks: {
69
+ type: Array
70
+ },
71
+ bookreader: {
72
+ type: Object
73
+ },
74
+ displayMode: {
75
+ type: String
76
+ },
77
+ editedBookmark: {
78
+ type: Object
79
+ },
80
+ deleteModalConfig: {
81
+ type: Object
82
+ },
83
+ modal: {
84
+ attribute: false
85
+ },
86
+ loginOptions: {
87
+ type: Object,
88
+ attribute: false
89
+ }
90
+ };
91
+ }
92
+ static get styles() {
93
+ var mainCss = css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n .bookmarks {\n height: 100%;\n overflow: hidden;\n padding-bottom: 20px;\n }\n\n .list ia-bookmark-edit {\n display: none;\n }\n\n .edit ia-bookmarks-list {\n display: none;\n }\n "])));
94
+ return [buttonStyles, mainCss];
95
+ }
96
+ static formatPage(page) {
97
+ return isNaN(+page) ? "(".concat(page.replace(/\D/g, ''), ")") : page;
98
+ }
99
+ constructor() {
100
+ super();
101
+ this.bookmarks = [];
102
+ this.bookreader = {};
103
+ this.editedBookmark = {};
104
+ /** @type {ModalManager} */
105
+ this.modal = undefined;
106
+ this.loginOptions = {
107
+ loginClicked: () => {},
108
+ loginUrl: ''
109
+ };
110
+ /**
111
+ * Toggles display to either bookmarks or login cta
112
+ * @param {('bookmarks'|'login')} displayMode
113
+ */
114
+ this.displayMode = 'bookmarks';
115
+ this.bookmarkColors = [{
116
+ id: 0,
117
+ className: 'red'
118
+ }, {
119
+ id: 1,
120
+ className: 'blue'
121
+ }, {
122
+ id: 2,
123
+ className: 'green'
124
+ }];
125
+
126
+ // eslint-disable-next-line
127
+ this.defaultColor = this.bookmarkColors[0];
128
+ this.api = api;
129
+ this.deleteModalConfig = new ModalConfig({
130
+ title: 'Delete Bookmark',
131
+ headline: 'This bookmark contains a note. Deleting it will permanently delete the note. Are you sure?',
132
+ headerColor: '#194880'
133
+ });
134
+ }
135
+ updated(changed) {
136
+ if (changed.has('displayMode')) {
137
+ this.updateDisplay();
138
+ }
139
+ this.emitBookmarksChanged();
140
+ }
141
+ setup() {
142
+ this.api.identifier = this.getIdentifier();
143
+ if (this.displayMode === 'login') {
144
+ return;
145
+ }
146
+ this.fetchUserBookmarks();
147
+ this.setBREventListeners();
148
+ }
149
+
150
+ /**
151
+ * get identifier for current book including sub-files
152
+ *
153
+ * @returns Identifer
154
+ */
155
+ getIdentifier() {
156
+ if (this.bookreader.bookId !== this.bookreader.subPrefix) {
157
+ return "".concat(this.bookreader.bookId, "/").concat(this.bookreader.subPrefix);
158
+ }
159
+ return this.bookreader.bookId;
160
+ }
161
+ updateDisplay() {
162
+ if (this.displayMode === 'bookmarks') {
163
+ this.fetchUserBookmarks();
164
+ }
165
+ }
166
+ fetchUserBookmarks() {
167
+ var _this = this;
168
+ return _asyncToGenerator(function* () {
169
+ if (!_this.api.identifier) {
170
+ return;
171
+ }
172
+ yield _this.fetchBookmarks();
173
+ _this.initializeBookmarks();
174
+ })();
175
+ }
176
+ setBREventListeners() {
177
+ ['3PageViewSelected'].forEach(event => {
178
+ window.addEventListener("BookReader:".concat(event), e => {
179
+ setTimeout(() => {
180
+ // wait a lil bit so bookreader can draw its DOM to attach onto
181
+ this.renderBookmarkButtons();
182
+ }, 100);
183
+ });
184
+ });
185
+ ['pageChanged', '1PageViewSelected', '2PageViewSelected'].forEach(event => {
186
+ window.addEventListener("BookReader:".concat(event), e => {
187
+ setTimeout(() => {
188
+ // wait a lil bit so bookreader can draw its DOM to attach onto
189
+ this.renderBookmarkButtons();
190
+ this.markActiveBookmark();
191
+ }, 100);
192
+ });
193
+ });
194
+ ['zoomOut', 'zoomIn', 'resize'].forEach(event => {
195
+ window.addEventListener("BookReader:".concat(event), () => {
196
+ this.renderBookmarkButtons();
197
+ });
198
+ });
199
+ }
200
+ initializeBookmarks() {
201
+ this.renderBookmarkButtons();
202
+ this.markActiveBookmark(true);
203
+ this.emitBookmarksChanged();
204
+ }
205
+
206
+ /**
207
+ * @typedef {object} Bookmark
208
+ * @property {number} id - bookreader page index, becomes key store
209
+ * @property {number} color - color number
210
+ * @property {string} page - bookmark's page label to display
211
+ * @property {string} note - optional, note that one can add
212
+ * @property {string} thumbnail - optional, image url
213
+ */
214
+ /**
215
+ * Formats bookmark view model
216
+ * @param {Object} bookmarkAttrs
217
+ * @param {number} bookmarkAttrs.leafNum
218
+ * @param {string} bookmarkAttrs.notes
219
+ *
220
+ * @returns Bookmark
221
+ */
222
+ formatBookmark(_ref) {
223
+ var {
224
+ leafNum = '',
225
+ notes = {}
226
+ } = _ref;
227
+ var {
228
+ note = '',
229
+ color
230
+ } = notes;
231
+ var nomalizedParams = {
232
+ note,
233
+ color: this.getBookmarkColor(color) ? color : this.defaultColor.id
234
+ };
235
+ var page = IABookmarks.formatPage(this.bookreader.book.getPageNum(leafNum));
236
+ var thumbnail = this.bookreader.book.getPageURI("".concat(leafNum).replace(/\D/g, ''), 32); // Request thumbnail 1/32 the size of original image
237
+ var bookmark = _objectSpread(_objectSpread({}, nomalizedParams), {}, {
238
+ id: leafNum,
239
+ leafNum,
240
+ page,
241
+ thumbnail
242
+ });
243
+ return bookmark;
244
+ }
245
+ fetchBookmarks() {
246
+ var _this2 = this;
247
+ return _asyncToGenerator(function* () {
248
+ var resText = yield _this2.api.getAll().then(r => r.text());
249
+ var parsedResponse;
250
+ try {
251
+ parsedResponse = JSON.parse(resText);
252
+ } catch (e) {
253
+ parsedResponse = {
254
+ error: e.message
255
+ };
256
+ }
257
+ var {
258
+ success,
259
+ error = 'Something happened while fetching bookmarks.',
260
+ value: bkmrks = []
261
+ } = parsedResponse;
262
+ if (!success) {
263
+ var _console;
264
+ (_console = console) === null || _console === void 0 || _console.warn('Error fetching bookmarks', error);
265
+ }
266
+ var bookmarks = {};
267
+ Object.keys(bkmrks).forEach(leafNum => {
268
+ var bookmark = bkmrks[leafNum];
269
+ var formattedLeafNum = parseInt(leafNum, 10);
270
+ var formattedBookmark = _this2.formatBookmark(_objectSpread(_objectSpread({}, bookmark), {}, {
271
+ leafNum: formattedLeafNum
272
+ }));
273
+ bookmarks[leafNum] = formattedBookmark;
274
+ });
275
+ _this2.bookmarks = bookmarks;
276
+ return bookmarks;
277
+ })();
278
+ }
279
+ emitBookmarksChanged() {
280
+ this.dispatchEvent(new CustomEvent('bookmarksChanged', {
281
+ bubbles: true,
282
+ composed: true,
283
+ detail: {
284
+ bookmarks: this.bookmarks
285
+ }
286
+ }));
287
+ }
288
+ emitBookmarkButtonClicked() {
289
+ this.dispatchEvent(new CustomEvent('bookmarkButtonClicked', {
290
+ bubbles: true,
291
+ composed: true,
292
+ detail: {
293
+ editedBookmark: this.editedBookmark
294
+ }
295
+ }));
296
+ }
297
+ bookmarkButtonClicked(pageID) {
298
+ if (this.getBookmark(pageID)) {
299
+ this.confirmDeletion(pageID);
300
+ } else {
301
+ this.createBookmark(pageID);
302
+ }
303
+ }
304
+ renderBookmarkButtons() {
305
+ var pages = this.bookreader.$('.BRpagecontainer').not('.BRemptypage').get();
306
+ pages.forEach(pageEl => {
307
+ var existingButton = pageEl.querySelector('.bookmark-button');
308
+ if (existingButton) {
309
+ existingButton.remove();
310
+ }
311
+ var pageID = +pageEl.classList.value.match(/pagediv\d+/)[0].replace(/\D/g, '');
312
+ var pageBookmark = this.getBookmark(pageID);
313
+ var bookmarkState = pageBookmark ? 'filled' : 'hollow';
314
+ // eslint-disable-next-line
315
+ var pageData = this.bookreader.book.getPage(pageID);
316
+ var {
317
+ isViewable
318
+ } = pageData;
319
+ if (!isViewable) {
320
+ return;
321
+ }
322
+ var bookmarkButton = document.createElement('div');
323
+ ['mousedown', 'mouseup'].forEach(event => {
324
+ bookmarkButton.addEventListener(event, e => e.stopPropagation());
325
+ });
326
+ bookmarkButton.classList.add('bookmark-button', bookmarkState);
327
+ if (pageBookmark) {
328
+ bookmarkButton.classList.add(this.getBookmarkColor(pageBookmark.color));
329
+ }
330
+ var pageSide = pageEl.getAttribute('data-side') === 'L' && this.bookreader.mode === this.bookreader.constMode2up ? 'left' : 'right';
331
+ render(html(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n <bookmark-button\n @bookmarkButtonClicked=", "\n state=", "\n side=", "\n ></bookmark-button>"])), () => this.bookmarkButtonClicked(pageID), bookmarkState, pageSide), bookmarkButton);
332
+ pageEl.appendChild(bookmarkButton);
333
+ });
334
+ }
335
+
336
+ /**
337
+ * Notes which bookmark is active
338
+ *
339
+ * @param {boolean} atSetup - denotes the first time this is fired
340
+ */
341
+ markActiveBookmark() {
342
+ var atSetup = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
343
+ var {
344
+ mode,
345
+ constMode2up,
346
+ constModeThumb
347
+ } = this.bookreader;
348
+ var currentIndex = this.bookreader.currentIndex();
349
+ if (mode === constModeThumb) {
350
+ // keep active bookmark the same
351
+ // no syncing until we can verify when a bookmark is "in view"
352
+ var requestedPageHasBookmark = this.bookmarks[currentIndex];
353
+ if (atSetup && requestedPageHasBookmark) {
354
+ this.activeBookmarkID = currentIndex;
355
+ }
356
+ return;
357
+ }
358
+ // In 2up, we prefer the right side of the page to bookmark
359
+ // so let's make sure we light that one up.
360
+ if (mode === constMode2up) {
361
+ var pagesInView = this.bookreader.displayedIndices;
362
+ var pagesHaveActiveBookmark = pagesInView.includes(+this.activeBookmarkID);
363
+ if (pagesHaveActiveBookmark) {
364
+ return;
365
+ }
366
+ }
367
+
368
+ // If a bookmark exists with the current index, set it as active
369
+ if (this.bookmarks[currentIndex]) {
370
+ this.activeBookmarkID = currentIndex;
371
+ return;
372
+ }
373
+
374
+ // No bookmark for this page
375
+ this.activeBookmarkID = '';
376
+ }
377
+ bookmarkEdited(_ref2) {
378
+ var {
379
+ detail
380
+ } = _ref2;
381
+ var closeEdit = detail.bookmark.id === this.editedBookmark.id;
382
+ this.editedBookmark = closeEdit ? {} : detail.bookmark;
383
+ }
384
+
385
+ /**
386
+ * Gets bookmark by pageindex
387
+ * @param {number} id
388
+ */
389
+ getBookmark(id) {
390
+ return this.bookmarks[id];
391
+ }
392
+ getBookmarkColor(id) {
393
+ var _this$bookmarkColors$;
394
+ return (_this$bookmarkColors$ = this.bookmarkColors.find(m => m.id === id)) === null || _this$bookmarkColors$ === void 0 ? void 0 : _this$bookmarkColors$.className;
395
+ }
396
+
397
+ /**
398
+ * Adds bookmark for current page
399
+ */
400
+ addBookmark() {
401
+ var pageID = this.bookreader.currentIndex();
402
+ if (this.bookreader.mode === this.bookreader.constMode2up) {
403
+ var pagesInView = this.bookreader.displayedIndices;
404
+
405
+ // add bookmark to right hand page
406
+ pageID = pagesInView[pagesInView.length - 1];
407
+ }
408
+ this.createBookmark(pageID);
409
+ }
410
+
411
+ /**
412
+ * Creates bookmark for a given page
413
+ * @param {number} pageID
414
+ */
415
+ createBookmark(pageID) {
416
+ var existingBookmark = this.getBookmark(pageID);
417
+ if (existingBookmark) {
418
+ this.bookmarkEdited({
419
+ detail: {
420
+ bookmark: existingBookmark
421
+ }
422
+ });
423
+ this.emitBookmarkButtonClicked();
424
+ return;
425
+ }
426
+ this.editedBookmark = this.formatBookmark({
427
+ leafNum: pageID
428
+ });
429
+ this.api.post(this.editedBookmark);
430
+ this.bookmarks[pageID] = this.editedBookmark;
431
+ this.activeBookmarkID = pageID;
432
+ this.disableAddBookmarkButton = true;
433
+ this.renderBookmarkButtons();
434
+ this.emitBookmarkButtonClicked();
435
+ }
436
+ bookmarkSelected(_ref3) {
437
+ var {
438
+ detail
439
+ } = _ref3;
440
+ var {
441
+ leafNum
442
+ } = detail.bookmark;
443
+ this.bookreader.jumpToPage("".concat(this.bookreader.book.getPageNum("".concat(leafNum).replace(/\D/g, ''))));
444
+ this.activeBookmarkID = leafNum;
445
+ }
446
+ saveBookmark(_ref4) {
447
+ var {
448
+ detail
449
+ } = _ref4;
450
+ var existingBookmark = this.bookmarks[detail.bookmark.id];
451
+ Object.assign(existingBookmark, detail.bookmark);
452
+ this.api.put(existingBookmark);
453
+ this.editedBookmark = {};
454
+ this.renderBookmarkButtons();
455
+ }
456
+ confirmDeletion(pageID) {
457
+ var existingBookmark = this.getBookmark(pageID);
458
+ if (existingBookmark.note) {
459
+ this.displayDeletionModal(pageID);
460
+ return;
461
+ }
462
+ this.deleteBookmark({
463
+ detail: {
464
+ id: "".concat(pageID)
465
+ }
466
+ });
467
+ }
468
+ displayDeletionModal(pageID) {
469
+ var customModalContent = html(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n <delete-modal-actions\n .deleteAction=", "\n .cancelAction=", "\n .pageID=", "\n ></delete-modal-actions>\n "])), () => this.deleteBookmark({
470
+ detail: {
471
+ id: "".concat(pageID)
472
+ }
473
+ }), () => this.modal.closeModal(), pageID);
474
+ this.modal.showModal({
475
+ config: this.deleteModalConfig,
476
+ customModalContent
477
+ });
478
+ }
479
+ deleteBookmark(_ref5) {
480
+ var {
481
+ detail
482
+ } = _ref5;
483
+ var {
484
+ id
485
+ } = detail;
486
+ var currBookmarks = this.bookmarks;
487
+ delete currBookmarks[id];
488
+ this.bookmarks = _objectSpread({}, currBookmarks);
489
+ this.api.delete(detail.id);
490
+ this.editedBookmark = {};
491
+ this.modal.closeModal();
492
+ this.renderBookmarkButtons();
493
+ }
494
+
495
+ /**
496
+ * Tells us if we should allow user to add bookmark via menu panel
497
+ * returns { Boolean }
498
+ */
499
+ get shouldEnableAddBookmarkButton() {
500
+ var pageToCheck = this.bookreader.mode === this.bookreader.constMode2up ? this.bookreader.displayedIndices[this.bookreader.displayedIndices.length - 1] : this.bookreader.currentIndex();
501
+ var pageHasBookmark = this.getBookmark(pageToCheck);
502
+ return !!pageHasBookmark;
503
+ }
504
+ get allowAddingBookmark() {
505
+ return this.bookreader.mode !== this.bookreader.constModeThumb;
506
+ }
507
+ get addBookmarkButton() {
508
+ return html(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n <button\n class=\"ia-button primary\"\n tabindex=\"-1\"\n ?disabled=", "\n @click=", ">\n Add bookmark\n </button>\n "])), this.shouldEnableAddBookmarkButton, this.addBookmark);
509
+ }
510
+ get bookmarksList() {
511
+ return html(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n <ia-bookmarks-list\n @bookmarkEdited=", "\n @bookmarkSelected=", "\n @saveBookmark=", "\n @deleteBookmark=", "\n .editedBookmark=", "\n .bookmarks=", "\n .activeBookmarkID=", "\n .bookmarkColors=", "\n .defaultBookmarkColor=", ">\n </ia-bookmarks-list>\n "])), this.bookmarkEdited, this.bookmarkSelected, this.saveBookmark, this.deleteBookmark, this.editedBookmark, _objectSpread({}, this.bookmarks), this.activeBookmarkID, this.bookmarkColors, this.defaultColor);
512
+ }
513
+ get bookmarkHelperMessage() {
514
+ return html(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["<p>Please use 1up or 2up view modes to add bookmark.</p>"])));
515
+ }
516
+ render() {
517
+ var bookmarks = html(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n ", "\n ", "\n "])), this.bookmarksList, this.allowAddingBookmark ? this.addBookmarkButton : this.bookmarkHelperMessage);
518
+ return html(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n <section class=\"bookmarks\">\n ", "\n </section>\n "])), this.displayMode === 'login' ? html(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["<bookmarks-login\n @click=", "\n .url=", "></bookmarks-login>"])), () => this.loginOptions.loginClicked(), this.loginOptions.loginUrl) : bookmarks);
519
+ }
520
+ }
521
+ customElements.define('ia-bookmarks', IABookmarks);
@@ -0,0 +1,29 @@
1
+ var _templateObject, _templateObject2;
2
+ function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
3
+ import { LitElement, html, css } from 'lit';
4
+ export default class DeleteModalActions extends LitElement {
5
+ static get styles() {
6
+ return css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n div {\n display: flex;\n justify-content: center;\n padding-top: 2rem;\n }\n\n button {\n appearance: none;\n padding: 0.5rem 1rem;\n margin: 0 .5rem;\n box-sizing: border-box;\n font: 1.3rem \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n color: var(--primaryTextColor);\n border: none;\n border-radius: 4px;\n cursor: pointer;\n background: var(--primaryCTAFill);\n }\n\n .delete {\n background: var(--primaryErrorCTAFill);\n }\n "])));
7
+ }
8
+ static get properties() {
9
+ return {
10
+ cancelAction: {
11
+ type: Function
12
+ },
13
+ deleteAction: {
14
+ type: Function
15
+ },
16
+ pageID: {
17
+ type: String
18
+ }
19
+ };
20
+ }
21
+ render() {
22
+ return html(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n <div>\n <button class=\"delete\" @click=", ">Delete</button>\n <button @click=", ">Cancel</button>\n </div>\n "])), () => this.deleteAction({
23
+ detail: {
24
+ id: "".concat(this.pageID)
25
+ }
26
+ }), () => this.cancelAction());
27
+ }
28
+ }
29
+ customElements.define('delete-modal-actions', DeleteModalActions);
@@ -0,0 +1,84 @@
1
+ var _templateObject, _templateObject2;
2
+ function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
3
+ import { html } from 'lit';
4
+ import '@internetarchive/icon-dl/icon-dl';
5
+ import './downloads';
6
+ var menuBase = {
7
+ pdf: {
8
+ type: 'Encrypted Adobe PDF',
9
+ url: '#',
10
+ note: 'PDF files contain high quality images of pages.'
11
+ },
12
+ lcppdf: {
13
+ type: 'Get LCP PDF',
14
+ url: '#',
15
+ note: 'PDF files contain high quality images of pages.'
16
+ },
17
+ lcpepub: {
18
+ type: 'Get LCP ePub',
19
+ url: '#',
20
+ note: 'ePub files are smaller in size, but may contain errors.'
21
+ },
22
+ epub: {
23
+ type: 'Encrypted Adobe ePub',
24
+ url: '#',
25
+ note: 'ePub files are smaller in size, but may contain errors.'
26
+ }
27
+ };
28
+ var publicMenuBase = {
29
+ pdf: "PDF",
30
+ epub: "ePub",
31
+ lcppdf: "LCP PDF",
32
+ lcpepub: "LCP ePub"
33
+ };
34
+ export default class DownloadsProvider {
35
+ constructor(_ref) {
36
+ var _bookreader$options;
37
+ var {
38
+ bookreader
39
+ } = _ref;
40
+ this.icon = html(_templateObject || (_templateObject = _taggedTemplateLiteral(["<ia-icon-dl style=\"width: var(--iconWidth); height: var(--iconHeight);\"></ia-icon-dl>"])));
41
+ this.label = 'Downloadable files';
42
+ this.menuDetails = '';
43
+ this.downloads = [];
44
+ this.id = 'downloads';
45
+ this.component = '';
46
+ this.isBookProtected = (bookreader === null || bookreader === void 0 || (_bookreader$options = bookreader.options) === null || _bookreader$options === void 0 ? void 0 : _bookreader$options.isProtected) || false;
47
+ }
48
+ update(downloadTypes) {
49
+ this.computeAvailableTypes(downloadTypes);
50
+ this.component = this.menu;
51
+ this.component.isBookProtected = this.isBookProtected;
52
+ var ending = this.downloads.length === 1 ? '' : 's';
53
+ this.menuDetails = "(".concat(this.downloads.length, " format").concat(ending, ")");
54
+ }
55
+
56
+ /**
57
+ * Generates Download Menu Info for available types
58
+ * sets global `downloads`
59
+ * @param availableTypes
60
+ */
61
+ computeAvailableTypes() {
62
+ var _this = this;
63
+ var availableTypes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
64
+ var menuData = availableTypes.reduce(function (found) {
65
+ var incoming = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
66
+ var [type = '', link = ''] = incoming;
67
+ var formattedType = type.toLowerCase();
68
+ var downloadOption = menuBase[formattedType] || null;
69
+ if (downloadOption) {
70
+ var menuButtonText = _this.isBookProtected ? menuBase[formattedType].type : publicMenuBase[formattedType];
71
+ var menuInfo = Object.assign({}, downloadOption, {
72
+ url: link,
73
+ type: menuButtonText
74
+ });
75
+ found.push(menuInfo);
76
+ }
77
+ return found;
78
+ }, []);
79
+ this.downloads = menuData;
80
+ }
81
+ get menu() {
82
+ return html(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["<ia-book-downloads .downloads=", "></ia-book-downloads>"])), this.downloads);
83
+ }
84
+ }