@internetarchive/collection-browser 0.4.8 → 0.4.9-alpha.2

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 (225) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +26 -26
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.husky/pre-commit +4 -4
  7. package/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/index.d.ts +9 -9
  10. package/dist/index.js +9 -9
  11. package/dist/src/app-root.d.ts +50 -50
  12. package/dist/src/app-root.js +278 -278
  13. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  14. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  15. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  16. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  17. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  18. package/dist/src/assets/img/icons/chevron.js +2 -2
  19. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  20. package/dist/src/assets/img/icons/empty-query.js +2 -2
  21. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  22. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  23. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  24. package/dist/src/assets/img/icons/eye.js +2 -2
  25. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  26. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  27. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  28. package/dist/src/assets/img/icons/login-required.js +2 -2
  29. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  30. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  31. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  32. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  33. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  34. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  35. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  36. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  37. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  38. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  39. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  40. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  41. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  42. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  43. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  44. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  45. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  46. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  47. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  48. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  49. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  50. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  51. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  52. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  53. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  54. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  55. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  56. package/dist/src/assets/img/icons/null-result.js +2 -2
  57. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  58. package/dist/src/assets/img/icons/restricted.js +2 -2
  59. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  60. package/dist/src/assets/img/icons/reviews.js +2 -2
  61. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  62. package/dist/src/assets/img/icons/upload.js +2 -2
  63. package/dist/src/assets/img/icons/views.d.ts +1 -1
  64. package/dist/src/assets/img/icons/views.js +2 -2
  65. package/dist/src/circular-activity-indicator.d.ts +5 -5
  66. package/dist/src/circular-activity-indicator.js +17 -17
  67. package/dist/src/collection-browser.d.ts +281 -277
  68. package/dist/src/collection-browser.js +1203 -1194
  69. package/dist/src/collection-browser.js.map +1 -1
  70. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  71. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  72. package/dist/src/collection-facets/facets-template.d.ts +16 -16
  73. package/dist/src/collection-facets/facets-template.js +125 -125
  74. package/dist/src/collection-facets/more-facets-content.d.ts +77 -77
  75. package/dist/src/collection-facets/more-facets-content.js +357 -357
  76. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  77. package/dist/src/collection-facets/more-facets-pagination.js +192 -192
  78. package/dist/src/collection-facets.d.ts +83 -77
  79. package/dist/src/collection-facets.js +402 -384
  80. package/dist/src/collection-facets.js.map +1 -1
  81. package/dist/src/empty-placeholder.d.ts +11 -11
  82. package/dist/src/empty-placeholder.js +42 -42
  83. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  84. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  85. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  86. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  87. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  88. package/dist/src/mediatype/mediatype-config.js +85 -85
  89. package/dist/src/models.d.ts +114 -114
  90. package/dist/src/models.js +125 -125
  91. package/dist/src/restoration-state-handler.d.ts +45 -45
  92. package/dist/src/restoration-state-handler.js +230 -230
  93. package/dist/src/sort-filter-bar/alpha-bar.d.ts +12 -12
  94. package/dist/src/sort-filter-bar/alpha-bar.js +52 -52
  95. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  96. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  97. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  98. package/dist/src/sort-filter-bar/img/list.js +2 -2
  99. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  100. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  101. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  102. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  103. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +108 -108
  104. package/dist/src/sort-filter-bar/sort-filter-bar.js +438 -438
  105. package/dist/src/styles/item-image-styles.d.ts +8 -8
  106. package/dist/src/styles/item-image-styles.js +9 -9
  107. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  108. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  109. package/dist/src/tiles/grid/account-tile.d.ts +17 -17
  110. package/dist/src/tiles/grid/account-tile.js +46 -46
  111. package/dist/src/tiles/grid/collection-tile.d.ts +14 -14
  112. package/dist/src/tiles/grid/collection-tile.js +53 -53
  113. package/dist/src/tiles/grid/item-tile.d.ts +29 -29
  114. package/dist/src/tiles/grid/item-tile.js +108 -108
  115. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  116. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +7 -7
  117. package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
  118. package/dist/src/tiles/grid/tile-stats.js +40 -40
  119. package/dist/src/tiles/hover/hover-pane-controller.d.ts +197 -197
  120. package/dist/src/tiles/hover/hover-pane-controller.js +331 -331
  121. package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -15
  122. package/dist/src/tiles/hover/tile-hover-pane.js +38 -38
  123. package/dist/src/tiles/image-block.d.ts +17 -17
  124. package/dist/src/tiles/image-block.js +72 -72
  125. package/dist/src/tiles/item-image.d.ts +35 -35
  126. package/dist/src/tiles/item-image.js +117 -117
  127. package/dist/src/tiles/list/account-label.d.ts +1 -1
  128. package/dist/src/tiles/list/account-label.js +6 -6
  129. package/dist/src/tiles/list/date-label.d.ts +1 -1
  130. package/dist/src/tiles/list/date-label.js +12 -12
  131. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -12
  132. package/dist/src/tiles/list/tile-list-compact-header.js +41 -41
  133. package/dist/src/tiles/list/tile-list-compact.d.ts +21 -21
  134. package/dist/src/tiles/list/tile-list-compact.js +99 -99
  135. package/dist/src/tiles/list/tile-list.d.ts +55 -55
  136. package/dist/src/tiles/list/tile-list.js +297 -297
  137. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  138. package/dist/src/tiles/mediatype-icon.js +47 -47
  139. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -10
  140. package/dist/src/tiles/overlay/icon-overlay.js +40 -40
  141. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
  142. package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
  143. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
  144. package/dist/src/tiles/overlay/text-overlay.js +42 -42
  145. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  146. package/dist/src/tiles/text-snippet-block.js +73 -73
  147. package/dist/src/tiles/tile-dispatcher.d.ts +55 -55
  148. package/dist/src/tiles/tile-dispatcher.js +176 -176
  149. package/dist/src/utils/analytics-events.d.ts +22 -22
  150. package/dist/src/utils/analytics-events.js +24 -24
  151. package/dist/src/utils/format-count.d.ts +7 -7
  152. package/dist/src/utils/format-count.js +76 -76
  153. package/dist/src/utils/format-date.d.ts +2 -2
  154. package/dist/src/utils/format-date.js +23 -23
  155. package/dist/src/utils/format-unit-size.d.ts +2 -2
  156. package/dist/src/utils/format-unit-size.js +33 -33
  157. package/dist/test/collection-browser.test.d.ts +1 -1
  158. package/dist/test/collection-browser.test.js +584 -584
  159. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  160. package/dist/test/collection-facets/facets-template.test.js +62 -62
  161. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  162. package/dist/test/collection-facets/more-facets-content.test.js +114 -114
  163. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  164. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  165. package/dist/test/collection-facets.test.d.ts +2 -2
  166. package/dist/test/collection-facets.test.js +508 -508
  167. package/dist/test/empty-placeholder.test.d.ts +1 -1
  168. package/dist/test/empty-placeholder.test.js +33 -33
  169. package/dist/test/icon-overlay.test.d.ts +1 -1
  170. package/dist/test/icon-overlay.test.js +24 -24
  171. package/dist/test/image-block.test.d.ts +1 -1
  172. package/dist/test/image-block.test.js +48 -48
  173. package/dist/test/item-image.test.d.ts +1 -1
  174. package/dist/test/item-image.test.js +84 -84
  175. package/dist/test/mediatype-config.test.d.ts +1 -1
  176. package/dist/test/mediatype-config.test.js +16 -16
  177. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  178. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  179. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -7
  180. package/dist/test/mocks/mock-collection-name-cache.js +13 -13
  181. package/dist/test/mocks/mock-search-responses.d.ts +12 -12
  182. package/dist/test/mocks/mock-search-responses.js +341 -341
  183. package/dist/test/mocks/mock-search-service.d.ts +13 -13
  184. package/dist/test/mocks/mock-search-service.js +40 -40
  185. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  186. package/dist/test/restoration-state-handler.test.js +125 -125
  187. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  188. package/dist/test/sort-filter-bar/alpha-bar.test.js +43 -43
  189. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  190. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +197 -197
  191. package/dist/test/text-overlay.test.d.ts +1 -1
  192. package/dist/test/text-overlay.test.js +48 -48
  193. package/dist/test/text-snippet-block.test.d.ts +1 -1
  194. package/dist/test/text-snippet-block.test.js +57 -57
  195. package/dist/test/tile-stats.test.d.ts +1 -1
  196. package/dist/test/tile-stats.test.js +33 -33
  197. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  198. package/dist/test/tiles/grid/account-tile.test.js +60 -60
  199. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  200. package/dist/test/tiles/grid/collection-tile.test.js +57 -57
  201. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  202. package/dist/test/tiles/grid/item-tile.test.js +142 -142
  203. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  204. package/dist/test/tiles/hover/hover-pane-controller.test.js +257 -257
  205. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  206. package/dist/test/tiles/hover/tile-hover-pane.test.js +13 -13
  207. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  208. package/dist/test/tiles/list/tile-list-compact.test.js +92 -92
  209. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  210. package/dist/test/tiles/list/tile-list.test.js +163 -163
  211. package/dist/test/utils/format-count.test.d.ts +1 -1
  212. package/dist/test/utils/format-count.test.js +23 -23
  213. package/dist/test/utils/format-date.test.d.ts +1 -1
  214. package/dist/test/utils/format-date.test.js +17 -17
  215. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  216. package/dist/test/utils/format-unit-size.test.js +17 -17
  217. package/local.archive.org.cert +86 -86
  218. package/local.archive.org.key +27 -27
  219. package/package.json +1 -1
  220. package/renovate.json +6 -6
  221. package/src/collection-browser.ts +10 -0
  222. package/src/collection-facets.ts +25 -6
  223. package/tsconfig.json +21 -21
  224. package/web-dev-server.config.mjs +30 -30
  225. package/web-test-runner.config.mjs +41 -41
@@ -1,264 +1,264 @@
1
- import { __decorate } from "tslib";
2
- /* eslint-disable dot-notation */
3
- /* eslint-disable lit-a11y/click-events-have-key-events */
4
- import { css, html, LitElement, nothing, } from 'lit';
5
- import { customElement, property, state } from 'lit/decorators.js';
6
- import { AggregationSortType, } from '@internetarchive/search-service';
7
- import { facetTitles, suppressedCollections, } from '../models';
8
- import '@internetarchive/ia-activity-indicator/ia-activity-indicator';
9
- import './more-facets-pagination';
10
- import './facets-template';
11
- import { analyticsActions, analyticsCategories, } from '../utils/analytics-events';
12
- let MoreFacetsContent = class MoreFacetsContent extends LitElement {
13
- constructor() {
14
- super(...arguments);
15
- this.sortedBy = 'count';
16
- this.facetGroup = [];
17
- this.facetGroupTitle = '';
18
- this.pageNumber = 1;
19
- /**
20
- * Facets are loading on popup
21
- */
22
- this.facetsLoading = true;
23
- this.paginationSize = 0;
24
- this.facetsType = 'modal';
25
- this.facetsPerPage = 35;
26
- }
27
- updated(changed) {
28
- if (changed.has('facetKey')) {
29
- this.facetsLoading = true;
30
- this.pageNumber = 1;
31
- this.updateSpecificFacets();
32
- }
33
- if (changed.has('pageNumber')) {
34
- this.facetGroup = this.aggregationFacetGroups;
35
- }
36
- }
37
- firstUpdated() {
38
- this.setupEscapeListeners();
39
- }
40
- /**
41
- * Close more facets modal on Escape click
42
- */
43
- setupEscapeListeners() {
44
- if (this.modalManager) {
45
- document.addEventListener('keydown', (e) => {
46
- var _a;
47
- if (e.key === 'Escape') {
48
- (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.closeModal();
49
- }
50
- });
51
- }
52
- else {
53
- document.removeEventListener('keydown', () => { });
54
- }
55
- }
56
- /**
57
- * Get specific facets data from search-service API based of currently query params
58
- * - this.aggregations - hold result of search service and being used for further processing.
59
- */
60
- async updateSpecificFacets() {
61
- var _a, _b;
62
- const aggregations = {
63
- simpleParams: [this.facetAggregationKey],
64
- };
65
- const aggregationsSize = 65535; // todo - do we want to have all the records at once?
66
- const params = {
67
- query: this.query,
68
- filters: this.filterMap,
69
- aggregations,
70
- aggregationsSize,
71
- rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?
72
- };
73
- const results = await ((_a = this.searchService) === null || _a === void 0 ? void 0 : _a.search(params, this.searchType));
74
- this.aggregations = (_b = results === null || results === void 0 ? void 0 : results.success) === null || _b === void 0 ? void 0 : _b.response.aggregations;
75
- this.facetGroup = this.aggregationFacetGroups;
76
- this.facetsLoading = false;
77
- }
78
- pageNumberClicked(e) {
79
- var _a, _b;
80
- const page = (_a = e === null || e === void 0 ? void 0 : e.detail) === null || _a === void 0 ? void 0 : _a.page;
81
- if (page) {
82
- this.pageNumber = Number(page);
83
- }
84
- (_b = this.analyticsHandler) === null || _b === void 0 ? void 0 : _b.sendEvent({
85
- category: analyticsCategories.default,
86
- action: analyticsActions.moreFacetsPageChange,
87
- label: `${this.pageNumber}`,
88
- });
89
- }
90
- /**
91
- * Combines the selected facets with the aggregations to create a single list of facets
92
- */
93
- get mergedFacets() {
94
- var _a;
95
- const facetGroups = [];
96
- const selectedFacetGroup = this.selectedFacetGroups.find(group => group.key === this.facetKey);
97
- const aggregateFacetGroup = this.aggregationFacetGroups.find(group => group.key === this.facetKey);
98
- // if the user selected a facet, but it's not in the aggregation, we add it as-is
99
- if (selectedFacetGroup && !aggregateFacetGroup) {
100
- facetGroups.push(selectedFacetGroup);
101
- return facetGroups;
102
- }
103
- // if we don't have an aggregate facet group, don't add this to the list
104
- if (!aggregateFacetGroup)
105
- return facetGroups;
106
- // start with either the selected group if we have one, or the aggregate group
107
- const facetGroup = selectedFacetGroup !== null && selectedFacetGroup !== void 0 ? selectedFacetGroup : aggregateFacetGroup;
108
- // attach the counts to the selected buckets
109
- const bucketsWithCount = (_a = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
110
- const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
111
- return selectedBucket
112
- ? {
113
- ...bucket,
114
- count: selectedBucket.count,
115
- }
116
- : bucket;
117
- })) !== null && _a !== void 0 ? _a : [];
118
- // append any additional buckets that were not selected
119
- aggregateFacetGroup.buckets.forEach(bucket => {
120
- const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);
121
- if (existingBucket)
122
- return;
123
- bucketsWithCount.push(bucket);
124
- });
125
- facetGroup.buckets = bucketsWithCount;
126
- facetGroups.push(facetGroup);
127
- return facetGroups;
128
- }
129
- /**
130
- * Converts the selected facets to a `FacetGroup` array,
131
- * which is easier to work with
132
- */
133
- get selectedFacetGroups() {
134
- if (!this.selectedFacets)
135
- return [];
136
- const facetGroups = Object.entries(this.selectedFacets).map(([key, selectedFacets]) => {
137
- const option = key;
138
- const title = facetTitles[option];
139
- const buckets = Object.entries(selectedFacets).map(([value, data]) => {
140
- var _a, _b;
141
- let displayText = value;
142
- // for selected languages, we store the language code instead of the
143
- // display name, so look up the name from the mapping
144
- if (option === 'language') {
145
- displayText =
146
- (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getLanguageNameFromCodeString(value)) !== null && _b !== void 0 ? _b : value;
147
- }
148
- return {
149
- displayText,
150
- key: value,
151
- count: data === null || data === void 0 ? void 0 : data.count,
152
- state: data === null || data === void 0 ? void 0 : data.state,
153
- };
154
- });
155
- return {
156
- title,
157
- key: option,
158
- buckets,
159
- };
160
- });
161
- return facetGroups;
162
- }
163
- /**
164
- * Converts the raw `aggregations` to `FacetGroups`, which are easier to use
165
- */
166
- get aggregationFacetGroups() {
167
- var _a;
168
- const facetGroups = [];
169
- Object.entries((_a = this.aggregations) !== null && _a !== void 0 ? _a : []).forEach(([key, aggregation]) => {
170
- // the year_histogram data is in a different format so can't be handled here
171
- if (key === 'year_histogram')
172
- return;
173
- const option = key;
174
- this.facetGroupTitle = facetTitles[option];
175
- // sort facets in specific order
176
- let castedBuckets = aggregation.getSortedBuckets(this.sortedBy === 'alpha'
177
- ? AggregationSortType.ALPHABETICAL
178
- : AggregationSortType.COUNT);
179
- if (option === 'collection') {
180
- // we are not showing fav- collections or certain deemphasized collections in facets
181
- castedBuckets = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.filter(bucket => {
182
- var _a;
183
- const bucketKey = (_a = bucket === null || bucket === void 0 ? void 0 : bucket.key) === null || _a === void 0 ? void 0 : _a.toString();
184
- return (!suppressedCollections[bucketKey] && !(bucketKey === null || bucketKey === void 0 ? void 0 : bucketKey.startsWith('fav-')));
185
- });
186
- // asynchronously load the collection name
187
- this.preloadCollectionNames(castedBuckets);
188
- }
189
- // find length and pagination size for modal pagination
190
- const { length } = Object.keys(castedBuckets);
191
- this.paginationSize = Math.ceil(length / this.facetsPerPage);
192
- // render only items which will be visible as per this.facetsPerPage
193
- const bucketsMaxSix = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.slice((this.pageNumber - 1) * this.facetsPerPage, this.pageNumber * this.facetsPerPage);
194
- const facetBucket = bucketsMaxSix.map(bucket => {
195
- var _a, _b;
196
- let bucketKey = bucket.key;
197
- // for languages, we need to search by language code instead of the
198
- // display name, which is what we get from the search engine result
199
- if (option === 'language') {
200
- bucketKey =
201
- (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getCodeStringFromLanguageName(`${bucket.key}`)) !== null && _b !== void 0 ? _b : bucket.key;
202
- }
203
- return {
204
- displayText: `${bucket.key}`,
205
- key: `${bucketKey}`,
206
- count: bucket.doc_count,
207
- state: 'none',
208
- };
209
- });
210
- const group = {
211
- title: this.facetGroupTitle,
212
- key: option,
213
- buckets: facetBucket,
214
- };
215
- facetGroups.push(group);
216
- });
217
- return facetGroups;
218
- }
219
- /**
220
- * for collections, we need to asynchronously load the collection name
221
- * so we use the `async-collection-name` widget and for the rest, we have a static value to use
222
- *
223
- * @param castedBuckets
224
- */
225
- preloadCollectionNames(castedBuckets) {
226
- var _a;
227
- const collectionIds = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.map(option => option.key);
228
- const collectionIdsArray = Array.from(new Set(collectionIds));
229
- (_a = this.collectionNameCache) === null || _a === void 0 ? void 0 : _a.preloadIdentifiers(collectionIdsArray);
230
- }
231
- get getMoreFacetsTemplate() {
232
- var _a;
1
+ import { __decorate } from "tslib";
2
+ /* eslint-disable dot-notation */
3
+ /* eslint-disable lit-a11y/click-events-have-key-events */
4
+ import { css, html, LitElement, nothing, } from 'lit';
5
+ import { customElement, property, state } from 'lit/decorators.js';
6
+ import { AggregationSortType, } from '@internetarchive/search-service';
7
+ import { facetTitles, suppressedCollections, } from '../models';
8
+ import '@internetarchive/ia-activity-indicator/ia-activity-indicator';
9
+ import './more-facets-pagination';
10
+ import './facets-template';
11
+ import { analyticsActions, analyticsCategories, } from '../utils/analytics-events';
12
+ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
13
+ constructor() {
14
+ super(...arguments);
15
+ this.sortedBy = 'count';
16
+ this.facetGroup = [];
17
+ this.facetGroupTitle = '';
18
+ this.pageNumber = 1;
19
+ /**
20
+ * Facets are loading on popup
21
+ */
22
+ this.facetsLoading = true;
23
+ this.paginationSize = 0;
24
+ this.facetsType = 'modal';
25
+ this.facetsPerPage = 35;
26
+ }
27
+ updated(changed) {
28
+ if (changed.has('facetKey')) {
29
+ this.facetsLoading = true;
30
+ this.pageNumber = 1;
31
+ this.updateSpecificFacets();
32
+ }
33
+ if (changed.has('pageNumber')) {
34
+ this.facetGroup = this.aggregationFacetGroups;
35
+ }
36
+ }
37
+ firstUpdated() {
38
+ this.setupEscapeListeners();
39
+ }
40
+ /**
41
+ * Close more facets modal on Escape click
42
+ */
43
+ setupEscapeListeners() {
44
+ if (this.modalManager) {
45
+ document.addEventListener('keydown', (e) => {
46
+ var _a;
47
+ if (e.key === 'Escape') {
48
+ (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.closeModal();
49
+ }
50
+ });
51
+ }
52
+ else {
53
+ document.removeEventListener('keydown', () => { });
54
+ }
55
+ }
56
+ /**
57
+ * Get specific facets data from search-service API based of currently query params
58
+ * - this.aggregations - hold result of search service and being used for further processing.
59
+ */
60
+ async updateSpecificFacets() {
61
+ var _a, _b;
62
+ const aggregations = {
63
+ simpleParams: [this.facetAggregationKey],
64
+ };
65
+ const aggregationsSize = 65535; // todo - do we want to have all the records at once?
66
+ const params = {
67
+ query: this.query,
68
+ filters: this.filterMap,
69
+ aggregations,
70
+ aggregationsSize,
71
+ rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?
72
+ };
73
+ const results = await ((_a = this.searchService) === null || _a === void 0 ? void 0 : _a.search(params, this.searchType));
74
+ this.aggregations = (_b = results === null || results === void 0 ? void 0 : results.success) === null || _b === void 0 ? void 0 : _b.response.aggregations;
75
+ this.facetGroup = this.aggregationFacetGroups;
76
+ this.facetsLoading = false;
77
+ }
78
+ pageNumberClicked(e) {
79
+ var _a, _b;
80
+ const page = (_a = e === null || e === void 0 ? void 0 : e.detail) === null || _a === void 0 ? void 0 : _a.page;
81
+ if (page) {
82
+ this.pageNumber = Number(page);
83
+ }
84
+ (_b = this.analyticsHandler) === null || _b === void 0 ? void 0 : _b.sendEvent({
85
+ category: analyticsCategories.default,
86
+ action: analyticsActions.moreFacetsPageChange,
87
+ label: `${this.pageNumber}`,
88
+ });
89
+ }
90
+ /**
91
+ * Combines the selected facets with the aggregations to create a single list of facets
92
+ */
93
+ get mergedFacets() {
94
+ var _a;
95
+ const facetGroups = [];
96
+ const selectedFacetGroup = this.selectedFacetGroups.find(group => group.key === this.facetKey);
97
+ const aggregateFacetGroup = this.aggregationFacetGroups.find(group => group.key === this.facetKey);
98
+ // if the user selected a facet, but it's not in the aggregation, we add it as-is
99
+ if (selectedFacetGroup && !aggregateFacetGroup) {
100
+ facetGroups.push(selectedFacetGroup);
101
+ return facetGroups;
102
+ }
103
+ // if we don't have an aggregate facet group, don't add this to the list
104
+ if (!aggregateFacetGroup)
105
+ return facetGroups;
106
+ // start with either the selected group if we have one, or the aggregate group
107
+ const facetGroup = selectedFacetGroup !== null && selectedFacetGroup !== void 0 ? selectedFacetGroup : aggregateFacetGroup;
108
+ // attach the counts to the selected buckets
109
+ const bucketsWithCount = (_a = selectedFacetGroup === null || selectedFacetGroup === void 0 ? void 0 : selectedFacetGroup.buckets.map(bucket => {
110
+ const selectedBucket = aggregateFacetGroup.buckets.find(b => b.key === bucket.key);
111
+ return selectedBucket
112
+ ? {
113
+ ...bucket,
114
+ count: selectedBucket.count,
115
+ }
116
+ : bucket;
117
+ })) !== null && _a !== void 0 ? _a : [];
118
+ // append any additional buckets that were not selected
119
+ aggregateFacetGroup.buckets.forEach(bucket => {
120
+ const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);
121
+ if (existingBucket)
122
+ return;
123
+ bucketsWithCount.push(bucket);
124
+ });
125
+ facetGroup.buckets = bucketsWithCount;
126
+ facetGroups.push(facetGroup);
127
+ return facetGroups;
128
+ }
129
+ /**
130
+ * Converts the selected facets to a `FacetGroup` array,
131
+ * which is easier to work with
132
+ */
133
+ get selectedFacetGroups() {
134
+ if (!this.selectedFacets)
135
+ return [];
136
+ const facetGroups = Object.entries(this.selectedFacets).map(([key, selectedFacets]) => {
137
+ const option = key;
138
+ const title = facetTitles[option];
139
+ const buckets = Object.entries(selectedFacets).map(([value, data]) => {
140
+ var _a, _b;
141
+ let displayText = value;
142
+ // for selected languages, we store the language code instead of the
143
+ // display name, so look up the name from the mapping
144
+ if (option === 'language') {
145
+ displayText =
146
+ (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getLanguageNameFromCodeString(value)) !== null && _b !== void 0 ? _b : value;
147
+ }
148
+ return {
149
+ displayText,
150
+ key: value,
151
+ count: data === null || data === void 0 ? void 0 : data.count,
152
+ state: data === null || data === void 0 ? void 0 : data.state,
153
+ };
154
+ });
155
+ return {
156
+ title,
157
+ key: option,
158
+ buckets,
159
+ };
160
+ });
161
+ return facetGroups;
162
+ }
163
+ /**
164
+ * Converts the raw `aggregations` to `FacetGroups`, which are easier to use
165
+ */
166
+ get aggregationFacetGroups() {
167
+ var _a;
168
+ const facetGroups = [];
169
+ Object.entries((_a = this.aggregations) !== null && _a !== void 0 ? _a : []).forEach(([key, aggregation]) => {
170
+ // the year_histogram data is in a different format so can't be handled here
171
+ if (key === 'year_histogram')
172
+ return;
173
+ const option = key;
174
+ this.facetGroupTitle = facetTitles[option];
175
+ // sort facets in specific order
176
+ let castedBuckets = aggregation.getSortedBuckets(this.sortedBy === 'alpha'
177
+ ? AggregationSortType.ALPHABETICAL
178
+ : AggregationSortType.COUNT);
179
+ if (option === 'collection') {
180
+ // we are not showing fav- collections or certain deemphasized collections in facets
181
+ castedBuckets = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.filter(bucket => {
182
+ var _a;
183
+ const bucketKey = (_a = bucket === null || bucket === void 0 ? void 0 : bucket.key) === null || _a === void 0 ? void 0 : _a.toString();
184
+ return (!suppressedCollections[bucketKey] && !(bucketKey === null || bucketKey === void 0 ? void 0 : bucketKey.startsWith('fav-')));
185
+ });
186
+ // asynchronously load the collection name
187
+ this.preloadCollectionNames(castedBuckets);
188
+ }
189
+ // find length and pagination size for modal pagination
190
+ const { length } = Object.keys(castedBuckets);
191
+ this.paginationSize = Math.ceil(length / this.facetsPerPage);
192
+ // render only items which will be visible as per this.facetsPerPage
193
+ const bucketsMaxSix = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.slice((this.pageNumber - 1) * this.facetsPerPage, this.pageNumber * this.facetsPerPage);
194
+ const facetBucket = bucketsMaxSix.map(bucket => {
195
+ var _a, _b;
196
+ let bucketKey = bucket.key;
197
+ // for languages, we need to search by language code instead of the
198
+ // display name, which is what we get from the search engine result
199
+ if (option === 'language') {
200
+ bucketKey =
201
+ (_b = (_a = this.languageCodeHandler) === null || _a === void 0 ? void 0 : _a.getCodeStringFromLanguageName(`${bucket.key}`)) !== null && _b !== void 0 ? _b : bucket.key;
202
+ }
203
+ return {
204
+ displayText: `${bucket.key}`,
205
+ key: `${bucketKey}`,
206
+ count: bucket.doc_count,
207
+ state: 'none',
208
+ };
209
+ });
210
+ const group = {
211
+ title: this.facetGroupTitle,
212
+ key: option,
213
+ buckets: facetBucket,
214
+ };
215
+ facetGroups.push(group);
216
+ });
217
+ return facetGroups;
218
+ }
219
+ /**
220
+ * for collections, we need to asynchronously load the collection name
221
+ * so we use the `async-collection-name` widget and for the rest, we have a static value to use
222
+ *
223
+ * @param castedBuckets
224
+ */
225
+ preloadCollectionNames(castedBuckets) {
226
+ var _a;
227
+ const collectionIds = castedBuckets === null || castedBuckets === void 0 ? void 0 : castedBuckets.map(option => option.key);
228
+ const collectionIdsArray = Array.from(new Set(collectionIds));
229
+ (_a = this.collectionNameCache) === null || _a === void 0 ? void 0 : _a.preloadIdentifiers(collectionIdsArray);
230
+ }
231
+ get getMoreFacetsTemplate() {
232
+ var _a;
233
233
  return html `
234
234
  <facets-template
235
235
  .facetGroup=${(_a = this.mergedFacets) === null || _a === void 0 ? void 0 : _a.shift()}
236
236
  .selectedFacets=${this.selectedFacets}
237
237
  .renderOn=${'modal'}
238
238
  .collectionNameCache=${this.collectionNameCache}
239
- @selectedFacetsChanged=${(e) => {
240
- this.selectedFacets = e.detail;
239
+ @selectedFacetsChanged=${(e) => {
240
+ this.selectedFacets = e.detail;
241
241
  }}
242
242
  ></facets-template>
243
- `;
244
- }
245
- get loaderTemplate() {
243
+ `;
244
+ }
245
+ get loaderTemplate() {
246
246
  return html `<div class="facets-loader">
247
247
  <ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>
248
- </div> `;
249
- }
250
- // render pagination if more then 1 page
251
- get facetsPaginationTemplate() {
252
- return this.paginationSize > 1
248
+ </div> `;
249
+ }
250
+ // render pagination if more then 1 page
251
+ get facetsPaginationTemplate() {
252
+ return this.paginationSize > 1
253
253
  ? html `<more-facets-pagination
254
254
  .size=${this.paginationSize}
255
255
  .currentPage=${1}
256
256
  @pageNumberClicked=${this.pageNumberClicked}
257
- ></more-facets-pagination>`
258
- : nothing;
259
- }
260
- get footerTemplate() {
261
- if (this.paginationSize > 0) {
257
+ ></more-facets-pagination>`
258
+ : nothing;
259
+ }
260
+ get footerTemplate() {
261
+ if (this.paginationSize > 0) {
262
262
  return html `${this.facetsPaginationTemplate}
263
263
  <div class="footer">
264
264
  <button
@@ -275,34 +275,34 @@ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
275
275
  >
276
276
  Apply filters
277
277
  </button>
278
- </div> `;
279
- }
280
- return nothing;
281
- }
282
- sortFacetAggregation() {
283
- this.sortedBy = this.sortedBy === 'count' ? 'alpha' : 'count';
284
- this.dispatchEvent(new CustomEvent('sortedFacets', { detail: this.sortedBy }));
285
- }
286
- get getModalHeaderTemplate() {
287
- const title = this.sortedBy === 'alpha' ? 'Sort by count' : 'Sort by value';
278
+ </div> `;
279
+ }
280
+ return nothing;
281
+ }
282
+ sortFacetAggregation() {
283
+ this.sortedBy = this.sortedBy === 'count' ? 'alpha' : 'count';
284
+ this.dispatchEvent(new CustomEvent('sortedFacets', { detail: this.sortedBy }));
285
+ }
286
+ get getModalHeaderTemplate() {
287
+ const title = this.sortedBy === 'alpha' ? 'Sort by count' : 'Sort by value';
288
288
  return html `<span class="sr-only">More facets for:</span>
289
289
  <span class="title">
290
290
  ${this.facetGroupTitle}
291
291
  <button
292
292
  class="sort-button"
293
- @click=${(e) => {
294
- e.preventDefault();
295
- this.sortFacetAggregation();
293
+ @click=${(e) => {
294
+ e.preventDefault();
295
+ this.sortFacetAggregation();
296
296
  }}
297
297
  >
298
298
  ${title}
299
299
  </button>
300
- </span>`;
301
- }
302
- render() {
300
+ </span>`;
301
+ }
302
+ render() {
303
303
  return html `
304
- ${this.facetsLoading
305
- ? this.loaderTemplate
304
+ ${this.facetsLoading
305
+ ? this.loaderTemplate
306
306
  : html `
307
307
  <section id="more-facets">
308
308
  <div class="header-content">${this.getModalHeaderTemplate}</div>
@@ -310,34 +310,34 @@ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
310
310
  ${this.footerTemplate}
311
311
  </section>
312
312
  `}
313
- `;
314
- }
315
- applySearchFacetsClicked() {
316
- var _a, _b;
317
- const event = new CustomEvent('facetsChanged', {
318
- detail: this.selectedFacets,
319
- bubbles: true,
320
- composed: true,
321
- });
322
- this.dispatchEvent(event);
323
- (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.closeModal();
324
- (_b = this.analyticsHandler) === null || _b === void 0 ? void 0 : _b.sendEvent({
325
- category: analyticsCategories.default,
326
- action: `${analyticsActions.applyMoreFacetsModal}`,
327
- label: `${this.facetKey}`,
328
- });
329
- }
330
- cancelClick() {
331
- var _a, _b;
332
- (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.closeModal();
333
- (_b = this.analyticsHandler) === null || _b === void 0 ? void 0 : _b.sendEvent({
334
- category: analyticsCategories.default,
335
- action: analyticsActions.closeMoreFacetsModal,
336
- label: `${this.facetKey}`,
337
- });
338
- }
339
- static get styles() {
340
- const modalSubmitButton = css `var(--primaryButtonBGColor, #194880)`;
313
+ `;
314
+ }
315
+ applySearchFacetsClicked() {
316
+ var _a, _b;
317
+ const event = new CustomEvent('facetsChanged', {
318
+ detail: this.selectedFacets,
319
+ bubbles: true,
320
+ composed: true,
321
+ });
322
+ this.dispatchEvent(event);
323
+ (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.closeModal();
324
+ (_b = this.analyticsHandler) === null || _b === void 0 ? void 0 : _b.sendEvent({
325
+ category: analyticsCategories.default,
326
+ action: `${analyticsActions.applyMoreFacetsModal}`,
327
+ label: `${this.facetKey}`,
328
+ });
329
+ }
330
+ cancelClick() {
331
+ var _a, _b;
332
+ (_a = this.modalManager) === null || _a === void 0 ? void 0 : _a.closeModal();
333
+ (_b = this.analyticsHandler) === null || _b === void 0 ? void 0 : _b.sendEvent({
334
+ category: analyticsCategories.default,
335
+ action: analyticsActions.closeMoreFacetsModal,
336
+ label: `${this.facetKey}`,
337
+ });
338
+ }
339
+ static get styles() {
340
+ const modalSubmitButton = css `var(--primaryButtonBGColor, #194880)`;
341
341
  return css `
342
342
  @media (max-width: 560px) {
343
343
  section#more-facets {
@@ -436,68 +436,68 @@ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
436
436
  vertical-align: baseline;
437
437
  cursor: pointer;
438
438
  }
439
- `;
440
- }
441
- };
442
- __decorate([
443
- property({ type: String })
444
- ], MoreFacetsContent.prototype, "facetKey", void 0);
445
- __decorate([
446
- property({ type: String })
447
- ], MoreFacetsContent.prototype, "facetAggregationKey", void 0);
448
- __decorate([
449
- property({ type: String })
450
- ], MoreFacetsContent.prototype, "query", void 0);
451
- __decorate([
452
- property({ type: Object })
453
- ], MoreFacetsContent.prototype, "filterMap", void 0);
454
- __decorate([
455
- property({ type: Object })
456
- ], MoreFacetsContent.prototype, "modalManager", void 0);
457
- __decorate([
458
- property({ type: Object })
459
- ], MoreFacetsContent.prototype, "searchService", void 0);
460
- __decorate([
461
- property({ type: String })
462
- ], MoreFacetsContent.prototype, "searchType", void 0);
463
- __decorate([
464
- property({ type: Object })
465
- ], MoreFacetsContent.prototype, "collectionNameCache", void 0);
466
- __decorate([
467
- property({ type: Object })
468
- ], MoreFacetsContent.prototype, "languageCodeHandler", void 0);
469
- __decorate([
470
- property({ type: Object })
471
- ], MoreFacetsContent.prototype, "selectedFacets", void 0);
472
- __decorate([
473
- property({ type: String })
474
- ], MoreFacetsContent.prototype, "sortedBy", void 0);
475
- __decorate([
476
- property({ type: Object, attribute: false })
477
- ], MoreFacetsContent.prototype, "analyticsHandler", void 0);
478
- __decorate([
479
- state()
480
- ], MoreFacetsContent.prototype, "aggregations", void 0);
481
- __decorate([
482
- state()
483
- ], MoreFacetsContent.prototype, "facetGroup", void 0);
484
- __decorate([
485
- state()
486
- ], MoreFacetsContent.prototype, "facetGroupTitle", void 0);
487
- __decorate([
488
- state()
489
- ], MoreFacetsContent.prototype, "pageNumber", void 0);
490
- __decorate([
491
- state()
492
- ], MoreFacetsContent.prototype, "facetsLoading", void 0);
493
- __decorate([
494
- state()
495
- ], MoreFacetsContent.prototype, "paginationSize", void 0);
496
- __decorate([
497
- state()
498
- ], MoreFacetsContent.prototype, "facetsType", void 0);
499
- MoreFacetsContent = __decorate([
500
- customElement('more-facets-content')
501
- ], MoreFacetsContent);
502
- export { MoreFacetsContent };
439
+ `;
440
+ }
441
+ };
442
+ __decorate([
443
+ property({ type: String })
444
+ ], MoreFacetsContent.prototype, "facetKey", void 0);
445
+ __decorate([
446
+ property({ type: String })
447
+ ], MoreFacetsContent.prototype, "facetAggregationKey", void 0);
448
+ __decorate([
449
+ property({ type: String })
450
+ ], MoreFacetsContent.prototype, "query", void 0);
451
+ __decorate([
452
+ property({ type: Object })
453
+ ], MoreFacetsContent.prototype, "filterMap", void 0);
454
+ __decorate([
455
+ property({ type: Object })
456
+ ], MoreFacetsContent.prototype, "modalManager", void 0);
457
+ __decorate([
458
+ property({ type: Object })
459
+ ], MoreFacetsContent.prototype, "searchService", void 0);
460
+ __decorate([
461
+ property({ type: String })
462
+ ], MoreFacetsContent.prototype, "searchType", void 0);
463
+ __decorate([
464
+ property({ type: Object })
465
+ ], MoreFacetsContent.prototype, "collectionNameCache", void 0);
466
+ __decorate([
467
+ property({ type: Object })
468
+ ], MoreFacetsContent.prototype, "languageCodeHandler", void 0);
469
+ __decorate([
470
+ property({ type: Object })
471
+ ], MoreFacetsContent.prototype, "selectedFacets", void 0);
472
+ __decorate([
473
+ property({ type: String })
474
+ ], MoreFacetsContent.prototype, "sortedBy", void 0);
475
+ __decorate([
476
+ property({ type: Object, attribute: false })
477
+ ], MoreFacetsContent.prototype, "analyticsHandler", void 0);
478
+ __decorate([
479
+ state()
480
+ ], MoreFacetsContent.prototype, "aggregations", void 0);
481
+ __decorate([
482
+ state()
483
+ ], MoreFacetsContent.prototype, "facetGroup", void 0);
484
+ __decorate([
485
+ state()
486
+ ], MoreFacetsContent.prototype, "facetGroupTitle", void 0);
487
+ __decorate([
488
+ state()
489
+ ], MoreFacetsContent.prototype, "pageNumber", void 0);
490
+ __decorate([
491
+ state()
492
+ ], MoreFacetsContent.prototype, "facetsLoading", void 0);
493
+ __decorate([
494
+ state()
495
+ ], MoreFacetsContent.prototype, "paginationSize", void 0);
496
+ __decorate([
497
+ state()
498
+ ], MoreFacetsContent.prototype, "facetsType", void 0);
499
+ MoreFacetsContent = __decorate([
500
+ customElement('more-facets-content')
501
+ ], MoreFacetsContent);
502
+ export { MoreFacetsContent };
503
503
  //# sourceMappingURL=more-facets-content.js.map