@internetarchive/collection-browser 0.0.1-alpha.2 → 0.0.1-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/demo/app-root.ts +24 -158
  2. package/dist/demo/app-root.d.ts +2 -16
  3. package/dist/demo/app-root.js +23 -141
  4. package/dist/demo/app-root.js.map +1 -1
  5. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  6. package/dist/src/assets/img/icons/chevron.js +4 -0
  7. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  8. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  9. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  10. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  11. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  12. package/dist/src/assets/img/icons/eye.js +5 -0
  13. package/dist/src/assets/img/icons/eye.js.map +1 -0
  14. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
  15. package/dist/src/assets/img/icons/mediatype/account.js +5 -4
  16. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
  17. package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
  18. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
  19. package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
  20. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
  21. package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
  22. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
  23. package/dist/src/assets/img/icons/mediatype/film.js +2 -1
  24. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
  25. package/dist/src/assets/img/icons/mediatype/images.js +9 -6
  26. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
  27. package/dist/src/assets/img/icons/mediatype/software.js +9 -6
  28. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
  29. package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
  30. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
  31. package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
  32. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
  33. package/dist/src/assets/img/icons/mediatype/video.js +10 -6
  34. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
  35. package/dist/src/assets/img/icons/mediatype/web.js +9 -6
  36. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
  37. package/dist/src/async-collection-name.d.ts +11 -0
  38. package/dist/src/async-collection-name.js +38 -0
  39. package/dist/src/async-collection-name.js.map +1 -0
  40. package/dist/src/collection-browser.d.ts +55 -17
  41. package/dist/src/collection-browser.js +466 -106
  42. package/dist/src/collection-browser.js.map +1 -1
  43. package/dist/src/collection-facets.d.ts +24 -5
  44. package/dist/src/collection-facets.js +300 -78
  45. package/dist/src/collection-facets.js.map +1 -1
  46. package/dist/src/collection-name-cache.d.ts +18 -0
  47. package/dist/src/collection-name-cache.js +89 -0
  48. package/dist/src/collection-name-cache.js.map +1 -0
  49. package/dist/src/mediatype-icon.js +10 -3
  50. package/dist/src/mediatype-icon.js.map +1 -1
  51. package/dist/src/models.d.ts +72 -14
  52. package/dist/src/models.js +57 -1
  53. package/dist/src/models.js.map +1 -1
  54. package/dist/src/restoration-state-handler.d.ts +37 -0
  55. package/dist/src/restoration-state-handler.js +177 -0
  56. package/dist/src/restoration-state-handler.js.map +1 -0
  57. package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -2
  58. package/dist/src/sort-filter-bar/alpha-bar.js +19 -9
  59. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  60. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  61. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  62. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  63. package/dist/src/sort-filter-bar/img/grid.d.ts +1 -0
  64. package/dist/src/sort-filter-bar/img/grid.js +5 -0
  65. package/dist/src/sort-filter-bar/img/grid.js.map +1 -0
  66. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  67. package/dist/src/sort-filter-bar/img/list.js +5 -0
  68. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  69. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  70. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  71. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  72. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  73. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  74. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  75. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +65 -11
  76. package/dist/src/sort-filter-bar/sort-filter-bar.js +453 -142
  77. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  78. package/dist/src/tiles/grid/collection-tile.js +1 -2
  79. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  80. package/dist/src/tiles/grid/item-tile.d.ts +4 -0
  81. package/dist/src/tiles/grid/item-tile.js +134 -45
  82. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  83. package/dist/src/tiles/list/tile-list-compact-header.d.ts +11 -0
  84. package/dist/src/tiles/list/tile-list-compact-header.js +79 -0
  85. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  86. package/dist/src/tiles/list/tile-list-compact.d.ts +1 -0
  87. package/dist/src/tiles/list/tile-list-compact.js +122 -31
  88. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  89. package/dist/src/tiles/list/tile-list-detail.d.ts +0 -10
  90. package/dist/src/tiles/list/tile-list-detail.js +6 -159
  91. package/dist/src/tiles/list/tile-list-detail.js.map +1 -1
  92. package/dist/src/tiles/list/tile-list.d.ts +19 -6
  93. package/dist/src/tiles/list/tile-list.js +240 -108
  94. package/dist/src/tiles/list/tile-list.js.map +1 -1
  95. package/dist/src/tiles/tile-dispatcher.d.ts +8 -1
  96. package/dist/src/tiles/tile-dispatcher.js +46 -11
  97. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  98. package/dist/src/utils/format-date.js +1 -2
  99. package/dist/src/utils/format-date.js.map +1 -1
  100. package/dist/test/{utils/format-string.test.d.ts → collection-name-cache.test.d.ts} +0 -0
  101. package/dist/test/collection-name-cache.test.js +158 -0
  102. package/dist/test/collection-name-cache.test.js.map +1 -0
  103. package/dist/test/mocks/mock-search-response.d.ts +5 -0
  104. package/dist/test/mocks/mock-search-response.js +62 -0
  105. package/dist/test/mocks/mock-search-response.js.map +1 -0
  106. package/dist/test/mocks/mock-search-service.d.ts +13 -0
  107. package/dist/test/mocks/mock-search-service.js +20 -0
  108. package/dist/test/mocks/mock-search-service.js.map +1 -0
  109. package/package.json +9 -4
  110. package/src/assets/img/icons/chevron.ts +4 -0
  111. package/src/assets/img/icons/eye-closed.ts +5 -0
  112. package/src/assets/img/icons/eye.ts +5 -0
  113. package/src/assets/img/icons/mediatype/account.ts +5 -4
  114. package/src/assets/img/icons/mediatype/audio.ts +7 -4
  115. package/src/assets/img/icons/mediatype/collection.ts +7 -4
  116. package/src/assets/img/icons/mediatype/etree.ts +10 -5
  117. package/src/assets/img/icons/mediatype/film.ts +2 -1
  118. package/src/assets/img/icons/mediatype/images.ts +9 -6
  119. package/src/assets/img/icons/mediatype/software.ts +9 -6
  120. package/src/assets/img/icons/mediatype/texts.ts +9 -6
  121. package/src/assets/img/icons/mediatype/tv.ts +10 -5
  122. package/src/assets/img/icons/mediatype/video.ts +10 -6
  123. package/src/assets/img/icons/mediatype/web.ts +9 -6
  124. package/src/collection-browser.ts +490 -105
  125. package/src/collection-facets.ts +325 -109
  126. package/src/mediatype-icon.ts +10 -3
  127. package/src/models.ts +139 -14
  128. package/src/restoration-state-handler.ts +234 -0
  129. package/src/sort-filter-bar/alpha-bar.ts +19 -9
  130. package/src/sort-filter-bar/img/compact.ts +5 -0
  131. package/src/sort-filter-bar/img/list.ts +5 -0
  132. package/src/sort-filter-bar/img/sort-triangle.ts +5 -0
  133. package/src/sort-filter-bar/img/tile.ts +5 -0
  134. package/src/sort-filter-bar/sort-filter-bar.ts +499 -149
  135. package/src/tiles/grid/collection-tile.ts +1 -2
  136. package/src/tiles/grid/item-tile.ts +138 -56
  137. package/src/tiles/list/tile-list-compact-header.ts +75 -0
  138. package/src/tiles/list/tile-list-compact.ts +209 -0
  139. package/src/tiles/list/tile-list.ts +261 -110
  140. package/src/tiles/tile-dispatcher.ts +51 -11
  141. package/src/utils/format-date.ts +1 -2
  142. package/dist/src/assets/img/icons/audio.d.ts +0 -1
  143. package/dist/src/assets/img/icons/audio.js +0 -9
  144. package/dist/src/assets/img/icons/audio.js.map +0 -1
  145. package/dist/src/assets/img/icons/collection.d.ts +0 -1
  146. package/dist/src/assets/img/icons/collection.js +0 -9
  147. package/dist/src/assets/img/icons/collection.js.map +0 -1
  148. package/dist/src/assets/img/icons/etree.d.ts +0 -1
  149. package/dist/src/assets/img/icons/etree.js +0 -9
  150. package/dist/src/assets/img/icons/etree.js.map +0 -1
  151. package/dist/src/assets/img/icons/images.d.ts +0 -1
  152. package/dist/src/assets/img/icons/images.js +0 -10
  153. package/dist/src/assets/img/icons/images.js.map +0 -1
  154. package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +0 -1
  155. package/dist/src/assets/img/icons/mediatype/etree copy.js +0 -9
  156. package/dist/src/assets/img/icons/mediatype/etree copy.js.map +0 -1
  157. package/dist/src/assets/img/icons/mediatype/livemusic.d.ts +0 -1
  158. package/dist/src/assets/img/icons/mediatype/livemusic.js +0 -7
  159. package/dist/src/assets/img/icons/mediatype/livemusic.js.map +0 -1
  160. package/dist/src/assets/img/icons/mediatype/photos.d.ts +0 -1
  161. package/dist/src/assets/img/icons/mediatype/photos.js +0 -7
  162. package/dist/src/assets/img/icons/mediatype/photos.js.map +0 -1
  163. package/dist/src/assets/img/icons/software.d.ts +0 -1
  164. package/dist/src/assets/img/icons/software.js +0 -10
  165. package/dist/src/assets/img/icons/software.js.map +0 -1
  166. package/dist/src/assets/img/icons/texts.d.ts +0 -1
  167. package/dist/src/assets/img/icons/texts.js +0 -10
  168. package/dist/src/assets/img/icons/texts.js.map +0 -1
  169. package/dist/src/assets/img/icons/tv.d.ts +0 -1
  170. package/dist/src/assets/img/icons/tv.js +0 -9
  171. package/dist/src/assets/img/icons/tv.js.map +0 -1
  172. package/dist/src/assets/img/icons/video.d.ts +0 -1
  173. package/dist/src/assets/img/icons/video.js +0 -10
  174. package/dist/src/assets/img/icons/video.js.map +0 -1
  175. package/dist/src/assets/img/icons/web.d.ts +0 -1
  176. package/dist/src/assets/img/icons/web.js +0 -10
  177. package/dist/src/assets/img/icons/web.js.map +0 -1
  178. package/dist/src/utils/format-string.d.ts +0 -2
  179. package/dist/src/utils/format-string.js +0 -7
  180. package/dist/src/utils/format-string.js.map +0 -1
  181. package/dist/test/utils/format-string.test.js +0 -17
  182. package/dist/test/utils/format-string.test.js.map +0 -1
  183. package/src/assets/img/icons/mediatype/foo.svg +0 -5
@@ -2,21 +2,34 @@ import { __decorate } from "tslib";
2
2
  /* eslint-disable import/no-duplicates */
3
3
  import { html, css, LitElement, nothing, } from 'lit';
4
4
  import { customElement, property, query, state } from 'lit/decorators.js';
5
+ import { ifDefined } from 'lit/directives/if-defined.js';
5
6
  import { SearchParams, } from '@internetarchive/search-service';
6
- import { AggregateSearchParams, } from '@internetarchive/search-service/dist/src/search-params';
7
+ import { AggregateSearchParams, SortParam, } from '@internetarchive/search-service';
7
8
  import '@internetarchive/infinite-scroller';
8
- import '@internetarchive/histogram-date-range';
9
9
  import './tiles/tile-dispatcher';
10
10
  import './tiles/loading-tile';
11
11
  import './sort-filter-bar/sort-filter-bar';
12
12
  import './collection-facets';
13
13
  import './circular-activity-indicator';
14
+ import './sort-filter-bar/sort-filter-bar';
15
+ import { SortField, SortFieldToMetadataField, defaultSelectedFacets, } from './models';
16
+ import { RestorationStateHandler, } from './restoration-state-handler';
17
+ import chevronIcon from './assets/img/icons/chevron';
14
18
  let CollectionBrowser = class CollectionBrowser extends LitElement {
15
19
  constructor() {
16
20
  super(...arguments);
17
21
  this.showDeleteButtons = false;
18
- this.displayMode = 'grid';
22
+ this.sortParam = null;
23
+ this.selectedSort = SortField.relevance;
24
+ this.selectedTitleFilter = null;
25
+ this.selectedCreatorFilter = null;
26
+ this.sortDirection = null;
19
27
  this.pageSize = 50;
28
+ this.pageContext = 'search';
29
+ this.restorationStateHandler = new RestorationStateHandler({
30
+ context: this.pageContext,
31
+ });
32
+ this.mobileBreakpoint = 530;
20
33
  /**
21
34
  * The page that the consumer wants to load.
22
35
  */
@@ -29,9 +42,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
29
42
  */
30
43
  this.pagesToRender = this.initialPageNumber;
31
44
  this.searchResultsLoading = false;
32
- this.selectedFacets = {};
33
45
  this.facetsLoading = false;
34
46
  this.fullYearAggregationLoading = false;
47
+ this.mobileView = false;
48
+ this.mobileFacetsVisible = false;
35
49
  /**
36
50
  * When we're animated scrolling to the page, we don't want to fetch
37
51
  * all of the pages as it scrolls so this lets us know if we're scrolling
@@ -74,6 +88,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
74
88
  }
75
89
  return model;
76
90
  }
91
+ get sortFilterQueries() {
92
+ const queries = [this.titleQuery, this.creatorQuery];
93
+ return queries.filter(q => q).join(' AND ');
94
+ }
77
95
  // this is the total number of tiles we expect if
78
96
  // the data returned is a full page worth
79
97
  // this is useful for putting in placeholders for the expected number of tiles
@@ -87,9 +105,9 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
87
105
  return Object.keys(this.dataSource).reduce((acc, page) => acc + this.dataSource[page].length, 0);
88
106
  }
89
107
  /**
108
+ * Go to the given page of results
90
109
  *
91
110
  * @param pageNumber
92
- * @param scroll
93
111
  */
94
112
  goToPage(pageNumber) {
95
113
  this.initialPageNumber = pageNumber;
@@ -97,36 +115,72 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
97
115
  this.scrollToPage(pageNumber);
98
116
  }
99
117
  render() {
100
- var _a, _b;
101
118
  return html `
102
- <h1>Collection Browser</h1>
103
-
104
- <div id="query">
105
- <ul>
106
- <li>Base Query: ${this.baseQuery}</li>
107
- <li>Facet Query: ${this.facetQuery}</li>
108
- <li>Additional Query: ${this.additionalQueryClause}</li>
109
- <li>Date Range Query: ${this.dateRangeQueryClause}</li>
110
- <li>Sort: ${(_a = this.sortParam) === null || _a === void 0 ? void 0 : _a.field} ${(_b = this.sortParam) === null || _b === void 0 ? void 0 : _b.direction}</li>
111
- <li>Full Query: ${this.fullQuery}</li>
112
- </ul>
113
- </div>
114
-
115
- <div id="content-container">
116
- <div id="left-column">
117
- <div id="histogram-container">${this.histogramTemplate}</div>
118
- <div id="facets-container">
119
- ${this.facetsLoading ? this.loadingTemplate : nothing}
120
- <collection-facets
121
- @facetsChanged=${this.facetsChanged}
122
- .aggregations=${this.aggregations}
123
- ></collection-facets>
119
+ <div id="content-container" class=${this.mobileView ? 'mobile' : ''}>
120
+ <div id="left-column" class="column">
121
+ <div id="mobile-header-container">
122
+ ${this.mobileView
123
+ ? html `
124
+ <div id="mobile-filter-collapse">
125
+ <h1
126
+ @click=${() => {
127
+ this.mobileFacetsVisible = !this.mobileFacetsVisible;
128
+ }}
129
+ @keyup=${() => {
130
+ this.mobileFacetsVisible = !this.mobileFacetsVisible;
131
+ }}
132
+ >
133
+ <span
134
+ class="collapser ${this.mobileFacetsVisible
135
+ ? 'open'
136
+ : ''}"
137
+ >
138
+ ${chevronIcon}
139
+ </span>
140
+ Filters
141
+ </h1>
142
+ </div>
143
+ `
144
+ : nothing}
145
+ <div id="results-total">
146
+ <span id="big-results-count"
147
+ >${this.totalResults
148
+ ? this.totalResults.toLocaleString()
149
+ : '-'}</span
150
+ >
151
+ <span id="big-results-label">Results</span>
152
+ </div>
153
+ </div>
154
+ <div
155
+ id="facets-container"
156
+ class=${!this.mobileView || this.mobileFacetsVisible
157
+ ? 'expanded'
158
+ : ''}
159
+ >
160
+ ${this.facetsTemplate}
124
161
  </div>
125
162
  </div>
126
- <div id="right-column">
163
+ <div id="right-column" class="column">
127
164
  ${this.searchResultsLoading ? this.loadingTemplate : nothing}
165
+ <sort-filter-bar
166
+ .selectedSort=${this.selectedSort}
167
+ .sortDirection=${this.sortDirection}
168
+ .displayMode=${this.displayMode}
169
+ .selectedTitleFilter=${this.selectedTitleFilter}
170
+ .selectedCreatorFilter=${this.selectedCreatorFilter}
171
+ .resizeObserver=${this.resizeObserver}
172
+ @sortChanged=${this.userChangedSort}
173
+ @displayModeChanged=${this.displayModeChanged}
174
+ @titleLetterChanged=${this.titleLetterSelected}
175
+ @creatorLetterChanged=${this.creatorLetterSelected}
176
+ ></sort-filter-bar>
177
+
178
+ ${this.displayMode === `list-compact`
179
+ ? this.listHeaderTemplate
180
+ : nothing}
181
+
128
182
  <infinite-scroller
129
- class="${this.displayMode}"
183
+ class="${ifDefined(this.displayMode)}"
130
184
  .cellProvider=${this}
131
185
  .placeholderCellTemplate=${this.placeholderCellTemplate}
132
186
  @scrollThresholdReached=${this.scrollThresholdReached}
@@ -137,6 +191,66 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
137
191
  </div>
138
192
  `;
139
193
  }
194
+ userChangedSort(e) {
195
+ var _a;
196
+ const { selectedSort, sortDirection } = e.detail;
197
+ this.selectedSort = selectedSort;
198
+ this.sortDirection = sortDirection;
199
+ if (((_a = this.currentPage) !== null && _a !== void 0 ? _a : 1) > 1) {
200
+ this.goToPage(1);
201
+ }
202
+ this.currentPage = 1;
203
+ }
204
+ selectedSortChanged() {
205
+ if (this.selectedSort === 'relevance' || this.sortDirection === null) {
206
+ this.sortParam = null;
207
+ return;
208
+ }
209
+ const sortField = SortFieldToMetadataField[this.selectedSort];
210
+ if (!sortField)
211
+ return;
212
+ this.sortParam = new SortParam(sortField, this.sortDirection);
213
+ }
214
+ displayModeChanged(e) {
215
+ this.displayMode = e.detail.displayMode;
216
+ }
217
+ selectedTitleLetterChanged() {
218
+ this.titleQuery = this.selectedTitleFilter
219
+ ? `firstTitle:${this.selectedTitleFilter}`
220
+ : undefined;
221
+ }
222
+ selectedCreatorLetterChanged() {
223
+ this.creatorQuery = this.selectedCreatorFilter
224
+ ? `firstCreator:${this.selectedCreatorFilter}`
225
+ : undefined;
226
+ }
227
+ titleLetterSelected(e) {
228
+ this.selectedTitleFilter = e.detail.selectedLetter;
229
+ }
230
+ creatorLetterSelected(e) {
231
+ this.selectedCreatorFilter = e.detail.selectedLetter;
232
+ }
233
+ get facetDataLoading() {
234
+ return this.facetsLoading || this.fullYearAggregationLoading;
235
+ }
236
+ get facetsTemplate() {
237
+ return html `
238
+ ${this.facetsLoading ? this.loadingTemplate : nothing}
239
+ <collection-facets
240
+ @facetsChanged=${this.facetsChanged}
241
+ @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
242
+ .aggregations=${this.aggregations}
243
+ .fullYearsHistogramAggregation=${this.fullYearsHistogramAggregation}
244
+ .minSelectedDate=${this.minSelectedDate}
245
+ .maxSelectedDate=${this.maxSelectedDate}
246
+ .selectedFacets=${this.selectedFacets}
247
+ .collectionNameCache=${this.collectionNameCache}
248
+ ?collapsableFacets=${this.mobileView}
249
+ ?facetsLoading=${this.facetDataLoading}
250
+ ?fullYearAggregationLoading=${this.fullYearAggregationLoading}
251
+ ></collection-facets>
252
+ `;
253
+ }
140
254
  get loadingTemplate() {
141
255
  return html `
142
256
  <div class="loading-cover">
@@ -144,53 +258,102 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
144
258
  </div>
145
259
  `;
146
260
  }
147
- get currentYearsHistogramAggregation() {
148
- var _a;
149
- return (_a = this.aggregations) === null || _a === void 0 ? void 0 : _a.year_histogram;
150
- }
151
- get histogramDataLoading() {
152
- return this.facetsLoading || this.fullYearAggregationLoading;
261
+ get listHeaderTemplate() {
262
+ return html `
263
+ <div id="list-header">
264
+ <tile-dispatcher
265
+ .displayMode=${'list-header'}
266
+ .resizeObserver=${this.resizeObserver}
267
+ .sortParam=${this.sortParam}
268
+ >
269
+ </tile-dispatcher>
270
+ </div>
271
+ `;
153
272
  }
154
- get histogramTemplate() {
155
- const { currentYearsHistogramAggregation, fullYearsHistogramAggregation } = this;
273
+ get queryDebuggingTemplate() {
274
+ var _a, _b;
156
275
  return html `
157
- <histogram-date-range
158
- .minDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.first_bucket_key}
159
- .maxDate=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.last_bucket_key}
160
- .minSelectedDate=${currentYearsHistogramAggregation === null || currentYearsHistogramAggregation === void 0 ? void 0 : currentYearsHistogramAggregation.first_bucket_key}
161
- .maxSelectedDate=${currentYearsHistogramAggregation === null || currentYearsHistogramAggregation === void 0 ? void 0 : currentYearsHistogramAggregation.last_bucket_key}
162
- .updateDelay=${100}
163
- missingDataMessage="..."
164
- ?loading=${this.histogramDataLoading}
165
- .width=${150}
166
- .bins=${fullYearsHistogramAggregation === null || fullYearsHistogramAggregation === void 0 ? void 0 : fullYearsHistogramAggregation.buckets}
167
- @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
168
- ></histogram-date-range>
276
+ <div>
277
+ <ul>
278
+ <li>Base Query: ${this.baseQuery}</li>
279
+ <li>Facet Query: ${this.facetQuery}</li>
280
+ <li>Sort Filter Query: ${this.sortFilterQueries}</li>
281
+ <li>Date Range Query: ${this.dateRangeQueryClause}</li>
282
+ <li>Sort: ${(_a = this.sortParam) === null || _a === void 0 ? void 0 : _a.field} ${(_b = this.sortParam) === null || _b === void 0 ? void 0 : _b.direction}</li>
283
+ <li>Full Query: ${this.fullQuery}</li>
284
+ </ul>
285
+ </div>
169
286
  `;
170
287
  }
171
288
  histogramDateRangeUpdated(e) {
172
289
  const { minDate, maxDate } = e.detail;
173
290
  this.dateRangeQueryClause = `year:[${minDate} TO ${maxDate}]`;
174
291
  }
292
+ firstUpdated() {
293
+ this.restoreState();
294
+ }
175
295
  updated(changed) {
176
296
  if (changed.has('displayMode') ||
177
297
  changed.has('showDeleteButtons') ||
178
298
  changed.has('baseNavigationUrl')) {
179
299
  this.infiniteScroller.reload();
180
300
  }
301
+ if (changed.has('currentPage') || changed.has('displayMode')) {
302
+ this.persistState();
303
+ }
181
304
  if (changed.has('baseQuery') ||
182
- changed.has('additionalQueryClause') ||
305
+ changed.has('titleQuery') ||
306
+ changed.has('creatorQuery') ||
183
307
  changed.has('dateRangeQueryClause') ||
184
308
  changed.has('sortParam') ||
185
309
  changed.has('selectedFacets') ||
186
310
  changed.has('searchService')) {
187
311
  this.handleQueryChange();
188
312
  }
313
+ if (changed.has('selectedSort') || changed.has('sortDirection')) {
314
+ this.selectedSortChanged();
315
+ }
316
+ if (changed.has('selectedTitleFilter')) {
317
+ this.selectedTitleLetterChanged();
318
+ }
319
+ if (changed.has('selectedCreatorFilter')) {
320
+ this.selectedCreatorLetterChanged();
321
+ }
189
322
  if (changed.has('pagesToRender')) {
190
323
  if (!this.endOfDataReached) {
191
324
  this.infiniteScroller.itemCount = this.estimatedTileCount;
192
325
  }
193
326
  }
327
+ if (changed.has('resizeObserver')) {
328
+ const oldObserver = changed.get('resizeObserver');
329
+ if (oldObserver)
330
+ this.disconnectResizeObserver(oldObserver);
331
+ this.setupResizeObserver();
332
+ }
333
+ }
334
+ disconnectedCallback() {
335
+ if (this.resizeObserver) {
336
+ this.disconnectResizeObserver(this.resizeObserver);
337
+ }
338
+ }
339
+ handleResize(entry) {
340
+ if (entry.target === this.contentContainer) {
341
+ this.mobileView = entry.contentRect.width < 600;
342
+ }
343
+ }
344
+ disconnectResizeObserver(resizeObserver) {
345
+ resizeObserver.removeObserver({
346
+ target: this.contentContainer,
347
+ handler: this,
348
+ });
349
+ }
350
+ setupResizeObserver() {
351
+ if (!this.resizeObserver)
352
+ return;
353
+ this.resizeObserver.addObserver({
354
+ target: this.contentContainer,
355
+ handler: this,
356
+ });
194
357
  }
195
358
  /**
196
359
  * When the visible cells change from the infinite scroller, we want to emit
@@ -207,6 +370,9 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
207
370
  return;
208
371
  const lastVisibleCellIndex = visibleCellIndices[visibleCellIndices.length - 1];
209
372
  const lastVisibleCellPage = Math.floor(lastVisibleCellIndex / this.pageSize) + 1;
373
+ if (this.currentPage !== lastVisibleCellPage) {
374
+ this.currentPage = lastVisibleCellPage;
375
+ }
210
376
  const event = new CustomEvent('visiblePageChanged', {
211
377
  detail: {
212
378
  pageNumber: lastVisibleCellPage,
@@ -216,7 +382,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
216
382
  }
217
383
  async handleQueryChange() {
218
384
  // only reset if the query has actually changed
219
- if (this.pageFetchQueryKey === this.previousQueryKey)
385
+ if (!this.searchService || this.pageFetchQueryKey === this.previousQueryKey)
220
386
  return;
221
387
  this.previousQueryKey = this.pageFetchQueryKey;
222
388
  this.dataSource = {};
@@ -227,12 +393,54 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
227
393
  this.scrollToPage(this.initialPageNumber);
228
394
  }
229
395
  this.initialQueryChangeHappened = true;
396
+ this.persistState();
230
397
  await Promise.all([
231
398
  this.doInitialPageFetch(),
232
399
  this.fetchFacets(),
233
400
  this.fetchFullYearHistogram(),
234
401
  ]);
235
402
  }
403
+ restoreState() {
404
+ var _a, _b, _c, _d, _e, _f;
405
+ const restorationState = this.restorationStateHandler.getRestorationState();
406
+ this.displayMode = restorationState.displayMode;
407
+ this.selectedSort = (_a = restorationState.selectedSort) !== null && _a !== void 0 ? _a : SortField.relevance;
408
+ this.sortDirection = (_b = restorationState.sortDirection) !== null && _b !== void 0 ? _b : null;
409
+ this.selectedTitleFilter = (_c = restorationState.selectedTitleFilter) !== null && _c !== void 0 ? _c : null;
410
+ this.selectedCreatorFilter = (_d = restorationState.selectedCreatorFilter) !== null && _d !== void 0 ? _d : null;
411
+ this.selectedFacets = restorationState.selectedFacets;
412
+ this.baseQuery = restorationState.baseQuery;
413
+ this.titleQuery = restorationState.titleQuery;
414
+ this.creatorQuery = restorationState.creatorQuery;
415
+ this.dateRangeQueryClause = restorationState.dateRangeQueryClause;
416
+ this.sortParam = (_e = restorationState.sortParam) !== null && _e !== void 0 ? _e : null;
417
+ this.currentPage = (_f = restorationState.currentPage) !== null && _f !== void 0 ? _f : 1;
418
+ this.minSelectedDate = restorationState.minSelectedDate;
419
+ this.maxSelectedDate = restorationState.maxSelectedDate;
420
+ if (this.currentPage > 1) {
421
+ this.goToPage(this.currentPage);
422
+ }
423
+ }
424
+ persistState() {
425
+ var _a, _b, _c, _d, _e;
426
+ const restorationState = {
427
+ displayMode: this.displayMode,
428
+ sortParam: (_a = this.sortParam) !== null && _a !== void 0 ? _a : undefined,
429
+ selectedSort: this.selectedSort,
430
+ sortDirection: (_b = this.sortDirection) !== null && _b !== void 0 ? _b : undefined,
431
+ selectedFacets: (_c = this.selectedFacets) !== null && _c !== void 0 ? _c : defaultSelectedFacets,
432
+ baseQuery: this.baseQuery,
433
+ currentPage: this.currentPage,
434
+ dateRangeQueryClause: this.dateRangeQueryClause,
435
+ titleQuery: this.titleQuery,
436
+ creatorQuery: this.creatorQuery,
437
+ minSelectedDate: this.minSelectedDate,
438
+ maxSelectedDate: this.maxSelectedDate,
439
+ selectedTitleFilter: (_d = this.selectedTitleFilter) !== null && _d !== void 0 ? _d : undefined,
440
+ selectedCreatorFilter: (_e = this.selectedCreatorFilter) !== null && _e !== void 0 ? _e : undefined,
441
+ };
442
+ this.restorationStateHandler.persistState(restorationState);
443
+ }
236
444
  async doInitialPageFetch() {
237
445
  this.searchResultsLoading = true;
238
446
  await this.fetchPage(this.initialPageNumber);
@@ -250,24 +458,35 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
250
458
  if (!this.baseQuery)
251
459
  return undefined;
252
460
  let fullQuery = this.baseQuery;
253
- const { facetQuery, additionalQueryClause } = this;
461
+ const { facetQuery, sortFilterQueries } = this;
254
462
  if (facetQuery) {
255
463
  fullQuery += ` AND ${facetQuery}`;
256
464
  }
257
- if (additionalQueryClause) {
258
- fullQuery += ` AND ${additionalQueryClause}`;
465
+ if (sortFilterQueries) {
466
+ fullQuery += ` AND ${sortFilterQueries}`;
259
467
  }
260
468
  return fullQuery;
261
469
  }
470
+ /**
471
+ * Generates a query string for the given facets
472
+ *
473
+ * Example: `mediatype:("collection" OR "audio" OR -"etree") AND year:("2000" OR "2001")`
474
+ */
262
475
  get facetQuery() {
476
+ if (!this.selectedFacets)
477
+ return undefined;
263
478
  const facetQuery = [];
264
- for (const [facetName, selectedValues] of Object.entries(this.selectedFacets)) {
265
- const values = [];
266
- for (const value of selectedValues) {
267
- values.push(`${facetName}:"${value}"`);
479
+ for (const [facetName, facetValues] of Object.entries(this.selectedFacets)) {
480
+ const facetEntries = Object.entries(facetValues);
481
+ // eslint-disable-next-line no-continue
482
+ if (facetEntries.length === 0)
483
+ continue;
484
+ const facetValuesArray = [];
485
+ for (const [key, facetState] of facetEntries) {
486
+ facetValuesArray.push(`${facetState === 'hidden' ? '-' : ''}"${key}"`);
268
487
  }
269
- const valueQuery = values.join(' OR ');
270
- facetQuery.push(`(${valueQuery})`);
488
+ const valueQuery = facetValuesArray.join(` OR `);
489
+ facetQuery.push(`${facetName}:(${valueQuery})`);
271
490
  }
272
491
  return facetQuery.length > 0 ? `(${facetQuery.join(' AND ')})` : undefined;
273
492
  }
@@ -403,23 +622,25 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
403
622
  const params = new SearchParams({
404
623
  query: this.fullQuery,
405
624
  fields: [
625
+ 'addeddate',
626
+ 'avg_rating',
627
+ 'collections_raw',
628
+ 'creator',
629
+ 'date',
630
+ 'description',
631
+ 'downloads',
406
632
  'identifier',
407
- 'title',
633
+ 'issue',
634
+ 'item_count',
408
635
  'mediatype',
409
- 'downloads',
410
- 'avg_rating',
411
636
  'num_favorites',
412
637
  'num_reviews',
413
- 'item_count',
414
- 'description',
415
- 'date',
416
- 'addeddate',
417
638
  'publicdate',
418
639
  'reviewdate',
419
- 'creator',
420
- 'subject',
421
640
  'source',
422
- 'collection',
641
+ 'subject',
642
+ 'title',
643
+ 'volume',
423
644
  ],
424
645
  page: pageNumber,
425
646
  rows: this.pageSize,
@@ -429,6 +650,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
429
650
  const success = results === null || results === void 0 ? void 0 : results.success;
430
651
  if (!success)
431
652
  return;
653
+ this.totalResults = success.response.numFound;
432
654
  // this is checking to see if the query has changed since the data was fetched
433
655
  // if so, we just want to discard the data since there should be a new query
434
656
  // right behind it
@@ -439,6 +661,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
439
661
  return;
440
662
  const { docs } = success.response;
441
663
  if (docs && docs.length > 0) {
664
+ this.preloadCollectionNames(docs);
442
665
  this.updateDataSource(pageNumber, docs);
443
666
  }
444
667
  if (docs.length < this.pageSize) {
@@ -449,6 +672,12 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
449
672
  (_d = this.pageFetchesInProgress[pageFetchQueryKey]) === null || _d === void 0 ? void 0 : _d.delete(pageNumber);
450
673
  this.searchResultsLoading = false;
451
674
  }
675
+ preloadCollectionNames(docs) {
676
+ var _a;
677
+ const collectionIds = docs.map(doc => { var _a; return (_a = doc.collections_raw) === null || _a === void 0 ? void 0 : _a.values; }).flat();
678
+ const collectionIdsArray = Array.from(new Set(collectionIds));
679
+ (_a = this.collectionNameCache) === null || _a === void 0 ? void 0 : _a.preloadIdentifiers(collectionIdsArray);
680
+ }
452
681
  /**
453
682
  * This is useful for determining whether we need to reload the scroller.
454
683
  *
@@ -477,27 +706,30 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
477
706
  const datasource = { ...this.dataSource };
478
707
  const tiles = [];
479
708
  docs === null || docs === void 0 ? void 0 : docs.forEach(doc => {
480
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y;
709
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4;
481
710
  if (!doc.identifier)
482
711
  return;
483
712
  tiles.push({
484
- identifier: doc.identifier,
485
- title: this.etreeTitle((_a = doc.title) === null || _a === void 0 ? void 0 : _a.value, (_b = doc.mediatype) === null || _b === void 0 ? void 0 : _b.value),
486
- mediatype: (_d = (_c = doc.mediatype) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : 'data',
487
- viewCount: (_f = (_e = doc.downloads) === null || _e === void 0 ? void 0 : _e.value) !== null && _f !== void 0 ? _f : 0,
488
- favCount: (_h = (_g = doc.num_favorites) === null || _g === void 0 ? void 0 : _g.value) !== null && _h !== void 0 ? _h : 0,
489
- commentCount: (_k = (_j = doc.num_reviews) === null || _j === void 0 ? void 0 : _j.value) !== null && _k !== void 0 ? _k : 0,
490
- itemCount: (_m = (_l = doc.item_count) === null || _l === void 0 ? void 0 : _l.value) !== null && _m !== void 0 ? _m : 0,
713
+ averageRating: (_a = doc.avg_rating) === null || _a === void 0 ? void 0 : _a.value,
714
+ collections: (_c = (_b = doc.collections_raw) === null || _b === void 0 ? void 0 : _b.values) !== null && _c !== void 0 ? _c : [],
715
+ commentCount: (_e = (_d = doc.num_reviews) === null || _d === void 0 ? void 0 : _d.value) !== null && _e !== void 0 ? _e : 0,
716
+ creator: (_f = doc.creator) === null || _f === void 0 ? void 0 : _f.value,
717
+ creators: (_h = (_g = doc.creator) === null || _g === void 0 ? void 0 : _g.values) !== null && _h !== void 0 ? _h : [],
718
+ dateAdded: (_j = doc.addeddate) === null || _j === void 0 ? void 0 : _j.value,
719
+ dateArchived: (_k = doc.publicdate) === null || _k === void 0 ? void 0 : _k.value,
720
+ datePublished: (_l = doc.date) === null || _l === void 0 ? void 0 : _l.value,
721
+ dateReviewed: (_m = doc.reviewdate) === null || _m === void 0 ? void 0 : _m.value,
491
722
  description: (_o = doc.description) === null || _o === void 0 ? void 0 : _o.value,
492
- dateAdded: (_p = doc.addeddate) === null || _p === void 0 ? void 0 : _p.value,
493
- dateArchived: (_q = doc.publicdate) === null || _q === void 0 ? void 0 : _q.value,
494
- dateReviewed: (_r = doc.reviewdate) === null || _r === void 0 ? void 0 : _r.value,
495
- datePublished: (_s = doc.date) === null || _s === void 0 ? void 0 : _s.value,
496
- creator: (_t = doc.creator) === null || _t === void 0 ? void 0 : _t.value,
497
- averageRating: (_u = doc.avg_rating) === null || _u === void 0 ? void 0 : _u.value,
498
- subject: (_v = doc.subject) === null || _v === void 0 ? void 0 : _v.value,
723
+ favCount: (_q = (_p = doc.num_favorites) === null || _p === void 0 ? void 0 : _p.value) !== null && _q !== void 0 ? _q : 0,
724
+ identifier: doc.identifier,
725
+ issue: (_r = doc.issue) === null || _r === void 0 ? void 0 : _r.value,
726
+ itemCount: (_t = (_s = doc.item_count) === null || _s === void 0 ? void 0 : _s.value) !== null && _t !== void 0 ? _t : 0,
727
+ mediatype: (_v = (_u = doc.mediatype) === null || _u === void 0 ? void 0 : _u.value) !== null && _v !== void 0 ? _v : 'data',
499
728
  source: (_w = doc.source) === null || _w === void 0 ? void 0 : _w.value,
500
- collection: (_y = (_x = doc.collection) === null || _x === void 0 ? void 0 : _x.values) !== null && _y !== void 0 ? _y : [],
729
+ subjects: (_y = (_x = doc.subject) === null || _x === void 0 ? void 0 : _x.values) !== null && _y !== void 0 ? _y : [],
730
+ title: this.etreeTitle((_z = doc.title) === null || _z === void 0 ? void 0 : _z.value, (_0 = doc.mediatype) === null || _0 === void 0 ? void 0 : _0.value, (_1 = doc.collection) === null || _1 === void 0 ? void 0 : _1.values),
731
+ volume: (_2 = doc.volume) === null || _2 === void 0 ? void 0 : _2.value,
732
+ viewCount: (_4 = (_3 = doc.downloads) === null || _3 === void 0 ? void 0 : _3.value) !== null && _4 !== void 0 ? _4 : 0,
501
733
  });
502
734
  });
503
735
  datasource[pageNumber] = tiles;
@@ -515,9 +747,8 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
515
747
  * Todo: Check collection(s) for etree, need to get as array.
516
748
  * Current search-service only returns first collection as string.
517
749
  */
518
- etreeTitle(title, mediatype) {
519
- if (mediatype === 'etree') {
520
- // || collections.includes('etree')) {
750
+ etreeTitle(title, mediatype, collections) {
751
+ if (mediatype === 'etree' || (collections === null || collections === void 0 ? void 0 : collections.includes('etree'))) {
521
752
  const regex = /^(.*) Live at (.*) on (\d\d\d\d-\d\d-\d\d)$/;
522
753
  const newTitle = title === null || title === void 0 ? void 0 : title.replace(regex, '$3: $2');
523
754
  if (newTitle) {
@@ -536,6 +767,7 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
536
767
  .displayMode=${this.displayMode}
537
768
  .resizeObserver=${this.resizeObserver}
538
769
  .sortParam=${this.sortParam}
770
+ .collectionNameCache=${this.collectionNameCache}
539
771
  ?showDeleteButton=${this.showDeleteButtons}
540
772
  ></tile-dispatcher>`;
541
773
  }
@@ -557,17 +789,99 @@ CollectionBrowser.styles = css `
557
789
  display: flex;
558
790
  }
559
791
 
792
+ .collapser {
793
+ display: inline-block;
794
+ }
795
+
796
+ .collapser svg {
797
+ width: 10px;
798
+ height: 10px;
799
+ transition: transform 0.2s ease-out;
800
+ }
801
+
802
+ .collapser.open svg {
803
+ transform: rotate(90deg);
804
+ }
805
+
806
+ #mobile-filter-collapse h1 {
807
+ cursor: pointer;
808
+ }
809
+
810
+ #content-container.mobile {
811
+ display: block;
812
+ }
813
+
814
+ .column {
815
+ padding-top: 2rem;
816
+ }
817
+
560
818
  #right-column {
561
819
  flex: 1;
562
820
  position: relative;
821
+ border-left: 1px solid rgb(232, 232, 232);
822
+ padding-left: 1rem;
823
+ }
824
+
825
+ .mobile #right-column {
826
+ border-left: none;
827
+ padding: 0;
563
828
  }
564
829
 
565
830
  #left-column {
566
- width: 15rem;
831
+ width: 18rem;
832
+ padding-right: 12px;
833
+ padding-right: 1rem;
834
+ }
835
+
836
+ .mobile #left-column {
837
+ width: 100%;
838
+ padding: 0;
839
+ }
840
+
841
+ #mobile-header-container {
842
+ display: flex;
843
+ justify-content: space-between;
567
844
  }
568
845
 
569
846
  #facets-container {
570
847
  position: relative;
848
+ max-height: 0;
849
+ transition: max-height 0.2s ease-in-out;
850
+ z-index: 1;
851
+ }
852
+
853
+ .mobile #facets-container {
854
+ overflow: hidden;
855
+ }
856
+
857
+ #facets-container.expanded {
858
+ max-height: 2000px;
859
+ }
860
+
861
+ #results-total {
862
+ display: flex;
863
+ align-items: center;
864
+ margin-bottom: 5rem;
865
+ }
866
+
867
+ .mobile #results-total {
868
+ margin-bottom: 0;
869
+ }
870
+
871
+ #big-results-count {
872
+ font-size: 2.4rem;
873
+ font-weight: 500;
874
+ margin-right: 5px;
875
+ }
876
+
877
+ #big-results-label {
878
+ font-size: 1rem;
879
+ font-weight: 200;
880
+ text-transform: uppercase;
881
+ }
882
+
883
+ #list-header {
884
+ max-height: 3rem;
571
885
  }
572
886
 
573
887
  .loading-cover {
@@ -576,7 +890,6 @@ CollectionBrowser.styles = css `
576
890
  left: 0;
577
891
  width: 100%;
578
892
  height: 100%;
579
- background-color: rgba(255, 255, 255, 0.75);
580
893
  display: flex;
581
894
  justify-content: center;
582
895
  z-index: 1;
@@ -588,6 +901,11 @@ CollectionBrowser.styles = css `
588
901
  height: 30px;
589
902
  }
590
903
 
904
+ sort-filter-bar {
905
+ display: block;
906
+ margin-bottom: 4rem;
907
+ }
908
+
591
909
  infinite-scroller {
592
910
  display: block;
593
911
  --infiniteScrollerRowGap: var(--collectionBrowserRowGap, 1.7rem);
@@ -599,14 +917,9 @@ CollectionBrowser.styles = css `
599
917
  --collectionBrowserCellMinWidth,
600
918
  100%
601
919
  );
602
- --infiniteScrollerCellMinHeight: var(
603
- --collectionBrowserCellMinHeight,
604
- 2rem
605
- );
606
- --infiniteScrollerCellMaxHeight: var(
607
- --collectionBrowserCellMaxHeight,
608
- 2rem
609
- );
920
+ --infiniteScrollerCellMinHeight: 34px; /* override infinite scroller component */
921
+ --infiniteScrollerCellMaxHeight: 56px;
922
+ --infiniteScrollerRowGap: 0px;
610
923
  }
611
924
 
612
925
  infinite-scroller.list-detail {
@@ -618,6 +931,8 @@ CollectionBrowser.styles = css `
618
931
  --collectionBrowserCellMinHeight,
619
932
  5rem
620
933
  );
934
+ /* 30px, but compensating for a -5px margin */
935
+ --infiniteScrollerRowGap: 35px;
621
936
  }
622
937
 
623
938
  infinite-scroller.grid {
@@ -656,7 +971,16 @@ __decorate([
656
971
  ], CollectionBrowser.prototype, "sortParam", void 0);
657
972
  __decorate([
658
973
  property({ type: String })
659
- ], CollectionBrowser.prototype, "additionalQueryClause", void 0);
974
+ ], CollectionBrowser.prototype, "selectedSort", void 0);
975
+ __decorate([
976
+ property({ type: String })
977
+ ], CollectionBrowser.prototype, "selectedTitleFilter", void 0);
978
+ __decorate([
979
+ property({ type: String })
980
+ ], CollectionBrowser.prototype, "selectedCreatorFilter", void 0);
981
+ __decorate([
982
+ property({ type: String })
983
+ ], CollectionBrowser.prototype, "sortDirection", void 0);
660
984
  __decorate([
661
985
  property({ type: String })
662
986
  ], CollectionBrowser.prototype, "dateRangeQueryClause", void 0);
@@ -667,17 +991,41 @@ __decorate([
667
991
  property({ type: Object })
668
992
  ], CollectionBrowser.prototype, "resizeObserver", void 0);
669
993
  __decorate([
670
- query('collection-facets')
671
- ], CollectionBrowser.prototype, "collectionFacets", void 0);
994
+ property({ type: String })
995
+ ], CollectionBrowser.prototype, "titleQuery", void 0);
996
+ __decorate([
997
+ property({ type: String })
998
+ ], CollectionBrowser.prototype, "creatorQuery", void 0);
999
+ __decorate([
1000
+ property({ type: Number })
1001
+ ], CollectionBrowser.prototype, "currentPage", void 0);
1002
+ __decorate([
1003
+ property({ type: String })
1004
+ ], CollectionBrowser.prototype, "minSelectedDate", void 0);
1005
+ __decorate([
1006
+ property({ type: String })
1007
+ ], CollectionBrowser.prototype, "maxSelectedDate", void 0);
1008
+ __decorate([
1009
+ property({ type: Object })
1010
+ ], CollectionBrowser.prototype, "selectedFacets", void 0);
1011
+ __decorate([
1012
+ property({ type: Object })
1013
+ ], CollectionBrowser.prototype, "collectionNameCache", void 0);
1014
+ __decorate([
1015
+ property({ type: String })
1016
+ ], CollectionBrowser.prototype, "pageContext", void 0);
1017
+ __decorate([
1018
+ property({ type: Object })
1019
+ ], CollectionBrowser.prototype, "restorationStateHandler", void 0);
1020
+ __decorate([
1021
+ property({ type: Number })
1022
+ ], CollectionBrowser.prototype, "mobileBreakpoint", void 0);
672
1023
  __decorate([
673
1024
  state()
674
1025
  ], CollectionBrowser.prototype, "pagesToRender", void 0);
675
1026
  __decorate([
676
1027
  state()
677
1028
  ], CollectionBrowser.prototype, "searchResultsLoading", void 0);
678
- __decorate([
679
- state()
680
- ], CollectionBrowser.prototype, "selectedFacets", void 0);
681
1029
  __decorate([
682
1030
  state()
683
1031
  ], CollectionBrowser.prototype, "facetsLoading", void 0);
@@ -690,6 +1038,18 @@ __decorate([
690
1038
  __decorate([
691
1039
  state()
692
1040
  ], CollectionBrowser.prototype, "fullYearsHistogramAggregation", void 0);
1041
+ __decorate([
1042
+ state()
1043
+ ], CollectionBrowser.prototype, "totalResults", void 0);
1044
+ __decorate([
1045
+ state()
1046
+ ], CollectionBrowser.prototype, "mobileView", void 0);
1047
+ __decorate([
1048
+ state()
1049
+ ], CollectionBrowser.prototype, "mobileFacetsVisible", void 0);
1050
+ __decorate([
1051
+ query('#content-container')
1052
+ ], CollectionBrowser.prototype, "contentContainer", void 0);
693
1053
  __decorate([
694
1054
  query('infinite-scroller')
695
1055
  ], CollectionBrowser.prototype, "infiniteScroller", void 0);