@internetarchive/collection-browser 0.3.10-alpha.1 → 0.4.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 +26 -26
- 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 +4 -4
- package/LICENSE +661 -661
- package/README.md +83 -83
- package/dist/index.d.ts +9 -9
- package/dist/index.js +9 -9
- package/dist/src/app-root.d.ts +48 -48
- package/dist/src/app-root.js +258 -258
- package/dist/src/app-root.js.map +1 -1
- package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
- package/dist/src/assets/img/icons/arrow-left.js +2 -2
- package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
- package/dist/src/assets/img/icons/arrow-right.js +2 -2
- package/dist/src/assets/img/icons/chevron.d.ts +2 -2
- package/dist/src/assets/img/icons/chevron.js +2 -2
- package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
- package/dist/src/assets/img/icons/empty-query.js +2 -2
- package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
- package/dist/src/assets/img/icons/eye-closed.js +2 -2
- package/dist/src/assets/img/icons/eye.d.ts +2 -2
- package/dist/src/assets/img/icons/eye.js +2 -2
- package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
- package/dist/src/assets/img/icons/favorite-filled.js +2 -2
- package/dist/src/assets/img/icons/login-required.d.ts +1 -1
- package/dist/src/assets/img/icons/login-required.js +5 -17
- package/dist/src/assets/img/icons/login-required.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/account.js +2 -2
- package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
- package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
- package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/data.js +2 -2
- package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
- package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/film.js +2 -2
- package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/images.js +2 -2
- package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
- package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/software.js +2 -2
- package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
- package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
- package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/video.js +2 -2
- package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/web.js +2 -2
- package/dist/src/assets/img/icons/null-result.d.ts +2 -2
- package/dist/src/assets/img/icons/null-result.js +2 -2
- package/dist/src/assets/img/icons/restricted.d.ts +1 -1
- package/dist/src/assets/img/icons/restricted.js +3 -19
- package/dist/src/assets/img/icons/restricted.js.map +1 -1
- package/dist/src/assets/img/icons/reviews.d.ts +1 -1
- package/dist/src/assets/img/icons/reviews.js +2 -2
- package/dist/src/assets/img/icons/upload.d.ts +1 -1
- package/dist/src/assets/img/icons/upload.js +2 -2
- package/dist/src/assets/img/icons/views.d.ts +1 -1
- package/dist/src/assets/img/icons/views.js +2 -2
- package/dist/src/circular-activity-indicator.d.ts +5 -5
- package/dist/src/circular-activity-indicator.js +17 -17
- package/dist/src/collection-browser.d.ts +315 -278
- package/dist/src/collection-browser.js +1275 -1119
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
- package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
- package/dist/src/collection-facets/facets-template.d.ts +16 -16
- package/dist/src/collection-facets/facets-template.js +125 -125
- package/dist/src/collection-facets/more-facets-content.d.ts +77 -76
- package/dist/src/collection-facets/more-facets-content.js +357 -353
- package/dist/src/collection-facets/more-facets-content.js.map +1 -1
- package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
- package/dist/src/collection-facets/more-facets-pagination.js +192 -192
- package/dist/src/collection-facets.d.ts +78 -77
- package/dist/src/collection-facets.js +393 -389
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/empty-placeholder.d.ts +11 -11
- package/dist/src/empty-placeholder.js +42 -42
- package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
- package/dist/src/language-code-handler/language-code-handler.js +26 -26
- package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
- package/dist/src/language-code-handler/language-code-mapping.js +562 -562
- package/dist/src/mediatype/mediatype-config.d.ts +3 -3
- package/dist/src/mediatype/mediatype-config.js +85 -85
- package/dist/src/models.d.ts +112 -103
- package/dist/src/models.js +125 -117
- package/dist/src/models.js.map +1 -1
- package/dist/src/restoration-state-handler.d.ts +45 -46
- package/dist/src/restoration-state-handler.js +230 -230
- package/dist/src/restoration-state-handler.js.map +1 -1
- package/dist/src/sort-filter-bar/alpha-bar.d.ts +12 -9
- package/dist/src/sort-filter-bar/alpha-bar.js +69 -50
- package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
- package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
- package/dist/src/sort-filter-bar/img/compact.js +2 -2
- package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
- package/dist/src/sort-filter-bar/img/list.js +2 -2
- package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
- package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
- package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
- package/dist/src/sort-filter-bar/img/tile.js +2 -2
- package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +108 -107
- package/dist/src/sort-filter-bar/sort-filter-bar.js +430 -423
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/styles/item-image-styles.d.ts +8 -8
- package/dist/src/styles/item-image-styles.js +12 -15
- package/dist/src/styles/item-image-styles.js.map +1 -1
- package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
- package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
- package/dist/src/tiles/grid/account-tile.d.ts +8 -8
- package/dist/src/tiles/grid/account-tile.js +20 -20
- package/dist/src/tiles/grid/collection-tile.d.ts +7 -7
- package/dist/src/tiles/grid/collection-tile.js +23 -23
- package/dist/src/tiles/grid/item-tile.d.ts +24 -24
- package/dist/src/tiles/grid/item-tile.js +89 -87
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
- package/dist/src/tiles/grid/tile-stats.js +40 -40
- package/dist/src/tiles/image-block.d.ts +17 -17
- package/dist/src/tiles/image-block.js +77 -69
- package/dist/src/tiles/image-block.js.map +1 -1
- package/dist/src/tiles/item-image.d.ts +31 -31
- package/dist/src/tiles/item-image.js +106 -106
- package/dist/src/tiles/list/account-label.d.ts +1 -1
- package/dist/src/tiles/list/account-label.js +6 -6
- package/dist/src/tiles/list/date-label.d.ts +1 -1
- package/dist/src/tiles/list/date-label.js +12 -12
- package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -12
- package/dist/src/tiles/list/tile-list-compact-header.js +41 -41
- package/dist/src/tiles/list/tile-list-compact.d.ts +21 -21
- package/dist/src/tiles/list/tile-list-compact.js +93 -93
- package/dist/src/tiles/list/tile-list.d.ts +50 -50
- package/dist/src/tiles/list/tile-list.js +276 -276
- package/dist/src/tiles/mediatype-icon.d.ts +9 -9
- package/dist/src/tiles/mediatype-icon.js +47 -47
- package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -7
- package/dist/src/tiles/overlay/icon-overlay.js +63 -33
- package/dist/src/tiles/overlay/icon-overlay.js.map +1 -1
- package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -0
- package/dist/src/tiles/overlay/icon-text-overlay.js +83 -0
- package/dist/src/tiles/overlay/icon-text-overlay.js.map +1 -0
- package/dist/src/tiles/overlay/text-overlay.d.ts +10 -8
- package/dist/src/tiles/overlay/text-overlay.js +63 -35
- package/dist/src/tiles/overlay/text-overlay.js.map +1 -1
- package/dist/src/tiles/text-snippet-block.d.ts +29 -29
- package/dist/src/tiles/text-snippet-block.js +81 -81
- package/dist/src/tiles/tile-dispatcher.d.ts +36 -36
- package/dist/src/tiles/tile-dispatcher.js +128 -128
- package/dist/src/utils/analytics-events.d.ts +22 -22
- package/dist/src/utils/analytics-events.js +24 -24
- package/dist/src/utils/format-count.d.ts +7 -7
- package/dist/src/utils/format-count.js +76 -76
- package/dist/src/utils/format-date.d.ts +2 -2
- package/dist/src/utils/format-date.js +23 -23
- package/dist/test/collection-browser.test.d.ts +1 -1
- package/dist/test/collection-browser.test.js +647 -575
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
- package/dist/test/collection-facets/facets-template.test.js +62 -62
- package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
- package/dist/test/collection-facets/more-facets-content.test.js +114 -114
- package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
- package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
- package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
- package/dist/test/collection-facets.test.d.ts +2 -2
- package/dist/test/collection-facets.test.js +544 -544
- package/dist/test/empty-placeholder.test.d.ts +1 -1
- package/dist/test/empty-placeholder.test.js +33 -33
- package/dist/test/icon-overlay.test.d.ts +1 -1
- package/dist/test/icon-overlay.test.js +24 -24
- package/dist/test/image-block.test.d.ts +1 -1
- package/dist/test/image-block.test.js +48 -48
- package/dist/test/item-image.test.d.ts +1 -1
- package/dist/test/item-image.test.js +80 -80
- package/dist/test/item-image.test.js.map +1 -1
- package/dist/test/mediatype-config.test.d.ts +1 -1
- package/dist/test/mediatype-config.test.js +16 -16
- package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
- package/dist/test/mocks/mock-analytics-handler.js +15 -15
- package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -7
- package/dist/test/mocks/mock-collection-name-cache.js +13 -13
- package/dist/test/mocks/mock-search-responses.d.ts +12 -10
- package/dist/test/mocks/mock-search-responses.js +341 -271
- package/dist/test/mocks/mock-search-responses.js.map +1 -1
- package/dist/test/mocks/mock-search-service.d.ts +13 -13
- package/dist/test/mocks/mock-search-service.js +40 -36
- package/dist/test/mocks/mock-search-service.js.map +1 -1
- package/dist/test/restoration-state-handler.test.d.ts +1 -1
- package/dist/test/restoration-state-handler.test.js +125 -126
- package/dist/test/restoration-state-handler.test.js.map +1 -1
- package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -0
- package/dist/test/sort-filter-bar/alpha-bar.test.js +44 -0
- package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -0
- package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js +145 -113
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
- package/dist/test/text-overlay.test.d.ts +1 -1
- package/dist/test/text-overlay.test.js +48 -41
- package/dist/test/text-overlay.test.js.map +1 -1
- package/dist/test/text-snippet-block.test.d.ts +1 -1
- package/dist/test/text-snippet-block.test.js +57 -57
- package/dist/test/tile-stats.test.d.ts +1 -1
- package/dist/test/tile-stats.test.js +33 -33
- package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
- package/dist/test/tiles/grid/item-tile.test.js +107 -107
- package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
- package/dist/test/tiles/list/tile-list-compact.test.js +92 -92
- package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
- package/dist/test/tiles/list/tile-list.test.js +123 -123
- package/dist/test/utils/format-count.test.d.ts +1 -1
- package/dist/test/utils/format-count.test.js +23 -23
- package/dist/test/utils/format-date.test.d.ts +1 -1
- package/dist/test/utils/format-date.test.js +17 -17
- package/index.html +24 -24
- package/local.archive.org.cert +86 -86
- package/local.archive.org.key +27 -27
- package/package.json +3 -3
- package/renovate.json +6 -6
- package/src/app-root.ts +1 -1
- package/src/assets/img/icons/login-required.ts +3 -15
- package/src/assets/img/icons/restricted.ts +1 -17
- package/src/collection-browser.ts +273 -57
- package/src/collection-facets/more-facets-content.ts +6 -2
- package/src/collection-facets.ts +6 -2
- package/src/models.ts +15 -0
- package/src/restoration-state-handler.ts +7 -5
- package/src/sort-filter-bar/alpha-bar.ts +26 -9
- package/src/sort-filter-bar/sort-filter-bar.ts +9 -0
- package/src/styles/item-image-styles.ts +3 -6
- package/src/tiles/grid/item-tile.ts +2 -0
- package/src/tiles/image-block.ts +8 -0
- package/src/tiles/overlay/icon-overlay.ts +33 -3
- package/src/tiles/overlay/icon-text-overlay.ts +75 -0
- package/src/tiles/overlay/text-overlay.ts +34 -7
- package/test/collection-browser.test.ts +90 -10
- package/test/collection-facets/more-facets-content.test.ts +2 -2
- package/test/item-image.test.ts +2 -2
- package/test/mocks/mock-search-responses.ts +78 -0
- package/test/mocks/mock-search-service.ts +6 -0
- package/test/restoration-state-handler.test.ts +0 -3
- package/test/sort-filter-bar/alpha-bar.test.ts +52 -0
- package/test/sort-filter-bar/sort-filter-bar.test.ts +44 -0
- package/test/text-overlay.test.ts +10 -3
- package/tsconfig.json +21 -21
- package/web-dev-server.config.mjs +30 -30
- package/web-test-runner.config.mjs +41 -41
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { LitElement, html, css } from 'lit';
|
|
2
2
|
import { customElement, property } from 'lit/decorators.js';
|
|
3
|
+
import type { PrefixFilterCounts } from '../models';
|
|
3
4
|
|
|
4
5
|
@customElement('alpha-bar')
|
|
5
6
|
export class AlphaBar extends LitElement {
|
|
6
7
|
@property({ type: String }) selectedLetter: string | null = null;
|
|
7
8
|
|
|
9
|
+
@property({ type: Object }) letterCounts?: PrefixFilterCounts;
|
|
10
|
+
|
|
8
11
|
private get selectedUppercaseLetter(): string | undefined {
|
|
9
12
|
return this.selectedLetter?.toUpperCase();
|
|
10
13
|
}
|
|
@@ -21,15 +24,9 @@ export class AlphaBar extends LitElement {
|
|
|
21
24
|
? 'selected'
|
|
22
25
|
: ''}
|
|
23
26
|
>
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
e.preventDefault();
|
|
28
|
-
this.letterClicked(letter);
|
|
29
|
-
}}
|
|
30
|
-
>
|
|
31
|
-
${letter}
|
|
32
|
-
</a>
|
|
27
|
+
${this.letterCounts?.[letter]
|
|
28
|
+
? this.letterLinkTemplate(letter)
|
|
29
|
+
: html`<span>${letter}</span>`}
|
|
33
30
|
</li>
|
|
34
31
|
`
|
|
35
32
|
)}
|
|
@@ -38,6 +35,20 @@ export class AlphaBar extends LitElement {
|
|
|
38
35
|
`;
|
|
39
36
|
}
|
|
40
37
|
|
|
38
|
+
private letterLinkTemplate(letter: string) {
|
|
39
|
+
return html`
|
|
40
|
+
<a
|
|
41
|
+
href="#"
|
|
42
|
+
@click=${(e: Event) => {
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
this.letterClicked(letter);
|
|
45
|
+
}}
|
|
46
|
+
>
|
|
47
|
+
${letter}
|
|
48
|
+
</a>
|
|
49
|
+
`;
|
|
50
|
+
}
|
|
51
|
+
|
|
41
52
|
private letterClicked(letter: string) {
|
|
42
53
|
if (letter === this.selectedUppercaseLetter) {
|
|
43
54
|
this.selectedLetter = null;
|
|
@@ -85,6 +96,12 @@ export class AlphaBar extends LitElement {
|
|
|
85
96
|
display: block;
|
|
86
97
|
}
|
|
87
98
|
|
|
99
|
+
span {
|
|
100
|
+
color: #aaa;
|
|
101
|
+
padding: 0.5rem 0;
|
|
102
|
+
display: block;
|
|
103
|
+
}
|
|
104
|
+
|
|
88
105
|
.selected {
|
|
89
106
|
background-color: darkgray;
|
|
90
107
|
}
|
|
@@ -13,6 +13,8 @@ import type {
|
|
|
13
13
|
} from '@internetarchive/shared-resize-observer';
|
|
14
14
|
import {
|
|
15
15
|
CollectionDisplayMode,
|
|
16
|
+
PrefixFilterCounts,
|
|
17
|
+
PrefixFilterType,
|
|
16
18
|
SortField,
|
|
17
19
|
SortFieldDisplayName,
|
|
18
20
|
} from '../models';
|
|
@@ -42,6 +44,11 @@ export class SortFilterBar
|
|
|
42
44
|
|
|
43
45
|
@property({ type: Boolean }) showRelevance: boolean = true;
|
|
44
46
|
|
|
47
|
+
@property({ type: Object }) prefixFilterCountMap?: Record<
|
|
48
|
+
PrefixFilterType,
|
|
49
|
+
PrefixFilterCounts
|
|
50
|
+
>;
|
|
51
|
+
|
|
45
52
|
@property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;
|
|
46
53
|
|
|
47
54
|
@state() alphaSelectorVisible: AlphaSelector | null = null;
|
|
@@ -563,6 +570,7 @@ export class SortFilterBar
|
|
|
563
570
|
private get titleSelectorBar() {
|
|
564
571
|
return html` <alpha-bar
|
|
565
572
|
.selectedLetter=${this.selectedTitleFilter}
|
|
573
|
+
.letterCounts=${this.prefixFilterCountMap?.title}
|
|
566
574
|
@letterChanged=${this.titleLetterChanged}
|
|
567
575
|
></alpha-bar>`;
|
|
568
576
|
}
|
|
@@ -570,6 +578,7 @@ export class SortFilterBar
|
|
|
570
578
|
private get creatorSelectorBar() {
|
|
571
579
|
return html` <alpha-bar
|
|
572
580
|
.selectedLetter=${this.selectedCreatorFilter}
|
|
581
|
+
.letterCounts=${this.prefixFilterCountMap?.creator}
|
|
573
582
|
@letterChanged=${this.creatorLetterChanged}
|
|
574
583
|
></alpha-bar>`;
|
|
575
584
|
}
|
|
@@ -11,18 +11,14 @@ export const baseItemImageStyles = css`
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
.list-box {
|
|
14
|
-
width: 100%;
|
|
15
|
-
height: 100%;
|
|
16
14
|
overflow: hidden;
|
|
17
15
|
box-sizing: border-box;
|
|
18
|
-
display:
|
|
16
|
+
display: inline-block;
|
|
19
17
|
position: relative;
|
|
20
|
-
max-width: 100px;
|
|
21
18
|
}
|
|
22
19
|
|
|
23
20
|
.contain {
|
|
24
21
|
object-fit: contain;
|
|
25
|
-
object-position: top;
|
|
26
22
|
height: 100%;
|
|
27
23
|
width: 100%;
|
|
28
24
|
}
|
|
@@ -32,7 +28,8 @@ export const baseItemImageStyles = css`
|
|
|
32
28
|
}
|
|
33
29
|
|
|
34
30
|
.blur {
|
|
35
|
-
filter: blur(
|
|
31
|
+
filter: blur(15px);
|
|
32
|
+
box-shadow: 1px 1px 2px 0px;
|
|
36
33
|
}
|
|
37
34
|
`;
|
|
38
35
|
|
package/src/tiles/image-block.ts
CHANGED
|
@@ -58,6 +58,7 @@ export class ImageBlock extends LitElement {
|
|
|
58
58
|
<icon-overlay
|
|
59
59
|
.loggedIn=${this.loggedIn}
|
|
60
60
|
.loginRequired=${this.model?.loginRequired}
|
|
61
|
+
.isCompactTile=${this.isCompactTile}
|
|
61
62
|
>
|
|
62
63
|
</icon-overlay>
|
|
63
64
|
`;
|
|
@@ -73,6 +74,7 @@ export class ImageBlock extends LitElement {
|
|
|
73
74
|
<text-overlay
|
|
74
75
|
.loggedIn=${this.loggedIn}
|
|
75
76
|
.loginRequired=${this.model?.loginRequired}
|
|
77
|
+
?iconRequired=${true}
|
|
76
78
|
>
|
|
77
79
|
</text-overlay>
|
|
78
80
|
`;
|
|
@@ -89,12 +91,17 @@ export class ImageBlock extends LitElement {
|
|
|
89
91
|
.grid {
|
|
90
92
|
height: var(--imgBlockHeight, 16rem);
|
|
91
93
|
flex: 1;
|
|
94
|
+
display: inline-block;
|
|
95
|
+
position: initial;
|
|
92
96
|
}
|
|
93
97
|
|
|
94
98
|
/** tile-list view */
|
|
95
99
|
.list.desktop {
|
|
96
100
|
width: 100px;
|
|
97
101
|
height: 100px;
|
|
102
|
+
display: inline-block;
|
|
103
|
+
position: relative;
|
|
104
|
+
text-align: center;
|
|
98
105
|
}
|
|
99
106
|
|
|
100
107
|
.list.mobile {
|
|
@@ -105,6 +112,7 @@ export class ImageBlock extends LitElement {
|
|
|
105
112
|
/** tile-list-compact view */
|
|
106
113
|
.list-compact {
|
|
107
114
|
display: block;
|
|
115
|
+
text-align: center;
|
|
108
116
|
}
|
|
109
117
|
|
|
110
118
|
.list-compact.desktop {
|
|
@@ -10,7 +10,19 @@ export class IconOverlay extends LitElement {
|
|
|
10
10
|
|
|
11
11
|
@property({ type: Boolean }) loginRequired = false;
|
|
12
12
|
|
|
13
|
+
@property({ type: Boolean }) isCompactTile = false;
|
|
14
|
+
|
|
13
15
|
render() {
|
|
16
|
+
return html`<div class="icon-overlay ${this.getClass}">
|
|
17
|
+
${this.iconDisplay}
|
|
18
|
+
</div>`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
private get getClass() {
|
|
22
|
+
return this.isCompactTile ? 'list-compact' : 'list-detail';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
private get iconDisplay() {
|
|
14
26
|
return this.loginRequired && !this.loggedIn
|
|
15
27
|
? html`${loginRequiredIcon}`
|
|
16
28
|
: html`${restrictedIcon}`;
|
|
@@ -23,10 +35,28 @@ export class IconOverlay extends LitElement {
|
|
|
23
35
|
top: 50%;
|
|
24
36
|
left: 50%;
|
|
25
37
|
transform: translate(-50%, -50%);
|
|
26
|
-
|
|
27
|
-
width: 50%;
|
|
28
|
-
height: 50%;
|
|
38
|
+
width: 100%;
|
|
29
39
|
z-index: 2;
|
|
40
|
+
background-color: rgb(255, 254, 203);
|
|
41
|
+
display: flex;
|
|
42
|
+
justify-content: center;
|
|
43
|
+
border: 1px solid #2c2c2c;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.icon-overlay {
|
|
47
|
+
height: 20px;
|
|
48
|
+
width: 20px;
|
|
49
|
+
padding: 2px;
|
|
50
|
+
padding: 2px;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.list-detail {
|
|
54
|
+
height: 20px;
|
|
55
|
+
width: 20px;
|
|
56
|
+
}
|
|
57
|
+
.list-compact {
|
|
58
|
+
height: 15px;
|
|
59
|
+
width: 15px;
|
|
30
60
|
}
|
|
31
61
|
`;
|
|
32
62
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { css, CSSResultGroup, html, LitElement } from 'lit';
|
|
2
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
3
|
+
import { loginRequiredIcon } from '../../assets/img/icons/login-required';
|
|
4
|
+
import { restrictedIcon } from '../../assets/img/icons/restricted';
|
|
5
|
+
|
|
6
|
+
@customElement('icon-text-overlay')
|
|
7
|
+
export class IconTextOverlay extends LitElement {
|
|
8
|
+
@property({ type: Boolean }) loggedIn = false;
|
|
9
|
+
|
|
10
|
+
@property({ type: Boolean }) loginRequired = false;
|
|
11
|
+
|
|
12
|
+
render() {
|
|
13
|
+
return html`
|
|
14
|
+
<div class="overlay no-preview">
|
|
15
|
+
<div class="icon-overlay">${this.iconDisplay}</div>
|
|
16
|
+
<p class="text-overlay">${this.textDisplay}</p>
|
|
17
|
+
</div>
|
|
18
|
+
`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
private get iconDisplay() {
|
|
22
|
+
return this.loginRequired && !this.loggedIn
|
|
23
|
+
? html`${loginRequiredIcon}`
|
|
24
|
+
: html`${restrictedIcon}`;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private get textDisplay() {
|
|
28
|
+
return this.loginRequired && !this.loggedIn
|
|
29
|
+
? 'Log in\nto view this item'
|
|
30
|
+
: 'Content may be inappropriate';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static get styles(): CSSResultGroup {
|
|
34
|
+
return css`
|
|
35
|
+
:host {
|
|
36
|
+
align-items: center;
|
|
37
|
+
display: flex;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.overlay {
|
|
41
|
+
border: 1px solid #2c2c2c;
|
|
42
|
+
border-radius: 1px;
|
|
43
|
+
position: absolute;
|
|
44
|
+
right: 0;
|
|
45
|
+
left: 0;
|
|
46
|
+
width: auto;
|
|
47
|
+
height: auto;
|
|
48
|
+
padding: 5px;
|
|
49
|
+
display: flex;
|
|
50
|
+
align-items: center;
|
|
51
|
+
border-radius: 1px;
|
|
52
|
+
text-align: center;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.icon-overlay {
|
|
56
|
+
width: 40px;
|
|
57
|
+
height: 40px;
|
|
58
|
+
display: inherit;
|
|
59
|
+
}
|
|
60
|
+
.text-overlay {
|
|
61
|
+
margin: 0;
|
|
62
|
+
vertical-align: bottom;
|
|
63
|
+
padding-left: 5px;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.no-preview {
|
|
67
|
+
background-color: #fffecb;
|
|
68
|
+
border: 1px solid #2c2c2c;
|
|
69
|
+
color: #2c2c2c;
|
|
70
|
+
font-size: 1.4rem;
|
|
71
|
+
line-height: 2rem;
|
|
72
|
+
}
|
|
73
|
+
`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { css, CSSResultGroup, html, LitElement } from 'lit';
|
|
2
2
|
import { customElement, property } from 'lit/decorators.js';
|
|
3
|
+
import { loginRequiredIcon } from '../../assets/img/icons/login-required';
|
|
4
|
+
import { restrictedIcon } from '../../assets/img/icons/restricted';
|
|
3
5
|
|
|
4
6
|
@customElement('text-overlay')
|
|
5
7
|
export class TextOverlay extends LitElement {
|
|
@@ -7,14 +9,27 @@ export class TextOverlay extends LitElement {
|
|
|
7
9
|
|
|
8
10
|
@property({ type: Boolean }) loginRequired = false;
|
|
9
11
|
|
|
12
|
+
@property({ type: Boolean }) iconRequired = false;
|
|
13
|
+
|
|
10
14
|
render() {
|
|
11
|
-
return html`
|
|
15
|
+
return html`
|
|
16
|
+
<div class="overlay no-preview">
|
|
17
|
+
<div class="icon-overlay">${this.iconDisplay}</div>
|
|
18
|
+
<p class="text-overlay">${this.textDisplay}</p>
|
|
19
|
+
</div>
|
|
20
|
+
`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
private get iconDisplay() {
|
|
24
|
+
return this.loginRequired && !this.loggedIn
|
|
25
|
+
? html`${loginRequiredIcon}`
|
|
26
|
+
: html`${restrictedIcon}`;
|
|
12
27
|
}
|
|
13
28
|
|
|
14
29
|
private get textDisplay() {
|
|
15
30
|
return this.loginRequired && !this.loggedIn
|
|
16
|
-
?
|
|
17
|
-
:
|
|
31
|
+
? html`Log in to view this item`
|
|
32
|
+
: html`Content may be inappropriate`;
|
|
18
33
|
}
|
|
19
34
|
|
|
20
35
|
static get styles(): CSSResultGroup {
|
|
@@ -30,18 +45,30 @@ export class TextOverlay extends LitElement {
|
|
|
30
45
|
position: absolute;
|
|
31
46
|
right: 0;
|
|
32
47
|
left: 0;
|
|
48
|
+
top: 50%;
|
|
49
|
+
transform: translate(0px, -50%);
|
|
33
50
|
width: auto;
|
|
34
51
|
height: auto;
|
|
35
52
|
padding: 5px;
|
|
53
|
+
background-color: #fffecb;
|
|
54
|
+
display: flex;
|
|
55
|
+
align-items: center;
|
|
56
|
+
border-radius: 1px;
|
|
36
57
|
}
|
|
37
58
|
|
|
38
|
-
.
|
|
39
|
-
|
|
59
|
+
.icon-overlay {
|
|
60
|
+
width: 40px;
|
|
61
|
+
height: 40px;
|
|
62
|
+
display: inherit;
|
|
63
|
+
}
|
|
64
|
+
.text-overlay {
|
|
65
|
+
margin: 0;
|
|
66
|
+
vertical-align: bottom;
|
|
67
|
+
padding-left: 5px;
|
|
68
|
+
text-align: center;
|
|
40
69
|
color: #2c2c2c;
|
|
41
70
|
font-size: 1.4rem;
|
|
42
71
|
line-height: 2rem;
|
|
43
|
-
text-align: center;
|
|
44
|
-
white-space: pre-wrap; // for the newline character
|
|
45
72
|
}
|
|
46
73
|
`;
|
|
47
74
|
}
|
|
@@ -20,6 +20,20 @@ import { analyticsCategories } from '../src/utils/analytics-events';
|
|
|
20
20
|
import type { TileDispatcher } from '../src/tiles/tile-dispatcher';
|
|
21
21
|
import type { CollectionFacets } from '../src/collection-facets';
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Wait for the next tick of the event loop.
|
|
25
|
+
*
|
|
26
|
+
* This is necessary in some of the tests because certain collection browser
|
|
27
|
+
* updates take more than one tick to render (e.g., date picker & query changes).
|
|
28
|
+
* These delays are non-ideal and should eventually be investigated and fixed,
|
|
29
|
+
* but they are minor enough that waiting for the next tick is a reasonable
|
|
30
|
+
* testing solution for now.
|
|
31
|
+
*/
|
|
32
|
+
const nextTick = () =>
|
|
33
|
+
new Promise(resolve => {
|
|
34
|
+
setTimeout(resolve, 0);
|
|
35
|
+
});
|
|
36
|
+
|
|
23
37
|
describe('Collection Browser', () => {
|
|
24
38
|
beforeEach(async () => {
|
|
25
39
|
// Apparently query params set by one test can bleed into other tests.
|
|
@@ -61,6 +75,8 @@ describe('Collection Browser', () => {
|
|
|
61
75
|
);
|
|
62
76
|
|
|
63
77
|
el.searchContext = 'betaSearchService';
|
|
78
|
+
el.selectedSort = 'creator' as SortField;
|
|
79
|
+
el.sortDirection = 'asc';
|
|
64
80
|
el.selectedCreatorFilter = 'A';
|
|
65
81
|
await el.updateComplete;
|
|
66
82
|
|
|
@@ -86,6 +102,7 @@ describe('Collection Browser', () => {
|
|
|
86
102
|
|
|
87
103
|
el.searchContext = 'beta-search-service';
|
|
88
104
|
el.selectedSort = 'title' as SortField;
|
|
105
|
+
el.sortDirection = 'asc';
|
|
89
106
|
el.selectedTitleFilter = 'A';
|
|
90
107
|
await el.updateComplete;
|
|
91
108
|
|
|
@@ -199,6 +216,7 @@ describe('Collection Browser', () => {
|
|
|
199
216
|
|
|
200
217
|
el.baseQuery = 'collection:foo';
|
|
201
218
|
await el.updateComplete;
|
|
219
|
+
await nextTick();
|
|
202
220
|
|
|
203
221
|
expect(searchService.searchParams?.query).to.equal('collection:foo');
|
|
204
222
|
expect(
|
|
@@ -219,6 +237,7 @@ describe('Collection Browser', () => {
|
|
|
219
237
|
|
|
220
238
|
el.baseQuery = 'collection:foo';
|
|
221
239
|
await el.updateComplete;
|
|
240
|
+
await nextTick();
|
|
222
241
|
|
|
223
242
|
expect(searchService.searchParams?.query).to.equal('collection:foo');
|
|
224
243
|
expect(searchService.searchType).to.equal(SearchType.METADATA);
|
|
@@ -240,6 +259,7 @@ describe('Collection Browser', () => {
|
|
|
240
259
|
|
|
241
260
|
el.baseQuery = 'collection:foo';
|
|
242
261
|
await el.updateComplete;
|
|
262
|
+
await nextTick();
|
|
243
263
|
|
|
244
264
|
expect(searchService.searchParams?.query).to.equal('collection:foo');
|
|
245
265
|
expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
|
|
@@ -286,9 +306,16 @@ describe('Collection Browser', () => {
|
|
|
286
306
|
el.selectedFacets = selectedFacets;
|
|
287
307
|
await el.updateComplete;
|
|
288
308
|
|
|
289
|
-
expect(searchService.searchParams?.query).to.equal(
|
|
290
|
-
|
|
291
|
-
|
|
309
|
+
expect(searchService.searchParams?.query).to.equal('collection:foo');
|
|
310
|
+
expect(searchService.searchParams?.filters).to.deep.equal({
|
|
311
|
+
subject: {
|
|
312
|
+
foo: 'inc',
|
|
313
|
+
bar: 'exc',
|
|
314
|
+
},
|
|
315
|
+
language: {
|
|
316
|
+
en: 'inc',
|
|
317
|
+
},
|
|
318
|
+
});
|
|
292
319
|
});
|
|
293
320
|
|
|
294
321
|
it('fires a separate date histogram query when year facets are applied', async () => {
|
|
@@ -337,7 +364,8 @@ describe('Collection Browser', () => {
|
|
|
337
364
|
|
|
338
365
|
el.baseQuery = 'collection:foo';
|
|
339
366
|
el.showHistogramDatePicker = true;
|
|
340
|
-
el.
|
|
367
|
+
el.minSelectedDate = '1995';
|
|
368
|
+
el.maxSelectedDate = '2005';
|
|
341
369
|
await el.updateComplete;
|
|
342
370
|
|
|
343
371
|
expect(
|
|
@@ -375,7 +403,8 @@ describe('Collection Browser', () => {
|
|
|
375
403
|
|
|
376
404
|
el.baseQuery = 'collection:foo';
|
|
377
405
|
el.showHistogramDatePicker = false;
|
|
378
|
-
el.
|
|
406
|
+
el.minSelectedDate = '1995';
|
|
407
|
+
el.maxSelectedDate = '2005';
|
|
379
408
|
await el.updateComplete;
|
|
380
409
|
|
|
381
410
|
expect(searchService.searchParams?.aggregations?.simpleParams).to.satisfy(
|
|
@@ -675,7 +704,9 @@ describe('Collection Browser', () => {
|
|
|
675
704
|
</collection-browser>`
|
|
676
705
|
);
|
|
677
706
|
|
|
678
|
-
el.baseQuery = '
|
|
707
|
+
el.baseQuery = 'first-title';
|
|
708
|
+
el.selectedSort = 'title' as SortField;
|
|
709
|
+
el.sortDirection = 'asc';
|
|
679
710
|
el.selectedTitleFilter = 'X';
|
|
680
711
|
await el.updateComplete;
|
|
681
712
|
|
|
@@ -685,7 +716,7 @@ describe('Collection Browser', () => {
|
|
|
685
716
|
});
|
|
686
717
|
|
|
687
718
|
expect(searchService.searchParams?.query).to.equal(
|
|
688
|
-
'
|
|
719
|
+
'first-title AND firstTitle:X'
|
|
689
720
|
);
|
|
690
721
|
});
|
|
691
722
|
|
|
@@ -696,7 +727,9 @@ describe('Collection Browser', () => {
|
|
|
696
727
|
</collection-browser>`
|
|
697
728
|
);
|
|
698
729
|
|
|
699
|
-
el.baseQuery = '
|
|
730
|
+
el.baseQuery = 'first-creator';
|
|
731
|
+
el.selectedSort = 'creator' as SortField;
|
|
732
|
+
el.sortDirection = 'asc';
|
|
700
733
|
el.selectedCreatorFilter = 'X';
|
|
701
734
|
await el.updateComplete;
|
|
702
735
|
|
|
@@ -706,10 +739,55 @@ describe('Collection Browser', () => {
|
|
|
706
739
|
});
|
|
707
740
|
|
|
708
741
|
expect(searchService.searchParams?.query).to.equal(
|
|
709
|
-
'
|
|
742
|
+
'first-creator AND firstCreator:X'
|
|
710
743
|
);
|
|
711
744
|
});
|
|
712
745
|
|
|
746
|
+
it('sets sort filter properties simultaneous with facets and date range', async () => {
|
|
747
|
+
const searchService = new MockSearchService();
|
|
748
|
+
const selectedFacets: SelectedFacets = {
|
|
749
|
+
collection: { foo: { key: 'foo', state: 'selected', count: 1 } },
|
|
750
|
+
creator: {},
|
|
751
|
+
language: {},
|
|
752
|
+
lending: {},
|
|
753
|
+
mediatype: {},
|
|
754
|
+
subject: {},
|
|
755
|
+
year: {},
|
|
756
|
+
};
|
|
757
|
+
|
|
758
|
+
const el = await fixture<CollectionBrowser>(
|
|
759
|
+
html`<collection-browser .searchService=${searchService}>
|
|
760
|
+
</collection-browser>`
|
|
761
|
+
);
|
|
762
|
+
|
|
763
|
+
el.baseQuery = 'first-creator';
|
|
764
|
+
el.selectedSort = 'creator' as SortField;
|
|
765
|
+
el.selectedFacets = selectedFacets;
|
|
766
|
+
el.minSelectedDate = '1950';
|
|
767
|
+
el.maxSelectedDate = '1970';
|
|
768
|
+
el.sortDirection = 'asc';
|
|
769
|
+
el.selectedCreatorFilter = 'X';
|
|
770
|
+
await el.updateComplete;
|
|
771
|
+
|
|
772
|
+
// Wait an extra tick
|
|
773
|
+
await new Promise(res => {
|
|
774
|
+
setTimeout(res, 0);
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
expect(searchService.searchParams?.query).to.equal(
|
|
778
|
+
'first-creator AND firstCreator:X'
|
|
779
|
+
);
|
|
780
|
+
expect(searchService.searchParams?.filters).to.deep.equal({
|
|
781
|
+
collection: {
|
|
782
|
+
foo: 'inc',
|
|
783
|
+
},
|
|
784
|
+
year: {
|
|
785
|
+
'1950': 'gte',
|
|
786
|
+
'1970': 'lte',
|
|
787
|
+
},
|
|
788
|
+
});
|
|
789
|
+
});
|
|
790
|
+
|
|
713
791
|
it('sets date range query when date picker selection changed', async () => {
|
|
714
792
|
const searchService = new MockSearchService();
|
|
715
793
|
const el = await fixture<CollectionBrowser>(
|
|
@@ -756,7 +834,8 @@ describe('Collection Browser', () => {
|
|
|
756
834
|
// Ensure that the histogram change propagated to the collection browser's
|
|
757
835
|
// date query correctly.
|
|
758
836
|
await el.updateComplete;
|
|
759
|
-
expect(el.
|
|
837
|
+
expect(el.minSelectedDate).to.equal('1960');
|
|
838
|
+
expect(el.maxSelectedDate).to.equal('2000');
|
|
760
839
|
});
|
|
761
840
|
|
|
762
841
|
it('scrolls to page', async () => {
|
|
@@ -862,6 +941,7 @@ describe('Collection Browser', () => {
|
|
|
862
941
|
|
|
863
942
|
el.baseQuery = 'single-result';
|
|
864
943
|
await el.updateComplete;
|
|
944
|
+
await nextTick();
|
|
865
945
|
|
|
866
946
|
expect(
|
|
867
947
|
el.shadowRoot?.querySelector('#big-results-label')?.textContent
|
|
@@ -80,7 +80,7 @@ describe('More facets content', () => {
|
|
|
80
80
|
);
|
|
81
81
|
|
|
82
82
|
el.facetKey = 'collection';
|
|
83
|
-
el.
|
|
83
|
+
el.query = 'title:hello';
|
|
84
84
|
await el.updateComplete;
|
|
85
85
|
|
|
86
86
|
expect(searchService.searchParams?.query).to.equal('title:hello');
|
|
@@ -97,7 +97,7 @@ describe('More facets content', () => {
|
|
|
97
97
|
);
|
|
98
98
|
|
|
99
99
|
el.facetKey = 'collection';
|
|
100
|
-
el.
|
|
100
|
+
el.query = 'title:hello';
|
|
101
101
|
await el.updateComplete;
|
|
102
102
|
|
|
103
103
|
expect(searchService.searchParams?.query).to.equal('title:hello');
|
package/test/item-image.test.ts
CHANGED
|
@@ -106,7 +106,7 @@ describe('ItemImage component', () => {
|
|
|
106
106
|
</item-image>
|
|
107
107
|
`);
|
|
108
108
|
|
|
109
|
-
// Doesn't set the image src if
|
|
109
|
+
// Doesn't set the image src if model is not present
|
|
110
110
|
const img = el.shadowRoot?.querySelector('img');
|
|
111
111
|
expect(img).to.exist;
|
|
112
112
|
expect(img?.getAttribute('src')).not.to.exist;
|
|
@@ -123,7 +123,7 @@ describe('ItemImage component', () => {
|
|
|
123
123
|
</item-image>
|
|
124
124
|
`);
|
|
125
125
|
|
|
126
|
-
// Doesn't set the image src if
|
|
126
|
+
// Doesn't set the image src if identifier is not present
|
|
127
127
|
const img = el.shadowRoot?.querySelector('img');
|
|
128
128
|
expect(img).to.exist;
|
|
129
129
|
expect(img?.getAttribute('src')).not.to.exist;
|