@internetarchive/collection-browser 4.7.1-alpha-webdev9189.0 → 4.8.1-webdev-9227.1
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.
- package/README.md +33 -0
- package/dist/src/app-root.js +0 -2
- package/dist/src/app-root.js.map +1 -1
- package/dist/src/assets/img/icons/check.d.ts +2 -0
- package/dist/src/assets/img/icons/check.js +5 -0
- package/dist/src/assets/img/icons/check.js.map +1 -0
- package/dist/src/collection-browser.d.ts +2 -1
- package/dist/src/collection-browser.js +5 -27
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/facet-row-template.d.ts +38 -0
- package/dist/src/collection-facets/facet-row-template.js +200 -0
- package/dist/src/collection-facets/facet-row-template.js.map +1 -0
- package/dist/src/collection-facets/facet-row.js +11 -186
- package/dist/src/collection-facets/facet-row.js.map +1 -1
- package/dist/src/collection-facets/models.d.ts +7 -2
- package/dist/src/collection-facets/models.js +7 -2
- package/dist/src/collection-facets/models.js.map +1 -1
- package/dist/src/collection-facets/more-facets-content.d.ts +87 -21
- package/dist/src/collection-facets/more-facets-content.js +479 -201
- package/dist/src/collection-facets/more-facets-content.js.map +1 -1
- package/dist/src/collection-facets/more-facets-scroller.d.ts +85 -0
- package/dist/src/collection-facets/more-facets-scroller.js +429 -0
- package/dist/src/collection-facets/more-facets-scroller.js.map +1 -0
- package/dist/src/collection-facets/page-window.d.ts +73 -0
- package/dist/src/collection-facets/page-window.js +202 -0
- package/dist/src/collection-facets/page-window.js.map +1 -0
- package/dist/src/collection-facets/toggle-switch.js +1 -0
- package/dist/src/collection-facets/toggle-switch.js.map +1 -1
- package/dist/src/collection-facets.js +3 -2
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/empty-placeholder.d.ts +7 -7
- package/dist/src/empty-placeholder.js +29 -15
- package/dist/src/empty-placeholder.js.map +1 -1
- package/dist/src/expanded-date-picker.js +3 -2
- package/dist/src/expanded-date-picker.js.map +1 -1
- package/dist/src/locales/es.d.ts +94 -0
- package/dist/src/locales/es.js +109 -0
- package/dist/src/locales/es.js.map +1 -0
- package/dist/src/manage/manage-bar.d.ts +3 -2
- package/dist/src/manage/manage-bar.js +6 -7
- package/dist/src/manage/manage-bar.js.map +1 -1
- package/dist/src/manage/remove-items-modal-content.js +3 -2
- package/dist/src/manage/remove-items-modal-content.js.map +1 -1
- package/dist/src/models.d.ts +4 -0
- package/dist/src/models.js +22 -2
- package/dist/src/models.js.map +1 -1
- package/dist/src/sort-filter-bar/sort-filter-bar.js +3 -3
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/tiles/grid/account-tile.js +3 -2
- package/dist/src/tiles/grid/account-tile.js.map +1 -1
- package/dist/src/tiles/grid/collection-tile.js +3 -2
- package/dist/src/tiles/grid/collection-tile.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.js +3 -2
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/grid/tile-stats.js +3 -2
- package/dist/src/tiles/grid/tile-stats.js.map +1 -1
- package/dist/src/tiles/list/tile-list-compact-header.js +3 -2
- package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -1
- package/dist/src/tiles/list/tile-list-compact.js +3 -1
- package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
- package/dist/src/tiles/list/tile-list.js +3 -2
- package/dist/src/tiles/list/tile-list.js.map +1 -1
- package/dist/src/tiles/overlay/text-overlay.js +3 -1
- package/dist/src/tiles/overlay/text-overlay.js.map +1 -1
- package/dist/src/tiles/review-block.js +3 -2
- package/dist/src/tiles/review-block.js.map +1 -1
- package/dist/src/tiles/tile-dispatcher.d.ts +2 -1
- package/dist/src/tiles/tile-dispatcher.js +5 -4
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/src/utils/log.d.ts +1 -4
- package/dist/src/utils/normalize-filter-text.d.ts +28 -0
- package/dist/src/utils/normalize-filter-text.js +35 -0
- package/dist/src/utils/normalize-filter-text.js.map +1 -0
- package/locales/es.d.ts +1 -0
- package/locales/es.js +1 -0
- package/package.json +15 -1
- package/.editorconfig +0 -29
- package/.github/workflows/ci.yml +0 -29
- package/.github/workflows/gh-pages-main.yml +0 -41
- package/.github/workflows/npm-publish.yml +0 -42
- package/.github/workflows/pr-preview.yml +0 -40
- package/.husky/pre-commit +0 -1
- package/.prettierignore +0 -1
- package/dist/src/collection-facets/more-facets-pagination.d.ts +0 -36
- package/dist/src/collection-facets/more-facets-pagination.js +0 -260
- package/dist/src/collection-facets/more-facets-pagination.js.map +0 -1
- package/dist/test/collection-browser.test.d.ts +0 -1
- package/dist/test/collection-browser.test.js +0 -1849
- package/dist/test/collection-browser.test.js.map +0 -1
- package/dist/test/collection-facets/facet-row.test.d.ts +0 -1
- package/dist/test/collection-facets/facet-row.test.js +0 -291
- package/dist/test/collection-facets/facet-row.test.js.map +0 -1
- package/dist/test/collection-facets/facets-template.test.d.ts +0 -1
- package/dist/test/collection-facets/facets-template.test.js +0 -95
- package/dist/test/collection-facets/facets-template.test.js.map +0 -1
- package/dist/test/collection-facets/more-facets-content.test.d.ts +0 -1
- package/dist/test/collection-facets/more-facets-content.test.js +0 -159
- package/dist/test/collection-facets/more-facets-content.test.js.map +0 -1
- package/dist/test/collection-facets/more-facets-pagination.test.d.ts +0 -1
- package/dist/test/collection-facets/more-facets-pagination.test.js +0 -126
- package/dist/test/collection-facets/more-facets-pagination.test.js.map +0 -1
- package/dist/test/collection-facets/toggle-switch.test.d.ts +0 -1
- package/dist/test/collection-facets/toggle-switch.test.js +0 -99
- package/dist/test/collection-facets/toggle-switch.test.js.map +0 -1
- package/dist/test/collection-facets.test.d.ts +0 -2
- package/dist/test/collection-facets.test.js +0 -728
- package/dist/test/collection-facets.test.js.map +0 -1
- package/dist/test/data-source/collection-browser-data-source.test.d.ts +0 -1
- package/dist/test/data-source/collection-browser-data-source.test.js +0 -154
- package/dist/test/data-source/collection-browser-data-source.test.js.map +0 -1
- package/dist/test/empty-placeholder.test.d.ts +0 -1
- package/dist/test/empty-placeholder.test.js +0 -57
- package/dist/test/empty-placeholder.test.js.map +0 -1
- package/dist/test/expanded-date-picker.test.d.ts +0 -1
- package/dist/test/expanded-date-picker.test.js +0 -124
- package/dist/test/expanded-date-picker.test.js.map +0 -1
- package/dist/test/icon-overlay.test.d.ts +0 -1
- package/dist/test/icon-overlay.test.js +0 -31
- package/dist/test/icon-overlay.test.js.map +0 -1
- package/dist/test/image-block.test.d.ts +0 -1
- package/dist/test/image-block.test.js +0 -208
- package/dist/test/image-block.test.js.map +0 -1
- package/dist/test/item-image.test.d.ts +0 -1
- package/dist/test/item-image.test.js +0 -187
- package/dist/test/item-image.test.js.map +0 -1
- package/dist/test/manage/manage-bar.test.d.ts +0 -3
- package/dist/test/manage/manage-bar.test.js +0 -216
- package/dist/test/manage/manage-bar.test.js.map +0 -1
- package/dist/test/manage/remove-items-modal-content.test.d.ts +0 -1
- package/dist/test/manage/remove-items-modal-content.test.js +0 -60
- package/dist/test/manage/remove-items-modal-content.test.js.map +0 -1
- package/dist/test/mediatype-config.test.d.ts +0 -1
- package/dist/test/mediatype-config.test.js +0 -11
- package/dist/test/mediatype-config.test.js.map +0 -1
- package/dist/test/mocks/mock-analytics-handler.d.ts +0 -10
- package/dist/test/mocks/mock-analytics-handler.js +0 -16
- package/dist/test/mocks/mock-analytics-handler.js.map +0 -1
- package/dist/test/mocks/mock-search-responses.d.ts +0 -31
- package/dist/test/mocks/mock-search-responses.js +0 -1241
- package/dist/test/mocks/mock-search-responses.js.map +0 -1
- package/dist/test/mocks/mock-search-service.d.ts +0 -16
- package/dist/test/mocks/mock-search-service.js +0 -64
- package/dist/test/mocks/mock-search-service.js.map +0 -1
- package/dist/test/restoration-state-handler.test.d.ts +0 -1
- package/dist/test/restoration-state-handler.test.js +0 -335
- package/dist/test/restoration-state-handler.test.js.map +0 -1
- package/dist/test/review-block.test.d.ts +0 -1
- package/dist/test/review-block.test.js +0 -46
- package/dist/test/review-block.test.js.map +0 -1
- package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +0 -1
- package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +0 -12
- package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js.map +0 -1
- package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +0 -1
- package/dist/test/sort-filter-bar/alpha-bar.test.js +0 -68
- package/dist/test/sort-filter-bar/alpha-bar.test.js.map +0 -1
- package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +0 -1
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js +0 -326
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +0 -1
- package/dist/test/text-overlay.test.d.ts +0 -1
- package/dist/test/text-overlay.test.js +0 -43
- package/dist/test/text-overlay.test.js.map +0 -1
- package/dist/test/text-snippet-block.test.d.ts +0 -1
- package/dist/test/text-snippet-block.test.js +0 -58
- package/dist/test/text-snippet-block.test.js.map +0 -1
- package/dist/test/tile-stats.test.d.ts +0 -1
- package/dist/test/tile-stats.test.js +0 -167
- package/dist/test/tile-stats.test.js.map +0 -1
- package/dist/test/tiles/grid/account-tile.test.d.ts +0 -1
- package/dist/test/tiles/grid/account-tile.test.js +0 -96
- package/dist/test/tiles/grid/account-tile.test.js.map +0 -1
- package/dist/test/tiles/grid/collection-tile.test.d.ts +0 -1
- package/dist/test/tiles/grid/collection-tile.test.js +0 -90
- package/dist/test/tiles/grid/collection-tile.test.js.map +0 -1
- package/dist/test/tiles/grid/item-tile.test.d.ts +0 -1
- package/dist/test/tiles/grid/item-tile.test.js +0 -400
- package/dist/test/tiles/grid/item-tile.test.js.map +0 -1
- package/dist/test/tiles/grid/search-tile.test.d.ts +0 -1
- package/dist/test/tiles/grid/search-tile.test.js +0 -62
- package/dist/test/tiles/grid/search-tile.test.js.map +0 -1
- package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +0 -1
- package/dist/test/tiles/hover/hover-pane-controller.test.js +0 -351
- package/dist/test/tiles/hover/hover-pane-controller.test.js.map +0 -1
- package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +0 -1
- package/dist/test/tiles/hover/tile-hover-pane.test.js +0 -53
- package/dist/test/tiles/hover/tile-hover-pane.test.js.map +0 -1
- package/dist/test/tiles/list/tile-list-compact-header.test.d.ts +0 -1
- package/dist/test/tiles/list/tile-list-compact-header.test.js +0 -36
- package/dist/test/tiles/list/tile-list-compact-header.test.js.map +0 -1
- package/dist/test/tiles/list/tile-list-compact.test.d.ts +0 -1
- package/dist/test/tiles/list/tile-list-compact.test.js +0 -237
- package/dist/test/tiles/list/tile-list-compact.test.js.map +0 -1
- package/dist/test/tiles/list/tile-list.test.d.ts +0 -1
- package/dist/test/tiles/list/tile-list.test.js +0 -460
- package/dist/test/tiles/list/tile-list.test.js.map +0 -1
- package/dist/test/tiles/tile-dispatcher.test.d.ts +0 -1
- package/dist/test/tiles/tile-dispatcher.test.js +0 -246
- package/dist/test/tiles/tile-dispatcher.test.js.map +0 -1
- package/dist/test/tiles/tile-display-value-provider.test.d.ts +0 -1
- package/dist/test/tiles/tile-display-value-provider.test.js +0 -142
- package/dist/test/tiles/tile-display-value-provider.test.js.map +0 -1
- package/dist/test/tiles/tile-mediatype-icon.test.d.ts +0 -1
- package/dist/test/tiles/tile-mediatype-icon.test.js +0 -133
- package/dist/test/tiles/tile-mediatype-icon.test.js.map +0 -1
- package/dist/test/utils/array-equals.test.d.ts +0 -1
- package/dist/test/utils/array-equals.test.js +0 -27
- package/dist/test/utils/array-equals.test.js.map +0 -1
- package/dist/test/utils/format-count.test.d.ts +0 -1
- package/dist/test/utils/format-count.test.js +0 -24
- package/dist/test/utils/format-count.test.js.map +0 -1
- package/dist/test/utils/format-date.test.d.ts +0 -1
- package/dist/test/utils/format-date.test.js +0 -61
- package/dist/test/utils/format-date.test.js.map +0 -1
- package/dist/test/utils/format-unit-size.test.d.ts +0 -1
- package/dist/test/utils/format-unit-size.test.js +0 -18
- package/dist/test/utils/format-unit-size.test.js.map +0 -1
- package/dist/test/utils/local-date-from-utc.test.d.ts +0 -1
- package/dist/test/utils/local-date-from-utc.test.js +0 -27
- package/dist/test/utils/local-date-from-utc.test.js.map +0 -1
- package/eslint.config.mjs +0 -53
- package/index.html +0 -24
- package/index.ts +0 -29
- package/local.archive.org.cert +0 -86
- package/local.archive.org.key +0 -27
- package/pnpm-workspace.yaml +0 -30
- package/renovate.json +0 -6
- package/src/app-root.ts +0 -1284
- package/src/assets/img/icons/arrow-left.ts +0 -10
- package/src/assets/img/icons/arrow-right.ts +0 -10
- package/src/assets/img/icons/chevron.ts +0 -4
- package/src/assets/img/icons/close-circle-dark.ts +0 -5
- package/src/assets/img/icons/contract.ts +0 -9
- package/src/assets/img/icons/empty-query.ts +0 -5
- package/src/assets/img/icons/expand.ts +0 -9
- package/src/assets/img/icons/eye-closed.ts +0 -5
- package/src/assets/img/icons/eye.ts +0 -5
- package/src/assets/img/icons/favorite-filled.ts +0 -10
- package/src/assets/img/icons/favorite-unfilled.ts +0 -9
- package/src/assets/img/icons/filter.ts +0 -10
- package/src/assets/img/icons/login-required.ts +0 -18
- package/src/assets/img/icons/mediatype/account.ts +0 -14
- package/src/assets/img/icons/mediatype/audio.ts +0 -14
- package/src/assets/img/icons/mediatype/collection.ts +0 -12
- package/src/assets/img/icons/mediatype/data.ts +0 -15
- package/src/assets/img/icons/mediatype/etree.ts +0 -14
- package/src/assets/img/icons/mediatype/film.ts +0 -14
- package/src/assets/img/icons/mediatype/images.ts +0 -13
- package/src/assets/img/icons/mediatype/radio.ts +0 -15
- package/src/assets/img/icons/mediatype/search.ts +0 -14
- package/src/assets/img/icons/mediatype/software.ts +0 -13
- package/src/assets/img/icons/mediatype/texts.ts +0 -13
- package/src/assets/img/icons/mediatype/tv-commercial.ts +0 -12
- package/src/assets/img/icons/mediatype/tv-fact-check.ts +0 -12
- package/src/assets/img/icons/mediatype/tv-quote.ts +0 -12
- package/src/assets/img/icons/mediatype/tv.ts +0 -14
- package/src/assets/img/icons/mediatype/video.ts +0 -14
- package/src/assets/img/icons/mediatype/web.ts +0 -13
- package/src/assets/img/icons/null-result.ts +0 -5
- package/src/assets/img/icons/quote.ts +0 -7
- package/src/assets/img/icons/restricted.ts +0 -13
- package/src/assets/img/icons/reviews.ts +0 -11
- package/src/assets/img/icons/upload.ts +0 -12
- package/src/assets/img/icons/views.ts +0 -11
- package/src/circular-activity-indicator.ts +0 -64
- package/src/collection-browser.ts +0 -3187
- package/src/collection-facets/facet-row.ts +0 -309
- package/src/collection-facets/facet-tombstone-row.ts +0 -40
- package/src/collection-facets/facets-template.ts +0 -85
- package/src/collection-facets/models.ts +0 -10
- package/src/collection-facets/more-facets-content.ts +0 -644
- package/src/collection-facets/more-facets-pagination.ts +0 -294
- package/src/collection-facets/smart-facets/dedupe.ts +0 -44
- package/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.ts +0 -27
- package/src/collection-facets/smart-facets/heuristics/index.ts +0 -3
- package/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.ts +0 -17
- package/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.ts +0 -70
- package/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.ts +0 -79
- package/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.ts +0 -93
- package/src/collection-facets/smart-facets/models.ts +0 -36
- package/src/collection-facets/smart-facets/smart-facet-bar.ts +0 -437
- package/src/collection-facets/smart-facets/smart-facet-button.ts +0 -145
- package/src/collection-facets/smart-facets/smart-facet-dropdown.ts +0 -185
- package/src/collection-facets/smart-facets/smart-facet-equals.ts +0 -16
- package/src/collection-facets/smart-facets/smart-facet-heuristics.ts +0 -26
- package/src/collection-facets/toggle-switch.ts +0 -174
- package/src/collection-facets.ts +0 -1013
- package/src/data-source/collection-browser-data-source-interface.ts +0 -351
- package/src/data-source/collection-browser-data-source.ts +0 -1474
- package/src/data-source/collection-browser-query-state.ts +0 -60
- package/src/data-source/models.ts +0 -56
- package/src/empty-placeholder.ts +0 -192
- package/src/expanded-date-picker.ts +0 -191
- package/src/language-code-handler/language-code-handler.ts +0 -64
- package/src/language-code-handler/language-code-mapping.ts +0 -564
- package/src/manage/manage-bar.ts +0 -276
- package/src/manage/remove-items-modal-content.ts +0 -102
- package/src/mediatype/mediatype-config.ts +0 -146
- package/src/models.ts +0 -895
- package/src/restoration-state-handler.ts +0 -550
- package/src/sort-filter-bar/alpha-bar-tooltip.ts +0 -53
- package/src/sort-filter-bar/alpha-bar.ts +0 -252
- package/src/sort-filter-bar/img/compact.ts +0 -5
- package/src/sort-filter-bar/img/list.ts +0 -5
- package/src/sort-filter-bar/img/sort-toggle-disabled.ts +0 -15
- package/src/sort-filter-bar/img/sort-toggle-down.ts +0 -17
- package/src/sort-filter-bar/img/sort-toggle-up.ts +0 -17
- package/src/sort-filter-bar/img/sort-triangle.ts +0 -5
- package/src/sort-filter-bar/img/tile.ts +0 -5
- package/src/sort-filter-bar/sort-filter-bar.ts +0 -734
- package/src/styles/ia-button.ts +0 -139
- package/src/styles/item-image-styles.ts +0 -124
- package/src/styles/sr-only.ts +0 -18
- package/src/styles/tile-action-styles.ts +0 -59
- package/src/tiles/base-tile-component.ts +0 -124
- package/src/tiles/collection-browser-loading-tile.ts +0 -26
- package/src/tiles/grid/account-tile.ts +0 -113
- package/src/tiles/grid/collection-tile.ts +0 -184
- package/src/tiles/grid/item-tile.ts +0 -347
- package/src/tiles/grid/search-tile.ts +0 -90
- package/src/tiles/grid/styles/tile-grid-shared-styles.ts +0 -130
- package/src/tiles/grid/tile-stats.ts +0 -211
- package/src/tiles/hover/hover-pane-controller.ts +0 -638
- package/src/tiles/hover/tile-hover-pane.ts +0 -184
- package/src/tiles/image-block.ts +0 -162
- package/src/tiles/item-image.ts +0 -214
- package/src/tiles/list/tile-list-compact-header.ts +0 -112
- package/src/tiles/list/tile-list-compact.ts +0 -278
- package/src/tiles/list/tile-list.ts +0 -718
- package/src/tiles/models.ts +0 -21
- package/src/tiles/overlay/icon-overlay.ts +0 -57
- package/src/tiles/overlay/text-overlay.ts +0 -79
- package/src/tiles/review-block.ts +0 -130
- package/src/tiles/text-snippet-block.ts +0 -132
- package/src/tiles/tile-dispatcher.ts +0 -637
- package/src/tiles/tile-display-value-provider.ts +0 -133
- package/src/tiles/tile-mediatype-icon.ts +0 -133
- package/src/utils/analytics-events.ts +0 -29
- package/src/utils/array-equals.ts +0 -8
- package/src/utils/collapse-repeated-quotes.ts +0 -13
- package/src/utils/date-filter-field.ts +0 -11
- package/src/utils/facet-utils.ts +0 -183
- package/src/utils/format-count.ts +0 -95
- package/src/utils/format-date.ts +0 -62
- package/src/utils/format-unit-size.ts +0 -43
- package/src/utils/local-date-from-utc.ts +0 -15
- package/src/utils/log.ts +0 -14
- package/src/utils/resolve-mediatype.ts +0 -26
- package/src/utils/sha1.ts +0 -9
- package/test/collection-browser.test.ts +0 -2694
- package/test/collection-facets/facet-row.test.ts +0 -421
- package/test/collection-facets/facets-template.test.ts +0 -139
- package/test/collection-facets/more-facets-content.test.ts +0 -231
- package/test/collection-facets/more-facets-pagination.test.ts +0 -201
- package/test/collection-facets/toggle-switch.test.ts +0 -164
- package/test/collection-facets.test.ts +0 -928
- package/test/data-source/collection-browser-data-source.test.ts +0 -193
- package/test/empty-placeholder.test.ts +0 -88
- package/test/expanded-date-picker.test.ts +0 -201
- package/test/icon-overlay.test.ts +0 -38
- package/test/image-block.test.ts +0 -247
- package/test/item-image.test.ts +0 -220
- package/test/manage/manage-bar.test.ts +0 -347
- package/test/manage/remove-items-modal-content.test.ts +0 -81
- package/test/mediatype-config.test.ts +0 -11
- package/test/mocks/mock-analytics-handler.ts +0 -30
- package/test/mocks/mock-search-responses.ts +0 -1364
- package/test/mocks/mock-search-service.ts +0 -134
- package/test/restoration-state-handler.test.ts +0 -480
- package/test/review-block.test.ts +0 -62
- package/test/sort-filter-bar/alpha-bar-tooltip.test.ts +0 -17
- package/test/sort-filter-bar/alpha-bar.test.ts +0 -101
- package/test/sort-filter-bar/sort-filter-bar.test.ts +0 -472
- package/test/text-overlay.test.ts +0 -55
- package/test/text-snippet-block.test.ts +0 -85
- package/test/tile-stats.test.ts +0 -191
- package/test/tiles/grid/account-tile.test.ts +0 -121
- package/test/tiles/grid/collection-tile.test.ts +0 -114
- package/test/tiles/grid/item-tile.test.ts +0 -520
- package/test/tiles/grid/search-tile.test.ts +0 -75
- package/test/tiles/hover/hover-pane-controller.test.ts +0 -482
- package/test/tiles/hover/tile-hover-pane.test.ts +0 -80
- package/test/tiles/list/tile-list-compact-header.test.ts +0 -43
- package/test/tiles/list/tile-list-compact.test.ts +0 -282
- package/test/tiles/list/tile-list.test.ts +0 -576
- package/test/tiles/tile-dispatcher.test.ts +0 -320
- package/test/tiles/tile-display-value-provider.test.ts +0 -172
- package/test/tiles/tile-mediatype-icon.test.ts +0 -160
- package/test/utils/array-equals.test.ts +0 -31
- package/test/utils/format-count.test.ts +0 -32
- package/test/utils/format-date.test.ts +0 -89
- package/test/utils/format-unit-size.test.ts +0 -21
- package/test/utils/local-date-from-utc.test.ts +0 -37
- package/tsconfig.json +0 -25
- package/types/dompurify.d.ts +0 -1
- package/vite.config.ts +0 -29
- package/web-dev-server.config.mjs +0 -30
- package/web-test-runner.config.mjs +0 -52
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
css,
|
|
3
|
-
CSSResultGroup,
|
|
4
|
-
html,
|
|
5
|
-
LitElement,
|
|
6
|
-
nothing,
|
|
7
|
-
TemplateResult,
|
|
8
|
-
} from 'lit';
|
|
9
|
-
import { customElement, property, state } from 'lit/decorators.js';
|
|
10
|
-
import arrowLeftIcon from '../assets/img/icons/arrow-left';
|
|
11
|
-
import arrowRightIcon from '../assets/img/icons/arrow-right';
|
|
12
|
-
import { srOnlyStyle } from '../styles/sr-only';
|
|
13
|
-
|
|
14
|
-
@customElement('more-facets-pagination')
|
|
15
|
-
export class MoreFacetsPagination extends LitElement {
|
|
16
|
-
/**
|
|
17
|
-
* Total number of pages
|
|
18
|
-
*/
|
|
19
|
-
@property({ type: Number }) size!: number;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Number of pages can be moved in back/forward
|
|
23
|
-
*/
|
|
24
|
-
@property({ type: Number }) step = 2;
|
|
25
|
-
|
|
26
|
-
@property({ type: Number }) currentPage: number = 1;
|
|
27
|
-
|
|
28
|
-
@state() pages?: number[] = [];
|
|
29
|
-
|
|
30
|
-
firstUpdated() {
|
|
31
|
-
this.observePageCount();
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
-
override updated(changed: Map<string, any>) {
|
|
36
|
-
if (changed.has('size')) {
|
|
37
|
-
this.observePageCount();
|
|
38
|
-
}
|
|
39
|
-
if (changed.has('currentPage')) {
|
|
40
|
-
this.observePageCount();
|
|
41
|
-
this.emitPageClick();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** creates `this.pages` array that notes which pages to draw
|
|
46
|
-
* - `0` is elipses marker
|
|
47
|
-
* - rule: selected page is centered between -2/+2 pages
|
|
48
|
-
* - outlier: first page selected, show _1_ 2 3 ... N
|
|
49
|
-
* - outlier: second page selected, show 1 _2_ 3 4 ... N
|
|
50
|
-
* - outlier: last page selected, show 1 ... N-2 N-1 _N_
|
|
51
|
-
* - outlier: if page count = 7, & selected is either [2, 3, 4, 5, 6], show all pages
|
|
52
|
-
*/
|
|
53
|
-
observePageCount() {
|
|
54
|
-
this.pages = []; /* `0` is elipses marker */
|
|
55
|
-
|
|
56
|
-
const paginatorMaxPagesToShow = 7;
|
|
57
|
-
const atMinThreshold = this.size <= paginatorMaxPagesToShow;
|
|
58
|
-
|
|
59
|
-
/** Display outliers */
|
|
60
|
-
if (this.size <= 5) {
|
|
61
|
-
// display all pages
|
|
62
|
-
this.pages = [...Array(this.size).keys()].map(i => i + 1);
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (this.size === paginatorMaxPagesToShow) {
|
|
67
|
-
// edge: 7 pages
|
|
68
|
-
if (this.currentPage === 2) {
|
|
69
|
-
this.pages = [1, 2, 3, 4, 0, this.size];
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (this.currentPage === this.size - 1) {
|
|
74
|
-
this.pages = [1, 0, 4, 5, this.size - 1, this.size];
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (this.currentPage === 1) {
|
|
80
|
-
// first page
|
|
81
|
-
this.pages = [1, 2, 3, 0, this.size];
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (this.currentPage === this.size) {
|
|
86
|
-
// last page
|
|
87
|
-
this.pages = [1, 0, this.size - 2, this.size - 1, this.size];
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (this.currentPage === this.size - 1) {
|
|
92
|
-
// second last page
|
|
93
|
-
this.pages = [
|
|
94
|
-
1,
|
|
95
|
-
0,
|
|
96
|
-
this.size - 3,
|
|
97
|
-
this.size - 2,
|
|
98
|
-
this.size - 1,
|
|
99
|
-
this.size,
|
|
100
|
-
];
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (
|
|
105
|
-
atMinThreshold &&
|
|
106
|
-
this.currentPage > 1 &&
|
|
107
|
-
this.currentPage < paginatorMaxPagesToShow
|
|
108
|
-
) {
|
|
109
|
-
this.pages = [...Array(this.size).keys()].map(i => i + 1);
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/* The rest here calculates the range to display in "page window" */
|
|
114
|
-
let startPage = this.currentPage - this.step;
|
|
115
|
-
let endPage = this.currentPage + this.step;
|
|
116
|
-
|
|
117
|
-
if (startPage <= 0) {
|
|
118
|
-
endPage += -startPage + 1;
|
|
119
|
-
startPage = 1;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (endPage >= this.size) {
|
|
123
|
-
startPage = Math.max(startPage - (endPage - this.size), 1);
|
|
124
|
-
endPage = this.size;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (startPage === 2) {
|
|
128
|
-
endPage -= 1;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
if (endPage === this.size - 1) {
|
|
132
|
-
startPage += 1;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// create first page node
|
|
136
|
-
this.createFirstNode(startPage);
|
|
137
|
-
|
|
138
|
-
// create middle pages node
|
|
139
|
-
this.createMiddelNode(startPage, endPage);
|
|
140
|
-
|
|
141
|
-
// create last page node
|
|
142
|
-
this.createLastNode(endPage);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
private createFirstNode(startPage: number) {
|
|
146
|
-
if (startPage > 1) {
|
|
147
|
-
this.pages?.push(1);
|
|
148
|
-
}
|
|
149
|
-
if (startPage > 2) {
|
|
150
|
-
this.pages?.push(0); // let's asssume 0 is for ellipsis template
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
private createMiddelNode(startPage: number, endPage: number) {
|
|
155
|
-
for (let page = startPage; page <= endPage; page += 1) {
|
|
156
|
-
this.pages?.push(page);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
private createLastNode(endPage: number) {
|
|
161
|
-
if (endPage < this.size - 1) {
|
|
162
|
-
this.pages?.push(0); // let's asssume 0 is for ellipsis template
|
|
163
|
-
}
|
|
164
|
-
if (endPage < this.size) {
|
|
165
|
-
this.pages?.push(this.size);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
private get getEllipsisTemplate() {
|
|
170
|
-
return html`<i class="ellipses">...</i>`;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
emitPageClick() {
|
|
174
|
-
this.dispatchEvent(
|
|
175
|
-
new CustomEvent('pageNumberClicked', {
|
|
176
|
-
detail: { page: this.currentPage },
|
|
177
|
-
bubbles: true,
|
|
178
|
-
composed: true,
|
|
179
|
-
}),
|
|
180
|
-
);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
private onRewind() {
|
|
184
|
-
this.currentPage -= 1;
|
|
185
|
-
if (this.currentPage < 1) {
|
|
186
|
-
this.currentPage = 1;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
private onForward() {
|
|
191
|
-
this.currentPage += 1;
|
|
192
|
-
if (this.currentPage > this.size) {
|
|
193
|
-
this.currentPage = this.size;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
private onChange(page: number) {
|
|
198
|
-
this.currentPage = page;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
private getPageTemplate(page: number) {
|
|
202
|
-
return html`
|
|
203
|
-
<button
|
|
204
|
-
@click=${() => this.onChange(page)}
|
|
205
|
-
class=${this.currentPage === page ? 'current' : ''}
|
|
206
|
-
data-page=${page}
|
|
207
|
-
>
|
|
208
|
-
${page}
|
|
209
|
-
</button>
|
|
210
|
-
`;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
private get getPagesTemplate(): TemplateResult | typeof nothing {
|
|
214
|
-
if (!this.pages || !this.pages.length) {
|
|
215
|
-
return nothing;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
return html`
|
|
219
|
-
${this.pages?.map(
|
|
220
|
-
page =>
|
|
221
|
-
html`${page !== 0
|
|
222
|
-
? this.getPageTemplate(page)
|
|
223
|
-
: this.getEllipsisTemplate}`,
|
|
224
|
-
)}
|
|
225
|
-
`;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
render() {
|
|
229
|
-
return html`
|
|
230
|
-
<div class="facets-pagination">
|
|
231
|
-
<button class="arrow-icon rewind" @click=${this.onRewind}>
|
|
232
|
-
<span class="sr-only">Rewind pagination:</span>
|
|
233
|
-
${arrowLeftIcon}
|
|
234
|
-
</button>
|
|
235
|
-
<div class="page-numbers">${this.getPagesTemplate}</div>
|
|
236
|
-
<button class="arrow-icon forward" @click=${this.onForward}>
|
|
237
|
-
<span class="sr-only">Forward pagination:</span>
|
|
238
|
-
${arrowRightIcon}
|
|
239
|
-
</button>
|
|
240
|
-
</div>
|
|
241
|
-
`;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
static get styles(): CSSResultGroup {
|
|
245
|
-
return [
|
|
246
|
-
srOnlyStyle,
|
|
247
|
-
css`
|
|
248
|
-
.facets-pagination {
|
|
249
|
-
user-select: none;
|
|
250
|
-
margin-top: 10px;
|
|
251
|
-
background-color: #eee;
|
|
252
|
-
text-align: center;
|
|
253
|
-
}
|
|
254
|
-
.facets-pagination button {
|
|
255
|
-
border: none;
|
|
256
|
-
background: none;
|
|
257
|
-
}
|
|
258
|
-
.facets-pagination .arrow-icon {
|
|
259
|
-
width: 2.5rem;
|
|
260
|
-
vertical-align: middle;
|
|
261
|
-
}
|
|
262
|
-
.facets-pagination .arrow-icon svg {
|
|
263
|
-
height: 14px;
|
|
264
|
-
fill: #2c2c2c;
|
|
265
|
-
}
|
|
266
|
-
.facets-pagination button,
|
|
267
|
-
.facets-pagination i {
|
|
268
|
-
background: none;
|
|
269
|
-
border: 0;
|
|
270
|
-
cursor: pointer;
|
|
271
|
-
border-radius: 4px;
|
|
272
|
-
margin: 10px 5px;
|
|
273
|
-
padding: 5px;
|
|
274
|
-
font-size: 1.4rem;
|
|
275
|
-
color: inherit;
|
|
276
|
-
vertical-align: baseline;
|
|
277
|
-
display: inline-block;
|
|
278
|
-
min-width: 2.5rem;
|
|
279
|
-
}
|
|
280
|
-
.facets-pagination i {
|
|
281
|
-
cursor: auto;
|
|
282
|
-
display: inline;
|
|
283
|
-
}
|
|
284
|
-
.facets-pagination button.current {
|
|
285
|
-
background: #2c2c2c;
|
|
286
|
-
color: white;
|
|
287
|
-
}
|
|
288
|
-
.page-numbers {
|
|
289
|
-
display: inline-block;
|
|
290
|
-
}
|
|
291
|
-
`,
|
|
292
|
-
];
|
|
293
|
-
}
|
|
294
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { SmartFacet } from './models';
|
|
2
|
-
import { smartFacetEquals } from './smart-facet-equals';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Removes any duplicated smart facets from the given array.
|
|
6
|
-
* Smart facets are equal if they have the same `label` and same
|
|
7
|
-
* set of facet refs. Only the first occurrence of a given smart
|
|
8
|
-
* facet is kept.
|
|
9
|
-
* @param facets The array of smart facets to deduplicate
|
|
10
|
-
* @returns A new array containing the deduplicated set of facets
|
|
11
|
-
*/
|
|
12
|
-
export function dedupe<T extends SmartFacet[] | SmartFacet[][]>(facets: T): T {
|
|
13
|
-
if (!Array.isArray(facets[0])) {
|
|
14
|
-
const facetsUnnested = facets as SmartFacet[];
|
|
15
|
-
|
|
16
|
-
let result: SmartFacet[] = [...facetsUnnested];
|
|
17
|
-
for (let i = 0; i < result.length; i++) {
|
|
18
|
-
const curFacet = result[i];
|
|
19
|
-
result = result.filter(
|
|
20
|
-
sf => curFacet === sf || !smartFacetEquals(curFacet, sf),
|
|
21
|
-
);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return result as T;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const facetsNested = facets as SmartFacet[][];
|
|
28
|
-
|
|
29
|
-
const result: SmartFacet[][] = [];
|
|
30
|
-
for (const curFacetArray of facetsNested) {
|
|
31
|
-
const subresult: SmartFacet[] = [];
|
|
32
|
-
for (const curFacet of curFacetArray) {
|
|
33
|
-
const existing = result.find(sfa =>
|
|
34
|
-
sfa.find(sf => smartFacetEquals(curFacet, sf)),
|
|
35
|
-
);
|
|
36
|
-
if (!existing) subresult.push(curFacet);
|
|
37
|
-
}
|
|
38
|
-
if (subresult.length > 0) {
|
|
39
|
-
result.push(subresult);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return result as T;
|
|
44
|
-
}
|
package/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { SmartQueryHeuristic, SmartFacet } from '../../models';
|
|
2
|
-
|
|
3
|
-
export class BrowserLanguageHeuristic implements SmartQueryHeuristic {
|
|
4
|
-
async getRecommendedFacets(): Promise<SmartFacet[]> {
|
|
5
|
-
const browserLanguageCode = navigator.language;
|
|
6
|
-
const languageName =
|
|
7
|
-
BrowserLanguageHeuristic.getLanguageDisplayName(browserLanguageCode);
|
|
8
|
-
if (!languageName) return [];
|
|
9
|
-
|
|
10
|
-
return [
|
|
11
|
-
{
|
|
12
|
-
facets: [
|
|
13
|
-
{
|
|
14
|
-
facetType: 'language',
|
|
15
|
-
bucketKey: languageName,
|
|
16
|
-
},
|
|
17
|
-
],
|
|
18
|
-
},
|
|
19
|
-
];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
private static getLanguageDisplayName(langCode: string): string | undefined {
|
|
23
|
-
// Strip off any script/region/variant codes for greater generality
|
|
24
|
-
const languageOnly = langCode.split('-')[0];
|
|
25
|
-
return new Intl.DisplayNames(['en'], { type: 'language' }).of(languageOnly);
|
|
26
|
-
}
|
|
27
|
-
}
|
package/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { SmartQueryHeuristic, SmartFacet } from '../../models';
|
|
2
|
-
import { QUERY_KEYWORDS } from './query-keywords-map';
|
|
3
|
-
|
|
4
|
-
// If the query contains X keyword but Y facet isn't selected, recommend facet Y
|
|
5
|
-
export class QueryKeywordsHeuristic implements SmartQueryHeuristic {
|
|
6
|
-
async getRecommendedFacets(query: string): Promise<SmartFacet[]> {
|
|
7
|
-
const recommendations: SmartFacet[] = [];
|
|
8
|
-
|
|
9
|
-
for (const [keyword, facets] of Object.entries(QUERY_KEYWORDS)) {
|
|
10
|
-
if (query.includes(keyword)) {
|
|
11
|
-
recommendations.push(...facets);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
return recommendations;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type { KeywordFacetMap, SmartFacet } from '../../models';
|
|
2
|
-
|
|
3
|
-
const TEXTS: SmartFacet = {
|
|
4
|
-
facets: [{ facetType: 'mediatype', bucketKey: 'texts' }],
|
|
5
|
-
};
|
|
6
|
-
const AUDIO: SmartFacet = {
|
|
7
|
-
facets: [{ facetType: 'mediatype', bucketKey: 'audio' }],
|
|
8
|
-
};
|
|
9
|
-
const MOVIES: SmartFacet = {
|
|
10
|
-
facets: [{ facetType: 'mediatype', bucketKey: 'movies' }],
|
|
11
|
-
};
|
|
12
|
-
const IMAGE: SmartFacet = {
|
|
13
|
-
facets: [{ facetType: 'mediatype', bucketKey: 'image' }],
|
|
14
|
-
};
|
|
15
|
-
const SOFTWARE: SmartFacet = {
|
|
16
|
-
facets: [{ facetType: 'mediatype', bucketKey: 'software' }],
|
|
17
|
-
};
|
|
18
|
-
const ETREE: SmartFacet = {
|
|
19
|
-
facets: [{ facetType: 'mediatype', bucketKey: 'etree' }],
|
|
20
|
-
};
|
|
21
|
-
const WEB: SmartFacet = {
|
|
22
|
-
facets: [{ facetType: 'mediatype', bucketKey: 'web' }],
|
|
23
|
-
};
|
|
24
|
-
const DATA: SmartFacet = {
|
|
25
|
-
facets: [{ facetType: 'mediatype', bucketKey: 'data' }],
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Map from keywords found in the search query to an array of
|
|
30
|
-
* likely-relevant "smart facets" for those keywords.
|
|
31
|
-
*/
|
|
32
|
-
export const QUERY_KEYWORDS: Readonly<KeywordFacetMap> = {
|
|
33
|
-
text: [TEXTS],
|
|
34
|
-
book: [TEXTS],
|
|
35
|
-
novel: [TEXTS],
|
|
36
|
-
magazine: [TEXTS],
|
|
37
|
-
newspaper: [TEXTS],
|
|
38
|
-
pdf: [TEXTS],
|
|
39
|
-
epub: [TEXTS],
|
|
40
|
-
audio: [AUDIO],
|
|
41
|
-
song: [AUDIO],
|
|
42
|
-
music: [AUDIO],
|
|
43
|
-
listen: [AUDIO],
|
|
44
|
-
podcast: [AUDIO],
|
|
45
|
-
radio: [AUDIO],
|
|
46
|
-
stream: [AUDIO, MOVIES],
|
|
47
|
-
video: [MOVIES],
|
|
48
|
-
movie: [MOVIES],
|
|
49
|
-
film: [MOVIES],
|
|
50
|
-
animation: [MOVIES],
|
|
51
|
-
youtube: [MOVIES],
|
|
52
|
-
image: [IMAGE],
|
|
53
|
-
photo: [IMAGE],
|
|
54
|
-
picture: [IMAGE],
|
|
55
|
-
painting: [IMAGE],
|
|
56
|
-
jpg: [IMAGE],
|
|
57
|
-
jpeg: [IMAGE],
|
|
58
|
-
png: [IMAGE],
|
|
59
|
-
gif: [IMAGE],
|
|
60
|
-
software: [SOFTWARE],
|
|
61
|
-
app: [SOFTWARE],
|
|
62
|
-
program: [SOFTWARE],
|
|
63
|
-
game: [SOFTWARE],
|
|
64
|
-
arcade: [SOFTWARE],
|
|
65
|
-
etree: [ETREE],
|
|
66
|
-
concert: [ETREE],
|
|
67
|
-
'live music': [ETREE],
|
|
68
|
-
'web crawl': [WEB],
|
|
69
|
-
dataset: [DATA],
|
|
70
|
-
};
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import type { KeywordFacetMap, SmartFacet } from '../../models';
|
|
2
|
-
|
|
3
|
-
const WRITTEN_WORK_SMART_FACETS: SmartFacet[] = [
|
|
4
|
-
{ facets: [{ facetType: 'mediatype', bucketKey: 'texts' }] },
|
|
5
|
-
];
|
|
6
|
-
|
|
7
|
-
const FILMMAKER_SMART_FACETS: SmartFacet[] = [
|
|
8
|
-
{
|
|
9
|
-
label: 'Films by __QUERY',
|
|
10
|
-
facets: [
|
|
11
|
-
{ facetType: 'mediatype', bucketKey: 'movies' },
|
|
12
|
-
{ facetType: 'creator', bucketKey: '__QUERY' },
|
|
13
|
-
],
|
|
14
|
-
},
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
const AUTHOR_SMART_FACETS: SmartFacet[] = [
|
|
18
|
-
{
|
|
19
|
-
label: 'Writing by __QUERY',
|
|
20
|
-
facets: [
|
|
21
|
-
{ facetType: 'mediatype', bucketKey: 'texts' },
|
|
22
|
-
{ facetType: 'creator', bucketKey: '__QUERY' },
|
|
23
|
-
],
|
|
24
|
-
},
|
|
25
|
-
];
|
|
26
|
-
|
|
27
|
-
const VISUAL_ARTIST_SMART_FACETS: SmartFacet[] = [
|
|
28
|
-
{
|
|
29
|
-
label: 'Images by __QUERY',
|
|
30
|
-
facets: [
|
|
31
|
-
{ facetType: 'mediatype', bucketKey: 'image' },
|
|
32
|
-
{ facetType: 'creator', bucketKey: '__QUERY' },
|
|
33
|
-
],
|
|
34
|
-
},
|
|
35
|
-
];
|
|
36
|
-
|
|
37
|
-
const MUSICIAN_SMART_FACETS: SmartFacet[] = [
|
|
38
|
-
{
|
|
39
|
-
label: 'Music by __QUERY',
|
|
40
|
-
facets: [
|
|
41
|
-
{ facetType: 'mediatype', bucketKey: 'audio' },
|
|
42
|
-
{ facetType: 'creator', bucketKey: '__QUERY' },
|
|
43
|
-
],
|
|
44
|
-
},
|
|
45
|
-
];
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Map from Wikidata description keywords for a given entity to a
|
|
49
|
-
* set of likely-relevant "smart facets" for that query.
|
|
50
|
-
*
|
|
51
|
-
* The placeholder string "__QUERY" should be substituted for the actual
|
|
52
|
-
* queried entity when generating facet values.
|
|
53
|
-
*/
|
|
54
|
-
export const WIKIDATA_ENTITIES: Readonly<KeywordFacetMap> = {
|
|
55
|
-
'written work': WRITTEN_WORK_SMART_FACETS,
|
|
56
|
-
literature: WRITTEN_WORK_SMART_FACETS,
|
|
57
|
-
book: WRITTEN_WORK_SMART_FACETS,
|
|
58
|
-
novel: WRITTEN_WORK_SMART_FACETS,
|
|
59
|
-
|
|
60
|
-
filmmaker: FILMMAKER_SMART_FACETS,
|
|
61
|
-
director: FILMMAKER_SMART_FACETS,
|
|
62
|
-
|
|
63
|
-
author: AUTHOR_SMART_FACETS,
|
|
64
|
-
writer: AUTHOR_SMART_FACETS,
|
|
65
|
-
novelist: AUTHOR_SMART_FACETS,
|
|
66
|
-
essayist: AUTHOR_SMART_FACETS,
|
|
67
|
-
poet: AUTHOR_SMART_FACETS,
|
|
68
|
-
|
|
69
|
-
'visual artist': VISUAL_ARTIST_SMART_FACETS,
|
|
70
|
-
'graphic artist': VISUAL_ARTIST_SMART_FACETS,
|
|
71
|
-
photographer: VISUAL_ARTIST_SMART_FACETS,
|
|
72
|
-
painter: VISUAL_ARTIST_SMART_FACETS,
|
|
73
|
-
|
|
74
|
-
singer: MUSICIAN_SMART_FACETS,
|
|
75
|
-
songwriter: MUSICIAN_SMART_FACETS,
|
|
76
|
-
musician: MUSICIAN_SMART_FACETS,
|
|
77
|
-
composer: MUSICIAN_SMART_FACETS,
|
|
78
|
-
pianist: MUSICIAN_SMART_FACETS,
|
|
79
|
-
};
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import type { SmartQueryHeuristic, SmartFacet } from '../../models';
|
|
2
|
-
import { WIKIDATA_ENTITIES } from './wikidata-entity-map';
|
|
3
|
-
|
|
4
|
-
// If wikidata describes the top query result as X, recommend facet Y, e.g.:
|
|
5
|
-
// X Y
|
|
6
|
-
// written work mt:texts
|
|
7
|
-
// film mt:movies
|
|
8
|
-
// author mt:texts and creator:<query>
|
|
9
|
-
// filmmaker mt:movies and creator:<query>
|
|
10
|
-
// photographer mt:image and creator:<query>
|
|
11
|
-
// visual artist mt:image and creator:<query>
|
|
12
|
-
// etc.
|
|
13
|
-
export class WikidataHeuristic implements SmartQueryHeuristic {
|
|
14
|
-
private readonly WIKIDATA_BASE_URL = 'https://www.wikidata.org/w/api.php';
|
|
15
|
-
|
|
16
|
-
private readonly WIKIDATA_DEFAULT_ARGS =
|
|
17
|
-
'?action=wbsearchentities&format=json&language=en&uselang=en&origin=*&type=item&limit=5';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Returns the full URL for a Wikidata search for the given query
|
|
21
|
-
* @param query The query to search for
|
|
22
|
-
*/
|
|
23
|
-
private getWikidataURL(query: string): string {
|
|
24
|
-
const urlQuery = encodeURIComponent(query);
|
|
25
|
-
return `${this.WIKIDATA_BASE_URL}${this.WIKIDATA_DEFAULT_ARGS}&search=${urlQuery}`;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Replaces query placeholders with an actual query string, within a collection of smart facets
|
|
30
|
-
* @param smartFacets The array of smart facets
|
|
31
|
-
* @param query The query string to replace placeholders with
|
|
32
|
-
* @returns A new array of smart facets with all query placeholders replaced
|
|
33
|
-
*/
|
|
34
|
-
private replaceQueryPlaceholders(
|
|
35
|
-
smartFacets: SmartFacet[],
|
|
36
|
-
query: string,
|
|
37
|
-
): SmartFacet[] {
|
|
38
|
-
return smartFacets.map(
|
|
39
|
-
smartFacet =>
|
|
40
|
-
({
|
|
41
|
-
// Replace placeholders within the smart facet label
|
|
42
|
-
label: smartFacet.label?.replace('__QUERY', query),
|
|
43
|
-
// Replace placeholders within the facets themselves (buckets & display text)
|
|
44
|
-
facets: smartFacet.facets.map(facet => {
|
|
45
|
-
const replaced = {
|
|
46
|
-
...facet,
|
|
47
|
-
bucketKey: facet.bucketKey.replace(
|
|
48
|
-
'__QUERY',
|
|
49
|
-
query.toLowerCase(),
|
|
50
|
-
),
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
if (facet.displayText) {
|
|
54
|
-
replaced.displayText = replaced.displayText?.replace(
|
|
55
|
-
'__QUERY',
|
|
56
|
-
query,
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return replaced;
|
|
61
|
-
}),
|
|
62
|
-
}) as SmartFacet,
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* @inheritdoc
|
|
68
|
-
*/
|
|
69
|
-
async getRecommendedFacets(query: string): Promise<SmartFacet[]> {
|
|
70
|
-
const recommendations: SmartFacet[] = [];
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
const wikidataURL = this.getWikidataURL(query);
|
|
74
|
-
const wikidataResponse = await fetch(wikidataURL);
|
|
75
|
-
const searchResults = await wikidataResponse.json();
|
|
76
|
-
|
|
77
|
-
for (const [keyword, facets] of Object.entries(WIKIDATA_ENTITIES)) {
|
|
78
|
-
const keywordRegex = new RegExp(`\\b${keyword}\\b`);
|
|
79
|
-
if (keywordRegex.test(searchResults.search[0]?.description)) {
|
|
80
|
-
const entityName = searchResults.search[0].label;
|
|
81
|
-
recommendations.push(
|
|
82
|
-
...this.replaceQueryPlaceholders(facets, entityName),
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return recommendations;
|
|
88
|
-
} catch (err) {
|
|
89
|
-
console.warn(err);
|
|
90
|
-
return [];
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { FacetEventDetails, FacetOption } from '../../models';
|
|
2
|
-
|
|
3
|
-
export interface FacetRef {
|
|
4
|
-
facetType: FacetOption;
|
|
5
|
-
bucketKey: string;
|
|
6
|
-
displayText?: string;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
interface LabeledSmartFacet {
|
|
10
|
-
label: string;
|
|
11
|
-
facets: FacetRef[];
|
|
12
|
-
selected?: boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
interface UnlabeledSmartFacet {
|
|
16
|
-
label?: string;
|
|
17
|
-
facets: [FacetRef];
|
|
18
|
-
selected?: boolean;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export type SmartFacet = LabeledSmartFacet | UnlabeledSmartFacet;
|
|
22
|
-
|
|
23
|
-
export interface SmartFacetEvent {
|
|
24
|
-
smartFacet: SmartFacet;
|
|
25
|
-
details: FacetEventDetails[];
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export type KeywordFacetMap = Record<string, SmartFacet[]>;
|
|
29
|
-
|
|
30
|
-
export interface SmartQueryHeuristic {
|
|
31
|
-
/**
|
|
32
|
-
* Resolves to a recommended set of facets to apply for the given query
|
|
33
|
-
* @param query The search query to recommend facets for
|
|
34
|
-
*/
|
|
35
|
-
getRecommendedFacets(query: string): Promise<SmartFacet[]>;
|
|
36
|
-
}
|