@internetarchive/collection-browser 4.3.2-alpha-webdev7939.13 → 4.3.2-rc-webdev-8334.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/.editorconfig +29 -29
- package/.github/workflows/ci.yml +27 -27
- package/.github/workflows/gh-pages-main.yml +39 -39
- package/.github/workflows/npm-publish.yml +39 -39
- package/.github/workflows/pr-preview.yml +38 -38
- package/.husky/pre-commit +1 -1
- package/.prettierignore +1 -1
- package/LICENSE +661 -661
- package/README.md +83 -83
- package/dist/src/app-root.js +0 -4
- package/dist/src/app-root.js.map +1 -1
- package/dist/src/collection-browser.d.ts +0 -41
- package/dist/src/collection-browser.js +36 -128
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/data-source/collection-browser-data-source.js +0 -3
- package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
- package/dist/src/tiles/item-image.d.ts +1 -9
- package/dist/src/tiles/item-image.js +2 -22
- package/dist/src/tiles/item-image.js.map +1 -1
- package/dist/src/tiles/tile-dispatcher.js +1 -0
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/src/tiles/tile-display-value-provider.js +2 -1
- package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
- package/dist/test/tiles/grid/item-tile.test.js +2 -2
- package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
- package/dist/test/tiles/list/tile-list.test.js +2 -2
- package/dist/test/tiles/list/tile-list.test.js.map +1 -1
- package/eslint.config.mjs +53 -53
- package/index.html +24 -24
- package/local.archive.org.cert +86 -86
- package/local.archive.org.key +27 -27
- package/package.json +120 -120
- package/renovate.json +6 -6
- package/src/app-root.ts +0 -3
- package/src/collection-browser.ts +35 -146
- package/src/data-source/collection-browser-data-source.ts +0 -9
- package/src/tiles/item-image.ts +1 -28
- package/src/tiles/tile-dispatcher.ts +1 -0
- package/src/tiles/tile-display-value-provider.ts +2 -3
- package/test/tiles/grid/item-tile.test.ts +2 -2
- package/test/tiles/list/tile-list.test.ts +2 -2
- package/tsconfig.json +25 -25
- package/web-dev-server.config.mjs +30 -30
- package/web-test-runner.config.mjs +52 -52
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-dispatcher.js","sourceRoot":"","sources":["../../../src/tiles/tile-dispatcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, nothing, PropertyValues } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { msg } from '@lit/localize';\nimport type {\n SharedResizeObserverInterface,\n SharedResizeObserverResizeHandlerInterface,\n} from '@internetarchive/shared-resize-observer';\nimport type { TileDisplayMode } from '../models';\nimport type { CollectionTitles } from '../data-source/models';\nimport './grid/collection-tile';\nimport './grid/item-tile';\nimport './grid/account-tile';\nimport './grid/search-tile';\nimport './hover/tile-hover-pane';\nimport './list/tile-list';\nimport './list/tile-list-compact';\nimport './list/tile-list-compact-header';\nimport type { TileHoverPane } from './hover/tile-hover-pane';\nimport { BaseTileComponent } from './base-tile-component';\nimport { LayoutType } from './models';\nimport {\n HoverPaneController,\n HoverPaneControllerInterface,\n HoverPaneProperties,\n HoverPaneProviderInterface,\n} from './hover/hover-pane-controller';\nimport { srOnlyStyle } from '../styles/sr-only';\n\n@customElement('tile-dispatcher')\nexport class TileDispatcher\n extends BaseTileComponent\n implements\n SharedResizeObserverResizeHandlerInterface,\n HoverPaneProviderInterface\n{\n /*\n * Reactive properties inherited from BaseTileComponent:\n * - model?: TileModel;\n * - currentWidth?: number;\n * - currentHeight?: number;\n * - baseNavigationUrl?: string;\n * - baseImageUrl?: string;\n * - collectionPagePath?: string;\n * - sortParam: SortParam | null = null;\n * - defaultSortParam: SortParam | null = null;\n * - creatorFilter?: string;\n * - mobileBreakpoint?: number;\n * - loggedIn = false;\n * - suppressTileBlurring = false;\n * - useLocalTime = false;\n */\n\n @property({ type: String }) tileDisplayMode?: TileDisplayMode;\n\n @property({ type: Boolean }) isManageView = false;\n\n @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object })\n collectionTitles?: CollectionTitles;\n\n @property({ type: Boolean }) showTvClips = false;\n\n /** What type of simplified layout to use in grid mode, if any */\n @property({ type: String }) layoutType: LayoutType = 'default';\n\n /** Whether this tile should include a hover pane at all (for applicable tile modes) */\n @property({ type: Boolean }) enableHoverPane = false;\n\n @property({ type: String }) manageCheckTitle = msg(\n 'Remove this item from the list',\n );\n\n private hoverPaneController?: HoverPaneControllerInterface;\n\n @query('#container')\n private container!: HTMLDivElement;\n\n @query('tile-hover-pane')\n private hoverPane?: TileHoverPane;\n\n @query('.tile-link')\n private tileLinkElement?: HTMLAnchorElement;\n\n acquireFocus(): void {\n this.tileLinkElement?.focus();\n }\n\n releaseFocus(): void {\n this.tileLinkElement?.blur();\n }\n\n /** Maps each display mode to whether hover panes should appear in that mode */\n private static readonly HOVER_PANE_DISPLAY_MODES: Record<\n TileDisplayMode,\n boolean\n > = {\n grid: true,\n 'list-compact': true,\n 'list-detail': false,\n 'list-header': false,\n };\n\n render() {\n const isGridMode = this.tileDisplayMode === 'grid';\n const hoverPaneTemplate =\n this.hoverPaneController?.getTemplate() ?? nothing;\n return html`\n <div id=\"container\" class=${isGridMode ? 'hoverable' : ''}>\n ${this.tileDisplayMode === 'list-header'\n ? this.headerTemplate\n : this.tileTemplate}\n ${this.manageCheckTemplate} ${hoverPaneTemplate}\n </div>\n `;\n }\n\n protected firstUpdated(): void {\n if (this.shouldPrepareHoverPane) {\n this.hoverPaneController = new HoverPaneController(this, {\n mobileBreakpoint: this.mobileBreakpoint,\n enableLongPress: false,\n });\n }\n }\n\n private get headerTemplate() {\n const { currentWidth, sortParam, defaultSortParam, mobileBreakpoint } =\n this;\n return html`\n <tile-list-compact-header\n class=\"header\"\n .currentWidth=${currentWidth}\n .sortParam=${sortParam ?? defaultSortParam}\n .mobileBreakpoint=${mobileBreakpoint}\n >\n </tile-list-compact-header>\n `;\n }\n\n private get tileTemplate() {\n return html`\n ${this.tileDisplayMode === 'list-detail'\n ? this.tile\n : this.linkTileTemplate}\n `;\n }\n\n private get linkTileTemplate() {\n return html`\n <a\n href=${this.linkTileHref}\n aria-label=${this.model?.title ?? 'Untitled item'}\n aria-describedby=\"link-aria-description\"\n aria-haspopup=${this.shouldPrepareHoverPane ? 'dialog' : 'false'}\n title=${this.shouldPrepareHoverPane\n ? nothing // Don't show title tooltips when we have the tile info popups\n : ifDefined(this.model?.title)}\n @click=${this.handleLinkClicked}\n @contextmenu=${this.handleLinkContextMenu}\n class=\"tile-link\"\n >\n ${this.tile}\n </a>\n <div id=\"link-aria-description\" class=\"sr-only\">\n ${msg('Press Down Arrow to preview item details')}\n </div>\n `;\n }\n\n private get linkTileHref(): string | typeof nothing {\n if (!this.model?.identifier || this.baseNavigationUrl == null)\n return nothing;\n\n // Use the server-specified href if available.\n // Otherwise, construct a details page URL from the item identifier.\n if (this.model.href) {\n return `${this.baseNavigationUrl}${this.model.href}`;\n }\n\n return this.displayValueProvider.itemPageUrl(\n this.model.identifier,\n this.model.mediatype === 'collection',\n );\n }\n\n private get manageCheckTemplate() {\n if (!this.isManageView || this.tileDisplayMode !== 'grid') return nothing;\n\n return html`\n <div class=\"manage-check\">\n <input\n type=\"checkbox\"\n title=${this.manageCheckTitle}\n ?checked=${this.model?.checked}\n @change=${this.handleLinkClicked}\n />\n </div>\n `;\n }\n\n /**\n * Whether hover pane behavior should be prepared for this tile\n * (e.g., whether mouse listeners should be attached, etc.)\n */\n private get shouldPrepareHoverPane(): boolean {\n return (\n this.enableHoverPane &&\n !!this.tileDisplayMode &&\n TileDispatcher.HOVER_PANE_DISPLAY_MODES[this.tileDisplayMode] &&\n this.model?.mediatype !== 'search' && // don't show hover panes on search tiles\n !this.model?.captureDates // don't show hover panes on web archive tiles\n );\n }\n\n private get isHoverEnabled(): boolean {\n return window.matchMedia('(hover: hover)').matches;\n }\n\n /**\n * Whether the info button should be shown on this tile.\n * Only shown on touch/non-hover devices where a hover pane is available,\n * so the button always has something to toggle.\n */\n private get shouldShowInfoButton(): boolean {\n return !this.isHoverEnabled && this.shouldPrepareHoverPane;\n }\n\n /** @inheritdoc */\n getHoverPane(): TileHoverPane | undefined {\n return this.hoverPane;\n }\n\n /** @inheritdoc */\n getHoverPaneProps(): HoverPaneProperties {\n return this;\n }\n\n handleResize(entry: ResizeObserverEntry): void {\n this.currentWidth = entry.contentRect.width;\n this.currentHeight = entry.contentRect.height;\n }\n\n disconnectedCallback(): void {\n this.stopResizeObservation(this.resizeObserver);\n }\n\n private stopResizeObservation(observer?: SharedResizeObserverInterface) {\n observer?.removeObserver({\n handler: this,\n target: this.container,\n });\n }\n\n private startResizeObservation() {\n this.stopResizeObservation(this.resizeObserver);\n this.resizeObserver?.addObserver({\n handler: this,\n target: this.container,\n });\n }\n\n updated(props: PropertyValues) {\n if (props.has('resizeObserver')) {\n const previousObserver = props.get(\n 'resizeObserver',\n ) as SharedResizeObserverInterface;\n this.stopResizeObservation(previousObserver);\n this.startResizeObservation();\n }\n }\n\n /**\n * Handler for when the tile link is left-clicked. Emits the `resultSelected` event.\n * In manage view, it also checks/unchecks the tile.\n */\n private handleLinkClicked(e: Event): void {\n if (this.isManageView) {\n e.preventDefault();\n if (this.model) this.model.checked = !this.model.checked;\n }\n\n this.dispatchEvent(\n new CustomEvent('resultSelected', { detail: this.model }),\n );\n }\n\n /**\n * Handler for when the tile link is right-clicked.\n * In manage view, it opens the item in a new tab. Otherwise, does nothing.\n */\n private handleLinkContextMenu(e: Event): void {\n if (this.isManageView && this.linkTileHref !== nothing) {\n e.preventDefault();\n window.open(this.linkTileHref, '_blank');\n }\n }\n\n private tileInfoButtonPressed(\n e: CustomEvent<{ x: number; y: number }>,\n ): void {\n this.hoverPaneController?.toggleHoverPane({\n coords: e.detail,\n enableTouchBackdrop: true,\n });\n }\n\n private get tile() {\n const {\n model,\n collectionPagePath,\n baseNavigationUrl,\n currentWidth,\n currentHeight,\n sortParam,\n creatorFilter,\n mobileBreakpoint,\n defaultSortParam,\n } = this;\n\n if (!model) return nothing;\n\n switch (this.tileDisplayMode) {\n case 'grid':\n switch (model.mediatype) {\n case 'collection':\n return html`<collection-tile\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .baseImageUrl=${this.baseImageUrl}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .creatorFilter=${creatorFilter}\n .suppressBlurring=${this.suppressBlurring}\n .isManageView=${this.isManageView}\n .layoutType=${this.layoutType}\n ?showInfoButton=${this.shouldShowInfoButton}\n @infoButtonPressed=${this.tileInfoButtonPressed}\n >\n </collection-tile>`;\n case 'account':\n return html`<account-tile\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .baseImageUrl=${this.baseImageUrl}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .creatorFilter=${creatorFilter}\n .suppressBlurring=${this.suppressBlurring}\n .isManageView=${this.isManageView}\n ?showInfoButton=${this.shouldShowInfoButton}\n @infoButtonPressed=${this.tileInfoButtonPressed}\n >\n </account-tile>`;\n case 'search':\n return html`<search-tile\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .baseImageUrl=${this.baseImageUrl}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .creatorFilter=${creatorFilter}\n .suppressBlurring=${this.suppressBlurring}\n .isManageView=${this.isManageView}\n ?showInfoButton=${false}\n @infoButtonPressed=${this.tileInfoButtonPressed}\n >\n </search-tile>`;\n default:\n return html`<item-tile\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .currentWidth=${this.currentWidth}\n .currentHeight=${this.currentHeight}\n .baseImageUrl=${this.baseImageUrl}\n .sortParam=${sortParam}\n .defaultSortParam=${defaultSortParam}\n .creatorFilter=${creatorFilter}\n .loggedIn=${this.loggedIn}\n .suppressBlurring=${this.suppressBlurring}\n .isManageView=${this.isManageView}\n .layoutType=${this.layoutType}\n ?showTvClips=${this.showTvClips}\n ?showInfoButton=${this.shouldShowInfoButton}\n ?useLocalTime=${this.useLocalTime}\n @infoButtonPressed=${this.tileInfoButtonPressed}\n >\n </item-tile>`;\n }\n case 'list-compact':\n return html`<tile-list-compact\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .baseNavigationUrl=${baseNavigationUrl}\n .sortParam=${sortParam}\n .defaultSortParam=${defaultSortParam}\n .creatorFilter=${creatorFilter}\n .mobileBreakpoint=${mobileBreakpoint}\n .baseImageUrl=${this.baseImageUrl}\n .loggedIn=${this.loggedIn}\n .suppressBlurring=${this.suppressBlurring}\n ?useLocalTime=${this.useLocalTime}\n >\n </tile-list-compact>`;\n case 'list-detail':\n return html`<tile-list\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .collectionTitles=${this.collectionTitles}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .baseNavigationUrl=${baseNavigationUrl}\n .sortParam=${sortParam}\n .defaultSortParam=${defaultSortParam}\n .creatorFilter=${creatorFilter}\n .mobileBreakpoint=${mobileBreakpoint}\n .baseImageUrl=${this.baseImageUrl}\n .loggedIn=${this.loggedIn}\n .suppressBlurring=${this.suppressBlurring}\n ?useLocalTime=${this.useLocalTime}\n >\n </tile-list>`;\n default:\n return nothing;\n }\n }\n\n static get styles() {\n return [\n srOnlyStyle,\n css`\n :host {\n display: block;\n height: 100%;\n }\n\n collection-tile {\n --tileBorderColor: #555555;\n --tileBackgroundColor: #666666;\n --imageBlockBackgroundColor: #666666;\n }\n\n account-tile {\n --tileBorderColor: #dddddd;\n --imageBlockBackgroundColor: #fcf5e6;\n }\n\n item-tile {\n --tileBorderColor: #dddddd;\n --imageBlockBackgroundColor: #f1f1f4;\n }\n\n search-tile {\n --tileBorderColor: #555555;\n --tileBackgroundColor: #666666;\n --imageBlockBackgroundColor: #666666;\n --iconFillColor: #2c2c2c;\n }\n\n #container {\n position: relative;\n height: 100%;\n border-radius: 4px;\n }\n\n #container.hoverable a:focus,\n #container.hoverable a:hover {\n box-shadow: var(\n --tileHoverBoxShadow,\n 0 0 6px 2px rgba(8, 8, 32, 0.8)\n );\n transition: box-shadow 0.1s ease;\n }\n\n a {\n display: block;\n height: 100%;\n color: unset;\n text-decoration: none;\n transition: transform 0.05s ease;\n border-radius: 4px;\n outline: none;\n }\n\n a :first-child {\n display: block;\n height: 100%;\n }\n\n .manage-check {\n position: absolute;\n right: 0;\n top: 0;\n border: 5px solid #2c2c2c;\n border-radius: 3px;\n background-color: #2c2c2c;\n z-index: 1;\n }\n\n .manage-check > input[type='checkbox'] {\n display: block;\n margin: 0;\n }\n\n #touch-backdrop {\n position: fixed;\n width: 100vw;\n height: 100vh;\n top: 0;\n left: 0;\n z-index: 2;\n background: transparent;\n }\n\n tile-hover-pane {\n position: absolute;\n top: 0;\n left: -9999px;\n z-index: 2;\n }\n `,\n ];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tile-dispatcher.js","sourceRoot":"","sources":["../../../src/tiles/tile-dispatcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, nothing, PropertyValues } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { msg } from '@lit/localize';\nimport type {\n SharedResizeObserverInterface,\n SharedResizeObserverResizeHandlerInterface,\n} from '@internetarchive/shared-resize-observer';\nimport type { TileDisplayMode } from '../models';\nimport type { CollectionTitles } from '../data-source/models';\nimport './grid/collection-tile';\nimport './grid/item-tile';\nimport './grid/account-tile';\nimport './grid/search-tile';\nimport './hover/tile-hover-pane';\nimport './list/tile-list';\nimport './list/tile-list-compact';\nimport './list/tile-list-compact-header';\nimport type { TileHoverPane } from './hover/tile-hover-pane';\nimport { BaseTileComponent } from './base-tile-component';\nimport { LayoutType } from './models';\nimport {\n HoverPaneController,\n HoverPaneControllerInterface,\n HoverPaneProperties,\n HoverPaneProviderInterface,\n} from './hover/hover-pane-controller';\nimport { srOnlyStyle } from '../styles/sr-only';\n\n@customElement('tile-dispatcher')\nexport class TileDispatcher\n extends BaseTileComponent\n implements\n SharedResizeObserverResizeHandlerInterface,\n HoverPaneProviderInterface\n{\n /*\n * Reactive properties inherited from BaseTileComponent:\n * - model?: TileModel;\n * - currentWidth?: number;\n * - currentHeight?: number;\n * - baseNavigationUrl?: string;\n * - baseImageUrl?: string;\n * - collectionPagePath?: string;\n * - sortParam: SortParam | null = null;\n * - defaultSortParam: SortParam | null = null;\n * - creatorFilter?: string;\n * - mobileBreakpoint?: number;\n * - loggedIn = false;\n * - suppressTileBlurring = false;\n * - useLocalTime = false;\n */\n\n @property({ type: String }) tileDisplayMode?: TileDisplayMode;\n\n @property({ type: Boolean }) isManageView = false;\n\n @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object })\n collectionTitles?: CollectionTitles;\n\n @property({ type: Boolean }) showTvClips = false;\n\n /** What type of simplified layout to use in grid mode, if any */\n @property({ type: String }) layoutType: LayoutType = 'default';\n\n /** Whether this tile should include a hover pane at all (for applicable tile modes) */\n @property({ type: Boolean }) enableHoverPane = false;\n\n @property({ type: String }) manageCheckTitle = msg(\n 'Remove this item from the list',\n );\n\n private hoverPaneController?: HoverPaneControllerInterface;\n\n @query('#container')\n private container!: HTMLDivElement;\n\n @query('tile-hover-pane')\n private hoverPane?: TileHoverPane;\n\n @query('.tile-link')\n private tileLinkElement?: HTMLAnchorElement;\n\n acquireFocus(): void {\n this.tileLinkElement?.focus();\n }\n\n releaseFocus(): void {\n this.tileLinkElement?.blur();\n }\n\n /** Maps each display mode to whether hover panes should appear in that mode */\n private static readonly HOVER_PANE_DISPLAY_MODES: Record<\n TileDisplayMode,\n boolean\n > = {\n grid: true,\n 'list-compact': true,\n 'list-detail': false,\n 'list-header': false,\n };\n\n render() {\n const isGridMode = this.tileDisplayMode === 'grid';\n const hoverPaneTemplate =\n this.hoverPaneController?.getTemplate() ?? nothing;\n return html`\n <div id=\"container\" class=${isGridMode ? 'hoverable' : ''}>\n ${this.tileDisplayMode === 'list-header'\n ? this.headerTemplate\n : this.tileTemplate}\n ${this.manageCheckTemplate} ${hoverPaneTemplate}\n </div>\n `;\n }\n\n protected firstUpdated(): void {\n if (this.shouldPrepareHoverPane) {\n this.hoverPaneController = new HoverPaneController(this, {\n mobileBreakpoint: this.mobileBreakpoint,\n enableLongPress: false,\n });\n }\n }\n\n private get headerTemplate() {\n const { currentWidth, sortParam, defaultSortParam, mobileBreakpoint } =\n this;\n return html`\n <tile-list-compact-header\n class=\"header\"\n .currentWidth=${currentWidth}\n .sortParam=${sortParam ?? defaultSortParam}\n .mobileBreakpoint=${mobileBreakpoint}\n >\n </tile-list-compact-header>\n `;\n }\n\n private get tileTemplate() {\n return html`\n ${this.tileDisplayMode === 'list-detail'\n ? this.tile\n : this.linkTileTemplate}\n `;\n }\n\n private get linkTileTemplate() {\n return html`\n <a\n href=${this.linkTileHref}\n aria-label=${this.model?.title ?? 'Untitled item'}\n aria-describedby=\"link-aria-description\"\n aria-haspopup=${this.shouldPrepareHoverPane ? 'dialog' : 'false'}\n title=${this.shouldPrepareHoverPane\n ? nothing // Don't show title tooltips when we have the tile info popups\n : ifDefined(this.model?.title)}\n @click=${this.handleLinkClicked}\n @contextmenu=${this.handleLinkContextMenu}\n class=\"tile-link\"\n >\n ${this.tile}\n </a>\n <div id=\"link-aria-description\" class=\"sr-only\">\n ${msg('Press Down Arrow to preview item details')}\n </div>\n `;\n }\n\n private get linkTileHref(): string | typeof nothing {\n if (!this.model?.identifier || this.baseNavigationUrl == null)\n return nothing;\n\n // Use the server-specified href if available.\n // Otherwise, construct a details page URL from the item identifier.\n console.log('href', this.model.href);\n if (this.model.href) {\n return `${this.baseNavigationUrl}${this.model.href}`;\n }\n\n return this.displayValueProvider.itemPageUrl(\n this.model.identifier,\n this.model.mediatype === 'collection',\n );\n }\n\n private get manageCheckTemplate() {\n if (!this.isManageView || this.tileDisplayMode !== 'grid') return nothing;\n\n return html`\n <div class=\"manage-check\">\n <input\n type=\"checkbox\"\n title=${this.manageCheckTitle}\n ?checked=${this.model?.checked}\n @change=${this.handleLinkClicked}\n />\n </div>\n `;\n }\n\n /**\n * Whether hover pane behavior should be prepared for this tile\n * (e.g., whether mouse listeners should be attached, etc.)\n */\n private get shouldPrepareHoverPane(): boolean {\n return (\n this.enableHoverPane &&\n !!this.tileDisplayMode &&\n TileDispatcher.HOVER_PANE_DISPLAY_MODES[this.tileDisplayMode] &&\n this.model?.mediatype !== 'search' && // don't show hover panes on search tiles\n !this.model?.captureDates // don't show hover panes on web archive tiles\n );\n }\n\n private get isHoverEnabled(): boolean {\n return window.matchMedia('(hover: hover)').matches;\n }\n\n /**\n * Whether the info button should be shown on this tile.\n * Only shown on touch/non-hover devices where a hover pane is available,\n * so the button always has something to toggle.\n */\n private get shouldShowInfoButton(): boolean {\n return !this.isHoverEnabled && this.shouldPrepareHoverPane;\n }\n\n /** @inheritdoc */\n getHoverPane(): TileHoverPane | undefined {\n return this.hoverPane;\n }\n\n /** @inheritdoc */\n getHoverPaneProps(): HoverPaneProperties {\n return this;\n }\n\n handleResize(entry: ResizeObserverEntry): void {\n this.currentWidth = entry.contentRect.width;\n this.currentHeight = entry.contentRect.height;\n }\n\n disconnectedCallback(): void {\n this.stopResizeObservation(this.resizeObserver);\n }\n\n private stopResizeObservation(observer?: SharedResizeObserverInterface) {\n observer?.removeObserver({\n handler: this,\n target: this.container,\n });\n }\n\n private startResizeObservation() {\n this.stopResizeObservation(this.resizeObserver);\n this.resizeObserver?.addObserver({\n handler: this,\n target: this.container,\n });\n }\n\n updated(props: PropertyValues) {\n if (props.has('resizeObserver')) {\n const previousObserver = props.get(\n 'resizeObserver',\n ) as SharedResizeObserverInterface;\n this.stopResizeObservation(previousObserver);\n this.startResizeObservation();\n }\n }\n\n /**\n * Handler for when the tile link is left-clicked. Emits the `resultSelected` event.\n * In manage view, it also checks/unchecks the tile.\n */\n private handleLinkClicked(e: Event): void {\n if (this.isManageView) {\n e.preventDefault();\n if (this.model) this.model.checked = !this.model.checked;\n }\n\n this.dispatchEvent(\n new CustomEvent('resultSelected', { detail: this.model }),\n );\n }\n\n /**\n * Handler for when the tile link is right-clicked.\n * In manage view, it opens the item in a new tab. Otherwise, does nothing.\n */\n private handleLinkContextMenu(e: Event): void {\n if (this.isManageView && this.linkTileHref !== nothing) {\n e.preventDefault();\n window.open(this.linkTileHref, '_blank');\n }\n }\n\n private tileInfoButtonPressed(\n e: CustomEvent<{ x: number; y: number }>,\n ): void {\n this.hoverPaneController?.toggleHoverPane({\n coords: e.detail,\n enableTouchBackdrop: true,\n });\n }\n\n private get tile() {\n const {\n model,\n collectionPagePath,\n baseNavigationUrl,\n currentWidth,\n currentHeight,\n sortParam,\n creatorFilter,\n mobileBreakpoint,\n defaultSortParam,\n } = this;\n\n if (!model) return nothing;\n\n switch (this.tileDisplayMode) {\n case 'grid':\n switch (model.mediatype) {\n case 'collection':\n return html`<collection-tile\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .baseImageUrl=${this.baseImageUrl}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .creatorFilter=${creatorFilter}\n .suppressBlurring=${this.suppressBlurring}\n .isManageView=${this.isManageView}\n .layoutType=${this.layoutType}\n ?showInfoButton=${this.shouldShowInfoButton}\n @infoButtonPressed=${this.tileInfoButtonPressed}\n >\n </collection-tile>`;\n case 'account':\n return html`<account-tile\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .baseImageUrl=${this.baseImageUrl}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .creatorFilter=${creatorFilter}\n .suppressBlurring=${this.suppressBlurring}\n .isManageView=${this.isManageView}\n ?showInfoButton=${this.shouldShowInfoButton}\n @infoButtonPressed=${this.tileInfoButtonPressed}\n >\n </account-tile>`;\n case 'search':\n return html`<search-tile\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .baseImageUrl=${this.baseImageUrl}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .creatorFilter=${creatorFilter}\n .suppressBlurring=${this.suppressBlurring}\n .isManageView=${this.isManageView}\n ?showInfoButton=${false}\n @infoButtonPressed=${this.tileInfoButtonPressed}\n >\n </search-tile>`;\n default:\n return html`<item-tile\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .currentWidth=${this.currentWidth}\n .currentHeight=${this.currentHeight}\n .baseImageUrl=${this.baseImageUrl}\n .sortParam=${sortParam}\n .defaultSortParam=${defaultSortParam}\n .creatorFilter=${creatorFilter}\n .loggedIn=${this.loggedIn}\n .suppressBlurring=${this.suppressBlurring}\n .isManageView=${this.isManageView}\n .layoutType=${this.layoutType}\n ?showTvClips=${this.showTvClips}\n ?showInfoButton=${this.shouldShowInfoButton}\n ?useLocalTime=${this.useLocalTime}\n @infoButtonPressed=${this.tileInfoButtonPressed}\n >\n </item-tile>`;\n }\n case 'list-compact':\n return html`<tile-list-compact\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .baseNavigationUrl=${baseNavigationUrl}\n .sortParam=${sortParam}\n .defaultSortParam=${defaultSortParam}\n .creatorFilter=${creatorFilter}\n .mobileBreakpoint=${mobileBreakpoint}\n .baseImageUrl=${this.baseImageUrl}\n .loggedIn=${this.loggedIn}\n .suppressBlurring=${this.suppressBlurring}\n ?useLocalTime=${this.useLocalTime}\n >\n </tile-list-compact>`;\n case 'list-detail':\n return html`<tile-list\n .model=${model}\n .collectionPagePath=${collectionPagePath}\n .collectionTitles=${this.collectionTitles}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .baseNavigationUrl=${baseNavigationUrl}\n .sortParam=${sortParam}\n .defaultSortParam=${defaultSortParam}\n .creatorFilter=${creatorFilter}\n .mobileBreakpoint=${mobileBreakpoint}\n .baseImageUrl=${this.baseImageUrl}\n .loggedIn=${this.loggedIn}\n .suppressBlurring=${this.suppressBlurring}\n ?useLocalTime=${this.useLocalTime}\n >\n </tile-list>`;\n default:\n return nothing;\n }\n }\n\n static get styles() {\n return [\n srOnlyStyle,\n css`\n :host {\n display: block;\n height: 100%;\n }\n\n collection-tile {\n --tileBorderColor: #555555;\n --tileBackgroundColor: #666666;\n --imageBlockBackgroundColor: #666666;\n }\n\n account-tile {\n --tileBorderColor: #dddddd;\n --imageBlockBackgroundColor: #fcf5e6;\n }\n\n item-tile {\n --tileBorderColor: #dddddd;\n --imageBlockBackgroundColor: #f1f1f4;\n }\n\n search-tile {\n --tileBorderColor: #555555;\n --tileBackgroundColor: #666666;\n --imageBlockBackgroundColor: #666666;\n --iconFillColor: #2c2c2c;\n }\n\n #container {\n position: relative;\n height: 100%;\n border-radius: 4px;\n }\n\n #container.hoverable a:focus,\n #container.hoverable a:hover {\n box-shadow: var(\n --tileHoverBoxShadow,\n 0 0 6px 2px rgba(8, 8, 32, 0.8)\n );\n transition: box-shadow 0.1s ease;\n }\n\n a {\n display: block;\n height: 100%;\n color: unset;\n text-decoration: none;\n transition: transform 0.05s ease;\n border-radius: 4px;\n outline: none;\n }\n\n a :first-child {\n display: block;\n height: 100%;\n }\n\n .manage-check {\n position: absolute;\n right: 0;\n top: 0;\n border: 5px solid #2c2c2c;\n border-radius: 3px;\n background-color: #2c2c2c;\n z-index: 1;\n }\n\n .manage-check > input[type='checkbox'] {\n display: block;\n margin: 0;\n }\n\n #touch-backdrop {\n position: fixed;\n width: 100vw;\n height: 100vh;\n top: 0;\n left: 0;\n z-index: 2;\n background: transparent;\n }\n\n tile-hover-pane {\n position: absolute;\n top: 0;\n left: -9999px;\n z-index: 2;\n }\n `,\n ];\n }\n}\n"]}
|
|
@@ -92,7 +92,8 @@ export class TileDisplayValueProvider {
|
|
|
92
92
|
.toISOString()
|
|
93
93
|
.replace(/[TZ:-]/g, '')
|
|
94
94
|
.replace(/\..*/, '');
|
|
95
|
-
|
|
95
|
+
// url must not be percent-encoded — Wayback Machine matches on the raw URL
|
|
96
|
+
const captureHref = `https://web.archive.org/web/${captureDateStr}/${url}`;
|
|
96
97
|
const captureText = formatDate(date, 'long');
|
|
97
98
|
return html ` <a href=${captureHref}> ${captureText} </a> `;
|
|
98
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-display-value-provider.js","sourceRoot":"","sources":["../../../src/tiles/tile-display-value-provider.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tile-display-value-provider.js","sourceRoot":"","sources":["../../../src/tiles/tile-display-value-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { TemplateResult, html, nothing } from 'lit';\nimport { msg, str } from '@lit/localize';\nimport type { SortParam } from '@internetarchive/search-service';\nimport type { TileModel } from '../models';\nimport { formatDate } from '../utils/format-date';\n\n/**\n * A class encapsulating shared logic for converting model values into display values\n * across different types of tiles.\n */\nexport class TileDisplayValueProvider {\n private model?: TileModel;\n\n private baseNavigationUrl?: string;\n\n private collectionPagePath?: string;\n\n private sortParam?: SortParam;\n\n private creatorFilter?: string;\n\n constructor(\n options: {\n model?: TileModel;\n baseNavigationUrl?: string;\n collectionPagePath?: string;\n sortParam?: SortParam;\n creatorFilter?: string;\n } = {},\n ) {\n this.model = options.model;\n this.baseNavigationUrl = options.baseNavigationUrl;\n this.collectionPagePath = options.collectionPagePath ?? '/details/';\n this.sortParam = options.sortParam;\n this.creatorFilter = options.creatorFilter;\n }\n\n /**\n * Examines the creator(s) for the given tile model, returning\n * the first creator whose name matches the provided filter\n * (or simply the first creator overall if no filter is provided).\n */\n get firstCreatorMatchingFilter(): string | undefined {\n let matchingCreator;\n\n // If we're filtering by creator initial and have multiple creators, we want\n // to surface the first creator who matches the filter.\n if (this.creatorFilter && this.model?.creators.length) {\n const firstLetter = this.creatorFilter; // This is just to satisfy tsc\n matchingCreator = this.model.creators.find(creator =>\n // Decompose combining characters first, so that e.g., filtering on E matches É too.\n // Then remove anything that isn't strictly alphabetic, since our filters currently\n // only handle A-Z. The first such letter (if one exists) is what needs to match.\n creator\n .normalize('NFD')\n .replace(/[^A-Z]+/gi, '')\n .toUpperCase()\n .startsWith(firstLetter),\n );\n }\n\n return matchingCreator ?? this.model?.creator;\n }\n\n /**\n * The label indicating what year an account item was created.\n * E.g., \"Archivist since 2015\"\n */\n get accountLabel(): string {\n return this.model?.dateAdded\n ? msg(str`Archivist since ${this.model.dateAdded.getFullYear()}`)\n : '';\n }\n\n /**\n * The readable label for the current sort if it is a type of date sort,\n * or the empty string otherwise.\n */\n get dateLabel(): string {\n switch (this.sortParam?.field) {\n case 'publicdate':\n return msg('Archived');\n case 'reviewdate':\n return msg('Reviewed');\n case 'addeddate':\n return msg('Added');\n case 'date':\n return msg('Published');\n default:\n return '';\n }\n }\n\n /**\n * The readable label for the current views column, based on whether\n * weekly or all-time views are being shown.\n */\n get viewsLabel(): string {\n return this.sortParam?.field === 'week'\n ? msg('Weekly views')\n : msg('All-time views');\n }\n\n /**\n * Produces a URL pointing at the item page for the given identifier,\n * using the current base URL and the correct path based on whether the\n * item is specified to be a collection (default false).\n */\n itemPageUrl(\n identifier?: string,\n isCollection = false,\n ): string | typeof nothing {\n if (!identifier || this.baseNavigationUrl == null) return nothing;\n const basePath = isCollection ? this.collectionPagePath : '/details/';\n return `${this.baseNavigationUrl}${basePath}${identifier}`;\n }\n\n /**\n * Produces a template for a link to a single web capture of the given URL and date\n */\n webArchivesCaptureLink(url: string, date: Date): TemplateResult {\n // Convert the date into the format used to identify wayback captures (e.g., '20150102124550')\n const captureDateStr = date\n .toISOString()\n .replace(/[TZ:-]/g, '')\n .replace(/\\..*/, '');\n // url must not be percent-encoded — Wayback Machine matches on the raw URL\n const captureHref = `https://web.archive.org/web/${captureDateStr}/${url}`;\n const captureText = formatDate(date, 'long');\n\n return html` <a href=${captureHref}> ${captureText} </a> `;\n }\n}\n"]}
|
|
@@ -345,11 +345,11 @@ describe('Item Tile', () => {
|
|
|
345
345
|
expect(captureDatesUl?.children.length).to.equal(2);
|
|
346
346
|
const firstDateLink = captureDatesUl?.children[0]?.querySelector('a[href]');
|
|
347
347
|
expect(firstDateLink, 'first date link').to.exist;
|
|
348
|
-
expect(firstDateLink?.getAttribute('href')).to.equal('https://web.archive.org/web/20100102123456/https
|
|
348
|
+
expect(firstDateLink?.getAttribute('href')).to.equal('https://web.archive.org/web/20100102123456/https://example.com/');
|
|
349
349
|
expect(firstDateLink?.textContent?.trim()).to.equal('Jan 02, 2010');
|
|
350
350
|
const secondDateLink = captureDatesUl?.children[1]?.querySelector('a[href]');
|
|
351
351
|
expect(secondDateLink, 'second date link').to.exist;
|
|
352
|
-
expect(secondDateLink?.getAttribute('href')).to.equal('https://web.archive.org/web/20110203124321/https
|
|
352
|
+
expect(secondDateLink?.getAttribute('href')).to.equal('https://web.archive.org/web/20110203124321/https://example.com/');
|
|
353
353
|
expect(secondDateLink?.textContent?.trim()).to.equal('Feb 03, 2011');
|
|
354
354
|
});
|
|
355
355
|
it('should not render web captures if no title is present', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-tile.test.js","sourceRoot":"","sources":["../../../../test/tiles/grid/item-tile.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport sinon from 'sinon';\nimport { html } from 'lit';\nimport type { ItemTile } from '../../../src/tiles/grid/item-tile';\n\nimport '../../../src/tiles/grid/item-tile';\nimport type { TileModel } from '../../../src/models';\n\ndescribe('Item Tile', () => {\n it('should render initial component', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n const container = el.shadowRoot?.querySelector('.container');\n const tileDetails = el.shadowRoot?.querySelector('.tile-details');\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const itemTitle = el.shadowRoot?.querySelector('#title');\n const imageBlock = el.shadowRoot?.querySelector('image-block');\n\n expect(container).to.exist;\n expect(tileDetails).to.exist;\n expect(itemInfo).to.exist;\n expect(imageBlock).to.exist;\n expect(itemTitle).to.exist;\n });\n\n it('should render with created-by element', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ creator: 'someone' }}></item-tile>`,\n );\n\n const container = el.shadowRoot?.querySelector('.container');\n const tileDetails = el.shadowRoot?.querySelector('.tile-details');\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const truncatedCreatorText = createdBy?.querySelector('.truncated');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(container).to.exist;\n expect(tileDetails).to.exist;\n expect(itemInfo).to.exist;\n expect(createdBy).to.exist;\n expect(truncatedCreatorText).to.exist;\n expect(dateSortedBy).to.not.exist;\n });\n\n it('should not render with created-by but date element', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ datePublished: new Date() }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'date',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should not render with created-by but reviewdate element', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ dateReviewed: new Date() }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'reviewdate',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should not render with created-by but publicdate element', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ dateArchived: new Date() }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'publicdate',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should not render date-sorted-by element if date is not provided', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ dateArchived: undefined }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'publicdate',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.not.exist;\n });\n\n it('should render without created-by when sorting by a date field', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ dateAdded: new Date() }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'addeddate',\n direction: 'asc',\n };\n await el.updateComplete;\n\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(itemInfo).to.exist;\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should render with created-by when sort field is not a date', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ creator: 'someone' }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'week',\n direction: 'asc',\n };\n await el.updateComplete;\n\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(itemInfo).to.exist;\n expect(dateSortedBy).to.not.exist; // it should not exist because this is not a date sort\n expect(createdBy).to.exist;\n });\n\n it('should render published date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.contain(\n 'published Jan 02, 2012',\n );\n });\n\n it('should render added date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'addeddate', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.contain('added Jan 02, 2010');\n });\n\n it('should render archived date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'publicdate', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.contain(\n 'archived Jan 02, 2011',\n );\n });\n\n it('should render reviewed date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'reviewdate', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.contain(\n 'reviewed Jan 02, 2013',\n );\n });\n\n it('should only show the year for a date published of Jan 1 at midnight UTC', async () => {\n const model: Partial<TileModel> = {\n datePublished: new Date('2012-01-01T00:00:00Z'),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal('published 2012');\n });\n\n it('should show full date added/archived/reviewed, even on Jan 1 at midnight UTC', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 1, 0, 0, 0, 0),\n dateArchived: new Date(2011, 0, 1, 0, 0, 0, 0),\n datePublished: new Date(2012, 0, 1, 0, 0, 0, 0),\n dateReviewed: new Date(2013, 0, 1, 0, 0, 0, 0),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'addeddate', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n let dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal('added Jan 01, 2010');\n\n el.sortParam = { field: 'publicdate', direction: 'desc' };\n await el.updateComplete;\n dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal('archived Jan 01, 2011');\n\n el.sortParam = { field: 'reviewdate', direction: 'desc' };\n await el.updateComplete;\n dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal('reviewed Jan 01, 2013');\n });\n\n it('should display dates in UTC time zone by default', async () => {\n const model: Partial<TileModel> = {\n datePublished: new Date('2012-02-15T00:00:00Z'),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal(\n 'published Feb 15, 2012',\n );\n });\n\n it('should display dates in local time when useLocalTime option is true', async () => {\n // Expected behavior depends on the time zone offset where the testing occurs\n const offset = new Date().getTimezoneOffset();\n let datePublished, expected;\n if (offset > 0) {\n // Positive local time zone offsets have earlier local dates than UTC\n datePublished = new Date('2012-02-15T00:00:00Z');\n expected = 'published Feb 14, 2012';\n } else if (offset < 0) {\n // Negative local time zone offsets have later local dates than UTC\n datePublished = new Date('2012-02-15T23:59:59Z');\n expected = 'published Feb 16, 2012';\n } else {\n // Local time may just be UTC itself\n datePublished = new Date('2012-02-15T00:00:00Z');\n expected = 'published Feb 15, 2012';\n }\n\n const model: Partial<TileModel> = {\n datePublished,\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n useLocalTime\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal(expected);\n });\n\n it('should show the first creator matching the letter filter, if defined', async () => {\n const model: Partial<TileModel> = {\n creator: 'foo',\n creators: ['foo', 'bar', 'baz'],\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile .model=${model} .creatorFilter=${'B'}> </item-tile>\n `);\n\n const creator = el.shadowRoot?.querySelector('.created-by');\n expect(creator).to.exist;\n expect(creator?.textContent?.trim()).to.match(/by\\s+bar/);\n });\n\n it('should render with snippet block when it has snippets', async () => {\n const el = await fixture<ItemTile>(html`\n <item-tile .model=${{ snippets: ['some {{{snippet}}} text'] }}>\n </item-tile>\n `);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.exist;\n });\n\n it('should not render snippet block when no snippets are present', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.not.exist;\n });\n\n it('should render info button when showInfoButton flag is set', async () => {\n const el = await fixture<ItemTile>(html`\n <item-tile ?showInfoButton=${true}> </item-tile>\n `);\n\n const infoButton = el.shadowRoot?.querySelector('.info-button');\n\n expect(infoButton).to.exist;\n });\n\n it('should dispatch event when info button tapped', async () => {\n const infoButtonSpy = sinon.spy();\n const el = await fixture<ItemTile>(html`\n <item-tile ?showInfoButton=${true} @infoButtonPressed=${infoButtonSpy}>\n </item-tile>\n `);\n\n const infoButton = el.shadowRoot?.querySelector(\n '.info-button',\n ) as HTMLButtonElement;\n infoButton.click();\n await el.updateComplete;\n\n expect(infoButtonSpy.callCount).to.equal(1);\n });\n\n it('should render with volume/issue view', async () => {\n const el = await fixture<ItemTile>(html`\n <item-tile .model=${{ volume: '1', issue: 'Index' }}></item-tile>\n `);\n\n const volumeIssueBlock = el.shadowRoot?.querySelector('.volume-issue');\n\n expect(volumeIssueBlock).to.exist;\n });\n\n it('should render with volume/issue view to not render', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n const volumeIssueBlock = el.shadowRoot?.querySelector('.volume-issue');\n\n expect(volumeIssueBlock).to.not.exist;\n });\n\n it('should render web capture date links if present', async () => {\n const captureDates = [\n new Date('2010-01-02T12:34:56Z'),\n new Date('2011-02-03T12:43:21Z'),\n ];\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${{\n identifier: 'foo',\n title: 'https://example.com/',\n captureDates,\n }}\n ></item-tile>\n `);\n\n const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');\n expect(captureDatesUl, 'capture dates container').to.exist;\n expect(captureDatesUl?.children.length).to.equal(2);\n\n const firstDateLink = captureDatesUl?.children[0]?.querySelector('a[href]');\n expect(firstDateLink, 'first date link').to.exist;\n expect(firstDateLink?.getAttribute('href')).to.equal(\n 'https://web.archive.org/web/20100102123456/https%3A%2F%2Fexample.com%2F',\n );\n expect(firstDateLink?.textContent?.trim()).to.equal('Jan 02, 2010');\n\n const secondDateLink =\n captureDatesUl?.children[1]?.querySelector('a[href]');\n expect(secondDateLink, 'second date link').to.exist;\n expect(secondDateLink?.getAttribute('href')).to.equal(\n 'https://web.archive.org/web/20110203124321/https%3A%2F%2Fexample.com%2F',\n );\n expect(secondDateLink?.textContent?.trim()).to.equal('Feb 03, 2011');\n });\n\n it('should not render web captures if no title is present', async () => {\n const captureDates = [\n new Date('2010-01-02T12:34:56Z'),\n new Date('2011-02-03T12:43:21Z'),\n ];\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${{\n identifier: 'foo',\n captureDates,\n }}\n ></item-tile>\n `);\n\n const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');\n expect(captureDatesUl).not.to.exist;\n });\n\n it('should render review snippet if present', async () => {\n const review = {\n title: 'Foo',\n body: 'foo bar baz',\n stars: 3,\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${{\n identifier: 'foo',\n review,\n }}\n ></item-tile>\n `);\n\n const reviewBlock = el.shadowRoot?.querySelector('review-block');\n expect(reviewBlock).to.exist;\n });\n\n it('should not render review snippet block when no review is present', async () => {\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${{\n identifier: 'foo',\n }}\n ></item-tile>\n `);\n\n const reviewBlock = el.shadowRoot?.querySelector('review-block');\n expect(reviewBlock).not.to.exist;\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"item-tile.test.js","sourceRoot":"","sources":["../../../../test/tiles/grid/item-tile.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport sinon from 'sinon';\nimport { html } from 'lit';\nimport type { ItemTile } from '../../../src/tiles/grid/item-tile';\n\nimport '../../../src/tiles/grid/item-tile';\nimport type { TileModel } from '../../../src/models';\n\ndescribe('Item Tile', () => {\n it('should render initial component', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n const container = el.shadowRoot?.querySelector('.container');\n const tileDetails = el.shadowRoot?.querySelector('.tile-details');\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const itemTitle = el.shadowRoot?.querySelector('#title');\n const imageBlock = el.shadowRoot?.querySelector('image-block');\n\n expect(container).to.exist;\n expect(tileDetails).to.exist;\n expect(itemInfo).to.exist;\n expect(imageBlock).to.exist;\n expect(itemTitle).to.exist;\n });\n\n it('should render with created-by element', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ creator: 'someone' }}></item-tile>`,\n );\n\n const container = el.shadowRoot?.querySelector('.container');\n const tileDetails = el.shadowRoot?.querySelector('.tile-details');\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const truncatedCreatorText = createdBy?.querySelector('.truncated');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(container).to.exist;\n expect(tileDetails).to.exist;\n expect(itemInfo).to.exist;\n expect(createdBy).to.exist;\n expect(truncatedCreatorText).to.exist;\n expect(dateSortedBy).to.not.exist;\n });\n\n it('should not render with created-by but date element', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ datePublished: new Date() }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'date',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should not render with created-by but reviewdate element', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ dateReviewed: new Date() }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'reviewdate',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should not render with created-by but publicdate element', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ dateArchived: new Date() }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'publicdate',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should not render date-sorted-by element if date is not provided', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ dateArchived: undefined }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'publicdate',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.not.exist;\n });\n\n it('should render without created-by when sorting by a date field', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ dateAdded: new Date() }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'addeddate',\n direction: 'asc',\n };\n await el.updateComplete;\n\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(itemInfo).to.exist;\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should render with created-by when sort field is not a date', async () => {\n const el = await fixture<ItemTile>(\n html`<item-tile .model=${{ creator: 'someone' }}></item-tile>`,\n );\n\n el.sortParam = {\n field: 'week',\n direction: 'asc',\n };\n await el.updateComplete;\n\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(itemInfo).to.exist;\n expect(dateSortedBy).to.not.exist; // it should not exist because this is not a date sort\n expect(createdBy).to.exist;\n });\n\n it('should render published date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.contain(\n 'published Jan 02, 2012',\n );\n });\n\n it('should render added date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'addeddate', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.contain('added Jan 02, 2010');\n });\n\n it('should render archived date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'publicdate', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.contain(\n 'archived Jan 02, 2011',\n );\n });\n\n it('should render reviewed date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'reviewdate', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.contain(\n 'reviewed Jan 02, 2013',\n );\n });\n\n it('should only show the year for a date published of Jan 1 at midnight UTC', async () => {\n const model: Partial<TileModel> = {\n datePublished: new Date('2012-01-01T00:00:00Z'),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal('published 2012');\n });\n\n it('should show full date added/archived/reviewed, even on Jan 1 at midnight UTC', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 1, 0, 0, 0, 0),\n dateArchived: new Date(2011, 0, 1, 0, 0, 0, 0),\n datePublished: new Date(2012, 0, 1, 0, 0, 0, 0),\n dateReviewed: new Date(2013, 0, 1, 0, 0, 0, 0),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'addeddate', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n let dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal('added Jan 01, 2010');\n\n el.sortParam = { field: 'publicdate', direction: 'desc' };\n await el.updateComplete;\n dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal('archived Jan 01, 2011');\n\n el.sortParam = { field: 'reviewdate', direction: 'desc' };\n await el.updateComplete;\n dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal('reviewed Jan 01, 2013');\n });\n\n it('should display dates in UTC time zone by default', async () => {\n const model: Partial<TileModel> = {\n datePublished: new Date('2012-02-15T00:00:00Z'),\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal(\n 'published Feb 15, 2012',\n );\n });\n\n it('should display dates in local time when useLocalTime option is true', async () => {\n // Expected behavior depends on the time zone offset where the testing occurs\n const offset = new Date().getTimezoneOffset();\n let datePublished, expected;\n if (offset > 0) {\n // Positive local time zone offsets have earlier local dates than UTC\n datePublished = new Date('2012-02-15T00:00:00Z');\n expected = 'published Feb 14, 2012';\n } else if (offset < 0) {\n // Negative local time zone offsets have later local dates than UTC\n datePublished = new Date('2012-02-15T23:59:59Z');\n expected = 'published Feb 16, 2012';\n } else {\n // Local time may just be UTC itself\n datePublished = new Date('2012-02-15T00:00:00Z');\n expected = 'published Feb 15, 2012';\n }\n\n const model: Partial<TileModel> = {\n datePublished,\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n useLocalTime\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </item-tile>\n `);\n\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n expect(dateSortedBy).to.exist;\n expect(dateSortedBy?.textContent?.trim()).to.equal(expected);\n });\n\n it('should show the first creator matching the letter filter, if defined', async () => {\n const model: Partial<TileModel> = {\n creator: 'foo',\n creators: ['foo', 'bar', 'baz'],\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile .model=${model} .creatorFilter=${'B'}> </item-tile>\n `);\n\n const creator = el.shadowRoot?.querySelector('.created-by');\n expect(creator).to.exist;\n expect(creator?.textContent?.trim()).to.match(/by\\s+bar/);\n });\n\n it('should render with snippet block when it has snippets', async () => {\n const el = await fixture<ItemTile>(html`\n <item-tile .model=${{ snippets: ['some {{{snippet}}} text'] }}>\n </item-tile>\n `);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.exist;\n });\n\n it('should not render snippet block when no snippets are present', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.not.exist;\n });\n\n it('should render info button when showInfoButton flag is set', async () => {\n const el = await fixture<ItemTile>(html`\n <item-tile ?showInfoButton=${true}> </item-tile>\n `);\n\n const infoButton = el.shadowRoot?.querySelector('.info-button');\n\n expect(infoButton).to.exist;\n });\n\n it('should dispatch event when info button tapped', async () => {\n const infoButtonSpy = sinon.spy();\n const el = await fixture<ItemTile>(html`\n <item-tile ?showInfoButton=${true} @infoButtonPressed=${infoButtonSpy}>\n </item-tile>\n `);\n\n const infoButton = el.shadowRoot?.querySelector(\n '.info-button',\n ) as HTMLButtonElement;\n infoButton.click();\n await el.updateComplete;\n\n expect(infoButtonSpy.callCount).to.equal(1);\n });\n\n it('should render with volume/issue view', async () => {\n const el = await fixture<ItemTile>(html`\n <item-tile .model=${{ volume: '1', issue: 'Index' }}></item-tile>\n `);\n\n const volumeIssueBlock = el.shadowRoot?.querySelector('.volume-issue');\n\n expect(volumeIssueBlock).to.exist;\n });\n\n it('should render with volume/issue view to not render', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n const volumeIssueBlock = el.shadowRoot?.querySelector('.volume-issue');\n\n expect(volumeIssueBlock).to.not.exist;\n });\n\n it('should render web capture date links if present', async () => {\n const captureDates = [\n new Date('2010-01-02T12:34:56Z'),\n new Date('2011-02-03T12:43:21Z'),\n ];\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${{\n identifier: 'foo',\n title: 'https://example.com/',\n captureDates,\n }}\n ></item-tile>\n `);\n\n const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');\n expect(captureDatesUl, 'capture dates container').to.exist;\n expect(captureDatesUl?.children.length).to.equal(2);\n\n const firstDateLink = captureDatesUl?.children[0]?.querySelector('a[href]');\n expect(firstDateLink, 'first date link').to.exist;\n expect(firstDateLink?.getAttribute('href')).to.equal(\n 'https://web.archive.org/web/20100102123456/https://example.com/',\n );\n expect(firstDateLink?.textContent?.trim()).to.equal('Jan 02, 2010');\n\n const secondDateLink =\n captureDatesUl?.children[1]?.querySelector('a[href]');\n expect(secondDateLink, 'second date link').to.exist;\n expect(secondDateLink?.getAttribute('href')).to.equal(\n 'https://web.archive.org/web/20110203124321/https://example.com/',\n );\n expect(secondDateLink?.textContent?.trim()).to.equal('Feb 03, 2011');\n });\n\n it('should not render web captures if no title is present', async () => {\n const captureDates = [\n new Date('2010-01-02T12:34:56Z'),\n new Date('2011-02-03T12:43:21Z'),\n ];\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${{\n identifier: 'foo',\n captureDates,\n }}\n ></item-tile>\n `);\n\n const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');\n expect(captureDatesUl).not.to.exist;\n });\n\n it('should render review snippet if present', async () => {\n const review = {\n title: 'Foo',\n body: 'foo bar baz',\n stars: 3,\n };\n\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${{\n identifier: 'foo',\n review,\n }}\n ></item-tile>\n `);\n\n const reviewBlock = el.shadowRoot?.querySelector('review-block');\n expect(reviewBlock).to.exist;\n });\n\n it('should not render review snippet block when no review is present', async () => {\n const el = await fixture<ItemTile>(html`\n <item-tile\n .model=${{\n identifier: 'foo',\n }}\n ></item-tile>\n `);\n\n const reviewBlock = el.shadowRoot?.querySelector('review-block');\n expect(reviewBlock).not.to.exist;\n });\n});\n"]}
|
|
@@ -405,11 +405,11 @@ describe('List Tile', () => {
|
|
|
405
405
|
expect(captureDatesUl?.children.length).to.equal(2);
|
|
406
406
|
const firstDateLink = captureDatesUl?.children[0]?.querySelector('a[href]');
|
|
407
407
|
expect(firstDateLink, 'first date link').to.exist;
|
|
408
|
-
expect(firstDateLink?.getAttribute('href')).to.equal('https://web.archive.org/web/20100102123456/https
|
|
408
|
+
expect(firstDateLink?.getAttribute('href')).to.equal('https://web.archive.org/web/20100102123456/https://example.com/');
|
|
409
409
|
expect(firstDateLink?.textContent?.trim()).to.equal('Jan 02, 2010');
|
|
410
410
|
const secondDateLink = captureDatesUl?.children[1]?.querySelector('a[href]');
|
|
411
411
|
expect(secondDateLink, 'second date link').to.exist;
|
|
412
|
-
expect(secondDateLink?.getAttribute('href')).to.equal('https://web.archive.org/web/20110203124321/https
|
|
412
|
+
expect(secondDateLink?.getAttribute('href')).to.equal('https://web.archive.org/web/20110203124321/https://example.com/');
|
|
413
413
|
expect(secondDateLink?.textContent?.trim()).to.equal('Feb 03, 2011');
|
|
414
414
|
});
|
|
415
415
|
it('should not render web captures if no title is present', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-list.test.js","sourceRoot":"","sources":["../../../../test/tiles/list/tile-list.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { TileList } from '../../../src/tiles/list/tile-list';\n\nimport '../../../src/tiles/list/tile-list';\nimport type { TileModel } from '../../../src/models';\n\ndescribe('List Tile', () => {\n it('should render initial component', async () => {\n const el = await fixture<TileList>(\n html`<tile-list .model=${{}}></tile-list>`,\n );\n\n const listContainer = el.shadowRoot?.querySelector('#list-line');\n const itemTitle = el.shadowRoot?.querySelector('#title');\n const imageBlock = el.shadowRoot?.querySelector('image-block');\n\n expect(listContainer).to.exist;\n expect(itemTitle).to.exist;\n expect(imageBlock).to.exist;\n });\n\n it('should render the mobile template if below mobile breakpoint', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .mobileBreakpoint=${500} .currentWidth=${400}> </tile-list>\n `);\n\n const listContainer = el.shadowRoot?.getElementById('list-line');\n const topLine = el.shadowRoot?.getElementById('list-line-top');\n const bottomLine = el.shadowRoot?.getElementById('list-line-bottom');\n\n expect(listContainer).to.exist;\n expect(listContainer?.classList.contains('mobile')).to.be.true;\n expect(topLine).to.exist;\n expect(bottomLine).to.exist;\n });\n\n it('should render title link with model href if provided', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${''}\n .model=${{ title: 'foo', href: '/foo/bar' }}\n ></tile-list>\n `);\n\n const title = el.shadowRoot?.querySelector('#title > a');\n\n expect(title).to.exist;\n expect(title?.getAttribute('href')).to.equal('/foo/bar');\n });\n\n it('should add title to image link if provided', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${''}\n .model=${{ title: 'foo', href: '/foo/bar' }}\n ></tile-list>\n `);\n\n const imageLink = el.shadowRoot?.querySelector('#image-link');\n\n expect(imageLink).to.exist;\n expect(imageLink?.getAttribute('title')).to.equal('View foo');\n });\n\n it('should render with creator element but not dates', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ creators: ['someone'] }}></tile-list>\n `);\n\n const creator = el.shadowRoot?.querySelector('#creator');\n const datesLine = el.shadowRoot?.querySelector('#dates-line');\n\n expect(creator).to.exist;\n expect(datesLine?.children.length).to.equal(0);\n });\n\n it('should render with snippet block when it has snippets', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ snippets: ['some {{{snippet}}} text'] }}>\n </tile-list>\n `);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.exist;\n });\n\n it('should not render snippet block when no snippets are present', async () => {\n const el = await fixture<TileList>(html`<tile-list></tile-list>`);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.not.exist;\n });\n\n it('should not render suppressed collections', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ collections: ['deemphasize', 'community', 'foo'] }}\n .baseNavigationUrl=${'base'}\n >\n </tile-list>\n `);\n\n const collectionsRow = el.shadowRoot?.getElementById('collections');\n expect(collectionsRow).to.exist;\n\n const collectionLinks = collectionsRow?.querySelectorAll('a[href]');\n expect(collectionLinks?.length).to.equal(1);\n expect(collectionLinks?.item(0).getAttribute('href')).to.equal(\n 'base/details/foo',\n );\n });\n\n it('should not render fav- collections', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ collections: ['fav-foo', 'bar'] }}\n .baseNavigationUrl=${'base'}\n >\n </tile-list>\n `);\n\n const collectionsRow = el.shadowRoot?.getElementById('collections');\n expect(collectionsRow).to.exist;\n\n const collectionLinks = collectionsRow?.querySelectorAll('a[href]');\n expect(collectionLinks?.length).to.equal(1);\n expect(collectionLinks?.item(0).getAttribute('href')).to.equal(\n 'base/details/bar',\n );\n });\n\n it('should render weekly views when sorting by week', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ viewCount: 50, weeklyViewCount: 10 }}\n .sortParam=${{ field: 'week', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const viewsRow = el.shadowRoot?.getElementById('views-line');\n expect(viewsRow).to.exist;\n expect(viewsRow?.textContent?.trim()).to.equal('Weekly views: 10');\n });\n\n it('should render all-time views when sorting by non-week field', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ viewCount: 50, weeklyViewCount: 10 }}\n .sortParam=${{ field: 'downloads', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const viewsRow = el.shadowRoot?.getElementById('views-line');\n expect(viewsRow).to.exist;\n expect(viewsRow?.textContent?.trim()).to.equal('All-time views: 50');\n });\n\n it('should render all-time views with no sort param', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ viewCount: 50, weeklyViewCount: 10 }}> </tile-list>\n `);\n\n const viewsRow = el.shadowRoot?.getElementById('views-line');\n expect(viewsRow).to.exist;\n expect(viewsRow?.textContent?.trim()).to.equal('All-time views: 50');\n });\n\n it('should render published date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Published: Jan 02, 2012');\n });\n\n it('should render added date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'addeddate', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Added: Jan 02, 2010');\n });\n\n it('should render archived date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'publicdate', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Archived: Jan 02, 2011');\n });\n\n it('should render reviewed date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'reviewdate', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Reviewed: Jan 02, 2013');\n });\n\n it('should only show the year for a date published of Jan 1 at midnight UTC', async () => {\n const model: Partial<TileModel> = {\n datePublished: new Date('2012-01-01T00:00:00Z'),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Published: 2012');\n });\n\n it('should show full date added/archived/reviewed, even on Jan 1 at midnight UTC', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 1, 0, 0, 0, 0),\n dateArchived: new Date(2011, 0, 1, 0, 0, 0, 0),\n datePublished: new Date(2012, 0, 1, 0, 0, 0, 0),\n dateReviewed: new Date(2013, 0, 1, 0, 0, 0, 0),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'addeddate', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n let dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Added: Jan 01, 2010');\n\n el.sortParam = { field: 'publicdate', direction: 'desc' };\n await el.updateComplete;\n dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Archived: Jan 01, 2011');\n\n el.sortParam = { field: 'reviewdate', direction: 'desc' };\n await el.updateComplete;\n dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Reviewed: Jan 01, 2013');\n });\n\n it('should display dates in UTC time zone by default', async () => {\n const model: Partial<TileModel> = {\n datePublished: new Date('2012-02-15T00:00:00Z'),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Published: Feb 15, 2012');\n });\n\n it('should display dates in local time when useLocalTime option is true', async () => {\n // Expected behavior depends on the time zone offset where the testing occurs\n const offset = new Date().getTimezoneOffset();\n let datePublished, expected;\n if (offset > 0) {\n // Positive local time zone offsets have earlier local dates than UTC\n datePublished = new Date('2012-02-15T00:00:00Z');\n expected = 'Published: Feb 14, 2012';\n } else if (offset < 0) {\n // Negative local time zone offsets have later local dates than UTC\n datePublished = new Date('2012-02-15T23:59:59Z');\n expected = 'Published: Feb 16, 2012';\n } else {\n // Local time may just be UTC itself\n datePublished = new Date('2012-02-15T00:00:00Z');\n expected = 'Published: Feb 15, 2012';\n }\n\n const model: Partial<TileModel> = {\n datePublished,\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n useLocalTime\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n\n expect(dateRow?.textContent?.trim()).to.contain(expected);\n });\n\n it('should render links to /search pages (not search.php) for subject, creator, and source', async () => {\n const model: Partial<TileModel> = {\n subjects: ['foo'],\n creators: ['bar'],\n source: 'baz',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list .model=${model}></tile-list>\n `);\n\n const subjectLink = el.shadowRoot?.querySelector('#topics a[href]');\n expect(subjectLink).to.exist;\n expect(subjectLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('subject:\"foo\"')}`,\n );\n\n const creatorLink = el.shadowRoot?.querySelector('#creator a[href]');\n expect(creatorLink).to.exist;\n expect(creatorLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('creator:\"bar\"')}`,\n );\n\n const sourceLink = el.shadowRoot?.querySelector('#source a[href]');\n expect(sourceLink).to.exist;\n expect(sourceLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('source:\"baz\"')}`,\n );\n });\n\n it('should render multi-line descriptions with spaces b/w lines', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ description: 'line1\\nline2' }}> </tile-list>\n `);\n\n const descriptionBlock = el.shadowRoot?.getElementById('description');\n expect(descriptionBlock).to.exist;\n expect(descriptionBlock?.textContent?.trim()).to.equal('line1 line2'); // line break replaced by space\n });\n\n it('should render mediatype icon as link to corresponding mediatype collection details', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'texts',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${'https://archive.org'}\n .model=${model}\n ></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).to.equal(\n `https://archive.org/details/texts`,\n );\n expect(mediatypeLink?.getAttribute('title')).to.equal('See more: texts');\n });\n\n it('should render mediatype icon as link even with empty baseNavigationUrl', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'texts',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list .baseNavigationUrl=${''} .model=${model}></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).to.equal(`/details/texts`);\n });\n\n it('should render collection mediatype icon as link to search page', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'collection',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${'https://archive.org'}\n .model=${model}\n ></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).to.equal(\n `https://archive.org/search?query=mediatype:collection&sort=-downloads`,\n );\n });\n\n it('should not render account mediatype icon as link', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'account',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${'https://archive.org'}\n .model=${model}\n ></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).not.to.exist;\n });\n\n it('should render date added for accounts', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n mediatype: 'account',\n dateAdded: new Date('2015-05-05T00:00:00'),\n }}\n >\n </tile-list>\n `);\n\n const creatorBlock = el.shadowRoot?.getElementById('creator');\n expect(creatorBlock).to.exist;\n expect(creatorBlock?.textContent?.trim()).to.equal('Archivist since 2015');\n });\n\n it('should render web capture date links if present', async () => {\n const captureDates = [\n new Date('2010-01-02T12:34:56Z'),\n new Date('2011-02-03T12:43:21Z'),\n ];\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n identifier: 'foo',\n title: 'https://example.com/',\n captureDates,\n }}\n ></tile-list>\n `);\n\n const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');\n expect(captureDatesUl, 'capture dates container').to.exist;\n expect(captureDatesUl?.children.length).to.equal(2);\n\n const firstDateLink = captureDatesUl?.children[0]?.querySelector('a[href]');\n expect(firstDateLink, 'first date link').to.exist;\n expect(firstDateLink?.getAttribute('href')).to.equal(\n 'https://web.archive.org/web/20100102123456/https%3A%2F%2Fexample.com%2F',\n );\n expect(firstDateLink?.textContent?.trim()).to.equal('Jan 02, 2010');\n\n const secondDateLink =\n captureDatesUl?.children[1]?.querySelector('a[href]');\n expect(secondDateLink, 'second date link').to.exist;\n expect(secondDateLink?.getAttribute('href')).to.equal(\n 'https://web.archive.org/web/20110203124321/https%3A%2F%2Fexample.com%2F',\n );\n expect(secondDateLink?.textContent?.trim()).to.equal('Feb 03, 2011');\n });\n\n it('should not render web captures if no title is present', async () => {\n const captureDates = [\n new Date('2010-01-02T12:34:56Z'),\n new Date('2011-02-03T12:43:21Z'),\n ];\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n identifier: 'foo',\n captureDates,\n }}\n ></tile-list>\n `);\n\n const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');\n expect(captureDatesUl).not.to.exist;\n });\n\n it('should render review snippet if present', async () => {\n const review = {\n title: 'Foo',\n body: 'foo bar baz',\n stars: 3,\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n identifier: 'foo',\n review,\n }}\n ></tile-list>\n `);\n\n const reviewBlock = el.shadowRoot?.querySelector('review-block');\n expect(reviewBlock).to.exist;\n });\n\n it('should not render review snippet block when no review is present', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n identifier: 'foo',\n }}\n ></tile-list>\n `);\n\n const reviewBlock = el.shadowRoot?.querySelector('review-block');\n expect(reviewBlock).not.to.exist;\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tile-list.test.js","sourceRoot":"","sources":["../../../../test/tiles/list/tile-list.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { TileList } from '../../../src/tiles/list/tile-list';\n\nimport '../../../src/tiles/list/tile-list';\nimport type { TileModel } from '../../../src/models';\n\ndescribe('List Tile', () => {\n it('should render initial component', async () => {\n const el = await fixture<TileList>(\n html`<tile-list .model=${{}}></tile-list>`,\n );\n\n const listContainer = el.shadowRoot?.querySelector('#list-line');\n const itemTitle = el.shadowRoot?.querySelector('#title');\n const imageBlock = el.shadowRoot?.querySelector('image-block');\n\n expect(listContainer).to.exist;\n expect(itemTitle).to.exist;\n expect(imageBlock).to.exist;\n });\n\n it('should render the mobile template if below mobile breakpoint', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .mobileBreakpoint=${500} .currentWidth=${400}> </tile-list>\n `);\n\n const listContainer = el.shadowRoot?.getElementById('list-line');\n const topLine = el.shadowRoot?.getElementById('list-line-top');\n const bottomLine = el.shadowRoot?.getElementById('list-line-bottom');\n\n expect(listContainer).to.exist;\n expect(listContainer?.classList.contains('mobile')).to.be.true;\n expect(topLine).to.exist;\n expect(bottomLine).to.exist;\n });\n\n it('should render title link with model href if provided', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${''}\n .model=${{ title: 'foo', href: '/foo/bar' }}\n ></tile-list>\n `);\n\n const title = el.shadowRoot?.querySelector('#title > a');\n\n expect(title).to.exist;\n expect(title?.getAttribute('href')).to.equal('/foo/bar');\n });\n\n it('should add title to image link if provided', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${''}\n .model=${{ title: 'foo', href: '/foo/bar' }}\n ></tile-list>\n `);\n\n const imageLink = el.shadowRoot?.querySelector('#image-link');\n\n expect(imageLink).to.exist;\n expect(imageLink?.getAttribute('title')).to.equal('View foo');\n });\n\n it('should render with creator element but not dates', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ creators: ['someone'] }}></tile-list>\n `);\n\n const creator = el.shadowRoot?.querySelector('#creator');\n const datesLine = el.shadowRoot?.querySelector('#dates-line');\n\n expect(creator).to.exist;\n expect(datesLine?.children.length).to.equal(0);\n });\n\n it('should render with snippet block when it has snippets', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ snippets: ['some {{{snippet}}} text'] }}>\n </tile-list>\n `);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.exist;\n });\n\n it('should not render snippet block when no snippets are present', async () => {\n const el = await fixture<TileList>(html`<tile-list></tile-list>`);\n\n const snippetBlock = el.shadowRoot?.querySelector('text-snippet-block');\n\n expect(snippetBlock).to.not.exist;\n });\n\n it('should not render suppressed collections', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ collections: ['deemphasize', 'community', 'foo'] }}\n .baseNavigationUrl=${'base'}\n >\n </tile-list>\n `);\n\n const collectionsRow = el.shadowRoot?.getElementById('collections');\n expect(collectionsRow).to.exist;\n\n const collectionLinks = collectionsRow?.querySelectorAll('a[href]');\n expect(collectionLinks?.length).to.equal(1);\n expect(collectionLinks?.item(0).getAttribute('href')).to.equal(\n 'base/details/foo',\n );\n });\n\n it('should not render fav- collections', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ collections: ['fav-foo', 'bar'] }}\n .baseNavigationUrl=${'base'}\n >\n </tile-list>\n `);\n\n const collectionsRow = el.shadowRoot?.getElementById('collections');\n expect(collectionsRow).to.exist;\n\n const collectionLinks = collectionsRow?.querySelectorAll('a[href]');\n expect(collectionLinks?.length).to.equal(1);\n expect(collectionLinks?.item(0).getAttribute('href')).to.equal(\n 'base/details/bar',\n );\n });\n\n it('should render weekly views when sorting by week', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ viewCount: 50, weeklyViewCount: 10 }}\n .sortParam=${{ field: 'week', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const viewsRow = el.shadowRoot?.getElementById('views-line');\n expect(viewsRow).to.exist;\n expect(viewsRow?.textContent?.trim()).to.equal('Weekly views: 10');\n });\n\n it('should render all-time views when sorting by non-week field', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{ viewCount: 50, weeklyViewCount: 10 }}\n .sortParam=${{ field: 'downloads', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const viewsRow = el.shadowRoot?.getElementById('views-line');\n expect(viewsRow).to.exist;\n expect(viewsRow?.textContent?.trim()).to.equal('All-time views: 50');\n });\n\n it('should render all-time views with no sort param', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ viewCount: 50, weeklyViewCount: 10 }}> </tile-list>\n `);\n\n const viewsRow = el.shadowRoot?.getElementById('views-line');\n expect(viewsRow).to.exist;\n expect(viewsRow?.textContent?.trim()).to.equal('All-time views: 50');\n });\n\n it('should render published date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Published: Jan 02, 2012');\n });\n\n it('should render added date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'addeddate', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Added: Jan 02, 2010');\n });\n\n it('should render archived date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'publicdate', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Archived: Jan 02, 2011');\n });\n\n it('should render reviewed date when sorting by it', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 2),\n dateArchived: new Date(2011, 0, 2),\n datePublished: new Date(2012, 0, 2),\n dateReviewed: new Date(2013, 0, 2),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'reviewdate', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Reviewed: Jan 02, 2013');\n });\n\n it('should only show the year for a date published of Jan 1 at midnight UTC', async () => {\n const model: Partial<TileModel> = {\n datePublished: new Date('2012-01-01T00:00:00Z'),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Published: 2012');\n });\n\n it('should show full date added/archived/reviewed, even on Jan 1 at midnight UTC', async () => {\n const model: Partial<TileModel> = {\n dateAdded: new Date(2010, 0, 1, 0, 0, 0, 0),\n dateArchived: new Date(2011, 0, 1, 0, 0, 0, 0),\n datePublished: new Date(2012, 0, 1, 0, 0, 0, 0),\n dateReviewed: new Date(2013, 0, 1, 0, 0, 0, 0),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'addeddate', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n let dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Added: Jan 01, 2010');\n\n el.sortParam = { field: 'publicdate', direction: 'desc' };\n await el.updateComplete;\n dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Archived: Jan 01, 2011');\n\n el.sortParam = { field: 'reviewdate', direction: 'desc' };\n await el.updateComplete;\n dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Reviewed: Jan 01, 2013');\n });\n\n it('should display dates in UTC time zone by default', async () => {\n const model: Partial<TileModel> = {\n datePublished: new Date('2012-02-15T00:00:00Z'),\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n expect(dateRow?.textContent?.trim()).to.contain('Published: Feb 15, 2012');\n });\n\n it('should display dates in local time when useLocalTime option is true', async () => {\n // Expected behavior depends on the time zone offset where the testing occurs\n const offset = new Date().getTimezoneOffset();\n let datePublished, expected;\n if (offset > 0) {\n // Positive local time zone offsets have earlier local dates than UTC\n datePublished = new Date('2012-02-15T00:00:00Z');\n expected = 'Published: Feb 14, 2012';\n } else if (offset < 0) {\n // Negative local time zone offsets have later local dates than UTC\n datePublished = new Date('2012-02-15T23:59:59Z');\n expected = 'Published: Feb 16, 2012';\n } else {\n // Local time may just be UTC itself\n datePublished = new Date('2012-02-15T00:00:00Z');\n expected = 'Published: Feb 15, 2012';\n }\n\n const model: Partial<TileModel> = {\n datePublished,\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n useLocalTime\n .model=${model}\n .sortParam=${{ field: 'date', direction: 'desc' }}\n >\n </tile-list>\n `);\n\n const dateRow = el.shadowRoot?.getElementById('dates-line');\n expect(dateRow).to.exist;\n\n expect(dateRow?.textContent?.trim()).to.contain(expected);\n });\n\n it('should render links to /search pages (not search.php) for subject, creator, and source', async () => {\n const model: Partial<TileModel> = {\n subjects: ['foo'],\n creators: ['bar'],\n source: 'baz',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list .model=${model}></tile-list>\n `);\n\n const subjectLink = el.shadowRoot?.querySelector('#topics a[href]');\n expect(subjectLink).to.exist;\n expect(subjectLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('subject:\"foo\"')}`,\n );\n\n const creatorLink = el.shadowRoot?.querySelector('#creator a[href]');\n expect(creatorLink).to.exist;\n expect(creatorLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('creator:\"bar\"')}`,\n );\n\n const sourceLink = el.shadowRoot?.querySelector('#source a[href]');\n expect(sourceLink).to.exist;\n expect(sourceLink?.getAttribute('href')).to.equal(\n `/search?query=${encodeURIComponent('source:\"baz\"')}`,\n );\n });\n\n it('should render multi-line descriptions with spaces b/w lines', async () => {\n const el = await fixture<TileList>(html`\n <tile-list .model=${{ description: 'line1\\nline2' }}> </tile-list>\n `);\n\n const descriptionBlock = el.shadowRoot?.getElementById('description');\n expect(descriptionBlock).to.exist;\n expect(descriptionBlock?.textContent?.trim()).to.equal('line1 line2'); // line break replaced by space\n });\n\n it('should render mediatype icon as link to corresponding mediatype collection details', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'texts',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${'https://archive.org'}\n .model=${model}\n ></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).to.equal(\n `https://archive.org/details/texts`,\n );\n expect(mediatypeLink?.getAttribute('title')).to.equal('See more: texts');\n });\n\n it('should render mediatype icon as link even with empty baseNavigationUrl', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'texts',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list .baseNavigationUrl=${''} .model=${model}></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).to.equal(`/details/texts`);\n });\n\n it('should render collection mediatype icon as link to search page', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'collection',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${'https://archive.org'}\n .model=${model}\n ></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).to.equal(\n `https://archive.org/search?query=mediatype:collection&sort=-downloads`,\n );\n });\n\n it('should not render account mediatype icon as link', async () => {\n const model: Partial<TileModel> = {\n mediatype: 'account',\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .baseNavigationUrl=${'https://archive.org'}\n .model=${model}\n ></tile-list>\n `);\n\n const mediatypeLink = el.shadowRoot?.querySelector('a#icon-right');\n expect(mediatypeLink).to.exist;\n expect(mediatypeLink?.getAttribute('href')).not.to.exist;\n });\n\n it('should render date added for accounts', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n mediatype: 'account',\n dateAdded: new Date('2015-05-05T00:00:00'),\n }}\n >\n </tile-list>\n `);\n\n const creatorBlock = el.shadowRoot?.getElementById('creator');\n expect(creatorBlock).to.exist;\n expect(creatorBlock?.textContent?.trim()).to.equal('Archivist since 2015');\n });\n\n it('should render web capture date links if present', async () => {\n const captureDates = [\n new Date('2010-01-02T12:34:56Z'),\n new Date('2011-02-03T12:43:21Z'),\n ];\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n identifier: 'foo',\n title: 'https://example.com/',\n captureDates,\n }}\n ></tile-list>\n `);\n\n const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');\n expect(captureDatesUl, 'capture dates container').to.exist;\n expect(captureDatesUl?.children.length).to.equal(2);\n\n const firstDateLink = captureDatesUl?.children[0]?.querySelector('a[href]');\n expect(firstDateLink, 'first date link').to.exist;\n expect(firstDateLink?.getAttribute('href')).to.equal(\n 'https://web.archive.org/web/20100102123456/https://example.com/',\n );\n expect(firstDateLink?.textContent?.trim()).to.equal('Jan 02, 2010');\n\n const secondDateLink =\n captureDatesUl?.children[1]?.querySelector('a[href]');\n expect(secondDateLink, 'second date link').to.exist;\n expect(secondDateLink?.getAttribute('href')).to.equal(\n 'https://web.archive.org/web/20110203124321/https://example.com/',\n );\n expect(secondDateLink?.textContent?.trim()).to.equal('Feb 03, 2011');\n });\n\n it('should not render web captures if no title is present', async () => {\n const captureDates = [\n new Date('2010-01-02T12:34:56Z'),\n new Date('2011-02-03T12:43:21Z'),\n ];\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n identifier: 'foo',\n captureDates,\n }}\n ></tile-list>\n `);\n\n const captureDatesUl = el.shadowRoot?.querySelector('.capture-dates');\n expect(captureDatesUl).not.to.exist;\n });\n\n it('should render review snippet if present', async () => {\n const review = {\n title: 'Foo',\n body: 'foo bar baz',\n stars: 3,\n };\n\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n identifier: 'foo',\n review,\n }}\n ></tile-list>\n `);\n\n const reviewBlock = el.shadowRoot?.querySelector('review-block');\n expect(reviewBlock).to.exist;\n });\n\n it('should not render review snippet block when no review is present', async () => {\n const el = await fixture<TileList>(html`\n <tile-list\n .model=${{\n identifier: 'foo',\n }}\n ></tile-list>\n `);\n\n const reviewBlock = el.shadowRoot?.querySelector('review-block');\n expect(reviewBlock).not.to.exist;\n });\n});\n"]}
|