@internetarchive/collection-browser 0.3.1-alpha.2 → 0.3.1-alpha.3

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.
@@ -21,7 +21,7 @@ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
21
21
  this.facetsLoading = true;
22
22
  this.paginationSize = 0;
23
23
  this.facetsType = 'modal';
24
- this.facetsPerPage = 60; // TODO: Q. how many items we want to have on popup view
24
+ this.facetsPerPage = 35;
25
25
  }
26
26
  updated(changed) {
27
27
  if (changed.has('facetKey')) {
@@ -219,51 +219,51 @@ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
219
219
  }
220
220
  get getMoreFacetsTemplate() {
221
221
  var _a;
222
- return html `
223
- <facets-template
224
- .facetGroup=${(_a = this.mergedFacets) === null || _a === void 0 ? void 0 : _a.shift()}
225
- .selectedFacets=${this.selectedFacets}
226
- .renderOn=${'modal'}
227
- .collectionNameCache=${this.collectionNameCache}
222
+ return html `
223
+ <facets-template
224
+ .facetGroup=${(_a = this.mergedFacets) === null || _a === void 0 ? void 0 : _a.shift()}
225
+ .selectedFacets=${this.selectedFacets}
226
+ .renderOn=${'modal'}
227
+ .collectionNameCache=${this.collectionNameCache}
228
228
  @selectedFacetsChanged=${(e) => {
229
229
  this.selectedFacets = e.detail;
230
- }}
231
- ></facets-template>
230
+ }}
231
+ ></facets-template>
232
232
  `;
233
233
  }
234
234
  get loaderTemplate() {
235
- return html `<div class="facets-loader">
236
- <ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>
235
+ return html `<div class="facets-loader">
236
+ <ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>
237
237
  </div> `;
238
238
  }
239
239
  // render pagination if more then 1 page
240
240
  get facetsPaginationTemplate() {
241
241
  return this.paginationSize > 1
242
- ? html `<more-facets-pagination
243
- .size=${this.paginationSize}
244
- .currentPage=${1}
245
- @pageNumberClicked=${this.pageNumberClicked}
242
+ ? html `<more-facets-pagination
243
+ .size=${this.paginationSize}
244
+ .currentPage=${1}
245
+ @pageNumberClicked=${this.pageNumberClicked}
246
246
  ></more-facets-pagination>`
247
247
  : nothing;
248
248
  }
249
249
  get footerTemplate() {
250
250
  if (this.paginationSize > 0) {
251
- return html `${this.facetsPaginationTemplate}
252
- <div class="footer">
253
- <button
254
- class="btn btn-cancel"
255
- type="button"
256
- @click=${this.cancelClick}
257
- >
258
- Cancel
259
- </button>
260
- <button
261
- class="btn btn-submit"
262
- type="button"
263
- @click=${this.applySearchFacetsClicked}
264
- >
265
- Apply filters
266
- </button>
251
+ return html `${this.facetsPaginationTemplate}
252
+ <div class="footer">
253
+ <button
254
+ class="btn btn-cancel"
255
+ type="button"
256
+ @click=${this.cancelClick}
257
+ >
258
+ Cancel
259
+ </button>
260
+ <button
261
+ class="btn btn-submit"
262
+ type="button"
263
+ @click=${this.applySearchFacetsClicked}
264
+ >
265
+ Apply filters
266
+ </button>
267
267
  </div> `;
268
268
  }
269
269
  return nothing;
@@ -277,30 +277,30 @@ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
277
277
  const image = this.sortedBy === 'alpha'
278
278
  ? 'https://archive.org/images/filter-alpha.png'
279
279
  : 'https://archive.org/images/filter-count.png';
280
- return html `<span class="sr-only">More facets for:</span>
281
- <span class="title">
282
- ${this.facetGroupTitle}
283
- <input
284
- class="sorting-icon"
285
- type="image"
286
- @click=${() => this.sortFacetAggregation()}
287
- src="${image}"
288
- title=${title}
289
- alt="sort facets"
290
- />
280
+ return html `<span class="sr-only">More facets for:</span>
281
+ <span class="title">
282
+ ${this.facetGroupTitle}
283
+ <input
284
+ class="sorting-icon"
285
+ type="image"
286
+ @click=${() => this.sortFacetAggregation()}
287
+ src="${image}"
288
+ title=${title}
289
+ alt="sort facets"
290
+ />
291
291
  </span> `;
292
292
  }
293
293
  render() {
294
- return html `
294
+ return html `
295
295
  ${this.facetsLoading
296
296
  ? this.loaderTemplate
297
- : html `
298
- <div class="header-content">${this.getModalHeaderTemplate}</div>
299
- <div class="scrollable-content">
300
- <div class="facets-content">${this.getMoreFacetsTemplate}</div>
301
- </div>
302
- ${this.footerTemplate}
303
- `}
297
+ : html `
298
+ <section id="more-facets">
299
+ <div class="header-content">${this.getModalHeaderTemplate}</div>
300
+ <div class="facets-content">${this.getMoreFacetsTemplate}</div>
301
+ ${this.footerTemplate}
302
+ </section>
303
+ `}
304
304
  `;
305
305
  }
306
306
  applySearchFacetsClicked() {
@@ -319,80 +319,91 @@ let MoreFacetsContent = class MoreFacetsContent extends LitElement {
319
319
  }
320
320
  static get styles() {
321
321
  const modalSubmitButton = css `var(--primaryButtonBGColor, #194880)`;
322
- return css `
323
- .header-content .title {
324
- display: block;
325
- text-align: left;
326
- font-size: 1.8rem;
327
- padding: 0 10px;
328
- font-weight: bold;
329
- }
330
- .scrollable-content {
331
- overflow-y: auto;
332
- max-height: 60vh;
333
- }
334
- .facets-content {
335
- font-size: 1.2rem;
336
- margin: 10px;
337
- }
338
- .page-number {
339
- background: none;
340
- border: 0;
341
- cursor: pointer;
342
- border-radius: 100%;
343
- width: 25px;
344
- height: 25px;
345
- margin: 10px;
346
- font-size: 1.4rem;
347
- vertical-align: middle;
348
- }
349
- .current-page {
350
- background: black;
351
- color: white;
352
- }
353
- .facets-loader {
354
- margin-bottom: 20px;
355
- width: 70px;
356
- display: block;
357
- margin-left: auto;
358
- margin-right: auto;
359
- }
360
- .btn {
361
- border: none;
362
- padding: 10px;
363
- margin-bottom: 10px;
364
- width: auto;
365
- border-radius: 4px;
366
- cursor: pointer;
367
- }
368
- .btn-cancel {
369
- background-color: #000;
370
- color: white;
371
- }
372
- .btn-submit {
373
- background-color: ${modalSubmitButton};
374
- color: white;
375
- }
376
- .footer {
377
- text-align: center;
378
- margin-top: 10px;
379
- }
380
-
381
- .sr-only {
382
- position: absolute;
383
- width: 1px;
384
- height: 1px;
385
- padding: 0;
386
- margin: -1px;
387
- overflow: hidden;
388
- clip: rect(0, 0, 0, 0);
389
- border: 0;
390
- }
391
- .sorting-icon {
392
- height: 15px;
393
- vertical-align: baseline;
394
- cursor: pointer;
395
- }
322
+ return css `
323
+ @media (max-width: 560px) {
324
+ section#more-facets {
325
+ max-height: 450px;
326
+ }
327
+ .facets-content {
328
+ overflow-y: auto;
329
+ height: 300px;
330
+ }
331
+ }
332
+ section#more-facets {
333
+ overflow: auto;
334
+ padding: 10px; // leaves room for scroll bar to appear without overlaying on content
335
+ }
336
+ .header-content .title {
337
+ display: block;
338
+ text-align: left;
339
+ font-size: 1.8rem;
340
+ padding: 0 10px;
341
+ font-weight: bold;
342
+ }
343
+ .facets-content {
344
+ font-size: 1.2rem;
345
+ max-height: 300px;
346
+ overflow: auto;
347
+ padding: 10px;
348
+ }
349
+ .page-number {
350
+ background: none;
351
+ border: 0;
352
+ cursor: pointer;
353
+ border-radius: 100%;
354
+ width: 25px;
355
+ height: 25px;
356
+ margin: 10px;
357
+ font-size: 1.4rem;
358
+ vertical-align: middle;
359
+ }
360
+ .current-page {
361
+ background: black;
362
+ color: white;
363
+ }
364
+ .facets-loader {
365
+ margin-bottom: 20px;
366
+ width: 70px;
367
+ display: block;
368
+ margin-left: auto;
369
+ margin-right: auto;
370
+ }
371
+ .btn {
372
+ border: none;
373
+ padding: 10px;
374
+ margin-bottom: 10px;
375
+ width: auto;
376
+ border-radius: 4px;
377
+ cursor: pointer;
378
+ }
379
+ .btn-cancel {
380
+ background-color: #000;
381
+ color: white;
382
+ }
383
+ .btn-submit {
384
+ background-color: ${modalSubmitButton};
385
+ color: white;
386
+ }
387
+ .footer {
388
+ text-align: center;
389
+ margin-top: 10px;
390
+ }
391
+
392
+ .sr-only {
393
+ position: absolute;
394
+ width: 1px;
395
+ height: 1px;
396
+ padding: 0;
397
+ margin: -1px;
398
+ overflow: hidden;
399
+ clip: rect(0, 0, 0, 0);
400
+ border: 0;
401
+ }
402
+ .sorting-icon {
403
+ height: 15px;
404
+ vertical-align: baseline;
405
+ cursor: pointer;
406
+ }
396
407
  `;
397
408
  }
398
409
  };
@@ -1 +1 @@
1
- {"version":3,"file":"more-facets-content.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-content.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable dot-notation */\n/* eslint-disable lit-a11y/click-events-have-key-events */\nimport {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n PropertyValues,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport {\n Aggregation,\n Bucket,\n SearchServiceInterface,\n SearchParams,\n SearchType,\n AggregationSortType,\n} from '@internetarchive/search-service';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\nimport {\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n FacetOption,\n facetTitles,\n} from '../models';\nimport type { LanguageCodeHandlerInterface } from '../language-code-handler/language-code-handler';\nimport '@internetarchive/ia-activity-indicator/ia-activity-indicator';\nimport './more-facets-pagination';\nimport './facets-template';\n\n@customElement('more-facets-content')\nexport class MoreFacetsContent extends LitElement {\n @property({ type: String }) facetKey?: string;\n\n @property({ type: String }) facetAggregationKey?: string;\n\n @property({ type: String }) fullQuery?: string;\n\n @property({ type: Object }) modalManager?: ModalManagerInterface;\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: String }) searchType?: SearchType;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @property({ type: Object })\n languageCodeHandler?: LanguageCodeHandlerInterface;\n\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: String }) sortedBy = 'count'; // count | alpha\n\n @state() aggregations?: Record<string, Aggregation>;\n\n @state() facetGroup?: FacetGroup[] = [];\n\n @state() facetGroupTitle?: String = '';\n\n @state() pageNumber = 1;\n\n /**\n * Facets are loading on popup\n */\n @state() facetsLoading = true;\n\n @state() paginationSize = 0;\n\n @state() facetsType = 'modal';\n\n private facetsPerPage = 60; // TODO: Q. how many items we want to have on popup view\n\n updated(changed: PropertyValues) {\n if (changed.has('facetKey')) {\n this.facetsLoading = true;\n this.pageNumber = 1;\n\n this.updateSpecificFacets();\n }\n\n if (changed.has('pageNumber')) {\n this.facetGroup = this.aggregationFacetGroups;\n }\n }\n\n firstUpdated() {\n this.setupEscapeListeners();\n }\n\n /**\n * Close more facets modal on Escape click\n */\n private setupEscapeListeners() {\n if (this.modalManager) {\n document.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.modalManager?.closeModal();\n }\n });\n } else {\n document.removeEventListener('keydown', () => {});\n }\n }\n\n /**\n * Get specific facets data from search-service API based of currently query params\n * - this.aggregations - hold result of search service and being used for further processing.\n */\n async updateSpecificFacets(): Promise<void> {\n const aggregations = {\n simpleParams: [this.facetAggregationKey as string],\n };\n const aggregationsSize = 65535; // todo - do we want to have all the records at once?\n\n const params: SearchParams = {\n query: this.fullQuery as string,\n aggregations,\n aggregationsSize,\n rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?\n };\n\n const results = await this.searchService?.search(params, this.searchType);\n this.aggregations = results?.success?.response.aggregations;\n\n this.facetGroup = this.aggregationFacetGroups;\n this.facetsLoading = false;\n }\n\n private pageNumberClicked(e: CustomEvent<{ page: number }>) {\n const page = e?.detail?.page;\n if (page) {\n this.pageNumber = Number(page);\n }\n }\n\n /**\n * Combines the selected facets with the aggregations to create a single list of facets\n */\n private get mergedFacets(): FacetGroup[] | void {\n const facetGroups: FacetGroup[] = [];\n\n const selectedFacetGroup = this.selectedFacetGroups.find(\n group => group.key === this.facetKey\n );\n const aggregateFacetGroup = this.aggregationFacetGroups.find(\n group => group.key === this.facetKey\n );\n\n // if the user selected a facet, but it's not in the aggregation, we add it as-is\n if (selectedFacetGroup && !aggregateFacetGroup) {\n facetGroups.push(selectedFacetGroup);\n return facetGroups;\n }\n\n // if we don't have an aggregate facet group, don't add this to the list\n if (!aggregateFacetGroup) return facetGroups;\n\n // start with either the selected group if we have one, or the aggregate group\n const facetGroup = selectedFacetGroup ?? aggregateFacetGroup;\n\n // attach the counts to the selected buckets\n const bucketsWithCount =\n selectedFacetGroup?.buckets.map(bucket => {\n const selectedBucket = aggregateFacetGroup.buckets.find(\n b => b.key === bucket.key\n );\n return selectedBucket\n ? {\n ...bucket,\n count: selectedBucket.count,\n }\n : bucket;\n }) ?? [];\n\n // append any additional buckets that were not selected\n aggregateFacetGroup.buckets.forEach(bucket => {\n const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);\n if (existingBucket) return;\n bucketsWithCount.push(bucket);\n });\n facetGroup.buckets = bucketsWithCount;\n\n facetGroups.push(facetGroup);\n return facetGroups;\n }\n\n /**\n * Converts the selected facets to a `FacetGroup` array,\n * which is easier to work with\n */\n private get selectedFacetGroups(): FacetGroup[] {\n if (!this.selectedFacets) return [];\n\n const facetGroups: FacetGroup[] = Object.entries(this.selectedFacets).map(\n ([key, selectedFacets]) => {\n const option = key as FacetOption;\n const title = facetTitles[option];\n\n const buckets: FacetBucket[] = Object.entries(selectedFacets).map(\n ([value, data]) => {\n let displayText: string = value;\n // for selected languages, we store the language code instead of the\n // display name, so look up the name from the mapping\n if (option === 'language') {\n displayText =\n this.languageCodeHandler?.getLanguageNameFromCodeString(\n value\n ) ?? value;\n }\n return {\n displayText,\n key: value,\n count: data?.count,\n state: data?.state,\n };\n }\n );\n\n return {\n title,\n key: option,\n buckets,\n };\n }\n );\n\n return facetGroups;\n }\n\n /**\n * Converts the raw `aggregations` to `FacetGroups`, which are easier to use\n */\n private get aggregationFacetGroups(): FacetGroup[] {\n const facetGroups: FacetGroup[] = [];\n Object.entries(this.aggregations ?? []).forEach(([key, aggregation]) => {\n // the year_histogram data is in a different format so can't be handled here\n if (key === 'year_histogram') return;\n\n const option = key as FacetOption;\n this.facetGroupTitle = facetTitles[option];\n\n // sort facets in specific order\n let castedBuckets = aggregation.getSortedBuckets(\n this.sortedBy === 'alpha'\n ? AggregationSortType.ALPHABETICAL\n : AggregationSortType.COUNT\n ) as Bucket[];\n\n if (option === 'collection') {\n // we are not showing fav- collection items in facets\n castedBuckets = castedBuckets?.filter(\n bucket => bucket?.key?.toString().startsWith('fav-') === false\n );\n\n // asynchronously load the collection name\n this.preloadCollectionNames(castedBuckets);\n }\n\n // find length and pagination size for modal pagination\n const { length } = Object.keys(castedBuckets as []);\n this.paginationSize = Math.ceil(length / this.facetsPerPage);\n\n // render only items which will be visible as per this.facetsPerPage\n const bucketsMaxSix = castedBuckets?.slice(\n (this.pageNumber - 1) * this.facetsPerPage,\n this.pageNumber * this.facetsPerPage\n );\n\n const facetBucket: FacetBucket[] = bucketsMaxSix.map(bucket => {\n let bucketKey = bucket.key;\n // for languages, we need to search by language code instead of the\n // display name, which is what we get from the search engine result\n if (option === 'language') {\n bucketKey =\n this.languageCodeHandler?.getCodeStringFromLanguageName(\n `${bucket.key}`\n ) ?? bucket.key;\n }\n return {\n displayText: `${bucket.key}`,\n key: `${bucketKey}`,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n const group: FacetGroup = {\n title: this.facetGroupTitle as string,\n key: option,\n buckets: facetBucket,\n };\n facetGroups.push(group);\n });\n\n return facetGroups;\n }\n\n /**\n * for collections, we need to asynchronously load the collection name\n * so we use the `async-collection-name` widget and for the rest, we have a static value to use\n *\n * @param castedBuckets\n */\n private preloadCollectionNames(castedBuckets: any[]) {\n const collectionIds = castedBuckets?.map(option => option.key);\n const collectionIdsArray = Array.from(new Set(collectionIds)) as string[];\n\n this.collectionNameCache?.preloadIdentifiers(collectionIdsArray);\n }\n\n private get getMoreFacetsTemplate(): TemplateResult {\n return html`\n <facets-template\n .facetGroup=${this.mergedFacets?.shift()}\n .selectedFacets=${this.selectedFacets}\n .renderOn=${'modal'}\n .collectionNameCache=${this.collectionNameCache}\n @selectedFacetsChanged=${(e: CustomEvent) => {\n this.selectedFacets = e.detail;\n }}\n ></facets-template>\n `;\n }\n\n private get loaderTemplate(): TemplateResult {\n return html`<div class=\"facets-loader\">\n <ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>\n </div> `;\n }\n\n // render pagination if more then 1 page\n private get facetsPaginationTemplate() {\n return this.paginationSize > 1\n ? html`<more-facets-pagination\n .size=${this.paginationSize}\n .currentPage=${1}\n @pageNumberClicked=${this.pageNumberClicked}\n ></more-facets-pagination>`\n : nothing;\n }\n\n private get footerTemplate() {\n if (this.paginationSize > 0) {\n return html`${this.facetsPaginationTemplate}\n <div class=\"footer\">\n <button\n class=\"btn btn-cancel\"\n type=\"button\"\n @click=${this.cancelClick}\n >\n Cancel\n </button>\n <button\n class=\"btn btn-submit\"\n type=\"button\"\n @click=${this.applySearchFacetsClicked}\n >\n Apply filters\n </button>\n </div> `;\n }\n\n return nothing;\n }\n\n private sortFacetAggregation() {\n this.sortedBy = this.sortedBy === 'count' ? 'alpha' : 'count';\n this.dispatchEvent(\n new CustomEvent('sortedFacets', { detail: this.sortedBy })\n );\n }\n\n private get getModalHeaderTemplate(): TemplateResult {\n const title =\n this.sortedBy === 'alpha' ? 'Sort by count' : 'Sort by alphabetically';\n\n const image =\n this.sortedBy === 'alpha'\n ? 'https://archive.org/images/filter-alpha.png'\n : 'https://archive.org/images/filter-count.png';\n\n return html`<span class=\"sr-only\">More facets for:</span>\n <span class=\"title\">\n ${this.facetGroupTitle}\n <input\n class=\"sorting-icon\"\n type=\"image\"\n @click=${() => this.sortFacetAggregation()}\n src=\"${image}\"\n title=${title}\n alt=\"sort facets\"\n />\n </span> `;\n }\n\n render() {\n return html`\n ${this.facetsLoading\n ? this.loaderTemplate\n : html`\n <div class=\"header-content\">${this.getModalHeaderTemplate}</div>\n <div class=\"scrollable-content\">\n <div class=\"facets-content\">${this.getMoreFacetsTemplate}</div>\n </div>\n ${this.footerTemplate}\n `}\n `;\n }\n\n private applySearchFacetsClicked() {\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: this.selectedFacets,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n this.modalManager?.closeModal();\n }\n\n private cancelClick() {\n this.modalManager?.closeModal();\n }\n\n static get styles(): CSSResultGroup {\n const modalSubmitButton = css`var(--primaryButtonBGColor, #194880)`;\n\n return css`\n .header-content .title {\n display: block;\n text-align: left;\n font-size: 1.8rem;\n padding: 0 10px;\n font-weight: bold;\n }\n .scrollable-content {\n overflow-y: auto;\n max-height: 60vh;\n }\n .facets-content {\n font-size: 1.2rem;\n margin: 10px;\n }\n .page-number {\n background: none;\n border: 0;\n cursor: pointer;\n border-radius: 100%;\n width: 25px;\n height: 25px;\n margin: 10px;\n font-size: 1.4rem;\n vertical-align: middle;\n }\n .current-page {\n background: black;\n color: white;\n }\n .facets-loader {\n margin-bottom: 20px;\n width: 70px;\n display: block;\n margin-left: auto;\n margin-right: auto;\n }\n .btn {\n border: none;\n padding: 10px;\n margin-bottom: 10px;\n width: auto;\n border-radius: 4px;\n cursor: pointer;\n }\n .btn-cancel {\n background-color: #000;\n color: white;\n }\n .btn-submit {\n background-color: ${modalSubmitButton};\n color: white;\n }\n .footer {\n text-align: center;\n margin-top: 10px;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n }\n .sorting-icon {\n height: 15px;\n vertical-align: baseline;\n cursor: pointer;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"more-facets-content.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-content.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable dot-notation */\r\n/* eslint-disable lit-a11y/click-events-have-key-events */\r\nimport {\r\n css,\r\n CSSResultGroup,\r\n html,\r\n LitElement,\r\n nothing,\r\n PropertyValues,\r\n TemplateResult,\r\n} from 'lit';\r\nimport { customElement, property, state } from 'lit/decorators.js';\r\nimport {\r\n Aggregation,\r\n Bucket,\r\n SearchServiceInterface,\r\n SearchParams,\r\n SearchType,\r\n AggregationSortType,\r\n} from '@internetarchive/search-service';\r\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\r\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\r\nimport {\r\n SelectedFacets,\r\n FacetGroup,\r\n FacetBucket,\r\n FacetOption,\r\n facetTitles,\r\n} from '../models';\r\nimport type { LanguageCodeHandlerInterface } from '../language-code-handler/language-code-handler';\r\nimport '@internetarchive/ia-activity-indicator/ia-activity-indicator';\r\nimport './more-facets-pagination';\r\nimport './facets-template';\r\n\r\n@customElement('more-facets-content')\r\nexport class MoreFacetsContent extends LitElement {\r\n @property({ type: String }) facetKey?: string;\r\n\r\n @property({ type: String }) facetAggregationKey?: string;\r\n\r\n @property({ type: String }) fullQuery?: string;\r\n\r\n @property({ type: Object }) modalManager?: ModalManagerInterface;\r\n\r\n @property({ type: Object }) searchService?: SearchServiceInterface;\r\n\r\n @property({ type: String }) searchType?: SearchType;\r\n\r\n @property({ type: Object })\r\n collectionNameCache?: CollectionNameCacheInterface;\r\n\r\n @property({ type: Object })\r\n languageCodeHandler?: LanguageCodeHandlerInterface;\r\n\r\n @property({ type: Object }) selectedFacets?: SelectedFacets;\r\n\r\n @property({ type: String }) sortedBy = 'count'; // count | alpha\r\n\r\n @state() aggregations?: Record<string, Aggregation>;\r\n\r\n @state() facetGroup?: FacetGroup[] = [];\r\n\r\n @state() facetGroupTitle?: String = '';\r\n\r\n @state() pageNumber = 1;\r\n\r\n /**\r\n * Facets are loading on popup\r\n */\r\n @state() facetsLoading = true;\r\n\r\n @state() paginationSize = 0;\r\n\r\n @state() facetsType = 'modal';\r\n\r\n private facetsPerPage = 35;\r\n\r\n updated(changed: PropertyValues) {\r\n if (changed.has('facetKey')) {\r\n this.facetsLoading = true;\r\n this.pageNumber = 1;\r\n\r\n this.updateSpecificFacets();\r\n }\r\n\r\n if (changed.has('pageNumber')) {\r\n this.facetGroup = this.aggregationFacetGroups;\r\n }\r\n }\r\n\r\n firstUpdated() {\r\n this.setupEscapeListeners();\r\n }\r\n\r\n /**\r\n * Close more facets modal on Escape click\r\n */\r\n private setupEscapeListeners() {\r\n if (this.modalManager) {\r\n document.addEventListener('keydown', (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n this.modalManager?.closeModal();\r\n }\r\n });\r\n } else {\r\n document.removeEventListener('keydown', () => {});\r\n }\r\n }\r\n\r\n /**\r\n * Get specific facets data from search-service API based of currently query params\r\n * - this.aggregations - hold result of search service and being used for further processing.\r\n */\r\n async updateSpecificFacets(): Promise<void> {\r\n const aggregations = {\r\n simpleParams: [this.facetAggregationKey as string],\r\n };\r\n const aggregationsSize = 65535; // todo - do we want to have all the records at once?\r\n\r\n const params: SearchParams = {\r\n query: this.fullQuery as string,\r\n aggregations,\r\n aggregationsSize,\r\n rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?\r\n };\r\n\r\n const results = await this.searchService?.search(params, this.searchType);\r\n this.aggregations = results?.success?.response.aggregations;\r\n\r\n this.facetGroup = this.aggregationFacetGroups;\r\n this.facetsLoading = false;\r\n }\r\n\r\n private pageNumberClicked(e: CustomEvent<{ page: number }>) {\r\n const page = e?.detail?.page;\r\n if (page) {\r\n this.pageNumber = Number(page);\r\n }\r\n }\r\n\r\n /**\r\n * Combines the selected facets with the aggregations to create a single list of facets\r\n */\r\n private get mergedFacets(): FacetGroup[] | void {\r\n const facetGroups: FacetGroup[] = [];\r\n\r\n const selectedFacetGroup = this.selectedFacetGroups.find(\r\n group => group.key === this.facetKey\r\n );\r\n const aggregateFacetGroup = this.aggregationFacetGroups.find(\r\n group => group.key === this.facetKey\r\n );\r\n\r\n // if the user selected a facet, but it's not in the aggregation, we add it as-is\r\n if (selectedFacetGroup && !aggregateFacetGroup) {\r\n facetGroups.push(selectedFacetGroup);\r\n return facetGroups;\r\n }\r\n\r\n // if we don't have an aggregate facet group, don't add this to the list\r\n if (!aggregateFacetGroup) return facetGroups;\r\n\r\n // start with either the selected group if we have one, or the aggregate group\r\n const facetGroup = selectedFacetGroup ?? aggregateFacetGroup;\r\n\r\n // attach the counts to the selected buckets\r\n const bucketsWithCount =\r\n selectedFacetGroup?.buckets.map(bucket => {\r\n const selectedBucket = aggregateFacetGroup.buckets.find(\r\n b => b.key === bucket.key\r\n );\r\n return selectedBucket\r\n ? {\r\n ...bucket,\r\n count: selectedBucket.count,\r\n }\r\n : bucket;\r\n }) ?? [];\r\n\r\n // append any additional buckets that were not selected\r\n aggregateFacetGroup.buckets.forEach(bucket => {\r\n const existingBucket = bucketsWithCount.find(b => b.key === bucket.key);\r\n if (existingBucket) return;\r\n bucketsWithCount.push(bucket);\r\n });\r\n facetGroup.buckets = bucketsWithCount;\r\n\r\n facetGroups.push(facetGroup);\r\n return facetGroups;\r\n }\r\n\r\n /**\r\n * Converts the selected facets to a `FacetGroup` array,\r\n * which is easier to work with\r\n */\r\n private get selectedFacetGroups(): FacetGroup[] {\r\n if (!this.selectedFacets) return [];\r\n\r\n const facetGroups: FacetGroup[] = Object.entries(this.selectedFacets).map(\r\n ([key, selectedFacets]) => {\r\n const option = key as FacetOption;\r\n const title = facetTitles[option];\r\n\r\n const buckets: FacetBucket[] = Object.entries(selectedFacets).map(\r\n ([value, data]) => {\r\n let displayText: string = value;\r\n // for selected languages, we store the language code instead of the\r\n // display name, so look up the name from the mapping\r\n if (option === 'language') {\r\n displayText =\r\n this.languageCodeHandler?.getLanguageNameFromCodeString(\r\n value\r\n ) ?? value;\r\n }\r\n return {\r\n displayText,\r\n key: value,\r\n count: data?.count,\r\n state: data?.state,\r\n };\r\n }\r\n );\r\n\r\n return {\r\n title,\r\n key: option,\r\n buckets,\r\n };\r\n }\r\n );\r\n\r\n return facetGroups;\r\n }\r\n\r\n /**\r\n * Converts the raw `aggregations` to `FacetGroups`, which are easier to use\r\n */\r\n private get aggregationFacetGroups(): FacetGroup[] {\r\n const facetGroups: FacetGroup[] = [];\r\n Object.entries(this.aggregations ?? []).forEach(([key, aggregation]) => {\r\n // the year_histogram data is in a different format so can't be handled here\r\n if (key === 'year_histogram') return;\r\n\r\n const option = key as FacetOption;\r\n this.facetGroupTitle = facetTitles[option];\r\n\r\n // sort facets in specific order\r\n let castedBuckets = aggregation.getSortedBuckets(\r\n this.sortedBy === 'alpha'\r\n ? AggregationSortType.ALPHABETICAL\r\n : AggregationSortType.COUNT\r\n ) as Bucket[];\r\n\r\n if (option === 'collection') {\r\n // we are not showing fav- collection items in facets\r\n castedBuckets = castedBuckets?.filter(\r\n bucket => bucket?.key?.toString().startsWith('fav-') === false\r\n );\r\n\r\n // asynchronously load the collection name\r\n this.preloadCollectionNames(castedBuckets);\r\n }\r\n\r\n // find length and pagination size for modal pagination\r\n const { length } = Object.keys(castedBuckets as []);\r\n this.paginationSize = Math.ceil(length / this.facetsPerPage);\r\n\r\n // render only items which will be visible as per this.facetsPerPage\r\n const bucketsMaxSix = castedBuckets?.slice(\r\n (this.pageNumber - 1) * this.facetsPerPage,\r\n this.pageNumber * this.facetsPerPage\r\n );\r\n\r\n const facetBucket: FacetBucket[] = bucketsMaxSix.map(bucket => {\r\n let bucketKey = bucket.key;\r\n // for languages, we need to search by language code instead of the\r\n // display name, which is what we get from the search engine result\r\n if (option === 'language') {\r\n bucketKey =\r\n this.languageCodeHandler?.getCodeStringFromLanguageName(\r\n `${bucket.key}`\r\n ) ?? bucket.key;\r\n }\r\n return {\r\n displayText: `${bucket.key}`,\r\n key: `${bucketKey}`,\r\n count: bucket.doc_count,\r\n state: 'none',\r\n };\r\n });\r\n const group: FacetGroup = {\r\n title: this.facetGroupTitle as string,\r\n key: option,\r\n buckets: facetBucket,\r\n };\r\n facetGroups.push(group);\r\n });\r\n\r\n return facetGroups;\r\n }\r\n\r\n /**\r\n * for collections, we need to asynchronously load the collection name\r\n * so we use the `async-collection-name` widget and for the rest, we have a static value to use\r\n *\r\n * @param castedBuckets\r\n */\r\n private preloadCollectionNames(castedBuckets: any[]) {\r\n const collectionIds = castedBuckets?.map(option => option.key);\r\n const collectionIdsArray = Array.from(new Set(collectionIds)) as string[];\r\n\r\n this.collectionNameCache?.preloadIdentifiers(collectionIdsArray);\r\n }\r\n\r\n private get getMoreFacetsTemplate(): TemplateResult {\r\n return html`\r\n <facets-template\r\n .facetGroup=${this.mergedFacets?.shift()}\r\n .selectedFacets=${this.selectedFacets}\r\n .renderOn=${'modal'}\r\n .collectionNameCache=${this.collectionNameCache}\r\n @selectedFacetsChanged=${(e: CustomEvent) => {\r\n this.selectedFacets = e.detail;\r\n }}\r\n ></facets-template>\r\n `;\r\n }\r\n\r\n private get loaderTemplate(): TemplateResult {\r\n return html`<div class=\"facets-loader\">\r\n <ia-activity-indicator .mode=${'processing'}></ia-activity-indicator>\r\n </div> `;\r\n }\r\n\r\n // render pagination if more then 1 page\r\n private get facetsPaginationTemplate() {\r\n return this.paginationSize > 1\r\n ? html`<more-facets-pagination\r\n .size=${this.paginationSize}\r\n .currentPage=${1}\r\n @pageNumberClicked=${this.pageNumberClicked}\r\n ></more-facets-pagination>`\r\n : nothing;\r\n }\r\n\r\n private get footerTemplate() {\r\n if (this.paginationSize > 0) {\r\n return html`${this.facetsPaginationTemplate}\r\n <div class=\"footer\">\r\n <button\r\n class=\"btn btn-cancel\"\r\n type=\"button\"\r\n @click=${this.cancelClick}\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n class=\"btn btn-submit\"\r\n type=\"button\"\r\n @click=${this.applySearchFacetsClicked}\r\n >\r\n Apply filters\r\n </button>\r\n </div> `;\r\n }\r\n\r\n return nothing;\r\n }\r\n\r\n private sortFacetAggregation() {\r\n this.sortedBy = this.sortedBy === 'count' ? 'alpha' : 'count';\r\n this.dispatchEvent(\r\n new CustomEvent('sortedFacets', { detail: this.sortedBy })\r\n );\r\n }\r\n\r\n private get getModalHeaderTemplate(): TemplateResult {\r\n const title =\r\n this.sortedBy === 'alpha' ? 'Sort by count' : 'Sort by alphabetically';\r\n\r\n const image =\r\n this.sortedBy === 'alpha'\r\n ? 'https://archive.org/images/filter-alpha.png'\r\n : 'https://archive.org/images/filter-count.png';\r\n\r\n return html`<span class=\"sr-only\">More facets for:</span>\r\n <span class=\"title\">\r\n ${this.facetGroupTitle}\r\n <input\r\n class=\"sorting-icon\"\r\n type=\"image\"\r\n @click=${() => this.sortFacetAggregation()}\r\n src=\"${image}\"\r\n title=${title}\r\n alt=\"sort facets\"\r\n />\r\n </span> `;\r\n }\r\n\r\n render() {\r\n return html`\r\n ${this.facetsLoading\r\n ? this.loaderTemplate\r\n : html`\r\n <section id=\"more-facets\">\r\n <div class=\"header-content\">${this.getModalHeaderTemplate}</div>\r\n <div class=\"facets-content\">${this.getMoreFacetsTemplate}</div>\r\n ${this.footerTemplate}\r\n </section>\r\n `}\r\n `;\r\n }\r\n\r\n private applySearchFacetsClicked() {\r\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\r\n detail: this.selectedFacets,\r\n bubbles: true,\r\n composed: true,\r\n });\r\n this.dispatchEvent(event);\r\n this.modalManager?.closeModal();\r\n }\r\n\r\n private cancelClick() {\r\n this.modalManager?.closeModal();\r\n }\r\n\r\n static get styles(): CSSResultGroup {\r\n const modalSubmitButton = css`var(--primaryButtonBGColor, #194880)`;\r\n\r\n return css`\r\n @media (max-width: 560px) {\r\n section#more-facets {\r\n max-height: 450px;\r\n }\r\n .facets-content {\r\n overflow-y: auto;\r\n height: 300px;\r\n }\r\n }\r\n section#more-facets {\r\n overflow: auto;\r\n padding: 10px; // leaves room for scroll bar to appear without overlaying on content\r\n }\r\n .header-content .title {\r\n display: block;\r\n text-align: left;\r\n font-size: 1.8rem;\r\n padding: 0 10px;\r\n font-weight: bold;\r\n }\r\n .facets-content {\r\n font-size: 1.2rem;\r\n max-height: 300px;\r\n overflow: auto;\r\n padding: 10px;\r\n }\r\n .page-number {\r\n background: none;\r\n border: 0;\r\n cursor: pointer;\r\n border-radius: 100%;\r\n width: 25px;\r\n height: 25px;\r\n margin: 10px;\r\n font-size: 1.4rem;\r\n vertical-align: middle;\r\n }\r\n .current-page {\r\n background: black;\r\n color: white;\r\n }\r\n .facets-loader {\r\n margin-bottom: 20px;\r\n width: 70px;\r\n display: block;\r\n margin-left: auto;\r\n margin-right: auto;\r\n }\r\n .btn {\r\n border: none;\r\n padding: 10px;\r\n margin-bottom: 10px;\r\n width: auto;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n }\r\n .btn-cancel {\r\n background-color: #000;\r\n color: white;\r\n }\r\n .btn-submit {\r\n background-color: ${modalSubmitButton};\r\n color: white;\r\n }\r\n .footer {\r\n text-align: center;\r\n margin-top: 10px;\r\n }\r\n\r\n .sr-only {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n border: 0;\r\n }\r\n .sorting-icon {\r\n height: 15px;\r\n vertical-align: baseline;\r\n cursor: pointer;\r\n }\r\n `;\r\n }\r\n}\r\n"]}
@@ -1,8 +1,7 @@
1
- import { SearchType, SortDirection, SortParam } from '@internetarchive/search-service';
1
+ import type { SortDirection, SortParam } from '@internetarchive/search-service';
2
2
  import { CollectionBrowserContext, CollectionDisplayMode, SelectedFacets, SortField } from './models';
3
3
  export interface RestorationState {
4
4
  displayMode?: CollectionDisplayMode;
5
- searchType?: SearchType;
6
5
  sortParam?: SortParam;
7
6
  selectedSort?: SortField;
8
7
  sortDirection?: SortDirection;
@@ -1,4 +1,3 @@
1
- import { SearchType } from '@internetarchive/search-service';
2
1
  import { getCookie, setCookie } from 'typescript-cookie';
3
2
  import { MetadataFieldToSortField, } from './models';
4
3
  export class RestorationStateHandler {
@@ -45,15 +44,11 @@ export class RestorationStateHandler {
45
44
  persistQueryStateToUrl(state) {
46
45
  const url = new URL(window.location.href);
47
46
  const { searchParams } = url;
48
- searchParams.delete('sin');
49
47
  searchParams.delete('sort');
50
48
  searchParams.delete('query');
51
49
  searchParams.delete('page');
52
50
  searchParams.delete('and[]');
53
51
  searchParams.delete('not[]');
54
- if (state.searchType) {
55
- searchParams.set('sin', state.searchType === SearchType.FULLTEXT ? 'TXT' : '');
56
- }
57
52
  if (state.sortParam) {
58
53
  const prefix = state.sortParam.direction === 'desc' ? '-' : '';
59
54
  searchParams.set('sort', `${prefix}${state.sortParam.field}`);
@@ -107,7 +102,6 @@ export class RestorationStateHandler {
107
102
  }
108
103
  loadQueryStateFromUrl() {
109
104
  const url = new URL(window.location.href);
110
- const searchInside = url.searchParams.get('sin');
111
105
  const pageNumber = url.searchParams.get('page');
112
106
  const searchQuery = url.searchParams.get('query');
113
107
  const sortQuery = url.searchParams.get('sort');
@@ -124,11 +118,6 @@ export class RestorationStateHandler {
124
118
  year: {},
125
119
  },
126
120
  };
127
- if (searchInside) {
128
- restorationState.searchType = searchInside === 'TXT'
129
- ? SearchType.FULLTEXT
130
- : SearchType.METADATA;
131
- }
132
121
  if (pageNumber) {
133
122
  const parsed = parseInt(pageNumber, 10);
134
123
  restorationState.currentPage = parsed;
@@ -1 +1 @@
1
- {"version":3,"file":"restoration-state-handler.js","sourceRoot":"","sources":["../../src/restoration-state-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { SearchType, SortDirection, SortParam } from '@internetarchive/search-service';\r\nimport { getCookie, setCookie } from 'typescript-cookie';\r\nimport {\r\n MetadataFieldToSortField,\r\n MetadataSortField,\r\n FacetOption,\r\n CollectionBrowserContext,\r\n CollectionDisplayMode,\r\n SelectedFacets,\r\n SortField,\r\n FacetBucket,\r\n FacetState,\r\n} from './models';\r\n\r\nexport interface RestorationState {\r\n displayMode?: CollectionDisplayMode;\r\n searchType?: SearchType;\r\n sortParam?: SortParam;\r\n selectedSort?: SortField;\r\n sortDirection?: SortDirection;\r\n selectedFacets: SelectedFacets;\r\n baseQuery?: string;\r\n currentPage?: number;\r\n dateRangeQueryClause?: string;\r\n titleQuery?: string;\r\n creatorQuery?: string;\r\n minSelectedDate?: string;\r\n maxSelectedDate?: string;\r\n selectedTitleFilter?: string;\r\n selectedCreatorFilter?: string;\r\n}\r\n\r\nexport interface RestorationStateHandlerInterface {\r\n persistState(state: RestorationState): void;\r\n getRestorationState(): RestorationState;\r\n}\r\n\r\nexport class RestorationStateHandler\r\n implements RestorationStateHandlerInterface\r\n{\r\n private context: CollectionBrowserContext;\r\n\r\n private cookieDomain = '.archive.org';\r\n\r\n private cookieExpiration = 30;\r\n\r\n private cookiePath = '/';\r\n\r\n constructor(options: { context: CollectionBrowserContext }) {\r\n this.context = options.context;\r\n }\r\n\r\n persistState(state: RestorationState): void {\r\n if (state.displayMode) this.persistViewStateToCookies(state.displayMode);\r\n this.persistQueryStateToUrl(state);\r\n }\r\n\r\n getRestorationState(): RestorationState {\r\n const restorationState = this.loadQueryStateFromUrl();\r\n const displayMode = this.loadTileViewStateFromCookies();\r\n restorationState.displayMode = displayMode;\r\n return restorationState;\r\n }\r\n\r\n private persistViewStateToCookies(displayMode: CollectionDisplayMode) {\r\n const gridState = displayMode === 'grid' ? 'tiles' : 'lists';\r\n setCookie(`view-${this.context}`, gridState, {\r\n domain: this.cookieDomain,\r\n expires: this.cookieExpiration,\r\n path: this.cookiePath,\r\n });\r\n const detailsState = displayMode === 'list-detail' ? 'showdetails' : '';\r\n setCookie(`showdetails-${this.context}`, detailsState, {\r\n domain: this.cookieDomain,\r\n expires: this.cookieExpiration,\r\n path: this.cookiePath,\r\n });\r\n }\r\n\r\n private loadTileViewStateFromCookies(): CollectionDisplayMode {\r\n const viewState = getCookie(`view-${this.context}`);\r\n const detailsState = getCookie(`showdetails-${this.context}`);\r\n if (viewState === 'tiles' || viewState === undefined) return 'grid';\r\n if (detailsState === 'showdetails') return 'list-detail';\r\n return 'list-compact';\r\n }\r\n\r\n private persistQueryStateToUrl(state: RestorationState) {\r\n const url = new URL(window.location.href);\r\n const { searchParams } = url;\r\n searchParams.delete('sin');\r\n searchParams.delete('sort');\r\n searchParams.delete('query');\r\n searchParams.delete('page');\r\n searchParams.delete('and[]');\r\n searchParams.delete('not[]');\r\n\r\n if (state.searchType) {\r\n searchParams.set('sin', state.searchType === SearchType.FULLTEXT ? 'TXT' : '');\r\n }\r\n\r\n if (state.sortParam) {\r\n const prefix = state.sortParam.direction === 'desc' ? '-' : '';\r\n searchParams.set('sort', `${prefix}${state.sortParam.field}`);\r\n }\r\n\r\n if (state.baseQuery) {\r\n searchParams.set('query', state.baseQuery);\r\n }\r\n\r\n if (state.currentPage) {\r\n if (state.currentPage > 1) {\r\n searchParams.set('page', state.currentPage.toString());\r\n } else {\r\n searchParams.delete('page');\r\n }\r\n }\r\n\r\n if (state.selectedFacets) {\r\n for (const [facetName, facetValues] of Object.entries(\r\n state.selectedFacets\r\n )) {\r\n const facetEntries = Object.entries(facetValues);\r\n // eslint-disable-next-line no-continue\r\n if (facetEntries.length === 0) continue;\r\n for (const [key, data] of facetEntries) {\r\n const notValue = data.state === 'hidden';\r\n const paramValue = `${facetName}:\"${key}\"`;\r\n if (notValue) {\r\n searchParams.append('not[]', paramValue);\r\n } else {\r\n searchParams.append('and[]', paramValue);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (state.dateRangeQueryClause) {\r\n searchParams.append('and[]', state.dateRangeQueryClause);\r\n }\r\n if (state.titleQuery) {\r\n searchParams.append('and[]', state.titleQuery);\r\n }\r\n if (state.creatorQuery) {\r\n searchParams.append('and[]', state.creatorQuery);\r\n }\r\n\r\n window.history.pushState(\r\n {\r\n sort: state.sortParam,\r\n query: state.baseQuery,\r\n page: state.currentPage,\r\n and: state.selectedFacets,\r\n not: state.selectedFacets,\r\n dateRange: state.dateRangeQueryClause,\r\n },\r\n '',\r\n url\r\n );\r\n }\r\n\r\n private loadQueryStateFromUrl(): RestorationState {\r\n const url = new URL(window.location.href);\r\n const searchInside = url.searchParams.get('sin');\r\n const pageNumber = url.searchParams.get('page');\r\n const searchQuery = url.searchParams.get('query');\r\n const sortQuery = url.searchParams.get('sort');\r\n const facetAnds = url.searchParams.getAll('and[]');\r\n const facetNots = url.searchParams.getAll('not[]');\r\n\r\n const restorationState: RestorationState = {\r\n selectedFacets: {\r\n subject: {},\r\n lending: {},\r\n creator: {},\r\n mediatype: {},\r\n language: {},\r\n collection: {},\r\n year: {},\r\n },\r\n };\r\n\r\n if (searchInside) {\r\n restorationState.searchType = searchInside === 'TXT' \r\n ? SearchType.FULLTEXT \r\n : SearchType.METADATA;\r\n }\r\n if (pageNumber) {\r\n const parsed = parseInt(pageNumber, 10);\r\n restorationState.currentPage = parsed;\r\n } else {\r\n restorationState.currentPage = 1;\r\n }\r\n if (searchQuery) {\r\n restorationState.baseQuery = searchQuery;\r\n }\r\n if (sortQuery) {\r\n // check for two different sort formats: `date desc` and `-date`\r\n const hasSpace = sortQuery.indexOf(' ') > -1;\r\n if (hasSpace) {\r\n const [field, direction] = sortQuery.split(' ');\r\n const metadataField =\r\n MetadataFieldToSortField[field as MetadataSortField];\r\n if (metadataField) {\r\n restorationState.selectedSort = metadataField;\r\n }\r\n if (direction === 'desc' || direction === 'asc') {\r\n restorationState.sortDirection = direction as SortDirection;\r\n }\r\n } else {\r\n const sortDirection = sortQuery.startsWith('-') ? 'desc' : 'asc';\r\n const sortField = sortQuery.startsWith('-')\r\n ? sortQuery.slice(1)\r\n : sortQuery;\r\n const metadataField =\r\n MetadataFieldToSortField[sortField as MetadataSortField];\r\n if (metadataField) restorationState.selectedSort = metadataField;\r\n restorationState.sortDirection = sortDirection as SortDirection;\r\n }\r\n }\r\n if (facetAnds) {\r\n facetAnds.forEach(and => {\r\n const [field, value] = and.split(':');\r\n\r\n switch (field) {\r\n case 'year': {\r\n const [minDate, maxDate] = value.split(' TO ');\r\n // we have two potential ways of filtering by date:\r\n // the range with \"date TO date\" or the single date with \"date\"\r\n // this is checking for the range case and if we don't have those, fall\r\n // back to the single date case\r\n if (minDate && maxDate) {\r\n restorationState.minSelectedDate = minDate.substring(\r\n 1,\r\n minDate.length\r\n );\r\n restorationState.maxSelectedDate = maxDate.substring(\r\n 0,\r\n maxDate.length - 1\r\n );\r\n restorationState.dateRangeQueryClause = `year:${value}`;\r\n } else {\r\n this.setSelectedFacetState(\r\n restorationState.selectedFacets,\r\n field as FacetOption,\r\n value,\r\n 'selected'\r\n );\r\n }\r\n break;\r\n }\r\n case 'firstTitle':\r\n restorationState.selectedTitleFilter = value;\r\n break;\r\n case 'firstCreator':\r\n restorationState.selectedCreatorFilter = value;\r\n break;\r\n default:\r\n this.setSelectedFacetState(\r\n restorationState.selectedFacets,\r\n field as FacetOption,\r\n value,\r\n 'selected'\r\n );\r\n }\r\n });\r\n }\r\n if (facetNots) {\r\n facetNots.forEach(not => {\r\n const [field, value] = not.split(':');\r\n this.setSelectedFacetState(\r\n restorationState.selectedFacets,\r\n field as FacetOption,\r\n value,\r\n 'hidden'\r\n );\r\n });\r\n }\r\n return restorationState;\r\n }\r\n\r\n // remove optional opening and closing quotes from a string\r\n private stripQuotes(value: string): string {\r\n if (value.startsWith('\"') && value.endsWith('\"')) {\r\n return value.substring(1, value.length - 1);\r\n }\r\n return value;\r\n }\r\n\r\n /**\r\n * Sets the facet state for the given field & value to the given state,\r\n * creating any previously-undefined buckets as needed.\r\n */\r\n private setSelectedFacetState(\r\n selectedFacets: SelectedFacets,\r\n field: FacetOption,\r\n value: string,\r\n state: FacetState\r\n ): void {\r\n const facet = selectedFacets[field];\r\n const unQuotedValue = this.stripQuotes(value);\r\n facet[unQuotedValue] ??= this.getDefaultBucket(value);\r\n facet[unQuotedValue].state = state;\r\n }\r\n\r\n /** Returns a default bucket with the given key, count of 0, and state 'none'. */\r\n private getDefaultBucket(key: string): FacetBucket {\r\n return {\r\n key,\r\n count: 0,\r\n state: 'none',\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"restoration-state-handler.js","sourceRoot":"","sources":["../../src/restoration-state-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SortDirection, SortParam } from '@internetarchive/search-service';\r\nimport { getCookie, setCookie } from 'typescript-cookie';\r\nimport {\r\n MetadataFieldToSortField,\r\n MetadataSortField,\r\n FacetOption,\r\n CollectionBrowserContext,\r\n CollectionDisplayMode,\r\n SelectedFacets,\r\n SortField,\r\n FacetBucket,\r\n FacetState,\r\n} from './models';\r\n\r\nexport interface RestorationState {\r\n displayMode?: CollectionDisplayMode;\r\n sortParam?: SortParam;\r\n selectedSort?: SortField;\r\n sortDirection?: SortDirection;\r\n selectedFacets: SelectedFacets;\r\n baseQuery?: string;\r\n currentPage?: number;\r\n dateRangeQueryClause?: string;\r\n titleQuery?: string;\r\n creatorQuery?: string;\r\n minSelectedDate?: string;\r\n maxSelectedDate?: string;\r\n selectedTitleFilter?: string;\r\n selectedCreatorFilter?: string;\r\n}\r\n\r\nexport interface RestorationStateHandlerInterface {\r\n persistState(state: RestorationState): void;\r\n getRestorationState(): RestorationState;\r\n}\r\n\r\nexport class RestorationStateHandler\r\n implements RestorationStateHandlerInterface\r\n{\r\n private context: CollectionBrowserContext;\r\n\r\n private cookieDomain = '.archive.org';\r\n\r\n private cookieExpiration = 30;\r\n\r\n private cookiePath = '/';\r\n\r\n constructor(options: { context: CollectionBrowserContext }) {\r\n this.context = options.context;\r\n }\r\n\r\n persistState(state: RestorationState): void {\r\n if (state.displayMode) this.persistViewStateToCookies(state.displayMode);\r\n this.persistQueryStateToUrl(state);\r\n }\r\n\r\n getRestorationState(): RestorationState {\r\n const restorationState = this.loadQueryStateFromUrl();\r\n const displayMode = this.loadTileViewStateFromCookies();\r\n restorationState.displayMode = displayMode;\r\n return restorationState;\r\n }\r\n\r\n private persistViewStateToCookies(displayMode: CollectionDisplayMode) {\r\n const gridState = displayMode === 'grid' ? 'tiles' : 'lists';\r\n setCookie(`view-${this.context}`, gridState, {\r\n domain: this.cookieDomain,\r\n expires: this.cookieExpiration,\r\n path: this.cookiePath,\r\n });\r\n const detailsState = displayMode === 'list-detail' ? 'showdetails' : '';\r\n setCookie(`showdetails-${this.context}`, detailsState, {\r\n domain: this.cookieDomain,\r\n expires: this.cookieExpiration,\r\n path: this.cookiePath,\r\n });\r\n }\r\n\r\n private loadTileViewStateFromCookies(): CollectionDisplayMode {\r\n const viewState = getCookie(`view-${this.context}`);\r\n const detailsState = getCookie(`showdetails-${this.context}`);\r\n if (viewState === 'tiles' || viewState === undefined) return 'grid';\r\n if (detailsState === 'showdetails') return 'list-detail';\r\n return 'list-compact';\r\n }\r\n\r\n private persistQueryStateToUrl(state: RestorationState) {\r\n const url = new URL(window.location.href);\r\n const { searchParams } = url;\r\n searchParams.delete('sort');\r\n searchParams.delete('query');\r\n searchParams.delete('page');\r\n searchParams.delete('and[]');\r\n searchParams.delete('not[]');\r\n\r\n if (state.sortParam) {\r\n const prefix = state.sortParam.direction === 'desc' ? '-' : '';\r\n searchParams.set('sort', `${prefix}${state.sortParam.field}`);\r\n }\r\n\r\n if (state.baseQuery) {\r\n searchParams.set('query', state.baseQuery);\r\n }\r\n\r\n if (state.currentPage) {\r\n if (state.currentPage > 1) {\r\n searchParams.set('page', state.currentPage.toString());\r\n } else {\r\n searchParams.delete('page');\r\n }\r\n }\r\n\r\n if (state.selectedFacets) {\r\n for (const [facetName, facetValues] of Object.entries(\r\n state.selectedFacets\r\n )) {\r\n const facetEntries = Object.entries(facetValues);\r\n // eslint-disable-next-line no-continue\r\n if (facetEntries.length === 0) continue;\r\n for (const [key, data] of facetEntries) {\r\n const notValue = data.state === 'hidden';\r\n const paramValue = `${facetName}:\"${key}\"`;\r\n if (notValue) {\r\n searchParams.append('not[]', paramValue);\r\n } else {\r\n searchParams.append('and[]', paramValue);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (state.dateRangeQueryClause) {\r\n searchParams.append('and[]', state.dateRangeQueryClause);\r\n }\r\n if (state.titleQuery) {\r\n searchParams.append('and[]', state.titleQuery);\r\n }\r\n if (state.creatorQuery) {\r\n searchParams.append('and[]', state.creatorQuery);\r\n }\r\n\r\n window.history.pushState(\r\n {\r\n sort: state.sortParam,\r\n query: state.baseQuery,\r\n page: state.currentPage,\r\n and: state.selectedFacets,\r\n not: state.selectedFacets,\r\n dateRange: state.dateRangeQueryClause,\r\n },\r\n '',\r\n url\r\n );\r\n }\r\n\r\n private loadQueryStateFromUrl(): RestorationState {\r\n const url = new URL(window.location.href);\r\n const pageNumber = url.searchParams.get('page');\r\n const searchQuery = url.searchParams.get('query');\r\n const sortQuery = url.searchParams.get('sort');\r\n const facetAnds = url.searchParams.getAll('and[]');\r\n const facetNots = url.searchParams.getAll('not[]');\r\n\r\n const restorationState: RestorationState = {\r\n selectedFacets: {\r\n subject: {},\r\n lending: {},\r\n creator: {},\r\n mediatype: {},\r\n language: {},\r\n collection: {},\r\n year: {},\r\n },\r\n };\r\n\r\n if (pageNumber) {\r\n const parsed = parseInt(pageNumber, 10);\r\n restorationState.currentPage = parsed;\r\n } else {\r\n restorationState.currentPage = 1;\r\n }\r\n if (searchQuery) {\r\n restorationState.baseQuery = searchQuery;\r\n }\r\n if (sortQuery) {\r\n // check for two different sort formats: `date desc` and `-date`\r\n const hasSpace = sortQuery.indexOf(' ') > -1;\r\n if (hasSpace) {\r\n const [field, direction] = sortQuery.split(' ');\r\n const metadataField =\r\n MetadataFieldToSortField[field as MetadataSortField];\r\n if (metadataField) {\r\n restorationState.selectedSort = metadataField;\r\n }\r\n if (direction === 'desc' || direction === 'asc') {\r\n restorationState.sortDirection = direction as SortDirection;\r\n }\r\n } else {\r\n const sortDirection = sortQuery.startsWith('-') ? 'desc' : 'asc';\r\n const sortField = sortQuery.startsWith('-')\r\n ? sortQuery.slice(1)\r\n : sortQuery;\r\n const metadataField =\r\n MetadataFieldToSortField[sortField as MetadataSortField];\r\n if (metadataField) restorationState.selectedSort = metadataField;\r\n restorationState.sortDirection = sortDirection as SortDirection;\r\n }\r\n }\r\n if (facetAnds) {\r\n facetAnds.forEach(and => {\r\n const [field, value] = and.split(':');\r\n\r\n switch (field) {\r\n case 'year': {\r\n const [minDate, maxDate] = value.split(' TO ');\r\n // we have two potential ways of filtering by date:\r\n // the range with \"date TO date\" or the single date with \"date\"\r\n // this is checking for the range case and if we don't have those, fall\r\n // back to the single date case\r\n if (minDate && maxDate) {\r\n restorationState.minSelectedDate = minDate.substring(\r\n 1,\r\n minDate.length\r\n );\r\n restorationState.maxSelectedDate = maxDate.substring(\r\n 0,\r\n maxDate.length - 1\r\n );\r\n restorationState.dateRangeQueryClause = `year:${value}`;\r\n } else {\r\n this.setSelectedFacetState(\r\n restorationState.selectedFacets,\r\n field as FacetOption,\r\n value,\r\n 'selected'\r\n );\r\n }\r\n break;\r\n }\r\n case 'firstTitle':\r\n restorationState.selectedTitleFilter = value;\r\n break;\r\n case 'firstCreator':\r\n restorationState.selectedCreatorFilter = value;\r\n break;\r\n default:\r\n this.setSelectedFacetState(\r\n restorationState.selectedFacets,\r\n field as FacetOption,\r\n value,\r\n 'selected'\r\n );\r\n }\r\n });\r\n }\r\n if (facetNots) {\r\n facetNots.forEach(not => {\r\n const [field, value] = not.split(':');\r\n this.setSelectedFacetState(\r\n restorationState.selectedFacets,\r\n field as FacetOption,\r\n value,\r\n 'hidden'\r\n );\r\n });\r\n }\r\n return restorationState;\r\n }\r\n\r\n // remove optional opening and closing quotes from a string\r\n private stripQuotes(value: string): string {\r\n if (value.startsWith('\"') && value.endsWith('\"')) {\r\n return value.substring(1, value.length - 1);\r\n }\r\n return value;\r\n }\r\n\r\n /**\r\n * Sets the facet state for the given field & value to the given state,\r\n * creating any previously-undefined buckets as needed.\r\n */\r\n private setSelectedFacetState(\r\n selectedFacets: SelectedFacets,\r\n field: FacetOption,\r\n value: string,\r\n state: FacetState\r\n ): void {\r\n const facet = selectedFacets[field];\r\n const unQuotedValue = this.stripQuotes(value);\r\n facet[unQuotedValue] ??= this.getDefaultBucket(value);\r\n facet[unQuotedValue].state = state;\r\n }\r\n\r\n /** Returns a default bucket with the given key, count of 0, and state 'none'. */\r\n private getDefaultBucket(key: string): FacetBucket {\r\n return {\r\n key,\r\n count: 0,\r\n state: 'none',\r\n };\r\n }\r\n}\r\n"]}