@internetarchive/collection-browser 4.8.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/collection-browser.d.ts +2 -1
- package/dist/src/collection-browser.js +3 -3
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/more-facets-content.js +3 -2
- package/dist/src/collection-facets/more-facets-content.js.map +1 -1
- package/dist/src/collection-facets/more-facets-scroller.js +3 -2
- package/dist/src/collection-facets/more-facets-scroller.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.js +6 -2
- package/dist/src/models.js.map +1 -1
- package/dist/src/sort-filter-bar/sort-filter-bar.js +3 -2
- 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/locales/es.d.ts +1 -0
- package/locales/es.js +1 -0
- package/package.json +13 -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/test/collection-browser.test.d.ts +0 -1
- package/dist/test/collection-browser.test.js +0 -1815
- 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 -509
- package/dist/test/collection-facets/more-facets-content.test.js.map +0 -1
- package/dist/test/collection-facets/more-facets-scroller.test.d.ts +0 -1
- package/dist/test/collection-facets/more-facets-scroller.test.js +0 -288
- package/dist/test/collection-facets/more-facets-scroller.test.js.map +0 -1
- package/dist/test/collection-facets/page-window.test.d.ts +0 -1
- package/dist/test/collection-facets/page-window.test.js +0 -175
- package/dist/test/collection-facets/page-window.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 -37
- package/dist/test/mocks/mock-search-responses.js +0 -1293
- 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 -65
- 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 -304
- 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/dist/test/utils/normalize-filter-text.test.d.ts +0 -1
- package/dist/test/utils/normalize-filter-text.test.js +0 -69
- package/dist/test/utils/normalize-filter-text.test.js.map +0 -1
- package/docs/design/column-virtualization.md +0 -214
- 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 -1282
- 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/check.ts +0 -5
- 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 -3165
- package/src/collection-facets/facet-row-template.ts +0 -242
- package/src/collection-facets/facet-row.ts +0 -122
- 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 -16
- package/src/collection-facets/more-facets-content.ts +0 -951
- package/src/collection-facets/more-facets-scroller.ts +0 -485
- package/src/collection-facets/page-window.ts +0 -247
- 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 -175
- 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 -912
- 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 -733
- 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/normalize-filter-text.ts +0 -54
- package/src/utils/resolve-mediatype.ts +0 -26
- package/src/utils/sha1.ts +0 -9
- package/test/collection-browser.test.ts +0 -2639
- 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 -716
- package/test/collection-facets/more-facets-scroller.test.ts +0 -401
- package/test/collection-facets/page-window.test.ts +0 -208
- 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 -1420
- package/test/mocks/mock-search-service.ts +0 -136
- 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 -443
- 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/test/utils/normalize-filter-text.test.ts +0 -87
- 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 -57
|
@@ -5,7 +5,7 @@ import { ifDefined } from 'lit/directives/if-defined.js';
|
|
|
5
5
|
import { repeat } from 'lit/directives/repeat.js';
|
|
6
6
|
import { when } from 'lit/directives/when.js';
|
|
7
7
|
import { SearchType, AggregationSortType, } from '@internetarchive/search-service';
|
|
8
|
-
import { msg, str } from '@lit/localize';
|
|
8
|
+
import { localized, msg, str } from '@lit/localize';
|
|
9
9
|
import { facetTitles, facetPluralTitles, suppressedCollections, valueFacetSort, defaultFacetSort, getDefaultSelectedFacets, tvMoreFacetSort, } from '../models';
|
|
10
10
|
import '@internetarchive/elements/ia-status-indicator/ia-status-indicator';
|
|
11
11
|
import '@internetarchive/ia-clearable-text-input';
|
|
@@ -811,7 +811,8 @@ __decorate([
|
|
|
811
811
|
query('ia-clearable-text-input')
|
|
812
812
|
], MoreFacetsContent.prototype, "filterInput", void 0);
|
|
813
813
|
MoreFacetsContent = __decorate([
|
|
814
|
-
customElement('more-facets-content')
|
|
814
|
+
customElement('more-facets-content'),
|
|
815
|
+
localized()
|
|
815
816
|
], MoreFacetsContent);
|
|
816
817
|
export { MoreFacetsContent };
|
|
817
818
|
//# sourceMappingURL=more-facets-content.js.map
|
|
@@ -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":["import {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n PropertyValues,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { when } from 'lit/directives/when.js';\nimport {\n Aggregation,\n Bucket,\n SearchServiceInterface,\n SearchParams,\n SearchType,\n AggregationSortType,\n FilterMap,\n PageType,\n} from '@internetarchive/search-service';\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport { msg, str } from '@lit/localize';\nimport {\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n FacetOption,\n facetTitles,\n facetPluralTitles,\n suppressedCollections,\n valueFacetSort,\n defaultFacetSort,\n getDefaultSelectedFacets,\n FacetEventDetails,\n tvMoreFacetSort,\n} from '../models';\nimport type {\n CollectionTitles,\n PageSpecifierParams,\n TVChannelAliases,\n} from '../data-source/models';\nimport '@internetarchive/elements/ia-status-indicator/ia-status-indicator';\nimport '@internetarchive/ia-clearable-text-input';\nimport './more-facets-scroller';\nimport type { MoreFacetsScroller } from './more-facets-scroller';\nimport {\n analyticsActions,\n analyticsCategories,\n} from '../utils/analytics-events';\nimport './toggle-switch';\nimport { srOnlyStyle } from '../styles/sr-only';\nimport checkIcon from '../assets/img/icons/check';\nimport eyeClosedIcon from '../assets/img/icons/eye-closed';\nimport closeCircleDark from '../assets/img/icons/close-circle-dark';\nimport {\n mergeSelectedFacets,\n updateSelectedFacetBucket,\n} from '../utils/facet-utils';\nimport {\n filterTextIncludes,\n normalizeFilterText,\n type NormalizedFilterText,\n} from '../utils/normalize-filter-text';\nimport { log } from '../utils/log';\nimport { MORE_FACETS__MAX_AGGREGATIONS } from './models';\n\n@customElement('more-facets-content')\nexport class MoreFacetsContent extends LitElement {\n @property({ type: String }) facetKey?: FacetOption;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Array }) identifiers?: string[];\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: Number }) searchType?: SearchType;\n\n @property({ type: Object }) pageSpecifierParams?: PageSpecifierParams;\n\n @property({ type: Object })\n collectionTitles?: CollectionTitles;\n\n @property({ type: Object })\n tvChannelAliases?: TVChannelAliases;\n\n /**\n * Whether we are waiting for facet data to load.\n * We begin with this set to true so that we show an initial loading indicator.\n */\n @property({ type: Boolean }) facetsLoading = true;\n\n /**\n * The set of pre-existing facet selections (including both selected & negated facets).\n */\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Number }) sortedBy: AggregationSortType =\n AggregationSortType.COUNT;\n\n @property({ type: Boolean }) isTvSearch = false;\n\n @property({ type: Object }) modalManager?: ModalManagerInterface;\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: Object, attribute: false })\n analyticsHandler?: AnalyticsManagerInterface;\n\n /**\n * The full set of aggregations received from the search service\n */\n @state() private aggregations?: Record<string, Aggregation>;\n\n /**\n * A FacetGroup storing the full set of facet buckets to be shown on the dialog.\n */\n @state() private facetGroup?: FacetGroup;\n\n /**\n * An object holding any changes the patron has made to their facet selections\n * within the modal dialog but which they have not yet applied. These are\n * eventually merged into the existing `selectedFacets` when the patron applies\n * their changes, or discarded if they cancel/close the dialog.\n */\n @state() private unappliedFacetChanges: SelectedFacets =\n getDefaultSelectedFacets();\n\n /**\n * Text the patron has entered to narrow down the facet values shown.\n */\n @state() private filterText = '';\n\n /**\n * Whether the search for this facet's values failed, either with an error\n * result or by throwing.\n */\n @state() private loadFailed = false;\n\n /**\n * The buckets from `facetGroup` that match `filterText`, in display order.\n * Derived in `willUpdate`.\n */\n private filteredBuckets: FacetBucket[] = [];\n\n /**\n * Each bucket's display text in the normalized form that filtering compares\n * against, keyed by bucket key. Filled lazily so that each value is only\n * normalized once, however many times the filter text changes.\n */\n private filterKeys = new Map<string, NormalizedFilterText>();\n\n /**\n * The values currently selected or hidden, in the order they were selected.\n * Shown as chiclets above the list. Derived in `willUpdate`.\n */\n private chosenBuckets: FacetBucket[] = [];\n\n /**\n * Position of a chiclet that was just removed, whose neighbor should get\n * focus once it's gone.\n */\n private chicletFocusIndex?: number;\n\n @query('more-facets-scroller')\n private scroller?: MoreFacetsScroller;\n\n @query('ia-clearable-text-input')\n private filterInput?: HTMLElement;\n\n willUpdate(changed: PropertyValues): void {\n if (changed.has('aggregations')) {\n this.filterKeys.clear();\n }\n\n const facetGroupChanged =\n changed.has('aggregations') ||\n changed.has('sortedBy') ||\n changed.has('selectedFacets') ||\n changed.has('unappliedFacetChanges');\n if (facetGroupChanged) {\n // Convert the merged selected facets & aggregations into a facet group\n this.facetGroup = this.mergedFacets;\n this.chosenBuckets = this.listChosenBuckets();\n }\n\n if (facetGroupChanged || changed.has('filterText')) {\n this.filteredBuckets = this.filterBuckets();\n }\n\n // If any of the search properties change, it triggers a facet fetch\n if (\n changed.has('facetKey') ||\n changed.has('query') ||\n changed.has('searchType') ||\n changed.has('filterMap')\n ) {\n this.facetsLoading = true;\n this.loadFailed = false;\n this.sortedBy =\n this.searchType === SearchType.TV\n ? tvMoreFacetSort[this.facetKey as FacetOption]\n : defaultFacetSort[this.facetKey as FacetOption];\n\n this.updateSpecificFacets();\n }\n }\n\n updated(changed: PropertyValues): void {\n // A new filter or sort order shows different values, so start over from\n // the first page rather than somewhere in the middle of them.\n if (changed.has('filterText') || changed.has('sortedBy')) {\n this.scroller?.scrollToPage(0);\n }\n\n // A removed chiclet took its focused button with it; move focus to the\n // chiclet that took its place, or back to the filter field if none are left.\n if (this.chicletFocusIndex !== undefined) {\n const buttons =\n this.shadowRoot?.querySelectorAll<HTMLElement>('.chiclet-remove') ?? [];\n const index = Math.min(this.chicletFocusIndex, buttons.length - 1);\n this.chicletFocusIndex = undefined;\n (buttons[index] ?? this.filterInput)?.focus();\n }\n }\n\n firstUpdated(): void {\n this.setupEscapeListeners();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('keydown', this.escapeHandler);\n }\n\n /**\n * Close more facets modal on Escape click\n */\n private escapeHandler = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') this.modalManager?.closeModal();\n };\n\n private setupEscapeListeners() {\n if (this.modalManager) {\n document.addEventListener('keydown', this.escapeHandler);\n }\n }\n\n /**\n * Whether facet requests are for the search_results page type (either defaulted or explicitly).\n */\n private get isSearchResultsPage(): boolean {\n // Default page type is search_results when none is specified, so we check\n // for undefined as well.\n const pageType: PageType | undefined = this.pageSpecifierParams?.pageType;\n return pageType === undefined || pageType === 'search_results';\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 if (!this.facetKey) return; // Can't fetch facets if we don't know what type of facets we need!\n\n const trimmedQuery = this.query?.trim();\n if (!trimmedQuery && this.isSearchResultsPage) return; // The search page _requires_ a query\n\n const aggregations = {\n simpleParams: [this.facetKey],\n };\n const aggregationsSize = MORE_FACETS__MAX_AGGREGATIONS; // Only request the 10K highest-count facets\n\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n identifiers: this.identifiers,\n filters: this.filterMap,\n aggregations,\n aggregationsSize,\n rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?\n };\n\n try {\n const results = await this.searchService?.search(params, this.searchType);\n const response = results?.success?.response;\n if (!response) {\n log('More facets search failed', results?.error);\n this.loadFailed = true;\n this.aggregations = undefined;\n return;\n }\n\n // Record collection titles before the aggregations, so that they're\n // available for sorting & filtering once the facet group is built.\n const { collectionTitles } = response;\n if (collectionTitles) {\n for (const [id, title] of Object.entries(collectionTitles)) {\n this.collectionTitles?.set(id, title);\n }\n }\n\n this.aggregations = response.aggregations;\n } catch (err) {\n log('More facets search threw', err);\n this.loadFailed = true;\n this.aggregations = undefined;\n } finally {\n this.facetsLoading = false;\n }\n }\n\n /**\n * Combines the selected facets with the aggregations into the single list of\n * values the dialog shows. Selected and hidden values keep their place in the\n * current sort order rather than moving to the front; the chiclets above the\n * list are what call them out.\n */\n private get mergedFacets(): FacetGroup | undefined {\n if (!this.facetKey || !this.selectedFacets) return undefined;\n\n const { aggregationFacetGroup } = this;\n\n // If we don't have any aggregations, then there is nothing to show yet\n if (!aggregationFacetGroup) return undefined;\n\n const selections = this.currentSelections;\n\n // Mark each aggregated value with its selection state, if it has one\n const buckets = aggregationFacetGroup.buckets.map(bucket => {\n const selection = selections[bucket.key];\n return selection ? { ...bucket, state: selection.state } : bucket;\n });\n\n // Values selected before the dialog opened can be missing from the\n // aggregations (a hidden value is excluded from the results it would be\n // counted in). Slot them in where the current sort puts them, so they can\n // still be changed from the list.\n const aggregatedKeys = new Set(buckets.map(b => b.key));\n const preexisting = this.selectedFacets[this.facetKey] ?? {};\n for (const [key, data] of Object.entries(preexisting)) {\n if (aggregatedKeys.has(key)) continue;\n this.insertInSortOrder(buckets, {\n displayText: this.displayTextFor(key),\n key,\n count: data.count,\n state: selections[key]?.state ?? data.state,\n });\n }\n\n // For TV creator facets, uppercase the display text\n if (this.facetKey === 'creator' && this.isTvSearch) {\n buckets.forEach(b => {\n b.displayText = (b.displayText ?? b.key)?.toLocaleUpperCase();\n\n const channelLabel = this.tvChannelAliases?.get(b.displayText);\n if (channelLabel && channelLabel !== b.displayText) {\n b.extraNote = `(${channelLabel})`;\n }\n });\n }\n\n return { ...aggregationFacetGroup, buckets };\n }\n\n /**\n * This facet type's selections: the ones made before the dialog opened,\n * overridden by any unapplied changes made in it. Values stay in the order\n * they were first selected, and cleared ones remain with state `'none'`.\n */\n private get currentSelections(): Record<string, FacetBucket> {\n if (!this.facetKey) return {};\n return {\n ...this.selectedFacets?.[this.facetKey],\n ...this.unappliedFacetChanges[this.facetKey],\n };\n }\n\n /**\n * The values that are currently selected or hidden, in the order they were\n * selected, as they appear in `facetGroup`.\n */\n private listChosenBuckets(): FacetBucket[] {\n const byKey = new Map(this.facetGroup?.buckets.map(b => [b.key, b]));\n // Without a list (e.g. the search failed), fall back on the selections\n // themselves, so they can still be seen and cleared.\n return Object.entries(this.currentSelections)\n .map(\n ([key, selection]) =>\n byKey.get(key) ?? {\n ...selection,\n displayText: this.displayTextFor(key),\n },\n )\n .filter(bucket => bucket.state !== 'none');\n }\n\n /**\n * Inserts `bucket` ahead of the first bucket that the current sort would put\n * after it.\n */\n private insertInSortOrder(buckets: FacetBucket[], bucket: FacetBucket): void {\n const index = buckets.findIndex(b => this.compareForSort(bucket, b) < 0);\n buckets.splice(index === -1 ? buckets.length : index, 0, bucket);\n }\n\n /**\n * Orders two buckets the way the aggregations are ordered for the current\n * sort (see `getSortedBuckets` in search-service).\n */\n private compareForSort(a: FacetBucket, b: FacetBucket): number {\n switch (this.sortedBy) {\n case AggregationSortType.ALPHABETICAL:\n return (a.displayText ?? a.key).localeCompare(b.displayText ?? b.key);\n case AggregationSortType.NUMERIC:\n return Number(b.key) - Number(a.key);\n default:\n return b.count - a.count;\n }\n }\n\n /**\n * The text patrons see for a bucket: the collection title for collections,\n * and the bucket key for everything else.\n */\n private displayTextFor(key: string): string {\n const collectionTitle =\n this.facetKey === 'collection'\n ? this.collectionTitles?.get(key)\n : undefined;\n return collectionTitle ?? key;\n }\n\n /**\n * Converts the raw `aggregations` for the current facet key to a `FacetGroup`,\n * which is easier to work with.\n */\n private get aggregationFacetGroup(): FacetGroup | undefined {\n if (!this.aggregations || !this.facetKey) return undefined;\n\n const currentAggregation = this.aggregations[this.facetKey];\n if (!currentAggregation) return undefined;\n\n const facetGroupTitle = facetTitles[this.facetKey];\n\n // Order the facets according to the current sort option\n let sortedBuckets = currentAggregation.getSortedBuckets(\n this.sortedBy,\n ) as Bucket[];\n\n if (this.facetKey === 'collection') {\n // we are not showing fav- collections or certain deemphasized collections in facets\n sortedBuckets = sortedBuckets?.filter(bucket => {\n const bucketKey = bucket?.key?.toString();\n return (\n !suppressedCollections[bucketKey] && !bucketKey?.startsWith('fav-')\n );\n });\n }\n\n // Construct the array of facet buckets from the aggregation buckets\n const facetBuckets: FacetBucket[] = sortedBuckets.map(bucket => {\n const bucketKeyStr = `${bucket.key}`;\n return {\n displayText: this.displayTextFor(bucketKeyStr),\n key: bucketKeyStr,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n\n // Collections sorted alphabetically should be in order of the titles\n // patrons see, not of the identifiers that getSortedBuckets used.\n if (\n this.facetKey === 'collection' &&\n this.sortedBy === AggregationSortType.ALPHABETICAL\n ) {\n facetBuckets.sort((a, b) =>\n (a.displayText ?? a.key).localeCompare(b.displayText ?? b.key),\n );\n }\n\n return {\n title: facetGroupTitle,\n key: this.facetKey,\n buckets: facetBuckets,\n };\n }\n\n /**\n * The buckets whose visible text contains the filter text, ignoring case,\n * accents and punctuation.\n */\n private filterBuckets(): FacetBucket[] {\n const buckets = this.facetGroup?.buckets ?? [];\n const needle = normalizeFilterText(this.filterText);\n if (!needle.spaced) return buckets;\n return buckets.filter(bucket =>\n filterTextIncludes(this.filterKeyFor(bucket), needle),\n );\n }\n\n private filterKeyFor(bucket: FacetBucket): NormalizedFilterText {\n let filterKey = this.filterKeys.get(bucket.key);\n if (filterKey === undefined) {\n const visibleText = [bucket.displayText ?? bucket.key, bucket.extraNote]\n .filter(Boolean)\n .join(' ');\n filterKey = normalizeFilterText(visibleText);\n this.filterKeys.set(bucket.key, filterKey);\n }\n return filterKey;\n }\n\n /**\n * Whether the patron's filter text has ruled out every value\n */\n private get noValuesMatch(): boolean {\n const isFiltering = normalizeFilterText(this.filterText).spaced !== '';\n return isFiltering && this.filteredBuckets.length === 0;\n }\n\n private get moreFacetsTemplate(): TemplateResult {\n const valuesLabel = this.facetKey\n ? msg(str`${facetTitles[this.facetKey]} values`)\n : undefined;\n return html`\n <more-facets-scroller\n .facetType=${this.facetKey}\n .buckets=${this.filteredBuckets}\n .collectionTitles=${this.collectionTitles}\n ?omitHideButtons=${this.facetGroup?.buckets.length === 1}\n label=${ifDefined(valuesLabel)}\n @facetClick=${this.facetClicked}\n @pageChanged=${this.pageChanged}\n ></more-facets-scroller>\n ${when(\n this.loadFailed,\n () => this.loadErrorTemplate,\n () => when(this.noValuesMatch, () => this.noMatchesTemplate),\n )}\n `;\n }\n\n /**\n * A chiclet for each selected or hidden value, each with a button to clear it\n */\n private get chicletsTemplate(): TemplateResult {\n const valuesName = this.facetKey ? facetPluralTitles[this.facetKey] : '';\n return html`\n <ul class=\"chiclets\" aria-label=${msg(str`Selected ${valuesName}`)}>\n ${repeat(\n this.chosenBuckets,\n bucket => bucket.key,\n (bucket, index) => this.chicletTemplate(bucket, index),\n )}\n </ul>\n `;\n }\n\n private chicletTemplate(bucket: FacetBucket, index: number): TemplateResult {\n const isHidden = bucket.state === 'hidden';\n const text = [bucket.displayText ?? bucket.key, bucket.extraNote]\n .filter(Boolean)\n .join(' ');\n const removeLabel = isHidden\n ? msg(str`Unhide ${text}`)\n : msg(str`Deselect ${text}`);\n\n return html`\n <li class=\"chiclet\" title=${text}>\n <span class=\"chiclet-icon\" aria-hidden=\"true\"\n >${isHidden ? eyeClosedIcon : checkIcon}</span\n >\n <span class=\"sr-only\"\n >${isHidden ? msg('Hidden:') : msg('Selected:')}</span\n >\n <span class=\"chiclet-text\">${text}</span>\n <button\n type=\"button\"\n class=\"chiclet-remove\"\n aria-label=${removeLabel}\n @click=${() => this.chicletRemoved(bucket, index)}\n >\n ${closeCircleDark}\n </button>\n </li>\n `;\n }\n\n private get noMatchesTemplate(): TemplateResult {\n return html`<p class=\"facets-message no-matches\" role=\"status\">\n ${msg('No matching values found.')}\n </p>`;\n }\n\n private get loadErrorTemplate(): TemplateResult {\n return html`<p class=\"facets-message load-error\" role=\"alert\">\n ${msg('Sorry, these values couldn’t be loaded. Please try again later.')}\n </p>`;\n }\n\n private get loaderTemplate(): TemplateResult {\n return html`\n <ia-status-indicator\n class=\"facets-loader\"\n mode=\"loading\"\n ></ia-status-indicator>\n `;\n }\n\n private get footerTemplate(): TemplateResult {\n return html`\n <div class=\"footer\">\n <button class=\"btn btn-cancel\" type=\"button\" @click=${this.cancelClick}>\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\n private sortFacetAggregation(facetSortType: AggregationSortType) {\n this.sortedBy = facetSortType;\n this.dispatchEvent(\n new CustomEvent('sortedFacets', { detail: this.sortedBy }),\n );\n }\n\n private get modalHeaderTemplate(): TemplateResult {\n const facetSort =\n this.sortedBy ?? defaultFacetSort[this.facetKey as FacetOption];\n const defaultSwitchSide =\n facetSort === AggregationSortType.COUNT ? 'left' : 'right';\n const valuesName = this.facetKey ? facetPluralTitles[this.facetKey] : '';\n // From the facet key rather than the facet group, which is missing\n // until the values load (or if they fail to)\n const title = this.facetKey ? facetTitles[this.facetKey] : '';\n\n return html`<span class=\"sr-only\">${msg('More facets for:')}</span>\n <span class=\"title\">${title}</span>\n <span class=\"header-controls\">\n <span class=\"sort-controls\">\n <label class=\"sort-label\">${msg('Sort by:')}</label>\n ${this.facetKey\n ? html`<toggle-switch\n class=\"sort-toggle\"\n leftValue=${AggregationSortType.COUNT}\n leftLabel=\"Count\"\n rightValue=${valueFacetSort[this.facetKey]}\n .rightLabel=${title}\n side=${defaultSwitchSide}\n @change=${(e: CustomEvent<string>) => {\n this.sortFacetAggregation(\n Number(e.detail) as AggregationSortType,\n );\n }}\n ></toggle-switch>`\n : nothing}\n </span>\n <span class=\"filter-controls\">\n <label class=\"filter-label\">${msg('Filter by:')}</label>\n <ia-clearable-text-input\n class=\"filter-input\"\n .value=${this.filterText}\n .placeholder=${msg(str`Search ${valuesName}…`)}\n .screenReaderLabel=${msg(str`Filter ${valuesName}`)}\n .clearButtonScreenReaderLabel=${msg('Clear filter')}\n @input=${this.filterTextChanged}\n ></ia-clearable-text-input>\n </span>\n </span>`;\n }\n\n render() {\n return html`\n ${this.facetsLoading\n ? this.loaderTemplate\n : html`\n <section id=\"more-facets\">\n <div class=\"header-content\">${this.modalHeaderTemplate}</div>\n ${when(this.chosenBuckets.length, () => this.chicletsTemplate)}\n <div class=\"facets-content\">${this.moreFacetsTemplate}</div>\n ${this.footerTemplate}\n </section>\n `}\n `;\n }\n\n /**\n * Handler for typing in (or clearing) the filter text field\n */\n private filterTextChanged(e: Event): void {\n const input = e.target as HTMLElement & { value: string };\n this.filterText = input.value;\n }\n\n private facetClicked(e: CustomEvent<FacetEventDetails>): void {\n if (!this.facetKey) return;\n this.unappliedFacetChanges = updateSelectedFacetBucket(\n this.unappliedFacetChanges,\n this.facetKey,\n e.detail.bucket,\n );\n }\n\n /**\n * Clears the selection a chiclet stands for, which removes the chiclet and\n * unchecks the value in the list.\n */\n private chicletRemoved(bucket: FacetBucket, index: number): void {\n if (!this.facetKey) return;\n this.unappliedFacetChanges = updateSelectedFacetBucket(\n this.unappliedFacetChanges,\n this.facetKey,\n { ...bucket, state: 'none' },\n );\n this.chicletFocusIndex = index;\n }\n\n private pageChanged(e: CustomEvent<number>): void {\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.moreFacetsPageChange,\n label: `${e.detail + 1}`,\n });\n }\n\n private applySearchFacetsClicked() {\n const mergedSelections = mergeSelectedFacets(\n this.selectedFacets,\n this.unappliedFacetChanges,\n );\n\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: mergedSelections,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n\n // Reset the unapplied changes back to default, now that they have been applied\n this.unappliedFacetChanges = getDefaultSelectedFacets();\n\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: `${analyticsActions.applyMoreFacetsModal}`,\n label: `${this.facetKey}`,\n });\n }\n\n private cancelClick() {\n // Reset the unapplied changes back to default\n this.unappliedFacetChanges = getDefaultSelectedFacets();\n\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.closeMoreFacetsModal,\n label: `${this.facetKey}`,\n });\n }\n\n static get styles(): CSSResultGroup {\n const modalSubmitButton = css`var(--primaryButtonBGColor, #194880)`;\n\n return [\n srOnlyStyle,\n css`\n section#more-facets {\n padding: 10px;\n }\n\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\n .header-controls {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px 20px;\n padding: 5px 10px 0;\n }\n\n /* Each label stays on the same line as its control when these wrap */\n .sort-controls,\n .filter-controls {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n white-space: nowrap;\n }\n\n .sort-label,\n .filter-label {\n font-size: 1.3rem;\n }\n\n .sort-toggle {\n font-weight: normal;\n }\n\n .filter-input {\n --input-height: 2.5rem;\n --input-font-size: 1.3rem;\n --input-border-radius: 4px;\n --input-padding: 4px 8px;\n --input-focused-border-color: ${modalSubmitButton};\n width: 16rem;\n }\n\n .chiclets {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin: 0;\n padding: 10px 10px 0;\n list-style: none;\n /* About three rows; any more scroll, so the values stay in view */\n max-height: 7.8rem;\n overflow-y: auto;\n }\n\n .chiclet {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n max-width: 24rem;\n padding: 2px 3px 2px 6px;\n border: 1px solid ${modalSubmitButton};\n border-radius: 5px;\n background: #fff;\n color: #2c2c2c;\n font-size: 1.2rem;\n line-height: normal;\n }\n\n .chiclet-icon {\n display: flex;\n flex: none;\n }\n\n .chiclet-icon svg {\n width: 12px;\n height: 12px;\n }\n\n .chiclet-text {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .chiclet-remove {\n display: flex;\n flex: none;\n padding: 2px;\n border: none;\n border-radius: 50%;\n background: none;\n cursor: pointer;\n }\n\n .chiclet-remove svg {\n width: 10px;\n height: 10px;\n opacity: 0.55;\n }\n\n .chiclet-remove:hover svg,\n .chiclet-remove:focus-visible svg {\n opacity: 1;\n }\n\n .facets-content {\n position: relative;\n font-size: 1.2rem;\n padding: 10px 0;\n }\n\n .facets-message {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n font-size: 1.4rem;\n color: #666;\n }\n\n .facets-loader {\n --icon-width: 70px;\n margin-bottom: 20px;\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 font-family: inherit;\n }\n .btn-cancel {\n background-color: #2c2c2c;\n color: white;\n }\n .btn-submit {\n background-color: ${modalSubmitButton};\n color: white;\n }\n .footer {\n text-align: center;\n }\n\n @media (max-width: 560px) {\n /* The filter gets a line of its own here, so let it fill that line */\n .filter-controls {\n flex: 1 1 auto;\n }\n .filter-input {\n flex: 1 1 auto;\n width: auto;\n min-width: 12rem;\n --input-font-size: 1.2rem;\n }\n }\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":["import {\n css,\n CSSResultGroup,\n html,\n LitElement,\n nothing,\n PropertyValues,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { when } from 'lit/directives/when.js';\nimport {\n Aggregation,\n Bucket,\n SearchServiceInterface,\n SearchParams,\n SearchType,\n AggregationSortType,\n FilterMap,\n PageType,\n} from '@internetarchive/search-service';\nimport type { ModalManagerInterface } from '@internetarchive/modal-manager';\nimport type { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nimport { localized, msg, str } from '@lit/localize';\nimport {\n SelectedFacets,\n FacetGroup,\n FacetBucket,\n FacetOption,\n facetTitles,\n facetPluralTitles,\n suppressedCollections,\n valueFacetSort,\n defaultFacetSort,\n getDefaultSelectedFacets,\n FacetEventDetails,\n tvMoreFacetSort,\n} from '../models';\nimport type {\n CollectionTitles,\n PageSpecifierParams,\n TVChannelAliases,\n} from '../data-source/models';\nimport '@internetarchive/elements/ia-status-indicator/ia-status-indicator';\nimport '@internetarchive/ia-clearable-text-input';\nimport './more-facets-scroller';\nimport type { MoreFacetsScroller } from './more-facets-scroller';\nimport {\n analyticsActions,\n analyticsCategories,\n} from '../utils/analytics-events';\nimport './toggle-switch';\nimport { srOnlyStyle } from '../styles/sr-only';\nimport checkIcon from '../assets/img/icons/check';\nimport eyeClosedIcon from '../assets/img/icons/eye-closed';\nimport closeCircleDark from '../assets/img/icons/close-circle-dark';\nimport {\n mergeSelectedFacets,\n updateSelectedFacetBucket,\n} from '../utils/facet-utils';\nimport {\n filterTextIncludes,\n normalizeFilterText,\n type NormalizedFilterText,\n} from '../utils/normalize-filter-text';\nimport { log } from '../utils/log';\nimport { MORE_FACETS__MAX_AGGREGATIONS } from './models';\n\n@customElement('more-facets-content')\n@localized()\nexport class MoreFacetsContent extends LitElement {\n @property({ type: String }) facetKey?: FacetOption;\n\n @property({ type: String }) query?: string;\n\n @property({ type: Array }) identifiers?: string[];\n\n @property({ type: Object }) filterMap?: FilterMap;\n\n @property({ type: Number }) searchType?: SearchType;\n\n @property({ type: Object }) pageSpecifierParams?: PageSpecifierParams;\n\n @property({ type: Object })\n collectionTitles?: CollectionTitles;\n\n @property({ type: Object })\n tvChannelAliases?: TVChannelAliases;\n\n /**\n * Whether we are waiting for facet data to load.\n * We begin with this set to true so that we show an initial loading indicator.\n */\n @property({ type: Boolean }) facetsLoading = true;\n\n /**\n * The set of pre-existing facet selections (including both selected & negated facets).\n */\n @property({ type: Object }) selectedFacets?: SelectedFacets;\n\n @property({ type: Number }) sortedBy: AggregationSortType =\n AggregationSortType.COUNT;\n\n @property({ type: Boolean }) isTvSearch = false;\n\n @property({ type: Object }) modalManager?: ModalManagerInterface;\n\n @property({ type: Object }) searchService?: SearchServiceInterface;\n\n @property({ type: Object, attribute: false })\n analyticsHandler?: AnalyticsManagerInterface;\n\n /**\n * The full set of aggregations received from the search service\n */\n @state() private aggregations?: Record<string, Aggregation>;\n\n /**\n * A FacetGroup storing the full set of facet buckets to be shown on the dialog.\n */\n @state() private facetGroup?: FacetGroup;\n\n /**\n * An object holding any changes the patron has made to their facet selections\n * within the modal dialog but which they have not yet applied. These are\n * eventually merged into the existing `selectedFacets` when the patron applies\n * their changes, or discarded if they cancel/close the dialog.\n */\n @state() private unappliedFacetChanges: SelectedFacets =\n getDefaultSelectedFacets();\n\n /**\n * Text the patron has entered to narrow down the facet values shown.\n */\n @state() private filterText = '';\n\n /**\n * Whether the search for this facet's values failed, either with an error\n * result or by throwing.\n */\n @state() private loadFailed = false;\n\n /**\n * The buckets from `facetGroup` that match `filterText`, in display order.\n * Derived in `willUpdate`.\n */\n private filteredBuckets: FacetBucket[] = [];\n\n /**\n * Each bucket's display text in the normalized form that filtering compares\n * against, keyed by bucket key. Filled lazily so that each value is only\n * normalized once, however many times the filter text changes.\n */\n private filterKeys = new Map<string, NormalizedFilterText>();\n\n /**\n * The values currently selected or hidden, in the order they were selected.\n * Shown as chiclets above the list. Derived in `willUpdate`.\n */\n private chosenBuckets: FacetBucket[] = [];\n\n /**\n * Position of a chiclet that was just removed, whose neighbor should get\n * focus once it's gone.\n */\n private chicletFocusIndex?: number;\n\n @query('more-facets-scroller')\n private scroller?: MoreFacetsScroller;\n\n @query('ia-clearable-text-input')\n private filterInput?: HTMLElement;\n\n willUpdate(changed: PropertyValues): void {\n if (changed.has('aggregations')) {\n this.filterKeys.clear();\n }\n\n const facetGroupChanged =\n changed.has('aggregations') ||\n changed.has('sortedBy') ||\n changed.has('selectedFacets') ||\n changed.has('unappliedFacetChanges');\n if (facetGroupChanged) {\n // Convert the merged selected facets & aggregations into a facet group\n this.facetGroup = this.mergedFacets;\n this.chosenBuckets = this.listChosenBuckets();\n }\n\n if (facetGroupChanged || changed.has('filterText')) {\n this.filteredBuckets = this.filterBuckets();\n }\n\n // If any of the search properties change, it triggers a facet fetch\n if (\n changed.has('facetKey') ||\n changed.has('query') ||\n changed.has('searchType') ||\n changed.has('filterMap')\n ) {\n this.facetsLoading = true;\n this.loadFailed = false;\n this.sortedBy =\n this.searchType === SearchType.TV\n ? tvMoreFacetSort[this.facetKey as FacetOption]\n : defaultFacetSort[this.facetKey as FacetOption];\n\n this.updateSpecificFacets();\n }\n }\n\n updated(changed: PropertyValues): void {\n // A new filter or sort order shows different values, so start over from\n // the first page rather than somewhere in the middle of them.\n if (changed.has('filterText') || changed.has('sortedBy')) {\n this.scroller?.scrollToPage(0);\n }\n\n // A removed chiclet took its focused button with it; move focus to the\n // chiclet that took its place, or back to the filter field if none are left.\n if (this.chicletFocusIndex !== undefined) {\n const buttons =\n this.shadowRoot?.querySelectorAll<HTMLElement>('.chiclet-remove') ?? [];\n const index = Math.min(this.chicletFocusIndex, buttons.length - 1);\n this.chicletFocusIndex = undefined;\n (buttons[index] ?? this.filterInput)?.focus();\n }\n }\n\n firstUpdated(): void {\n this.setupEscapeListeners();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('keydown', this.escapeHandler);\n }\n\n /**\n * Close more facets modal on Escape click\n */\n private escapeHandler = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') this.modalManager?.closeModal();\n };\n\n private setupEscapeListeners() {\n if (this.modalManager) {\n document.addEventListener('keydown', this.escapeHandler);\n }\n }\n\n /**\n * Whether facet requests are for the search_results page type (either defaulted or explicitly).\n */\n private get isSearchResultsPage(): boolean {\n // Default page type is search_results when none is specified, so we check\n // for undefined as well.\n const pageType: PageType | undefined = this.pageSpecifierParams?.pageType;\n return pageType === undefined || pageType === 'search_results';\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 if (!this.facetKey) return; // Can't fetch facets if we don't know what type of facets we need!\n\n const trimmedQuery = this.query?.trim();\n if (!trimmedQuery && this.isSearchResultsPage) return; // The search page _requires_ a query\n\n const aggregations = {\n simpleParams: [this.facetKey],\n };\n const aggregationsSize = MORE_FACETS__MAX_AGGREGATIONS; // Only request the 10K highest-count facets\n\n const params: SearchParams = {\n ...this.pageSpecifierParams,\n query: trimmedQuery || '',\n identifiers: this.identifiers,\n filters: this.filterMap,\n aggregations,\n aggregationsSize,\n rows: 0, // todo - do we want server-side pagination with offset/page/limit flag?\n };\n\n try {\n const results = await this.searchService?.search(params, this.searchType);\n const response = results?.success?.response;\n if (!response) {\n log('More facets search failed', results?.error);\n this.loadFailed = true;\n this.aggregations = undefined;\n return;\n }\n\n // Record collection titles before the aggregations, so that they're\n // available for sorting & filtering once the facet group is built.\n const { collectionTitles } = response;\n if (collectionTitles) {\n for (const [id, title] of Object.entries(collectionTitles)) {\n this.collectionTitles?.set(id, title);\n }\n }\n\n this.aggregations = response.aggregations;\n } catch (err) {\n log('More facets search threw', err);\n this.loadFailed = true;\n this.aggregations = undefined;\n } finally {\n this.facetsLoading = false;\n }\n }\n\n /**\n * Combines the selected facets with the aggregations into the single list of\n * values the dialog shows. Selected and hidden values keep their place in the\n * current sort order rather than moving to the front; the chiclets above the\n * list are what call them out.\n */\n private get mergedFacets(): FacetGroup | undefined {\n if (!this.facetKey || !this.selectedFacets) return undefined;\n\n const { aggregationFacetGroup } = this;\n\n // If we don't have any aggregations, then there is nothing to show yet\n if (!aggregationFacetGroup) return undefined;\n\n const selections = this.currentSelections;\n\n // Mark each aggregated value with its selection state, if it has one\n const buckets = aggregationFacetGroup.buckets.map(bucket => {\n const selection = selections[bucket.key];\n return selection ? { ...bucket, state: selection.state } : bucket;\n });\n\n // Values selected before the dialog opened can be missing from the\n // aggregations (a hidden value is excluded from the results it would be\n // counted in). Slot them in where the current sort puts them, so they can\n // still be changed from the list.\n const aggregatedKeys = new Set(buckets.map(b => b.key));\n const preexisting = this.selectedFacets[this.facetKey] ?? {};\n for (const [key, data] of Object.entries(preexisting)) {\n if (aggregatedKeys.has(key)) continue;\n this.insertInSortOrder(buckets, {\n displayText: this.displayTextFor(key),\n key,\n count: data.count,\n state: selections[key]?.state ?? data.state,\n });\n }\n\n // For TV creator facets, uppercase the display text\n if (this.facetKey === 'creator' && this.isTvSearch) {\n buckets.forEach(b => {\n b.displayText = (b.displayText ?? b.key)?.toLocaleUpperCase();\n\n const channelLabel = this.tvChannelAliases?.get(b.displayText);\n if (channelLabel && channelLabel !== b.displayText) {\n b.extraNote = `(${channelLabel})`;\n }\n });\n }\n\n return { ...aggregationFacetGroup, buckets };\n }\n\n /**\n * This facet type's selections: the ones made before the dialog opened,\n * overridden by any unapplied changes made in it. Values stay in the order\n * they were first selected, and cleared ones remain with state `'none'`.\n */\n private get currentSelections(): Record<string, FacetBucket> {\n if (!this.facetKey) return {};\n return {\n ...this.selectedFacets?.[this.facetKey],\n ...this.unappliedFacetChanges[this.facetKey],\n };\n }\n\n /**\n * The values that are currently selected or hidden, in the order they were\n * selected, as they appear in `facetGroup`.\n */\n private listChosenBuckets(): FacetBucket[] {\n const byKey = new Map(this.facetGroup?.buckets.map(b => [b.key, b]));\n // Without a list (e.g. the search failed), fall back on the selections\n // themselves, so they can still be seen and cleared.\n return Object.entries(this.currentSelections)\n .map(\n ([key, selection]) =>\n byKey.get(key) ?? {\n ...selection,\n displayText: this.displayTextFor(key),\n },\n )\n .filter(bucket => bucket.state !== 'none');\n }\n\n /**\n * Inserts `bucket` ahead of the first bucket that the current sort would put\n * after it.\n */\n private insertInSortOrder(buckets: FacetBucket[], bucket: FacetBucket): void {\n const index = buckets.findIndex(b => this.compareForSort(bucket, b) < 0);\n buckets.splice(index === -1 ? buckets.length : index, 0, bucket);\n }\n\n /**\n * Orders two buckets the way the aggregations are ordered for the current\n * sort (see `getSortedBuckets` in search-service).\n */\n private compareForSort(a: FacetBucket, b: FacetBucket): number {\n switch (this.sortedBy) {\n case AggregationSortType.ALPHABETICAL:\n return (a.displayText ?? a.key).localeCompare(b.displayText ?? b.key);\n case AggregationSortType.NUMERIC:\n return Number(b.key) - Number(a.key);\n default:\n return b.count - a.count;\n }\n }\n\n /**\n * The text patrons see for a bucket: the collection title for collections,\n * and the bucket key for everything else.\n */\n private displayTextFor(key: string): string {\n const collectionTitle =\n this.facetKey === 'collection'\n ? this.collectionTitles?.get(key)\n : undefined;\n return collectionTitle ?? key;\n }\n\n /**\n * Converts the raw `aggregations` for the current facet key to a `FacetGroup`,\n * which is easier to work with.\n */\n private get aggregationFacetGroup(): FacetGroup | undefined {\n if (!this.aggregations || !this.facetKey) return undefined;\n\n const currentAggregation = this.aggregations[this.facetKey];\n if (!currentAggregation) return undefined;\n\n const facetGroupTitle = facetTitles[this.facetKey];\n\n // Order the facets according to the current sort option\n let sortedBuckets = currentAggregation.getSortedBuckets(\n this.sortedBy,\n ) as Bucket[];\n\n if (this.facetKey === 'collection') {\n // we are not showing fav- collections or certain deemphasized collections in facets\n sortedBuckets = sortedBuckets?.filter(bucket => {\n const bucketKey = bucket?.key?.toString();\n return (\n !suppressedCollections[bucketKey] && !bucketKey?.startsWith('fav-')\n );\n });\n }\n\n // Construct the array of facet buckets from the aggregation buckets\n const facetBuckets: FacetBucket[] = sortedBuckets.map(bucket => {\n const bucketKeyStr = `${bucket.key}`;\n return {\n displayText: this.displayTextFor(bucketKeyStr),\n key: bucketKeyStr,\n count: bucket.doc_count,\n state: 'none',\n };\n });\n\n // Collections sorted alphabetically should be in order of the titles\n // patrons see, not of the identifiers that getSortedBuckets used.\n if (\n this.facetKey === 'collection' &&\n this.sortedBy === AggregationSortType.ALPHABETICAL\n ) {\n facetBuckets.sort((a, b) =>\n (a.displayText ?? a.key).localeCompare(b.displayText ?? b.key),\n );\n }\n\n return {\n title: facetGroupTitle,\n key: this.facetKey,\n buckets: facetBuckets,\n };\n }\n\n /**\n * The buckets whose visible text contains the filter text, ignoring case,\n * accents and punctuation.\n */\n private filterBuckets(): FacetBucket[] {\n const buckets = this.facetGroup?.buckets ?? [];\n const needle = normalizeFilterText(this.filterText);\n if (!needle.spaced) return buckets;\n return buckets.filter(bucket =>\n filterTextIncludes(this.filterKeyFor(bucket), needle),\n );\n }\n\n private filterKeyFor(bucket: FacetBucket): NormalizedFilterText {\n let filterKey = this.filterKeys.get(bucket.key);\n if (filterKey === undefined) {\n const visibleText = [bucket.displayText ?? bucket.key, bucket.extraNote]\n .filter(Boolean)\n .join(' ');\n filterKey = normalizeFilterText(visibleText);\n this.filterKeys.set(bucket.key, filterKey);\n }\n return filterKey;\n }\n\n /**\n * Whether the patron's filter text has ruled out every value\n */\n private get noValuesMatch(): boolean {\n const isFiltering = normalizeFilterText(this.filterText).spaced !== '';\n return isFiltering && this.filteredBuckets.length === 0;\n }\n\n private get moreFacetsTemplate(): TemplateResult {\n const valuesLabel = this.facetKey\n ? msg(str`${facetTitles[this.facetKey]} values`)\n : undefined;\n return html`\n <more-facets-scroller\n .facetType=${this.facetKey}\n .buckets=${this.filteredBuckets}\n .collectionTitles=${this.collectionTitles}\n ?omitHideButtons=${this.facetGroup?.buckets.length === 1}\n label=${ifDefined(valuesLabel)}\n @facetClick=${this.facetClicked}\n @pageChanged=${this.pageChanged}\n ></more-facets-scroller>\n ${when(\n this.loadFailed,\n () => this.loadErrorTemplate,\n () => when(this.noValuesMatch, () => this.noMatchesTemplate),\n )}\n `;\n }\n\n /**\n * A chiclet for each selected or hidden value, each with a button to clear it\n */\n private get chicletsTemplate(): TemplateResult {\n const valuesName = this.facetKey ? facetPluralTitles[this.facetKey] : '';\n return html`\n <ul class=\"chiclets\" aria-label=${msg(str`Selected ${valuesName}`)}>\n ${repeat(\n this.chosenBuckets,\n bucket => bucket.key,\n (bucket, index) => this.chicletTemplate(bucket, index),\n )}\n </ul>\n `;\n }\n\n private chicletTemplate(bucket: FacetBucket, index: number): TemplateResult {\n const isHidden = bucket.state === 'hidden';\n const text = [bucket.displayText ?? bucket.key, bucket.extraNote]\n .filter(Boolean)\n .join(' ');\n const removeLabel = isHidden\n ? msg(str`Unhide ${text}`)\n : msg(str`Deselect ${text}`);\n\n return html`\n <li class=\"chiclet\" title=${text}>\n <span class=\"chiclet-icon\" aria-hidden=\"true\"\n >${isHidden ? eyeClosedIcon : checkIcon}</span\n >\n <span class=\"sr-only\"\n >${isHidden ? msg('Hidden:') : msg('Selected:')}</span\n >\n <span class=\"chiclet-text\">${text}</span>\n <button\n type=\"button\"\n class=\"chiclet-remove\"\n aria-label=${removeLabel}\n @click=${() => this.chicletRemoved(bucket, index)}\n >\n ${closeCircleDark}\n </button>\n </li>\n `;\n }\n\n private get noMatchesTemplate(): TemplateResult {\n return html`<p class=\"facets-message no-matches\" role=\"status\">\n ${msg('No matching values found.')}\n </p>`;\n }\n\n private get loadErrorTemplate(): TemplateResult {\n return html`<p class=\"facets-message load-error\" role=\"alert\">\n ${msg('Sorry, these values couldn’t be loaded. Please try again later.')}\n </p>`;\n }\n\n private get loaderTemplate(): TemplateResult {\n return html`\n <ia-status-indicator\n class=\"facets-loader\"\n mode=\"loading\"\n ></ia-status-indicator>\n `;\n }\n\n private get footerTemplate(): TemplateResult {\n return html`\n <div class=\"footer\">\n <button class=\"btn btn-cancel\" type=\"button\" @click=${this.cancelClick}>\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\n private sortFacetAggregation(facetSortType: AggregationSortType) {\n this.sortedBy = facetSortType;\n this.dispatchEvent(\n new CustomEvent('sortedFacets', { detail: this.sortedBy }),\n );\n }\n\n private get modalHeaderTemplate(): TemplateResult {\n const facetSort =\n this.sortedBy ?? defaultFacetSort[this.facetKey as FacetOption];\n const defaultSwitchSide =\n facetSort === AggregationSortType.COUNT ? 'left' : 'right';\n const valuesName = this.facetKey ? facetPluralTitles[this.facetKey] : '';\n // From the facet key rather than the facet group, which is missing\n // until the values load (or if they fail to)\n const title = this.facetKey ? facetTitles[this.facetKey] : '';\n\n return html`<span class=\"sr-only\">${msg('More facets for:')}</span>\n <span class=\"title\">${title}</span>\n <span class=\"header-controls\">\n <span class=\"sort-controls\">\n <label class=\"sort-label\">${msg('Sort by:')}</label>\n ${this.facetKey\n ? html`<toggle-switch\n class=\"sort-toggle\"\n leftValue=${AggregationSortType.COUNT}\n leftLabel=\"Count\"\n rightValue=${valueFacetSort[this.facetKey]}\n .rightLabel=${title}\n side=${defaultSwitchSide}\n @change=${(e: CustomEvent<string>) => {\n this.sortFacetAggregation(\n Number(e.detail) as AggregationSortType,\n );\n }}\n ></toggle-switch>`\n : nothing}\n </span>\n <span class=\"filter-controls\">\n <label class=\"filter-label\">${msg('Filter by:')}</label>\n <ia-clearable-text-input\n class=\"filter-input\"\n .value=${this.filterText}\n .placeholder=${msg(str`Search ${valuesName}…`)}\n .screenReaderLabel=${msg(str`Filter ${valuesName}`)}\n .clearButtonScreenReaderLabel=${msg('Clear filter')}\n @input=${this.filterTextChanged}\n ></ia-clearable-text-input>\n </span>\n </span>`;\n }\n\n render() {\n return html`\n ${this.facetsLoading\n ? this.loaderTemplate\n : html`\n <section id=\"more-facets\">\n <div class=\"header-content\">${this.modalHeaderTemplate}</div>\n ${when(this.chosenBuckets.length, () => this.chicletsTemplate)}\n <div class=\"facets-content\">${this.moreFacetsTemplate}</div>\n ${this.footerTemplate}\n </section>\n `}\n `;\n }\n\n /**\n * Handler for typing in (or clearing) the filter text field\n */\n private filterTextChanged(e: Event): void {\n const input = e.target as HTMLElement & { value: string };\n this.filterText = input.value;\n }\n\n private facetClicked(e: CustomEvent<FacetEventDetails>): void {\n if (!this.facetKey) return;\n this.unappliedFacetChanges = updateSelectedFacetBucket(\n this.unappliedFacetChanges,\n this.facetKey,\n e.detail.bucket,\n );\n }\n\n /**\n * Clears the selection a chiclet stands for, which removes the chiclet and\n * unchecks the value in the list.\n */\n private chicletRemoved(bucket: FacetBucket, index: number): void {\n if (!this.facetKey) return;\n this.unappliedFacetChanges = updateSelectedFacetBucket(\n this.unappliedFacetChanges,\n this.facetKey,\n { ...bucket, state: 'none' },\n );\n this.chicletFocusIndex = index;\n }\n\n private pageChanged(e: CustomEvent<number>): void {\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.moreFacetsPageChange,\n label: `${e.detail + 1}`,\n });\n }\n\n private applySearchFacetsClicked() {\n const mergedSelections = mergeSelectedFacets(\n this.selectedFacets,\n this.unappliedFacetChanges,\n );\n\n const event = new CustomEvent<SelectedFacets>('facetsChanged', {\n detail: mergedSelections,\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(event);\n\n // Reset the unapplied changes back to default, now that they have been applied\n this.unappliedFacetChanges = getDefaultSelectedFacets();\n\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: `${analyticsActions.applyMoreFacetsModal}`,\n label: `${this.facetKey}`,\n });\n }\n\n private cancelClick() {\n // Reset the unapplied changes back to default\n this.unappliedFacetChanges = getDefaultSelectedFacets();\n\n this.modalManager?.closeModal();\n this.analyticsHandler?.sendEvent({\n category: analyticsCategories.default,\n action: analyticsActions.closeMoreFacetsModal,\n label: `${this.facetKey}`,\n });\n }\n\n static get styles(): CSSResultGroup {\n const modalSubmitButton = css`var(--primaryButtonBGColor, #194880)`;\n\n return [\n srOnlyStyle,\n css`\n section#more-facets {\n padding: 10px;\n }\n\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\n .header-controls {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px 20px;\n padding: 5px 10px 0;\n }\n\n /* Each label stays on the same line as its control when these wrap */\n .sort-controls,\n .filter-controls {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n white-space: nowrap;\n }\n\n .sort-label,\n .filter-label {\n font-size: 1.3rem;\n }\n\n .sort-toggle {\n font-weight: normal;\n }\n\n .filter-input {\n --input-height: 2.5rem;\n --input-font-size: 1.3rem;\n --input-border-radius: 4px;\n --input-padding: 4px 8px;\n --input-focused-border-color: ${modalSubmitButton};\n width: 16rem;\n }\n\n .chiclets {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin: 0;\n padding: 10px 10px 0;\n list-style: none;\n /* About three rows; any more scroll, so the values stay in view */\n max-height: 7.8rem;\n overflow-y: auto;\n }\n\n .chiclet {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n max-width: 24rem;\n padding: 2px 3px 2px 6px;\n border: 1px solid ${modalSubmitButton};\n border-radius: 5px;\n background: #fff;\n color: #2c2c2c;\n font-size: 1.2rem;\n line-height: normal;\n }\n\n .chiclet-icon {\n display: flex;\n flex: none;\n }\n\n .chiclet-icon svg {\n width: 12px;\n height: 12px;\n }\n\n .chiclet-text {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .chiclet-remove {\n display: flex;\n flex: none;\n padding: 2px;\n border: none;\n border-radius: 50%;\n background: none;\n cursor: pointer;\n }\n\n .chiclet-remove svg {\n width: 10px;\n height: 10px;\n opacity: 0.55;\n }\n\n .chiclet-remove:hover svg,\n .chiclet-remove:focus-visible svg {\n opacity: 1;\n }\n\n .facets-content {\n position: relative;\n font-size: 1.2rem;\n padding: 10px 0;\n }\n\n .facets-message {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n font-size: 1.4rem;\n color: #666;\n }\n\n .facets-loader {\n --icon-width: 70px;\n margin-bottom: 20px;\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 font-family: inherit;\n }\n .btn-cancel {\n background-color: #2c2c2c;\n color: white;\n }\n .btn-submit {\n background-color: ${modalSubmitButton};\n color: white;\n }\n .footer {\n text-align: center;\n }\n\n @media (max-width: 560px) {\n /* The filter gets a line of its own here, so let it fill that line */\n .filter-controls {\n flex: 1 1 auto;\n }\n .filter-input {\n flex: 1 1 auto;\n width: auto;\n min-width: 12rem;\n --input-font-size: 1.2rem;\n }\n }\n `,\n ];\n }\n}\n"]}
|
|
@@ -6,7 +6,7 @@ import { ifDefined } from 'lit/directives/if-defined.js';
|
|
|
6
6
|
import { guard } from 'lit/directives/guard.js';
|
|
7
7
|
import { ref } from 'lit/directives/ref.js';
|
|
8
8
|
import { repeat } from 'lit/directives/repeat.js';
|
|
9
|
-
import { msg } from '@lit/localize';
|
|
9
|
+
import { localized, msg } from '@lit/localize';
|
|
10
10
|
import arrowLeftIcon from '../assets/img/icons/arrow-left';
|
|
11
11
|
import arrowRightIcon from '../assets/img/icons/arrow-right';
|
|
12
12
|
import { srOnlyStyle } from '../styles/sr-only';
|
|
@@ -422,7 +422,8 @@ __decorate([
|
|
|
422
422
|
query('.scroller')
|
|
423
423
|
], MoreFacetsScroller.prototype, "scroller", void 0);
|
|
424
424
|
MoreFacetsScroller = __decorate([
|
|
425
|
-
customElement('more-facets-scroller')
|
|
425
|
+
customElement('more-facets-scroller'),
|
|
426
|
+
localized()
|
|
426
427
|
], MoreFacetsScroller);
|
|
427
428
|
export { MoreFacetsScroller };
|
|
428
429
|
//# sourceMappingURL=more-facets-scroller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"more-facets-scroller.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-scroller.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n LitElement,\n PropertyValues,\n TemplateResult,\n unsafeCSS,\n} from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { guard } from 'lit/directives/guard.js';\nimport { ref } from 'lit/directives/ref.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { msg } from '@lit/localize';\nimport type { FacetBucket, FacetEventDetails, FacetOption } from '../models';\nimport type { CollectionTitles } from '../data-source/models';\nimport arrowLeftIcon from '../assets/img/icons/arrow-left';\nimport arrowRightIcon from '../assets/img/icons/arrow-right';\nimport { srOnlyStyle } from '../styles/sr-only';\nimport {\n facetRowStyles,\n facetRowTemplate,\n getFacetState,\n} from './facet-row-template';\nimport { PageWindow } from './page-window';\nimport {\n MORE_FACETS__COLUMN_WIDTH,\n MORE_FACETS__ROWS_PER_COLUMN,\n} from './models';\n\n/** Height in px reserved below the columns for the horizontal scrollbar */\nconst SCROLLBAR_SIZE = 12;\n\n/**\n * A long list of facet buckets laid out top to bottom in fixed-width columns\n * that scroll horizontally and snap to whole pages. Only the pages around the\n * viewport are in the DOM, so thousands of values stay responsive.\n *\n * Rows are plain DOM rather than `<facet-row>` elements, and one listener\n * handles every row's checkbox clicks.\n *\n * See docs/design/column-virtualization.md before changing the windowing.\n *\n * @fires facetClick - A row's checkbox was clicked. Detail: `FacetEventDetails`\n * @fires pageChanged - The scroller came to rest on a different page. Detail:\n * the 0-based page index\n */\n@customElement('more-facets-scroller')\nexport class MoreFacetsScroller extends LitElement {\n /** The name of the facet group the buckets belong to (e.g., \"subject\") */\n @property({ type: String }) facetType?: FacetOption;\n\n /** Every bucket to show, in display order */\n @property({ type: Array }) buckets: FacetBucket[] = [];\n\n /** The collection name cache for converting collection identifiers to titles */\n @property({ type: Object }) collectionTitles?: CollectionTitles;\n\n /** How many buckets to stack in each column before starting the next one */\n @property({ type: Number }) rowsPerColumn = MORE_FACETS__ROWS_PER_COLUMN;\n\n /**\n * Whether rows leave out their hide (eye) button, unless the value is\n * already hidden. Set it when the facet has only one value in all, since\n * hiding that would leave no results. Don't base it on how many rows are\n * showing: a filter that leaves a single row still needs its hide button.\n */\n @property({ type: Boolean }) omitHideButtons = false;\n\n /** Accessible name for the columns, e.g. \"Subject values\" */\n @property({ type: String }) label?: string;\n\n private win = new PageWindow(this, {\n colWidth: MORE_FACETS__COLUMN_WIDTH,\n total: 0,\n onRest: page => this.rested(page),\n });\n\n /** The page an arrow button is scrolling to, until the scroller rests */\n private pendingPage?: number;\n\n /** The last page reported in a `pageChanged` event */\n private reportedPage = 0;\n\n @query('.scroller')\n private scroller?: HTMLElement;\n\n /** The page resting at the start of the viewport */\n get currentPage(): number {\n return this.win.currentPage;\n }\n\n /** How many pages the buckets span at the current width */\n get pageCount(): number {\n return this.win.pageCount;\n }\n\n /** Scrolls so that `page` rests at the start of the viewport */\n scrollToPage(page: number, behavior: ScrollBehavior = 'auto'): void {\n this.win.scrollToPage(page, behavior);\n }\n\n willUpdate(changed: PropertyValues): void {\n if (changed.has('buckets') || changed.has('rowsPerColumn')) {\n this.win.setTotal(Math.ceil(this.buckets.length / this.rowsPerColumn));\n }\n this.keepFocusOnScreen();\n }\n\n render(): TemplateResult {\n const w = this.win;\n const live: number[] = [];\n for (let i = w.first; i <= w.last; i++) live.push(i);\n\n return html`\n <div class=\"scroll-nav\">\n ${this.arrowTemplate('prev')}\n <div class=\"frame\">\n <div\n class=\"scroller\"\n role=\"group\"\n aria-label=${ifDefined(this.label)}\n tabindex=${w.pageCount > 0 ? 0 : -1}\n style=\"--rowsPerColumn: ${this.rowsPerColumn}\"\n ${ref(w.attach)}\n @click=${this.rowClicked}\n @focusin=${this.rowFocused}\n >\n <div class=\"sizer\" style=\"width:${w.totalWidth}px\">\n ${guard([w.pageCount, w.pageWidth, w.totalWidth], () =>\n this.snapStubsTemplate(),\n )}\n ${repeat(\n live,\n i => i,\n i =>\n html`<div\n class=\"page\"\n data-page=${i}\n style=\"left:${i * w.pageWidth}px;width:${w.pageSpan(i)}px\"\n >\n ${this.pageTemplate(i)}\n </div>`,\n )}\n </div>\n </div>\n </div>\n ${this.arrowTemplate('next')}\n </div>\n `;\n }\n\n /**\n * One empty snap target per page, always mounted. The browser keeps\n * re-picking its snap target while a fling decelerates, so the targets must\n * not come and go with the window of rendered pages.\n */\n private snapStubsTemplate(): TemplateResult {\n const w = this.win;\n const all = Array.from({ length: w.pageCount }, (_, i) => i);\n return html`${repeat(\n all,\n i => i,\n i =>\n html`<div\n class=\"snap-stub\"\n style=\"left:${i * w.pageWidth}px;width:${w.pageSpan(i)}px\"\n ></div>`,\n )}`;\n }\n\n /** The columns of rows on page `page` */\n private pageTemplate(page: number): TemplateResult[] {\n const { facetType, buckets, rowsPerColumn } = this;\n if (!facetType) return [];\n\n const { colsPerPage } = this.win;\n const firstCol = page * colsPerPage;\n const endCol = Math.min(\n firstCol + colsPerPage,\n Math.ceil(buckets.length / rowsPerColumn),\n );\n\n const columns: TemplateResult[] = [];\n for (let col = firstCol; col < endCol; col++) {\n const start = col * rowsPerColumn;\n const rows = buckets.slice(start, start + rowsPerColumn);\n columns.push(\n html`<div class=\"column\">\n ${rows.map(bucket =>\n facetRowTemplate({\n facetType,\n bucket,\n collectionTitles: this.collectionTitles,\n omitHideButton: this.omitHideButtons,\n }),\n )}\n </div>`,\n );\n }\n return columns;\n }\n\n private arrowTemplate(direction: 'prev' | 'next'): TemplateResult {\n const { currentPage, pageCount } = this.win;\n const isPrev = direction === 'prev';\n const disabled = isPrev ? currentPage <= 0 : currentPage >= pageCount - 1;\n\n // Arrows keep their space even when there's nothing to scroll to, so that\n // showing them never changes how many columns fit.\n const classes = classMap({\n 'scroll-arrow': true,\n [direction]: true,\n unneeded: pageCount <= 1,\n });\n\n return html`<button\n type=\"button\"\n class=${classes}\n ?disabled=${disabled}\n aria-label=${isPrev\n ? msg('Show previous page of values')\n : msg('Show next page of values')}\n @click=${() => this.arrowClicked(isPrev ? -1 : 1)}\n >\n ${isPrev ? arrowLeftIcon : arrowRightIcon}\n </button>`;\n }\n\n /**\n * Handles clicks on any row's checkboxes. The rows have no listeners of\n * their own.\n */\n private rowClicked(e: Event): void {\n const input = e.target;\n const { facetType } = this;\n if (!(input instanceof HTMLInputElement) || !facetType) return;\n\n const bucket = this.buckets.find(b => b.key === input.value);\n if (!bucket) return;\n\n const negative = input.classList.contains('hide-facet-checkbox');\n this.dispatchEvent(\n new CustomEvent<FacetEventDetails>('facetClick', {\n detail: {\n facetType,\n bucket: { ...bucket, state: getFacetState(input.checked, negative) },\n negative,\n },\n }),\n );\n }\n\n /**\n * When focus comes into the rows from outside them, or from the scroller\n * itself (a tab stop just before the rows), keeps it on the page being\n * shown. Otherwise Tab lands on the mounted page before this one, and\n * Shift+Tab on the last one after it, and the browser scrolls there.\n * Moving from row to row is left alone, so Tab and Shift+Tab still carry on\n * into the next or previous page.\n */\n private rowFocused(e: FocusEvent): void {\n const { scroller } = this;\n const row = e.target;\n if (!scroller || !(row instanceof HTMLElement) || row === scroller) return;\n\n const from = e.relatedTarget;\n const fromRows =\n from instanceof Node && from !== scroller && scroller.contains(from);\n if (fromRows) return;\n\n const page = Number(row.closest<HTMLElement>('.page')?.dataset.page);\n const { currentPage } = this.win;\n if (Number.isNaN(page) || page === currentPage) return;\n\n const rowsOnPage = [\n ...scroller.querySelectorAll<HTMLElement>(\n `.page[data-page=\"${currentPage}\"] input`,\n ),\n ].filter(input => !input.closest('[hidden]'));\n const target =\n page < currentPage ? rowsOnPage[0] : rowsOnPage[rowsOnPage.length - 1];\n target?.focus({ preventScroll: true });\n\n // Whatever moved focus may also scroll to the row it picked: in the\n // dialog, modal-manager's focus trap already has, before this event; the\n // browser's own Tab does just after this handler returns. Put the page\n // back now, and again before the next frame is painted (and before the\n // window is recomputed, so this page stays mounted).\n this.win.scrollToPage(currentPage);\n requestAnimationFrame(() => this.win.scrollToPage(currentPage));\n }\n\n /**\n * If a row has focus and its page is about to leave the window, moves focus\n * to the scroller itself. Otherwise focus would fall back to the document\n * when the page is removed, and the arrow keys would stop scrolling. The\n * scroller being a tab stop matters here: modal-manager's focus trap only\n * moves Tab between tabbable elements, and from anything else it goes back\n * to the start of the dialog.\n */\n private keepFocusOnScreen(): void {\n const focusedPage =\n this.shadowRoot?.activeElement?.closest<HTMLElement>('.page');\n if (!focusedPage) return;\n const page = Number(focusedPage.dataset.page);\n if (page >= this.win.first && page <= this.win.last) return;\n this.scroller?.focus({ preventScroll: true });\n }\n\n private arrowClicked(step: 1 | -1): void {\n // Count from where an earlier click is already headed, so that clicking\n // twice quickly moves two pages.\n const from = this.pendingPage ?? this.win.currentPage;\n const target = Math.max(0, Math.min(from + step, this.win.pageCount - 1));\n this.pendingPage = target;\n\n const reduceMotion = window.matchMedia?.(\n '(prefers-reduced-motion: reduce)',\n ).matches;\n this.win.scrollToPage(target, reduceMotion ? 'auto' : 'smooth');\n }\n\n private rested(page: number): void {\n this.pendingPage = undefined;\n if (page === this.reportedPage) return;\n this.reportedPage = page;\n this.dispatchEvent(\n new CustomEvent<number>('pageChanged', { detail: page }),\n );\n }\n\n static get styles(): CSSResultGroup {\n const colWidth = unsafeCSS(`${MORE_FACETS__COLUMN_WIDTH}px`);\n const scrollbarSize = unsafeCSS(`${SCROLLBAR_SIZE}px`);\n\n const ownCss = css`\n :host {\n display: block;\n --colWidth: ${colWidth};\n --facetRowHeight: 2.4rem;\n }\n\n .scroll-nav {\n display: flex;\n align-items: center;\n }\n\n .frame {\n flex: 1 1 auto;\n min-width: 0;\n container-type: inline-size;\n }\n\n .scroller {\n /* Fallback where round() is unsupported: fill the frame */\n width: 100%;\n /* Otherwise round down to whole columns, so none is ever cut off */\n width: max(\n round(down, 100cqi, var(--colWidth)),\n min(100cqi, var(--colWidth))\n );\n height: calc(\n var(--rowsPerColumn) * var(--facetRowHeight) + ${scrollbarSize}\n );\n margin: 0 auto;\n outline-offset: 2px;\n overflow-x: auto;\n overflow-y: hidden;\n contain: strict;\n scroll-snap-type: x mandatory;\n /* scroll-snap-stop stays at its default 'normal' so a fling can cross\n many pages before resting. 'always' would force one page per gesture. */\n }\n\n /* Keep the scrollbar visible, so it's clear there is more to see */\n .scroller::-webkit-scrollbar {\n height: ${scrollbarSize};\n }\n .scroller::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 6px;\n }\n .scroller::-webkit-scrollbar-thumb {\n background: #888;\n border-radius: 6px;\n }\n .scroller::-webkit-scrollbar-thumb:hover {\n background: #555;\n }\n /* Chrome ignores the rules above once these are set, so only Firefox gets them */\n @supports not selector(::-webkit-scrollbar) {\n .scroller {\n scrollbar-width: thin;\n scrollbar-color: #888 #f1f1f1;\n }\n }\n\n .sizer {\n position: relative;\n height: 100%;\n }\n\n .snap-stub {\n position: absolute;\n top: 0;\n height: 100%;\n scroll-snap-align: start;\n pointer-events: none;\n contain: strict;\n }\n\n .page {\n position: absolute;\n top: 0;\n height: 100%;\n display: flex;\n contain: content;\n content-visibility: auto;\n contain-intrinsic-size: auto none;\n }\n\n .column {\n flex: none;\n width: var(--colWidth);\n box-sizing: border-box;\n padding: 0 0.75rem;\n }\n\n /* Rows are a fixed height with one line of text, so every column holds\n exactly rowsPerColumn rows. The full text is in the row's tooltip. */\n .facet-row-container {\n height: var(--facetRowHeight);\n box-sizing: border-box;\n align-items: center;\n }\n .facet-info-display {\n flex-wrap: nowrap;\n min-width: 0;\n }\n .facet-title {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n word-break: normal;\n }\n .facet-count {\n flex: none;\n padding-left: 0.5rem;\n }\n\n .scroll-arrow {\n flex: none;\n width: 2.4rem;\n padding: 0.5rem;\n background: none;\n border: none;\n cursor: pointer;\n }\n .scroll-arrow svg {\n height: 14px;\n fill: #2c2c2c;\n }\n .scroll-arrow:disabled {\n opacity: 0.3;\n cursor: default;\n }\n .scroll-arrow.unneeded {\n visibility: hidden;\n }\n\n /* Touch screens swipe; the space is better spent on the column */\n @media (max-width: 560px) {\n .scroll-arrow {\n display: none;\n }\n }\n `;\n\n return [srOnlyStyle, facetRowStyles, ownCss];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"more-facets-scroller.js","sourceRoot":"","sources":["../../../src/collection-facets/more-facets-scroller.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n LitElement,\n PropertyValues,\n TemplateResult,\n unsafeCSS,\n} from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { guard } from 'lit/directives/guard.js';\nimport { ref } from 'lit/directives/ref.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { localized, msg } from '@lit/localize';\nimport type { FacetBucket, FacetEventDetails, FacetOption } from '../models';\nimport type { CollectionTitles } from '../data-source/models';\nimport arrowLeftIcon from '../assets/img/icons/arrow-left';\nimport arrowRightIcon from '../assets/img/icons/arrow-right';\nimport { srOnlyStyle } from '../styles/sr-only';\nimport {\n facetRowStyles,\n facetRowTemplate,\n getFacetState,\n} from './facet-row-template';\nimport { PageWindow } from './page-window';\nimport {\n MORE_FACETS__COLUMN_WIDTH,\n MORE_FACETS__ROWS_PER_COLUMN,\n} from './models';\n\n/** Height in px reserved below the columns for the horizontal scrollbar */\nconst SCROLLBAR_SIZE = 12;\n\n/**\n * A long list of facet buckets laid out top to bottom in fixed-width columns\n * that scroll horizontally and snap to whole pages. Only the pages around the\n * viewport are in the DOM, so thousands of values stay responsive.\n *\n * Rows are plain DOM rather than `<facet-row>` elements, and one listener\n * handles every row's checkbox clicks.\n *\n * See docs/design/column-virtualization.md before changing the windowing.\n *\n * @fires facetClick - A row's checkbox was clicked. Detail: `FacetEventDetails`\n * @fires pageChanged - The scroller came to rest on a different page. Detail:\n * the 0-based page index\n */\n@customElement('more-facets-scroller')\n@localized()\nexport class MoreFacetsScroller extends LitElement {\n /** The name of the facet group the buckets belong to (e.g., \"subject\") */\n @property({ type: String }) facetType?: FacetOption;\n\n /** Every bucket to show, in display order */\n @property({ type: Array }) buckets: FacetBucket[] = [];\n\n /** The collection name cache for converting collection identifiers to titles */\n @property({ type: Object }) collectionTitles?: CollectionTitles;\n\n /** How many buckets to stack in each column before starting the next one */\n @property({ type: Number }) rowsPerColumn = MORE_FACETS__ROWS_PER_COLUMN;\n\n /**\n * Whether rows leave out their hide (eye) button, unless the value is\n * already hidden. Set it when the facet has only one value in all, since\n * hiding that would leave no results. Don't base it on how many rows are\n * showing: a filter that leaves a single row still needs its hide button.\n */\n @property({ type: Boolean }) omitHideButtons = false;\n\n /** Accessible name for the columns, e.g. \"Subject values\" */\n @property({ type: String }) label?: string;\n\n private win = new PageWindow(this, {\n colWidth: MORE_FACETS__COLUMN_WIDTH,\n total: 0,\n onRest: page => this.rested(page),\n });\n\n /** The page an arrow button is scrolling to, until the scroller rests */\n private pendingPage?: number;\n\n /** The last page reported in a `pageChanged` event */\n private reportedPage = 0;\n\n @query('.scroller')\n private scroller?: HTMLElement;\n\n /** The page resting at the start of the viewport */\n get currentPage(): number {\n return this.win.currentPage;\n }\n\n /** How many pages the buckets span at the current width */\n get pageCount(): number {\n return this.win.pageCount;\n }\n\n /** Scrolls so that `page` rests at the start of the viewport */\n scrollToPage(page: number, behavior: ScrollBehavior = 'auto'): void {\n this.win.scrollToPage(page, behavior);\n }\n\n willUpdate(changed: PropertyValues): void {\n if (changed.has('buckets') || changed.has('rowsPerColumn')) {\n this.win.setTotal(Math.ceil(this.buckets.length / this.rowsPerColumn));\n }\n this.keepFocusOnScreen();\n }\n\n render(): TemplateResult {\n const w = this.win;\n const live: number[] = [];\n for (let i = w.first; i <= w.last; i++) live.push(i);\n\n return html`\n <div class=\"scroll-nav\">\n ${this.arrowTemplate('prev')}\n <div class=\"frame\">\n <div\n class=\"scroller\"\n role=\"group\"\n aria-label=${ifDefined(this.label)}\n tabindex=${w.pageCount > 0 ? 0 : -1}\n style=\"--rowsPerColumn: ${this.rowsPerColumn}\"\n ${ref(w.attach)}\n @click=${this.rowClicked}\n @focusin=${this.rowFocused}\n >\n <div class=\"sizer\" style=\"width:${w.totalWidth}px\">\n ${guard([w.pageCount, w.pageWidth, w.totalWidth], () =>\n this.snapStubsTemplate(),\n )}\n ${repeat(\n live,\n i => i,\n i =>\n html`<div\n class=\"page\"\n data-page=${i}\n style=\"left:${i * w.pageWidth}px;width:${w.pageSpan(i)}px\"\n >\n ${this.pageTemplate(i)}\n </div>`,\n )}\n </div>\n </div>\n </div>\n ${this.arrowTemplate('next')}\n </div>\n `;\n }\n\n /**\n * One empty snap target per page, always mounted. The browser keeps\n * re-picking its snap target while a fling decelerates, so the targets must\n * not come and go with the window of rendered pages.\n */\n private snapStubsTemplate(): TemplateResult {\n const w = this.win;\n const all = Array.from({ length: w.pageCount }, (_, i) => i);\n return html`${repeat(\n all,\n i => i,\n i =>\n html`<div\n class=\"snap-stub\"\n style=\"left:${i * w.pageWidth}px;width:${w.pageSpan(i)}px\"\n ></div>`,\n )}`;\n }\n\n /** The columns of rows on page `page` */\n private pageTemplate(page: number): TemplateResult[] {\n const { facetType, buckets, rowsPerColumn } = this;\n if (!facetType) return [];\n\n const { colsPerPage } = this.win;\n const firstCol = page * colsPerPage;\n const endCol = Math.min(\n firstCol + colsPerPage,\n Math.ceil(buckets.length / rowsPerColumn),\n );\n\n const columns: TemplateResult[] = [];\n for (let col = firstCol; col < endCol; col++) {\n const start = col * rowsPerColumn;\n const rows = buckets.slice(start, start + rowsPerColumn);\n columns.push(\n html`<div class=\"column\">\n ${rows.map(bucket =>\n facetRowTemplate({\n facetType,\n bucket,\n collectionTitles: this.collectionTitles,\n omitHideButton: this.omitHideButtons,\n }),\n )}\n </div>`,\n );\n }\n return columns;\n }\n\n private arrowTemplate(direction: 'prev' | 'next'): TemplateResult {\n const { currentPage, pageCount } = this.win;\n const isPrev = direction === 'prev';\n const disabled = isPrev ? currentPage <= 0 : currentPage >= pageCount - 1;\n\n // Arrows keep their space even when there's nothing to scroll to, so that\n // showing them never changes how many columns fit.\n const classes = classMap({\n 'scroll-arrow': true,\n [direction]: true,\n unneeded: pageCount <= 1,\n });\n\n return html`<button\n type=\"button\"\n class=${classes}\n ?disabled=${disabled}\n aria-label=${isPrev\n ? msg('Show previous page of values')\n : msg('Show next page of values')}\n @click=${() => this.arrowClicked(isPrev ? -1 : 1)}\n >\n ${isPrev ? arrowLeftIcon : arrowRightIcon}\n </button>`;\n }\n\n /**\n * Handles clicks on any row's checkboxes. The rows have no listeners of\n * their own.\n */\n private rowClicked(e: Event): void {\n const input = e.target;\n const { facetType } = this;\n if (!(input instanceof HTMLInputElement) || !facetType) return;\n\n const bucket = this.buckets.find(b => b.key === input.value);\n if (!bucket) return;\n\n const negative = input.classList.contains('hide-facet-checkbox');\n this.dispatchEvent(\n new CustomEvent<FacetEventDetails>('facetClick', {\n detail: {\n facetType,\n bucket: { ...bucket, state: getFacetState(input.checked, negative) },\n negative,\n },\n }),\n );\n }\n\n /**\n * When focus comes into the rows from outside them, or from the scroller\n * itself (a tab stop just before the rows), keeps it on the page being\n * shown. Otherwise Tab lands on the mounted page before this one, and\n * Shift+Tab on the last one after it, and the browser scrolls there.\n * Moving from row to row is left alone, so Tab and Shift+Tab still carry on\n * into the next or previous page.\n */\n private rowFocused(e: FocusEvent): void {\n const { scroller } = this;\n const row = e.target;\n if (!scroller || !(row instanceof HTMLElement) || row === scroller) return;\n\n const from = e.relatedTarget;\n const fromRows =\n from instanceof Node && from !== scroller && scroller.contains(from);\n if (fromRows) return;\n\n const page = Number(row.closest<HTMLElement>('.page')?.dataset.page);\n const { currentPage } = this.win;\n if (Number.isNaN(page) || page === currentPage) return;\n\n const rowsOnPage = [\n ...scroller.querySelectorAll<HTMLElement>(\n `.page[data-page=\"${currentPage}\"] input`,\n ),\n ].filter(input => !input.closest('[hidden]'));\n const target =\n page < currentPage ? rowsOnPage[0] : rowsOnPage[rowsOnPage.length - 1];\n target?.focus({ preventScroll: true });\n\n // Whatever moved focus may also scroll to the row it picked: in the\n // dialog, modal-manager's focus trap already has, before this event; the\n // browser's own Tab does just after this handler returns. Put the page\n // back now, and again before the next frame is painted (and before the\n // window is recomputed, so this page stays mounted).\n this.win.scrollToPage(currentPage);\n requestAnimationFrame(() => this.win.scrollToPage(currentPage));\n }\n\n /**\n * If a row has focus and its page is about to leave the window, moves focus\n * to the scroller itself. Otherwise focus would fall back to the document\n * when the page is removed, and the arrow keys would stop scrolling. The\n * scroller being a tab stop matters here: modal-manager's focus trap only\n * moves Tab between tabbable elements, and from anything else it goes back\n * to the start of the dialog.\n */\n private keepFocusOnScreen(): void {\n const focusedPage =\n this.shadowRoot?.activeElement?.closest<HTMLElement>('.page');\n if (!focusedPage) return;\n const page = Number(focusedPage.dataset.page);\n if (page >= this.win.first && page <= this.win.last) return;\n this.scroller?.focus({ preventScroll: true });\n }\n\n private arrowClicked(step: 1 | -1): void {\n // Count from where an earlier click is already headed, so that clicking\n // twice quickly moves two pages.\n const from = this.pendingPage ?? this.win.currentPage;\n const target = Math.max(0, Math.min(from + step, this.win.pageCount - 1));\n this.pendingPage = target;\n\n const reduceMotion = window.matchMedia?.(\n '(prefers-reduced-motion: reduce)',\n ).matches;\n this.win.scrollToPage(target, reduceMotion ? 'auto' : 'smooth');\n }\n\n private rested(page: number): void {\n this.pendingPage = undefined;\n if (page === this.reportedPage) return;\n this.reportedPage = page;\n this.dispatchEvent(\n new CustomEvent<number>('pageChanged', { detail: page }),\n );\n }\n\n static get styles(): CSSResultGroup {\n const colWidth = unsafeCSS(`${MORE_FACETS__COLUMN_WIDTH}px`);\n const scrollbarSize = unsafeCSS(`${SCROLLBAR_SIZE}px`);\n\n const ownCss = css`\n :host {\n display: block;\n --colWidth: ${colWidth};\n --facetRowHeight: 2.4rem;\n }\n\n .scroll-nav {\n display: flex;\n align-items: center;\n }\n\n .frame {\n flex: 1 1 auto;\n min-width: 0;\n container-type: inline-size;\n }\n\n .scroller {\n /* Fallback where round() is unsupported: fill the frame */\n width: 100%;\n /* Otherwise round down to whole columns, so none is ever cut off */\n width: max(\n round(down, 100cqi, var(--colWidth)),\n min(100cqi, var(--colWidth))\n );\n height: calc(\n var(--rowsPerColumn) * var(--facetRowHeight) + ${scrollbarSize}\n );\n margin: 0 auto;\n outline-offset: 2px;\n overflow-x: auto;\n overflow-y: hidden;\n contain: strict;\n scroll-snap-type: x mandatory;\n /* scroll-snap-stop stays at its default 'normal' so a fling can cross\n many pages before resting. 'always' would force one page per gesture. */\n }\n\n /* Keep the scrollbar visible, so it's clear there is more to see */\n .scroller::-webkit-scrollbar {\n height: ${scrollbarSize};\n }\n .scroller::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 6px;\n }\n .scroller::-webkit-scrollbar-thumb {\n background: #888;\n border-radius: 6px;\n }\n .scroller::-webkit-scrollbar-thumb:hover {\n background: #555;\n }\n /* Chrome ignores the rules above once these are set, so only Firefox gets them */\n @supports not selector(::-webkit-scrollbar) {\n .scroller {\n scrollbar-width: thin;\n scrollbar-color: #888 #f1f1f1;\n }\n }\n\n .sizer {\n position: relative;\n height: 100%;\n }\n\n .snap-stub {\n position: absolute;\n top: 0;\n height: 100%;\n scroll-snap-align: start;\n pointer-events: none;\n contain: strict;\n }\n\n .page {\n position: absolute;\n top: 0;\n height: 100%;\n display: flex;\n contain: content;\n content-visibility: auto;\n contain-intrinsic-size: auto none;\n }\n\n .column {\n flex: none;\n width: var(--colWidth);\n box-sizing: border-box;\n padding: 0 0.75rem;\n }\n\n /* Rows are a fixed height with one line of text, so every column holds\n exactly rowsPerColumn rows. The full text is in the row's tooltip. */\n .facet-row-container {\n height: var(--facetRowHeight);\n box-sizing: border-box;\n align-items: center;\n }\n .facet-info-display {\n flex-wrap: nowrap;\n min-width: 0;\n }\n .facet-title {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n word-break: normal;\n }\n .facet-count {\n flex: none;\n padding-left: 0.5rem;\n }\n\n .scroll-arrow {\n flex: none;\n width: 2.4rem;\n padding: 0.5rem;\n background: none;\n border: none;\n cursor: pointer;\n }\n .scroll-arrow svg {\n height: 14px;\n fill: #2c2c2c;\n }\n .scroll-arrow:disabled {\n opacity: 0.3;\n cursor: default;\n }\n .scroll-arrow.unneeded {\n visibility: hidden;\n }\n\n /* Touch screens swipe; the space is better spent on the column */\n @media (max-width: 560px) {\n .scroll-arrow {\n display: none;\n }\n }\n `;\n\n return [srOnlyStyle, facetRowStyles, ownCss];\n }\n}\n"]}
|
|
@@ -3,7 +3,7 @@ import { css, html, LitElement, nothing, } from 'lit';
|
|
|
3
3
|
import { customElement, property, state } from 'lit/decorators.js';
|
|
4
4
|
import { map } from 'lit/directives/map.js';
|
|
5
5
|
import { ref } from 'lit/directives/ref.js';
|
|
6
|
-
import { msg } from '@lit/localize';
|
|
6
|
+
import { localized, msg } from '@lit/localize';
|
|
7
7
|
import { classMap } from 'lit/directives/class-map.js';
|
|
8
8
|
import '@internetarchive/elements/ia-histogram-date-range/ia-histogram-date-range';
|
|
9
9
|
import '@internetarchive/feature-feedback';
|
|
@@ -865,7 +865,8 @@ __decorate([
|
|
|
865
865
|
state()
|
|
866
866
|
], CollectionFacets.prototype, "openFacets", void 0);
|
|
867
867
|
CollectionFacets = __decorate([
|
|
868
|
-
customElement('collection-facets')
|
|
868
|
+
customElement('collection-facets'),
|
|
869
|
+
localized()
|
|
869
870
|
], CollectionFacets);
|
|
870
871
|
export { CollectionFacets };
|
|
871
872
|
//# sourceMappingURL=collection-facets.js.map
|