@internetarchive/collection-browser 0.2.15 → 0.2.16-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.
Files changed (250) hide show
  1. package/dist/index.d.ts +9 -0
  2. package/dist/index.js.map +1 -0
  3. package/dist/src/app-root.d.ts +33 -0
  4. package/dist/src/app-root.js +312 -0
  5. package/dist/src/app-root.js.map +1 -0
  6. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -0
  7. package/dist/src/assets/img/icons/arrow-left.js +10 -0
  8. package/dist/src/assets/img/icons/arrow-left.js.map +1 -0
  9. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
  10. package/dist/src/assets/img/icons/arrow-right.js +10 -0
  11. package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
  12. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  13. package/dist/src/assets/img/icons/chevron.js +4 -0
  14. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  15. package/dist/src/assets/img/icons/empty-query.d.ts +2 -0
  16. package/dist/src/assets/img/icons/empty-query.js +5 -0
  17. package/dist/src/assets/img/icons/empty-query.js.map +1 -0
  18. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  19. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  20. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  21. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  22. package/dist/src/assets/img/icons/eye.js +5 -0
  23. package/dist/src/assets/img/icons/eye.js.map +1 -0
  24. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -0
  25. package/dist/src/assets/img/icons/favorite-filled.js +11 -0
  26. package/dist/src/assets/img/icons/favorite-filled.js.map +1 -0
  27. package/dist/src/assets/img/icons/login-required.d.ts +1 -0
  28. package/dist/src/assets/img/icons/login-required.js +30 -0
  29. package/dist/src/assets/img/icons/login-required.js.map +1 -0
  30. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -0
  31. package/dist/src/assets/img/icons/mediatype/account.js +14 -0
  32. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -0
  33. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -0
  34. package/dist/src/assets/img/icons/mediatype/audio.js +14 -0
  35. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -0
  36. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -0
  37. package/dist/src/assets/img/icons/mediatype/collection.js +12 -0
  38. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -0
  39. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  40. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  41. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  42. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -0
  43. package/dist/src/assets/img/icons/mediatype/etree.js +14 -0
  44. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -0
  45. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -0
  46. package/dist/src/assets/img/icons/mediatype/film.js +14 -0
  47. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -0
  48. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -0
  49. package/dist/src/assets/img/icons/mediatype/images.js +13 -0
  50. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -0
  51. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  52. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  53. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  54. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -0
  55. package/dist/src/assets/img/icons/mediatype/software.js +13 -0
  56. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -0
  57. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -0
  58. package/dist/src/assets/img/icons/mediatype/texts.js +13 -0
  59. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -0
  60. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -0
  61. package/dist/src/assets/img/icons/mediatype/tv.js +14 -0
  62. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -0
  63. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -0
  64. package/dist/src/assets/img/icons/mediatype/video.js +14 -0
  65. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -0
  66. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -0
  67. package/dist/src/assets/img/icons/mediatype/web.js +13 -0
  68. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -0
  69. package/dist/src/assets/img/icons/null-result.d.ts +2 -0
  70. package/dist/src/assets/img/icons/null-result.js +5 -0
  71. package/dist/src/assets/img/icons/null-result.js.map +1 -0
  72. package/dist/src/assets/img/icons/restricted.d.ts +1 -0
  73. package/dist/src/assets/img/icons/restricted.js +29 -0
  74. package/dist/src/assets/img/icons/restricted.js.map +1 -0
  75. package/dist/src/assets/img/icons/reviews.d.ts +1 -0
  76. package/dist/src/assets/img/icons/reviews.js +11 -0
  77. package/dist/src/assets/img/icons/reviews.js.map +1 -0
  78. package/dist/src/assets/img/icons/upload.d.ts +1 -0
  79. package/dist/src/assets/img/icons/upload.js +12 -0
  80. package/dist/src/assets/img/icons/upload.js.map +1 -0
  81. package/dist/src/assets/img/icons/views.d.ts +1 -0
  82. package/dist/src/assets/img/icons/views.js +11 -0
  83. package/dist/src/assets/img/icons/views.js.map +1 -0
  84. package/dist/src/circular-activity-indicator.d.ts +5 -0
  85. package/dist/src/circular-activity-indicator.js +66 -0
  86. package/dist/src/circular-activity-indicator.js.map +1 -0
  87. package/dist/src/collection-browser.d.ts +216 -0
  88. package/dist/src/collection-browser.js +1249 -0
  89. package/dist/src/collection-browser.js.map +1 -0
  90. package/dist/src/collection-facets/more-facets-content.d.ts +56 -0
  91. package/dist/src/collection-facets/more-facets-content.js +374 -0
  92. package/dist/src/collection-facets/more-facets-content.js.map +1 -0
  93. package/dist/src/collection-facets/more-facets-pagination.d.ts +27 -0
  94. package/dist/src/collection-facets/more-facets-pagination.js +193 -0
  95. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -0
  96. package/dist/src/collection-facets.d.ts +80 -0
  97. package/dist/src/collection-facets.js +662 -0
  98. package/dist/src/collection-facets.js.map +1 -0
  99. package/dist/src/empty-placeholder.d.ts +11 -0
  100. package/dist/src/empty-placeholder.js +83 -0
  101. package/dist/src/empty-placeholder.js.map +1 -0
  102. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  103. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  104. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  105. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  106. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  107. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  108. package/dist/src/mediatype/mediatype-config.d.ts +3 -0
  109. package/dist/src/mediatype/mediatype-config.js +86 -0
  110. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  111. package/dist/src/models.d.ts +85 -0
  112. package/dist/src/models.js +62 -0
  113. package/dist/src/models.js.map +1 -0
  114. package/dist/src/restoration-state-handler.d.ts +38 -0
  115. package/dist/src/restoration-state-handler.js +204 -0
  116. package/dist/src/restoration-state-handler.js.map +1 -0
  117. package/dist/src/sort-filter-bar/alpha-bar.d.ts +9 -0
  118. package/dist/src/sort-filter-bar/alpha-bar.js +98 -0
  119. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -0
  120. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  121. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  122. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  123. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  124. package/dist/src/sort-filter-bar/img/list.js +5 -0
  125. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  126. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  127. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  128. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  129. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  130. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  131. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  132. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +107 -0
  133. package/dist/src/sort-filter-bar/sort-filter-bar.js +782 -0
  134. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -0
  135. package/dist/src/styles/item-image-styles.d.ts +8 -0
  136. package/dist/src/styles/item-image-styles.js +102 -0
  137. package/dist/src/styles/item-image-styles.js.map +1 -0
  138. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
  139. package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
  140. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  141. package/dist/src/tiles/grid/account-tile.d.ts +8 -0
  142. package/dist/src/tiles/grid/account-tile.js +126 -0
  143. package/dist/src/tiles/grid/account-tile.js.map +1 -0
  144. package/dist/src/tiles/grid/collection-tile.d.ts +7 -0
  145. package/dist/src/tiles/grid/collection-tile.js +159 -0
  146. package/dist/src/tiles/grid/collection-tile.js.map +1 -0
  147. package/dist/src/tiles/grid/item-tile.d.ts +21 -0
  148. package/dist/src/tiles/grid/item-tile.js +183 -0
  149. package/dist/src/tiles/grid/item-tile.js.map +1 -0
  150. package/dist/src/tiles/grid/tile-stats.d.ts +10 -0
  151. package/dist/src/tiles/grid/tile-stats.js +134 -0
  152. package/dist/src/tiles/grid/tile-stats.js.map +1 -0
  153. package/dist/src/tiles/image-block.d.ts +17 -0
  154. package/dist/src/tiles/image-block.js +136 -0
  155. package/dist/src/tiles/image-block.js.map +1 -0
  156. package/dist/src/tiles/item-image.d.ts +31 -0
  157. package/dist/src/tiles/item-image.js +118 -0
  158. package/dist/src/tiles/item-image.js.map +1 -0
  159. package/dist/src/tiles/list/account-label.d.ts +1 -0
  160. package/dist/src/tiles/list/account-label.js +7 -0
  161. package/dist/src/tiles/list/account-label.js.map +1 -0
  162. package/dist/src/tiles/list/date-label.d.ts +1 -0
  163. package/dist/src/tiles/list/date-label.js +13 -0
  164. package/dist/src/tiles/list/date-label.js.map +1 -0
  165. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
  166. package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
  167. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  168. package/dist/src/tiles/list/tile-list-compact.d.ts +20 -0
  169. package/dist/src/tiles/list/tile-list-compact.js +180 -0
  170. package/dist/src/tiles/list/tile-list-compact.js.map +1 -0
  171. package/dist/src/tiles/list/tile-list.d.ts +48 -0
  172. package/dist/src/tiles/list/tile-list.js +455 -0
  173. package/dist/src/tiles/list/tile-list.js.map +1 -0
  174. package/dist/src/tiles/mediatype-icon.d.ts +9 -0
  175. package/dist/src/tiles/mediatype-icon.js +82 -0
  176. package/dist/src/tiles/mediatype-icon.js.map +1 -0
  177. package/dist/src/tiles/overlay/icon-overlay.d.ts +7 -0
  178. package/dist/src/tiles/overlay/icon-overlay.js +43 -0
  179. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -0
  180. package/dist/src/tiles/overlay/text-overlay.d.ts +8 -0
  181. package/dist/src/tiles/overlay/text-overlay.js +57 -0
  182. package/dist/src/tiles/overlay/text-overlay.js.map +1 -0
  183. package/dist/src/tiles/tile-dispatcher.d.ts +36 -0
  184. package/dist/src/tiles/tile-dispatcher.js +215 -0
  185. package/dist/src/tiles/tile-dispatcher.js.map +1 -0
  186. package/dist/src/utils/format-count.d.ts +7 -0
  187. package/dist/src/utils/format-count.js +76 -0
  188. package/dist/src/utils/format-count.js.map +1 -0
  189. package/dist/src/utils/format-date.d.ts +2 -0
  190. package/dist/src/utils/format-date.js +24 -0
  191. package/dist/src/utils/format-date.js.map +1 -0
  192. package/dist/test/collection-browser.test.d.ts +1 -0
  193. package/dist/test/collection-browser.test.js +82 -0
  194. package/dist/test/collection-browser.test.js.map +1 -0
  195. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -0
  196. package/dist/test/collection-facets/more-facets-content.test.js +75 -0
  197. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -0
  198. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -0
  199. package/dist/test/collection-facets/more-facets-pagination.test.js +38 -0
  200. package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -0
  201. package/dist/test/empty-placeholder.test.d.ts +1 -0
  202. package/dist/test/empty-placeholder.test.js +34 -0
  203. package/dist/test/empty-placeholder.test.js.map +1 -0
  204. package/dist/test/icon-overlay.test.d.ts +1 -0
  205. package/dist/test/icon-overlay.test.js +31 -0
  206. package/dist/test/icon-overlay.test.js.map +1 -0
  207. package/dist/test/item-image.test.d.ts +1 -0
  208. package/dist/test/item-image.test.js +73 -0
  209. package/dist/test/item-image.test.js.map +1 -0
  210. package/dist/test/mediatype-config.test.d.ts +1 -0
  211. package/dist/test/mediatype-config.test.js +17 -0
  212. package/dist/test/mediatype-config.test.js.map +1 -0
  213. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -0
  214. package/dist/test/mocks/mock-collection-name-cache.js +14 -0
  215. package/dist/test/mocks/mock-collection-name-cache.js.map +1 -0
  216. package/dist/test/mocks/mock-search-responses.d.ts +3 -0
  217. package/dist/test/mocks/mock-search-responses.js +45 -0
  218. package/dist/test/mocks/mock-search-responses.js.map +1 -0
  219. package/dist/test/mocks/mock-search-service.d.ts +8 -0
  220. package/dist/test/mocks/mock-search-service.js +16 -0
  221. package/dist/test/mocks/mock-search-service.js.map +1 -0
  222. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -0
  223. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +122 -0
  224. package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -0
  225. package/dist/test/text-overlay.test.d.ts +1 -0
  226. package/dist/test/text-overlay.test.js +48 -0
  227. package/dist/test/text-overlay.test.js.map +1 -0
  228. package/dist/test/tile-stats.test.d.ts +1 -0
  229. package/dist/test/tile-stats.test.js +42 -0
  230. package/dist/test/tile-stats.test.js.map +1 -0
  231. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -0
  232. package/dist/test/tiles/grid/item-tile.test.js +96 -0
  233. package/dist/test/tiles/grid/item-tile.test.js.map +1 -0
  234. package/dist/test/utils/format-count.test.d.ts +1 -0
  235. package/dist/test/utils/format-count.test.js +24 -0
  236. package/dist/test/utils/format-count.test.js.map +1 -0
  237. package/dist/test/utils/format-date.test.d.ts +1 -0
  238. package/dist/test/utils/format-date.test.js +18 -0
  239. package/dist/test/utils/format-date.test.js.map +1 -0
  240. package/package.json +3 -1
  241. package/src/app-root.ts +29 -2
  242. package/src/assets/img/icons/arrow-left.ts +10 -0
  243. package/src/assets/img/icons/arrow-right.ts +10 -0
  244. package/src/collection-browser.ts +6 -0
  245. package/src/collection-facets/more-facets-content.ts +393 -0
  246. package/src/collection-facets/more-facets-pagination.ts +201 -0
  247. package/src/collection-facets.ts +117 -1
  248. package/test/collection-facets/more-facets-content.test.ts +113 -0
  249. package/test/collection-facets/more-facets-pagination.test.ts +70 -0
  250. package/test/mocks/mock-search-responses.ts +13 -0
@@ -0,0 +1,393 @@
1
+ /* eslint-disable dot-notation */
2
+ import {
3
+ css,
4
+ CSSResultGroup,
5
+ html,
6
+ LitElement,
7
+ nothing,
8
+ PropertyValues,
9
+ } from 'lit';
10
+ import { customElement, property, state } from 'lit/decorators.js';
11
+ import type {
12
+ Aggregation,
13
+ Bucket,
14
+ SearchServiceInterface,
15
+ SearchParams,
16
+ } from '@internetarchive/search-service';
17
+ import type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
18
+ import type { ModalManagerInterface } from '@internetarchive/modal-manager';
19
+ import { SelectedFacets, defaultSelectedFacets } from '../models';
20
+ import type { LanguageCodeHandlerInterface } from '../language-code-handler/language-code-handler';
21
+ import '@internetarchive/ia-activity-indicator/ia-activity-indicator';
22
+ import './more-facets-pagination';
23
+
24
+ @customElement('more-facets-content')
25
+ export class MoreFacetsContent extends LitElement {
26
+ @property({ type: String }) facetKey?: string;
27
+
28
+ @property({ type: String }) facetAggregationKey?: string;
29
+
30
+ @property({ type: String }) fullQuery?: string;
31
+
32
+ @property({ type: Object }) modalManager?: ModalManagerInterface;
33
+
34
+ @property({ type: Object }) searchService?: SearchServiceInterface;
35
+
36
+ @property({ type: Object })
37
+ collectionNameCache?: CollectionNameCacheInterface;
38
+
39
+ @property({ type: Object })
40
+ languageCodeHandler?: LanguageCodeHandlerInterface;
41
+
42
+ @property({ type: Object }) selectedFacets?: SelectedFacets;
43
+
44
+ @state() aggregations?: Record<string, Aggregation>;
45
+
46
+ @state() castedBuckets?: Bucket[] = [];
47
+
48
+ @state() pageNumber = 1;
49
+
50
+ /**
51
+ * Facets are loading on popup
52
+ */
53
+ @state() facetsLoading = true;
54
+
55
+ @state() paginationSize = 0;
56
+
57
+ private facetsPerPage = 60; // TODO: Q. how many items we want to have on popup view
58
+
59
+ updated(changed: PropertyValues) {
60
+ if (changed.has('facetKey')) {
61
+ this.facetsLoading = true;
62
+ this.pageNumber = 1;
63
+
64
+ this.updateSpecificFacets();
65
+ }
66
+ }
67
+
68
+ firstUpdated() {
69
+ this.setupEscapeListeners();
70
+ }
71
+
72
+ /**
73
+ * Close more facets modal on Escape click
74
+ */
75
+ private setupEscapeListeners() {
76
+ if (this.modalManager) {
77
+ document.addEventListener('keydown', (e: KeyboardEvent) => {
78
+ if (e.key === 'Escape') {
79
+ this.modalManager?.closeModal();
80
+ }
81
+ });
82
+ } else {
83
+ document.removeEventListener('keydown', () => {});
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Get specific facets data from search-service API based of currently query params
89
+ * - this.aggregations - hold result of search service and being used for further processing.
90
+ */
91
+ async updateSpecificFacets(): Promise<void> {
92
+ const aggregations = {
93
+ advancedParams: [
94
+ {
95
+ field: this.facetAggregationKey as string,
96
+ size: 1000000, // todo - do we want to have all the records at once?
97
+ },
98
+ ],
99
+ };
100
+
101
+ const params: SearchParams = {
102
+ query: this.fullQuery as string,
103
+ fields: ['identifier'],
104
+ aggregations,
105
+ rows: 1, // todo - do we want server-side pagination with offset/page/limit flag?
106
+ };
107
+
108
+ const results = await this.searchService?.search(params);
109
+ this.aggregations = results?.success?.response.aggregations as any;
110
+
111
+ // filter facets data to be rendered in modal-manager
112
+ await this.filterFacets();
113
+ this.facetsLoading = false;
114
+ }
115
+
116
+ /**
117
+ * Filter facets data stored in this.aggregations, eg.
118
+ * - we don't want to entertain year_histogram data since we using new date-picker
119
+ * - name of collections needs to be load inside cache using this.collectionNameCache
120
+ *
121
+ * this.castedBuckets - hold filtered facets data which will be render in modal
122
+ */
123
+ async filterFacets(): Promise<void> {
124
+ Object.entries(this.aggregations ?? []).forEach(([key, buckets]) => {
125
+ if (key === 'year_histogram') return;
126
+
127
+ this.castedBuckets = buckets['buckets'] as Bucket[];
128
+
129
+ if (this.facetKey === 'collection') {
130
+ // for collections, we need to asynchronously load the collection name
131
+ // so we use the `async-collection-name` widget and for the rest, we have a static value to use
132
+ const collectionIds = this.castedBuckets?.map(option => option.key);
133
+ const collectionIdsArray = Array.from(
134
+ new Set(collectionIds)
135
+ ) as string[];
136
+ this.collectionNameCache?.preloadIdentifiers(collectionIdsArray);
137
+ }
138
+ });
139
+
140
+ const { length } = Object.keys(this.castedBuckets as []);
141
+ this.paginationSize = Math.ceil(length / this.facetsPerPage);
142
+ }
143
+
144
+ private pageNumberClicked(e: CustomEvent<{ page: string }>) {
145
+ const page = e?.detail?.page;
146
+ if (page) {
147
+ this.pageNumber = Number(page);
148
+ }
149
+ }
150
+
151
+ private get getMoreFacetsTemplate() {
152
+ this.facetsLoading = false;
153
+
154
+ // render only items which will be visible as per this.facetsPerPage
155
+ const currentPageContent = this.castedBuckets?.slice(
156
+ (this.pageNumber - 1) * this.facetsPerPage,
157
+ this.pageNumber * this.facetsPerPage
158
+ );
159
+
160
+ return html`<ul class="facet-list">
161
+ ${currentPageContent?.map(facet => {
162
+ let displayText = facet.key;
163
+
164
+ if (this.facetKey === 'language') {
165
+ displayText =
166
+ this.languageCodeHandler?.getLanguageNameFromCodeString(
167
+ displayText as string
168
+ ) ?? displayText;
169
+ }
170
+
171
+ return html`
172
+ <li class="facet-row">
173
+ <div class="facet-checkbox">
174
+ <input
175
+ type="checkbox"
176
+ class="selected-facets"
177
+ id="${facet.key}"
178
+ data-facet="${this.facetKey}"
179
+ .value="${facet.key}"
180
+ @click=${(e: Event) => {
181
+ this.facetClicked(e);
182
+ }}
183
+ />
184
+ </div>
185
+ <label
186
+ class="facet-info-display"
187
+ for="${facet.key}"
188
+ title=${facet.key}
189
+ >
190
+ <div class="facet-title">
191
+ ${this.facetKey !== 'collection'
192
+ ? html`${displayText}`
193
+ : html`<async-collection-name
194
+ .collectionNameCache=${this.collectionNameCache}
195
+ .identifier=${displayText}
196
+ placeholder="-"
197
+ ></async-collection-name>`}
198
+ </div>
199
+ <div class="facet-count">${facet.doc_count}</div>
200
+ </label>
201
+ </li>
202
+ `;
203
+ })}
204
+ </ul>`;
205
+ }
206
+
207
+ private facetClicked(e: Event) {
208
+ const { selectedFacets } = this;
209
+
210
+ const target = e.target as HTMLInputElement;
211
+ const { checked, value } = target;
212
+
213
+ let newFacets: SelectedFacets;
214
+ if (selectedFacets) {
215
+ newFacets = {
216
+ ...selectedFacets,
217
+ };
218
+ } else {
219
+ newFacets = defaultSelectedFacets;
220
+ }
221
+
222
+ if (checked) {
223
+ newFacets[this.facetKey as keyof typeof newFacets][value] = 'selected';
224
+ } else {
225
+ delete newFacets[this.facetKey as keyof typeof newFacets][value];
226
+ }
227
+
228
+ this.selectedFacets = newFacets;
229
+ }
230
+
231
+ private get loaderTemplate() {
232
+ return this.facetsLoading
233
+ ? html`<div class="facets-loader">
234
+ <ia-activity-indicator .mode="processing"></ia-activity-indicator>
235
+ </div>`
236
+ : nothing;
237
+ }
238
+
239
+ // render pagination if more then 1 page
240
+ private get facetsPaginationTemplate() {
241
+ return this.paginationSize > 1
242
+ ? html`<more-facets-pagination
243
+ .size=${this.paginationSize}
244
+ @pageNumberClicked=${this.pageNumberClicked}
245
+ ></more-facets-pagination>`
246
+ : nothing;
247
+ }
248
+
249
+ private get facetsContentTemplate() {
250
+ return html`
251
+ <div class="facets-content">${this.getMoreFacetsTemplate}</div>
252
+ ${this.paginationSize > 0
253
+ ? html`${this.facetsPaginationTemplate}
254
+ <div class="footer">
255
+ <button
256
+ class="btn btn-cancel"
257
+ type="button"
258
+ @click=${this.cancelClick}
259
+ >
260
+ Cancel
261
+ </button>
262
+ <button
263
+ class="btn btn-submit"
264
+ type="button"
265
+ @click=${this.applySearchFacetsClicked}
266
+ >
267
+ Apply filters
268
+ </button>
269
+ </div>`
270
+ : html`No result found. please try again later.`}
271
+ `;
272
+ }
273
+
274
+ render() {
275
+ return html`
276
+ <div id="more-facets-page">
277
+ <form>
278
+ ${this.facetsLoading
279
+ ? this.loaderTemplate
280
+ : this.facetsContentTemplate}
281
+ </form>
282
+ </div>
283
+ `;
284
+ }
285
+
286
+ private applySearchFacetsClicked() {
287
+ const event = new CustomEvent<SelectedFacets>('facetsChanged', {
288
+ detail: this.selectedFacets,
289
+ bubbles: true,
290
+ composed: true,
291
+ });
292
+ this.dispatchEvent(event);
293
+ this.modalManager?.closeModal();
294
+ }
295
+
296
+ private cancelClick() {
297
+ this.modalManager?.closeModal();
298
+ }
299
+
300
+ static get styles(): CSSResultGroup {
301
+ const modalSubmitButton = css`var(--primaryButtonBGColor, #194880)`;
302
+
303
+ return css`
304
+ #more-facets-page {
305
+ margin-bottom: 2rem;
306
+ }
307
+
308
+ .facets-content {
309
+ -webkit-column-width: 25rem;
310
+ -moz-column-width: 25rem;
311
+ column-width: 25rem;
312
+ font-size: 1.2rem;
313
+ padding: 0 10px;
314
+ }
315
+
316
+ ul.facet-list {
317
+ list-style: none;
318
+ margin: 0;
319
+ padding: 0;
320
+ }
321
+ ul.facet-list li {
322
+ margin-bottom: 2px;
323
+ }
324
+
325
+ .facet-row {
326
+ text-align: left;
327
+ display: flex;
328
+ align-items: start;
329
+ font-weight: 500;
330
+ font-size: 1.2rem;
331
+ }
332
+ .facet-row input {
333
+ margin: 1px 5px 1px 0;
334
+ vertical-align: middle;
335
+ }
336
+ .facet-info-display {
337
+ display: flex;
338
+ flex: 1 1 0%;
339
+ cursor: pointer;
340
+ }
341
+ .facet-title {
342
+ flex: 1 1 0%;
343
+ }
344
+ .facet-count {
345
+ margin-left: 5px;
346
+ }
347
+
348
+ .page-number {
349
+ background: none;
350
+ border: 0;
351
+ cursor: pointer;
352
+ border-radius: 100%;
353
+ width: 25px;
354
+ height: 25px;
355
+ margin: 10px;
356
+ font-size: 1.4rem;
357
+ vertical-align: middle;
358
+ }
359
+ .current-page {
360
+ background: black;
361
+ color: white;
362
+ }
363
+ .facets-loader {
364
+ text-align: center;
365
+ margin-bottom: 2rem;
366
+ height: 7rem;
367
+ width: 7rem;
368
+ display: inline-block;
369
+ }
370
+
371
+ .btn {
372
+ border: none;
373
+ padding: 10px;
374
+ margin-bottom: 10px;
375
+ width: auto;
376
+ border-radius: 0.4rem;
377
+ cursor: pointer;
378
+ }
379
+ .btn-cancel {
380
+ background-color: #000;
381
+ color: white;
382
+ }
383
+ .btn-submit {
384
+ background-color: ${modalSubmitButton};
385
+ color: white;
386
+ }
387
+
388
+ .footer {
389
+ margin-top: 10px;
390
+ }
391
+ `;
392
+ }
393
+ }
@@ -0,0 +1,201 @@
1
+ import { css, CSSResultGroup, html, LitElement, nothing } from 'lit';
2
+ import { customElement, property, state } from 'lit/decorators.js';
3
+ import arrowLeftIcon from '../assets/img/icons/arrow-left';
4
+ import arrowRightIcon from '../assets/img/icons/arrow-right';
5
+
6
+ @customElement('more-facets-pagination')
7
+ export class MoreFacetsPagination extends LitElement {
8
+ /**
9
+ * Total number of pages
10
+ */
11
+ @property({ type: Number }) size?: any | undefined;
12
+
13
+ /**
14
+ * Number of pages can be moved in back/forward
15
+ */
16
+ @property({ type: Number }) step = 2;
17
+
18
+ @state() pages?: number[] = [];
19
+
20
+ @state() currentPage = 1;
21
+
22
+ firstUpdated() {
23
+ this.observePageCount();
24
+ }
25
+
26
+ observePageCount() {
27
+ this.pages = [];
28
+ let startPage = this.currentPage - this.step;
29
+ let endPage = this.currentPage + this.step;
30
+
31
+ if (startPage <= 0) {
32
+ endPage += -startPage + 1;
33
+ startPage = 1;
34
+ }
35
+
36
+ if (endPage >= this.size) {
37
+ startPage = Math.max(startPage - (endPage - this.size), 1);
38
+ endPage = this.size;
39
+ }
40
+
41
+ // create first page node
42
+ this.createFirstNode(startPage);
43
+
44
+ // create middle pages node
45
+ this.createMiddelNode(startPage, endPage);
46
+
47
+ // create last page node
48
+ this.createLastNode(endPage);
49
+ }
50
+
51
+ private createFirstNode(startPage: number) {
52
+ if (startPage > 1) {
53
+ this.pages?.push(1);
54
+ this.pages?.push(0); // let's asssume 0 is for ellipsis template
55
+ }
56
+ }
57
+
58
+ private createMiddelNode(startPage: number, endPage: number) {
59
+ for (let page = startPage; page <= endPage; page += 1) {
60
+ this.pages?.push(page);
61
+ }
62
+ }
63
+
64
+ private createLastNode(endPage: number) {
65
+ if (endPage < this.size) {
66
+ this.pages?.push(0); // let's asssume 0 is for ellipsis template
67
+ this.pages?.push(this.size);
68
+ }
69
+ }
70
+
71
+ private get getEllipsisTemplate() {
72
+ return html`<i>...</i>`;
73
+ }
74
+
75
+ private emitPageClick() {
76
+ this.dispatchEvent(
77
+ new CustomEvent('pageNumberClicked', {
78
+ detail: { page: this.currentPage },
79
+ })
80
+ );
81
+ }
82
+
83
+ private onRewind() {
84
+ this.currentPage -= 1;
85
+ if (this.currentPage < 1) {
86
+ this.currentPage = 1;
87
+ }
88
+ this.observePageCount();
89
+ this.emitPageClick();
90
+ }
91
+
92
+ private onForward() {
93
+ this.currentPage += 1;
94
+ if (this.currentPage > this.size) {
95
+ this.currentPage = this.size;
96
+ }
97
+ this.observePageCount();
98
+ this.emitPageClick();
99
+ }
100
+
101
+ private onChange(page: number) {
102
+ this.currentPage = page;
103
+ this.observePageCount();
104
+ this.emitPageClick();
105
+ }
106
+
107
+ private getPageTemplate(page: number) {
108
+ return html`
109
+ <button
110
+ @click="${() => this.onChange(page)}"
111
+ class="${this.currentPage === page ? 'current' : nothing}"
112
+ >
113
+ ${page}
114
+ </button>
115
+ `;
116
+ }
117
+
118
+ private get getPagesTemplate() {
119
+ return html`
120
+ ${this.pages?.map(
121
+ page =>
122
+ html`${page !== 0
123
+ ? this.getPageTemplate(page)
124
+ : this.getEllipsisTemplate}`
125
+ )}
126
+ `;
127
+ }
128
+
129
+ render() {
130
+ return html`
131
+ <div class="facets-pagination">
132
+ <button class="arrow-icon" @click=${this.onRewind}>
133
+ <span class="sr-only">Rewind pagination:</span>
134
+ ${arrowLeftIcon}
135
+ </button>
136
+ <div class="page-numbers">${this.getPagesTemplate}</div>
137
+ <button class="arrow-icon" @click=${this.onForward}>
138
+ <span class="sr-only">Forward pagination:</span>
139
+ ${arrowRightIcon}
140
+ </button>
141
+ </div>
142
+ `;
143
+ }
144
+
145
+ static get styles(): CSSResultGroup {
146
+ return css`
147
+ .facets-pagination {
148
+ user-select: none;
149
+ margin-top: 10px;
150
+ background-color: #eee;
151
+ text-align: center;
152
+ font-size: 3.2rem;
153
+ }
154
+ .facets-pagination button {
155
+ border: none;
156
+ background: none;
157
+ }
158
+ .facets-pagination .arrow-icon {
159
+ width: 2.5rem;
160
+ vertical-align: initial;
161
+ }
162
+
163
+ .facets-pagination button,
164
+ .facets-pagination i {
165
+ background: none;
166
+ border: 0;
167
+ cursor: pointer;
168
+ border-radius: 100%;
169
+ margin: 10px;
170
+ padding: 5px;
171
+ font-size: 1.4rem;
172
+ vertical-align: middle;
173
+ display: inline-block;
174
+ min-width: 2.5rem;
175
+ }
176
+ .facets-pagination i {
177
+ cursor: auto;
178
+ display: inline;
179
+ }
180
+ .facets-pagination button.current {
181
+ background: black;
182
+ color: white;
183
+ }
184
+
185
+ .page-numbers {
186
+ display: inline-block;
187
+ }
188
+
189
+ .sr-only {
190
+ position: absolute;
191
+ width: 1px;
192
+ height: 1px;
193
+ padding: 0;
194
+ margin: -1px;
195
+ overflow: hidden;
196
+ clip: rect(0, 0, 0, 0);
197
+ border: 0;
198
+ }
199
+ `;
200
+ }
201
+ }