@internetarchive/collection-browser 0.2.10 → 0.2.11

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 (207) 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 +32 -0
  4. package/dist/src/app-root.js +285 -0
  5. package/dist/src/app-root.js.map +1 -0
  6. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  7. package/dist/src/assets/img/icons/chevron.js +4 -0
  8. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  9. package/dist/src/assets/img/icons/empty-query.d.ts +2 -0
  10. package/dist/src/assets/img/icons/empty-query.js +5 -0
  11. package/dist/src/assets/img/icons/empty-query.js.map +1 -0
  12. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  13. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  14. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  15. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  16. package/dist/src/assets/img/icons/eye.js +5 -0
  17. package/dist/src/assets/img/icons/eye.js.map +1 -0
  18. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -0
  19. package/dist/src/assets/img/icons/favorite-filled.js +11 -0
  20. package/dist/src/assets/img/icons/favorite-filled.js.map +1 -0
  21. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -0
  22. package/dist/src/assets/img/icons/mediatype/account.js +14 -0
  23. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -0
  24. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -0
  25. package/dist/src/assets/img/icons/mediatype/audio.js +14 -0
  26. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -0
  27. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -0
  28. package/dist/src/assets/img/icons/mediatype/collection.js +12 -0
  29. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -0
  30. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  31. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  32. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  33. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -0
  34. package/dist/src/assets/img/icons/mediatype/etree.js +14 -0
  35. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -0
  36. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -0
  37. package/dist/src/assets/img/icons/mediatype/film.js +14 -0
  38. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -0
  39. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -0
  40. package/dist/src/assets/img/icons/mediatype/images.js +13 -0
  41. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -0
  42. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  43. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  44. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  45. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -0
  46. package/dist/src/assets/img/icons/mediatype/software.js +13 -0
  47. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -0
  48. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -0
  49. package/dist/src/assets/img/icons/mediatype/texts.js +13 -0
  50. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -0
  51. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -0
  52. package/dist/src/assets/img/icons/mediatype/tv.js +14 -0
  53. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -0
  54. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -0
  55. package/dist/src/assets/img/icons/mediatype/video.js +14 -0
  56. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -0
  57. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -0
  58. package/dist/src/assets/img/icons/mediatype/web.js +13 -0
  59. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -0
  60. package/dist/src/assets/img/icons/null-result.d.ts +2 -0
  61. package/dist/src/assets/img/icons/null-result.js +5 -0
  62. package/dist/src/assets/img/icons/null-result.js.map +1 -0
  63. package/dist/src/assets/img/icons/restricted.d.ts +1 -0
  64. package/dist/src/assets/img/icons/restricted.js +29 -0
  65. package/dist/src/assets/img/icons/restricted.js.map +1 -0
  66. package/dist/src/assets/img/icons/reviews.d.ts +1 -0
  67. package/dist/src/assets/img/icons/reviews.js +11 -0
  68. package/dist/src/assets/img/icons/reviews.js.map +1 -0
  69. package/dist/src/assets/img/icons/upload.d.ts +1 -0
  70. package/dist/src/assets/img/icons/upload.js +12 -0
  71. package/dist/src/assets/img/icons/upload.js.map +1 -0
  72. package/dist/src/assets/img/icons/views.d.ts +1 -0
  73. package/dist/src/assets/img/icons/views.js +11 -0
  74. package/dist/src/assets/img/icons/views.js.map +1 -0
  75. package/dist/src/circular-activity-indicator.d.ts +5 -0
  76. package/dist/src/circular-activity-indicator.js +66 -0
  77. package/dist/src/circular-activity-indicator.js.map +1 -0
  78. package/dist/src/collection-browser.d.ts +214 -0
  79. package/dist/src/collection-browser.js +1236 -0
  80. package/dist/src/collection-browser.js.map +1 -0
  81. package/dist/src/collection-facets.d.ts +63 -0
  82. package/dist/src/collection-facets.js +560 -0
  83. package/dist/src/collection-facets.js.map +1 -0
  84. package/dist/src/empty-placeholder.d.ts +11 -0
  85. package/dist/src/empty-placeholder.js +83 -0
  86. package/dist/src/empty-placeholder.js.map +1 -0
  87. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  88. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  89. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  90. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  91. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  92. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  93. package/dist/src/mediatype/mediatype-config.d.ts +3 -0
  94. package/dist/src/mediatype/mediatype-config.js +86 -0
  95. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  96. package/dist/src/models.d.ts +84 -0
  97. package/dist/src/models.js +58 -0
  98. package/dist/src/models.js.map +1 -0
  99. package/dist/src/restoration-state-handler.d.ts +38 -0
  100. package/dist/src/restoration-state-handler.js +204 -0
  101. package/dist/src/restoration-state-handler.js.map +1 -0
  102. package/dist/src/sort-filter-bar/alpha-bar.d.ts +9 -0
  103. package/dist/src/sort-filter-bar/alpha-bar.js +98 -0
  104. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -0
  105. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  106. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  107. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  108. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  109. package/dist/src/sort-filter-bar/img/list.js +5 -0
  110. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  111. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  112. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  113. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  114. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  115. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  116. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  117. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +85 -0
  118. package/dist/src/sort-filter-bar/sort-filter-bar.js +698 -0
  119. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -0
  120. package/dist/src/styles/item-image-styles.d.ts +8 -0
  121. package/dist/src/styles/item-image-styles.js +101 -0
  122. package/dist/src/styles/item-image-styles.js.map +1 -0
  123. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
  124. package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
  125. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  126. package/dist/src/tiles/grid/account-tile.d.ts +8 -0
  127. package/dist/src/tiles/grid/account-tile.js +126 -0
  128. package/dist/src/tiles/grid/account-tile.js.map +1 -0
  129. package/dist/src/tiles/grid/collection-tile.d.ts +7 -0
  130. package/dist/src/tiles/grid/collection-tile.js +159 -0
  131. package/dist/src/tiles/grid/collection-tile.js.map +1 -0
  132. package/dist/src/tiles/grid/item-tile.d.ts +16 -0
  133. package/dist/src/tiles/grid/item-tile.js +174 -0
  134. package/dist/src/tiles/grid/item-tile.js.map +1 -0
  135. package/dist/src/tiles/grid/tile-stats.d.ts +10 -0
  136. package/dist/src/tiles/grid/tile-stats.js +134 -0
  137. package/dist/src/tiles/grid/tile-stats.js.map +1 -0
  138. package/dist/src/tiles/item-image.d.ts +31 -0
  139. package/dist/src/tiles/item-image.js +117 -0
  140. package/dist/src/tiles/item-image.js.map +1 -0
  141. package/dist/src/tiles/item-tile-image.d.ts +15 -0
  142. package/dist/src/tiles/item-tile-image.js +68 -0
  143. package/dist/src/tiles/item-tile-image.js.map +1 -0
  144. package/dist/src/tiles/list/account-label.d.ts +1 -0
  145. package/dist/src/tiles/list/account-label.js +7 -0
  146. package/dist/src/tiles/list/account-label.js.map +1 -0
  147. package/dist/src/tiles/list/date-label.d.ts +1 -0
  148. package/dist/src/tiles/list/date-label.js +13 -0
  149. package/dist/src/tiles/list/date-label.js.map +1 -0
  150. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
  151. package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
  152. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  153. package/dist/src/tiles/list/tile-list-compact.d.ts +20 -0
  154. package/dist/src/tiles/list/tile-list-compact.js +215 -0
  155. package/dist/src/tiles/list/tile-list-compact.js.map +1 -0
  156. package/dist/src/tiles/list/tile-list.d.ts +47 -0
  157. package/dist/src/tiles/list/tile-list.js +492 -0
  158. package/dist/src/tiles/list/tile-list.js.map +1 -0
  159. package/dist/src/tiles/mediatype-icon.d.ts +9 -0
  160. package/dist/src/tiles/mediatype-icon.js +82 -0
  161. package/dist/src/tiles/mediatype-icon.js.map +1 -0
  162. package/dist/src/tiles/tile-dispatcher.d.ts +35 -0
  163. package/dist/src/tiles/tile-dispatcher.js +204 -0
  164. package/dist/src/tiles/tile-dispatcher.js.map +1 -0
  165. package/dist/src/utils/format-count.d.ts +7 -0
  166. package/dist/src/utils/format-count.js +76 -0
  167. package/dist/src/utils/format-count.js.map +1 -0
  168. package/dist/src/utils/format-date.d.ts +2 -0
  169. package/dist/src/utils/format-date.js +24 -0
  170. package/dist/src/utils/format-date.js.map +1 -0
  171. package/dist/test/collection-browser.test.d.ts +1 -0
  172. package/dist/test/collection-browser.test.js +47 -0
  173. package/dist/test/collection-browser.test.js.map +1 -0
  174. package/dist/test/empty-placeholder.test.d.ts +1 -0
  175. package/dist/test/empty-placeholder.test.js +34 -0
  176. package/dist/test/empty-placeholder.test.js.map +1 -0
  177. package/dist/test/mediatype-config.test.d.ts +1 -0
  178. package/dist/test/mediatype-config.test.js +17 -0
  179. package/dist/test/mediatype-config.test.js.map +1 -0
  180. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -0
  181. package/dist/test/mocks/mock-collection-name-cache.js +14 -0
  182. package/dist/test/mocks/mock-collection-name-cache.js.map +1 -0
  183. package/dist/test/mocks/mock-search-responses.d.ts +3 -0
  184. package/dist/test/mocks/mock-search-responses.js +32 -0
  185. package/dist/test/mocks/mock-search-responses.js.map +1 -0
  186. package/dist/test/mocks/mock-search-service.d.ts +8 -0
  187. package/dist/test/mocks/mock-search-service.js +16 -0
  188. package/dist/test/mocks/mock-search-service.js.map +1 -0
  189. package/dist/test/tile-stats.test.d.ts +1 -0
  190. package/dist/test/tile-stats.test.js +42 -0
  191. package/dist/test/tile-stats.test.js.map +1 -0
  192. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -0
  193. package/dist/test/tiles/grid/item-tile.test.js +96 -0
  194. package/dist/test/tiles/grid/item-tile.test.js.map +1 -0
  195. package/dist/test/utils/format-count.test.d.ts +1 -0
  196. package/dist/test/utils/format-count.test.js +24 -0
  197. package/dist/test/utils/format-count.test.js.map +1 -0
  198. package/dist/test/utils/format-date.test.d.ts +1 -0
  199. package/dist/test/utils/format-date.test.js +18 -0
  200. package/dist/test/utils/format-date.test.js.map +1 -0
  201. package/package.json +1 -1
  202. package/src/assets/img/icons/empty-query.ts +5 -0
  203. package/src/assets/img/icons/null-result.ts +5 -0
  204. package/src/collection-browser.ts +91 -61
  205. package/src/empty-placeholder.ts +79 -0
  206. package/test/collection-browser.test.ts +3 -0
  207. package/test/empty-placeholder.test.ts +46 -0
@@ -0,0 +1,698 @@
1
+ import { __decorate } from "tslib";
2
+ import { LitElement, html, css, nothing, } from 'lit';
3
+ import { customElement, property, query, state } from 'lit/decorators.js';
4
+ import { SortField, SortFieldDisplayName, } from '../models';
5
+ import './alpha-bar';
6
+ import { sortIcon } from './img/sort-triangle';
7
+ import { tileIcon } from './img/tile';
8
+ import { listIcon } from './img/list';
9
+ import { compactIcon } from './img/compact';
10
+ let SortFilterBar = class SortFilterBar extends LitElement {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.sortDirection = null;
14
+ this.selectedSort = SortField.relevance;
15
+ this.selectedTitleFilter = null;
16
+ this.selectedCreatorFilter = null;
17
+ this.showRelevance = true;
18
+ this.alphaSelectorVisible = null;
19
+ this.dateSortSelectorVisible = false;
20
+ this.desktopSelectorBarWidth = 0;
21
+ this.selectorBarContainerWidth = 0;
22
+ this.hoveringOverDateSortOptions = false;
23
+ this.boundDateSelectorEscapeListener = (e) => {
24
+ if (e.key === 'Escape') {
25
+ this.dateSortSelectorVisible = false;
26
+ }
27
+ };
28
+ }
29
+ render() {
30
+ return html `
31
+ <div id="container">
32
+ <div id="sort-bar">
33
+ <div id="sort-direction-container">
34
+ ${this.sortDirectionSelectorTemplate}
35
+ </div>
36
+
37
+ <div id="sort-selector-container">
38
+ ${this.mobileSortSelectorTemplate}
39
+ ${this.desktopSortSelectorTemplate}
40
+ </div>
41
+
42
+ <div id="display-style-selector">${this.displayOptionTemplate}</div>
43
+ </div>
44
+
45
+ ${this.dateSortSelectorVisible && !this.mobileSelectorVisible
46
+ ? this.dateSortSelector
47
+ : nothing}
48
+ ${this.alphaBarTemplate}
49
+
50
+ <div id="bottom-shadow"></div>
51
+ </div>
52
+ `;
53
+ }
54
+ updated(changed) {
55
+ if (changed.has('displayMode')) {
56
+ this.displayModeChanged();
57
+ }
58
+ if (changed.has('selectedSort') && this.sortDirection === null) {
59
+ this.sortDirection = 'desc';
60
+ }
61
+ if (changed.has('selectedTitleFilter') && this.selectedTitleFilter) {
62
+ this.alphaSelectorVisible = 'title';
63
+ }
64
+ if (changed.has('selectedCreatorFilter') && this.selectedCreatorFilter) {
65
+ this.alphaSelectorVisible = 'creator';
66
+ }
67
+ if (changed.has('dateSortSelectorVisible')) {
68
+ this.setupEscapeListeners();
69
+ }
70
+ if (changed.has('resizeObserver')) {
71
+ const oldObserver = changed.get('resizeObserver');
72
+ if (oldObserver)
73
+ this.disconnectResizeObserver(oldObserver);
74
+ this.setupResizeObserver();
75
+ }
76
+ }
77
+ setupEscapeListeners() {
78
+ if (this.dateSortSelectorVisible) {
79
+ document.addEventListener('keydown', this.boundDateSelectorEscapeListener);
80
+ }
81
+ else {
82
+ document.removeEventListener('keydown', this.boundDateSelectorEscapeListener);
83
+ }
84
+ }
85
+ disconnectedCallback() {
86
+ if (this.resizeObserver) {
87
+ this.disconnectResizeObserver(this.resizeObserver);
88
+ }
89
+ }
90
+ disconnectResizeObserver(resizeObserver) {
91
+ resizeObserver.removeObserver({
92
+ target: this.sortSelectorContainer,
93
+ handler: this,
94
+ });
95
+ resizeObserver.removeObserver({
96
+ target: this.desktopSortSelector,
97
+ handler: this,
98
+ });
99
+ }
100
+ setupResizeObserver() {
101
+ if (!this.resizeObserver)
102
+ return;
103
+ this.resizeObserver.addObserver({
104
+ target: this.sortSelectorContainer,
105
+ handler: this,
106
+ });
107
+ this.resizeObserver.addObserver({
108
+ target: this.desktopSortSelector,
109
+ handler: this,
110
+ });
111
+ }
112
+ get mobileSelectorVisible() {
113
+ return this.selectorBarContainerWidth - 10 < this.desktopSelectorBarWidth;
114
+ }
115
+ get alphaBarTemplate() {
116
+ if (!['title', 'creator'].includes(this.selectedSort))
117
+ return nothing;
118
+ if (this.alphaSelectorVisible === null) {
119
+ if (this.selectedSort === 'creator')
120
+ return this.creatorSelectorBar;
121
+ if (this.selectedSort === 'title')
122
+ return this.titleSelectorBar;
123
+ }
124
+ else {
125
+ return this.alphaSelectorVisible === 'creator'
126
+ ? this.creatorSelectorBar
127
+ : this.titleSelectorBar;
128
+ }
129
+ return nothing;
130
+ }
131
+ handleResize(entry) {
132
+ if (entry.target === this.desktopSortSelector) {
133
+ this.desktopSelectorBarWidth = entry.contentRect.width;
134
+ }
135
+ else if (entry.target === this.sortSelectorContainer) {
136
+ this.selectorBarContainerWidth = entry.contentRect.width;
137
+ }
138
+ }
139
+ get sortDirectionSelectorTemplate() {
140
+ return html `
141
+ <div id="sort-direction-selector">
142
+ <button
143
+ id="sort-ascending-btn"
144
+ class="sort-button ${this.sortDirection === 'asc' ? 'selected' : ''}"
145
+ ?disabled=${this.selectedSort === 'relevance'}
146
+ @click=${() => {
147
+ this.setSortDirections('asc');
148
+ }}
149
+ >
150
+ ${sortIcon}
151
+ </button>
152
+ <button
153
+ id="sort-descending-btn"
154
+ class="sort-button ${this.sortDirection === 'desc' ? 'selected' : ''}"
155
+ ?disabled=${this.selectedSort === 'relevance'}
156
+ @click=${() => {
157
+ this.setSortDirections('desc');
158
+ }}
159
+ >
160
+ ${sortIcon}
161
+ </button>
162
+ </div>
163
+ `;
164
+ }
165
+ get desktopSortSelectorTemplate() {
166
+ return html `
167
+ <ul
168
+ id="desktop-sort-selector"
169
+ class=${this.mobileSelectorVisible ? 'hidden' : 'visible'}
170
+ >
171
+ <li id="sort-by-text">Sort By</li>
172
+ <li>
173
+ ${this.showRelevance
174
+ ? this.getSortDisplayOption(SortField.relevance)
175
+ : nothing}
176
+ </li>
177
+ <li>${this.getSortDisplayOption(SortField.views)}</li>
178
+ <li>
179
+ ${this.getSortDisplayOption(SortField.title, {
180
+ clickEvent: () => {
181
+ this.alphaSelectorVisible = 'title';
182
+ this.selectedCreatorFilter = null;
183
+ this.dateSortSelectorVisible = false;
184
+ this.setSelectedSort(SortField.title);
185
+ this.emitCreatorLetterChangedEvent();
186
+ },
187
+ })}
188
+ </li>
189
+ <li>
190
+ ${this.getSortDisplayOption(SortField.date, {
191
+ clickEvent: () => {
192
+ if (!this.dateOptionSelected)
193
+ this.setSelectedSort(SortField.date);
194
+ this.dateSortSelectorVisible = !this.dateSortSelectorVisible;
195
+ this.alphaSelectorVisible = null;
196
+ this.selectedTitleFilter = null;
197
+ this.selectedCreatorFilter = null;
198
+ this.emitTitleLetterChangedEvent();
199
+ this.emitCreatorLetterChangedEvent();
200
+ },
201
+ displayName: html `${this.dateSortField}`,
202
+ isSelected: () => this.dateOptionSelected,
203
+ })}
204
+ </li>
205
+ <li>
206
+ ${this.getSortDisplayOption(SortField.creator, {
207
+ clickEvent: () => {
208
+ this.alphaSelectorVisible = 'creator';
209
+ this.selectedTitleFilter = null;
210
+ this.dateSortSelectorVisible = false;
211
+ this.setSelectedSort(SortField.creator);
212
+ this.emitTitleLetterChangedEvent();
213
+ },
214
+ })}
215
+ </li>
216
+ </ul>
217
+ `;
218
+ }
219
+ /**
220
+ * This generates each of the sort option links.
221
+ *
222
+ * It manages the display value and the selected state of the option.
223
+ *
224
+ * @param sortField
225
+ * @param options {
226
+ * additionalClickEvent?: () => void; If this is provided, it will also be called when the option is clicked.
227
+ * displayName?: TemplateResult; The name to display for the option. Defaults to the sortField display name.
228
+ * isSelected?: () => boolean; A function that returns true if the option is selected. Defaults to the selectedSort === sortField.
229
+ * }
230
+ * @returns
231
+ */
232
+ getSortDisplayOption(sortField, options) {
233
+ var _a, _b;
234
+ const isSelected = (_a = options === null || options === void 0 ? void 0 : options.isSelected) !== null && _a !== void 0 ? _a : (() => this.selectedSort === sortField);
235
+ const displayName = (_b = options === null || options === void 0 ? void 0 : options.displayName) !== null && _b !== void 0 ? _b : SortFieldDisplayName[sortField];
236
+ return html `
237
+ <a
238
+ href="#"
239
+ @click=${(e) => {
240
+ e.preventDefault();
241
+ if (options === null || options === void 0 ? void 0 : options.clickEvent) {
242
+ options.clickEvent(e);
243
+ }
244
+ else {
245
+ this.alphaSelectorVisible = null;
246
+ this.dateSortSelectorVisible = false;
247
+ this.selectedTitleFilter = null;
248
+ this.selectedCreatorFilter = null;
249
+ this.setSelectedSort(sortField);
250
+ this.emitTitleLetterChangedEvent();
251
+ this.emitCreatorLetterChangedEvent();
252
+ }
253
+ }}
254
+ class=${isSelected() ? 'selected' : ''}
255
+ >
256
+ ${displayName}
257
+ </a>
258
+ `;
259
+ }
260
+ get mobileSortSelectorTemplate() {
261
+ return html `
262
+ <select
263
+ id="mobile-sort-selector"
264
+ @change=${this.mobileSortChanged}
265
+ class=${this.mobileSelectorVisible ? 'visible' : 'hidden'}
266
+ >
267
+ ${Object.keys(SortField).map(field => html `
268
+ <option value="${field}" ?selected=${this.selectedSort === field}>
269
+ ${SortFieldDisplayName[field]}
270
+ </option>
271
+ `)}
272
+ </select>
273
+ `;
274
+ }
275
+ mobileSortChanged(e) {
276
+ const target = e.target;
277
+ this.setSelectedSort(target.value);
278
+ }
279
+ get displayOptionTemplate() {
280
+ return html `
281
+ <ul>
282
+ <li>
283
+ <button
284
+ id="grid-button"
285
+ @click=${() => {
286
+ this.displayMode = 'grid';
287
+ }}
288
+ class=${this.displayMode === 'grid' ? 'active' : ''}
289
+ title="Tile view"
290
+ >
291
+ ${tileIcon}
292
+ </button>
293
+ </li>
294
+ <li>
295
+ <button
296
+ id="grid-button"
297
+ @click=${() => {
298
+ this.displayMode = 'list-detail';
299
+ }}
300
+ class=${this.displayMode === 'list-detail' ? 'active' : ''}
301
+ title="List view"
302
+ >
303
+ ${listIcon}
304
+ </button>
305
+ </li>
306
+ <li>
307
+ <button
308
+ id="list-button"
309
+ @click=${() => {
310
+ this.displayMode = 'list-compact';
311
+ }}
312
+ class=${this.displayMode === 'list-compact' ? 'active' : ''}
313
+ title="Compact list view"
314
+ >
315
+ ${compactIcon}
316
+ </button>
317
+ </li>
318
+ </ul>
319
+ `;
320
+ }
321
+ get dateSortSelector() {
322
+ return html `
323
+ <div
324
+ id="date-sort-selector-backdrop"
325
+ @keyup=${() => {
326
+ this.dateSortSelectorVisible = false;
327
+ }}
328
+ @click=${() => {
329
+ this.dateSortSelectorVisible = false;
330
+ }}
331
+ ></div>
332
+ <div id="date-sort-selector">
333
+ <ul>
334
+ <li>${this.getDateSortButton(SortField.datearchived)}</li>
335
+ <li>${this.getDateSortButton(SortField.date)}</li>
336
+ <li>${this.getDateSortButton(SortField.datereviewed)}</li>
337
+ <li>${this.getDateSortButton(SortField.dateadded)}</li>
338
+ </ul>
339
+ </div>
340
+ `;
341
+ }
342
+ getDateSortButton(sortField) {
343
+ return html `
344
+ <button
345
+ @click=${() => {
346
+ this.selectDateSort(sortField);
347
+ }}
348
+ class=${this.selectedSort === sortField ? 'selected' : ''}
349
+ >
350
+ ${SortFieldDisplayName[sortField]}
351
+ </button>
352
+ `;
353
+ }
354
+ selectDateSort(sortField) {
355
+ this.dateSortSelectorVisible = false;
356
+ this.setSelectedSort(sortField);
357
+ }
358
+ setSortDirections(sortDirection) {
359
+ this.sortDirection = sortDirection;
360
+ this.emitSortChangedEvent();
361
+ }
362
+ setSelectedSort(sort) {
363
+ this.selectedSort = sort;
364
+ this.emitSortChangedEvent();
365
+ }
366
+ /**
367
+ * There are four date sort options.
368
+ *
369
+ * This checks to see if the current sort is one of them.
370
+ *
371
+ * @readonly
372
+ * @private
373
+ * @type {boolean}
374
+ * @memberof SortFilterBar
375
+ */
376
+ get dateOptionSelected() {
377
+ const dateSortFields = [
378
+ SortField.datearchived,
379
+ SortField.date,
380
+ SortField.datereviewed,
381
+ SortField.dateadded,
382
+ ];
383
+ return dateSortFields.includes(this.selectedSort);
384
+ }
385
+ /**
386
+ * The display name of the current date field
387
+ *
388
+ * @readonly
389
+ * @private
390
+ * @type {string}
391
+ * @memberof SortFilterBar
392
+ */
393
+ get dateSortField() {
394
+ var _a;
395
+ const defaultSort = SortFieldDisplayName[SortField.date];
396
+ const name = this.dateOptionSelected
397
+ ? (_a = SortFieldDisplayName[this.selectedSort]) !== null && _a !== void 0 ? _a : defaultSort
398
+ : defaultSort;
399
+ return name;
400
+ }
401
+ get titleSelectorBar() {
402
+ return html ` <alpha-bar
403
+ .selectedLetter=${this.selectedTitleFilter}
404
+ @letterChanged=${this.titleLetterChanged}
405
+ ></alpha-bar>`;
406
+ }
407
+ get creatorSelectorBar() {
408
+ return html ` <alpha-bar
409
+ .selectedLetter=${this.selectedCreatorFilter}
410
+ @letterChanged=${this.creatorLetterChanged}
411
+ ></alpha-bar>`;
412
+ }
413
+ titleLetterChanged(e) {
414
+ var _a;
415
+ this.selectedTitleFilter = (_a = e.detail.selectedLetter) !== null && _a !== void 0 ? _a : null;
416
+ this.emitTitleLetterChangedEvent();
417
+ }
418
+ creatorLetterChanged(e) {
419
+ var _a;
420
+ this.selectedCreatorFilter = (_a = e.detail.selectedLetter) !== null && _a !== void 0 ? _a : null;
421
+ this.emitCreatorLetterChangedEvent();
422
+ }
423
+ emitTitleLetterChangedEvent() {
424
+ const event = new CustomEvent('titleLetterChanged', {
425
+ detail: { selectedLetter: this.selectedTitleFilter },
426
+ });
427
+ this.dispatchEvent(event);
428
+ }
429
+ emitCreatorLetterChangedEvent() {
430
+ const event = new CustomEvent('creatorLetterChanged', {
431
+ detail: { selectedLetter: this.selectedCreatorFilter },
432
+ });
433
+ this.dispatchEvent(event);
434
+ }
435
+ displayModeChanged() {
436
+ const event = new CustomEvent('displayModeChanged', {
437
+ detail: { displayMode: this.displayMode },
438
+ });
439
+ this.dispatchEvent(event);
440
+ }
441
+ emitSortChangedEvent() {
442
+ const event = new CustomEvent('sortChanged', {
443
+ detail: {
444
+ selectedSort: this.selectedSort,
445
+ sortDirection: this.sortDirection,
446
+ },
447
+ });
448
+ this.dispatchEvent(event);
449
+ }
450
+ };
451
+ SortFilterBar.styles = css `
452
+ #container {
453
+ position: relative;
454
+ }
455
+
456
+ #sort-bar {
457
+ display: flex;
458
+ justify-content: space-between;
459
+ border: 1px solid rgb(232, 232, 232);
460
+ align-items: center;
461
+ padding: 0.5rem 1.5rem;
462
+ }
463
+
464
+ #sort-direction-container {
465
+ flex: 0;
466
+ }
467
+
468
+ #sort-by-text {
469
+ text-transform: uppercase;
470
+ }
471
+
472
+ #bottom-shadow {
473
+ height: 1px;
474
+ width: 100%;
475
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
476
+ background-color: #bbb;
477
+ }
478
+
479
+ ul {
480
+ list-style: none;
481
+ display: flex;
482
+ margin: 0;
483
+ padding: 0;
484
+ align-items: center;
485
+ }
486
+
487
+ li {
488
+ padding: 0;
489
+ }
490
+
491
+ .sort-button {
492
+ background: none;
493
+ color: inherit;
494
+ border: none;
495
+ padding: 0;
496
+ cursor: pointer;
497
+ outline: inherit;
498
+ width: 12px;
499
+ height: 12px;
500
+ opacity: 0.5;
501
+ }
502
+
503
+ .sort-button.selected {
504
+ opacity: 1;
505
+ }
506
+
507
+ .sort-button:disabled {
508
+ opacity: 0.25;
509
+ cursor: default;
510
+ }
511
+
512
+ #date-sort-selector {
513
+ position: absolute;
514
+ left: 150px;
515
+ top: 45px;
516
+
517
+ z-index: 1;
518
+ padding: 1rem;
519
+ background-color: white;
520
+ border-radius: 2.5rem;
521
+ border: 1px solid #404142;
522
+ }
523
+
524
+ #date-sort-selector button {
525
+ background: none;
526
+ border-radius: 15px;
527
+ color: #404142;
528
+ border: none;
529
+ appearance: none;
530
+ cursor: pointer;
531
+ -webkit-appearance: none;
532
+ font-size: 1.4rem;
533
+ font-weight: 400;
534
+ padding: 0.5rem 1.2rem;
535
+ }
536
+
537
+ #date-sort-selector button.selected {
538
+ background-color: #404142;
539
+ color: white;
540
+ }
541
+
542
+ #show-details {
543
+ text-transform: uppercase;
544
+ cursor: pointer;
545
+ display: flex;
546
+ }
547
+
548
+ #show-details input {
549
+ margin-right: 0.5rem;
550
+ flex: 0 0 12px;
551
+ }
552
+
553
+ #sort-descending-btn {
554
+ transform: rotate(180deg);
555
+ }
556
+
557
+ #sort-direction-selector {
558
+ display: flex;
559
+ flex-direction: column;
560
+ gap: 3px;
561
+ margin-right: 1rem;
562
+ }
563
+
564
+ #sort-selector-container {
565
+ flex: 1;
566
+ }
567
+
568
+ /*
569
+ we move the desktop sort selector offscreen instead of display: none
570
+ because we need to observe the width of it vs its container to determine
571
+ if it's wide enough to display the desktop version and if you displY: none,
572
+ the width becomes 0
573
+ */
574
+ #desktop-sort-selector.hidden {
575
+ position: absolute;
576
+ top: -9999px;
577
+ left: -9999px;
578
+ }
579
+
580
+ #mobile-sort-selector.hidden {
581
+ display: none;
582
+ }
583
+
584
+ #date-sort-selector-backdrop {
585
+ position: fixed;
586
+ top: 0;
587
+ left: 0;
588
+ width: 100%;
589
+ height: 100%;
590
+ z-index: 1;
591
+ background-color: rgba(255, 255, 255, 0.5);
592
+ }
593
+
594
+ #desktop-sort-selector {
595
+ display: inline-flex;
596
+ }
597
+
598
+ #desktop-sort-selector li {
599
+ display: flex;
600
+ align-items: center;
601
+ }
602
+
603
+ #desktop-sort-selector li a {
604
+ text-decoration: none;
605
+ text-transform: uppercase;
606
+ font-size: 1.4rem;
607
+ color: #333;
608
+ line-height: 2.5;
609
+ }
610
+
611
+ #desktop-sort-selector li a.selected {
612
+ font-weight: bold;
613
+ }
614
+
615
+ #desktop-sort-selector li::after {
616
+ content: '•';
617
+ padding-left: 1rem;
618
+ padding-right: 1rem;
619
+ }
620
+
621
+ #desktop-sort-selector li:first-child::after {
622
+ content: '';
623
+ }
624
+
625
+ #desktop-sort-selector li:last-child::after {
626
+ content: '';
627
+ }
628
+
629
+ #display-style-selector {
630
+ flex: 0;
631
+ }
632
+
633
+ #display-style-selector button {
634
+ background: none;
635
+ color: inherit;
636
+ border: none;
637
+ appearance: none;
638
+ cursor: pointer;
639
+ -webkit-appearance: none;
640
+ opacity: 0.5;
641
+ }
642
+
643
+ #display-style-selector button.active {
644
+ opacity: 1;
645
+ }
646
+
647
+ #display-style-selector button svg {
648
+ width: 24px;
649
+ height: 24px;
650
+ }
651
+ `;
652
+ __decorate([
653
+ property({ type: String })
654
+ ], SortFilterBar.prototype, "displayMode", void 0);
655
+ __decorate([
656
+ property({ type: String })
657
+ ], SortFilterBar.prototype, "sortDirection", void 0);
658
+ __decorate([
659
+ property({ type: String })
660
+ ], SortFilterBar.prototype, "selectedSort", void 0);
661
+ __decorate([
662
+ property({ type: String })
663
+ ], SortFilterBar.prototype, "selectedTitleFilter", void 0);
664
+ __decorate([
665
+ property({ type: String })
666
+ ], SortFilterBar.prototype, "selectedCreatorFilter", void 0);
667
+ __decorate([
668
+ property({ type: Boolean })
669
+ ], SortFilterBar.prototype, "showRelevance", void 0);
670
+ __decorate([
671
+ property({ type: Object })
672
+ ], SortFilterBar.prototype, "resizeObserver", void 0);
673
+ __decorate([
674
+ state()
675
+ ], SortFilterBar.prototype, "alphaSelectorVisible", void 0);
676
+ __decorate([
677
+ state()
678
+ ], SortFilterBar.prototype, "dateSortSelectorVisible", void 0);
679
+ __decorate([
680
+ state()
681
+ ], SortFilterBar.prototype, "desktopSelectorBarWidth", void 0);
682
+ __decorate([
683
+ state()
684
+ ], SortFilterBar.prototype, "selectorBarContainerWidth", void 0);
685
+ __decorate([
686
+ state()
687
+ ], SortFilterBar.prototype, "hoveringOverDateSortOptions", void 0);
688
+ __decorate([
689
+ query('#desktop-sort-selector')
690
+ ], SortFilterBar.prototype, "desktopSortSelector", void 0);
691
+ __decorate([
692
+ query('#sort-selector-container')
693
+ ], SortFilterBar.prototype, "sortSelectorContainer", void 0);
694
+ SortFilterBar = __decorate([
695
+ customElement('sort-filter-bar')
696
+ ], SortFilterBar);
697
+ export { SortFilterBar };
698
+ //# sourceMappingURL=sort-filter-bar.js.map