@internetarchive/collection-browser 0.0.1-alpha.9 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -11
- package/demo/app-root.ts +17 -92
- package/dist/demo/app-root.d.ts +3 -5
- package/dist/demo/app-root.js +14 -83
- package/dist/demo/app-root.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/src/assets/img/icons/chevron.d.ts +2 -0
- package/dist/src/assets/img/icons/chevron.js +4 -0
- package/dist/src/assets/img/icons/chevron.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
- package/dist/src/assets/img/icons/mediatype/account.js +6 -4
- package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
- package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
- package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/data.js +15 -0
- package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
- package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/film.js +2 -1
- package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/images.js +9 -6
- package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/livemusic.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/livemusic.js +7 -0
- package/dist/src/assets/img/icons/mediatype/livemusic.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/photos.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/photos.js +7 -0
- package/dist/src/assets/img/icons/mediatype/photos.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
- package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
- package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
- package/dist/src/assets/img/icons/mediatype/software.js +9 -6
- package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
- package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
- package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/video.js +10 -6
- package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
- package/dist/src/assets/img/icons/mediatype/web.js +9 -6
- package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
- package/dist/src/collection-browser.d.ts +54 -31
- package/dist/src/collection-browser.js +508 -166
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets.d.ts +28 -13
- package/dist/src/collection-facets.js +276 -160
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/helpers.d.ts +1 -0
- package/dist/src/helpers.js +20 -0
- package/dist/src/helpers.js.map +1 -0
- package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
- package/dist/src/language-code-handler/language-code-handler.js +27 -0
- package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
- package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
- package/dist/src/language-code-handler/language-code-mapping.js +563 -0
- package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
- package/dist/src/mediatype/mediatype-color.d.ts +3 -0
- package/dist/src/mediatype/mediatype-color.js +15 -0
- package/dist/src/mediatype/mediatype-color.js.map +1 -0
- package/dist/src/mediatype/mediatype-config.d.ts +3 -0
- package/dist/src/mediatype/mediatype-config.js +86 -0
- package/dist/src/mediatype/mediatype-config.js.map +1 -0
- package/dist/src/mediatype/mediatype-display.d.ts +3 -0
- package/dist/src/mediatype/mediatype-display.js +86 -0
- package/dist/src/mediatype/mediatype-display.js.map +1 -0
- package/dist/src/mediatype/mediatype-icon.d.ts +10 -0
- package/dist/src/mediatype/mediatype-icon.js +105 -0
- package/dist/src/mediatype/mediatype-icon.js.map +1 -0
- package/dist/src/mediatype/mediatype-text.d.ts +3 -0
- package/dist/src/mediatype/mediatype-text.js +17 -0
- package/dist/src/mediatype/mediatype-text.js.map +1 -0
- package/dist/src/mediatype/mediatypeConfig.d.ts +3 -0
- package/dist/src/mediatype/mediatypeConfig.js +86 -0
- package/dist/src/mediatype/mediatypeConfig.js.map +1 -0
- package/dist/src/mediatype-icon.d.ts +2 -2
- package/dist/src/mediatype-icon.js +35 -46
- package/dist/src/mediatype-icon.js.map +1 -1
- package/dist/src/models.d.ts +72 -13
- package/dist/src/models.js +57 -1
- package/dist/src/models.js.map +1 -1
- package/dist/src/restoration-state-handler.d.ts +38 -0
- package/dist/src/restoration-state-handler.js +204 -0
- package/dist/src/restoration-state-handler.js.map +1 -0
- package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -1
- package/dist/src/sort-filter-bar/alpha-bar.js +9 -2
- package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
- package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
- package/dist/src/sort-filter-bar/img/compact.js +5 -0
- package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
- package/dist/src/sort-filter-bar/img/list.js +1 -1
- package/dist/src/sort-filter-bar/img/list.js.map +1 -1
- package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
- package/dist/src/sort-filter-bar/img/tile.js +5 -0
- package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
- package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +71 -14
- package/dist/src/sort-filter-bar/sort-filter-bar.js +499 -216
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
- package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
- package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
- package/dist/src/tiles/grid/account-tile.d.ts +1 -1
- package/dist/src/tiles/grid/account-tile.js +5 -5
- package/dist/src/tiles/grid/account-tile.js.map +1 -1
- package/dist/src/tiles/grid/collection-tile.js +1 -2
- package/dist/src/tiles/grid/collection-tile.js.map +1 -1
- package/dist/src/tiles/grid/icons/views.d.ts +1 -1
- package/dist/src/tiles/grid/icons/views.js +2 -2
- package/dist/src/tiles/grid/icons/views.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.d.ts +3 -3
- package/dist/src/tiles/grid/item-tile.js +55 -152
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/item-image.d.ts +21 -0
- package/dist/src/tiles/item-image.js +215 -0
- package/dist/src/tiles/item-image.js.map +1 -0
- package/dist/src/tiles/list/account-label.d.ts +1 -0
- package/dist/src/tiles/list/account-label.js +7 -0
- package/dist/src/tiles/list/account-label.js.map +1 -0
- package/dist/src/tiles/list/date-label.d.ts +1 -0
- package/dist/src/tiles/list/date-label.js +13 -0
- package/dist/src/tiles/list/date-label.js.map +1 -0
- package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
- package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
- package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
- package/dist/src/tiles/list/tile-list-compact.d.ts +13 -0
- package/dist/src/tiles/list/tile-list-compact.js +206 -6
- package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
- package/dist/src/tiles/list/tile-list.d.ts +36 -10
- package/dist/src/tiles/list/tile-list.js +370 -103
- package/dist/src/tiles/list/tile-list.js.map +1 -1
- package/dist/src/tiles/loading-tile.js +1 -42
- package/dist/src/tiles/loading-tile.js.map +1 -1
- package/dist/src/tiles/mediatype-icon.d.ts +9 -0
- package/dist/src/tiles/mediatype-icon.js +78 -0
- package/dist/src/tiles/mediatype-icon.js.map +1 -0
- package/dist/src/tiles/tile-dispatcher.d.ts +12 -4
- package/dist/src/tiles/tile-dispatcher.js +62 -20
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/src/utils/format-date.js +2 -2
- package/dist/src/utils/format-date.js.map +1 -1
- package/dist/src/utils/format-string.d.ts +2 -0
- package/dist/src/utils/format-string.js +7 -0
- package/dist/src/utils/format-string.js.map +1 -0
- package/dist/src/waveform-thumbnail.d.ts +7 -0
- package/dist/src/waveform-thumbnail.js +106 -0
- package/dist/src/waveform-thumbnail.js.map +1 -0
- package/dist/src/waveform-view.d.ts +0 -0
- package/dist/src/waveform-view.js +2 -0
- package/dist/src/waveform-view.js.map +1 -0
- package/dist/src/your-webcomponent.d.ts +8 -0
- package/dist/src/your-webcomponent.js +38 -0
- package/dist/src/your-webcomponent.js.map +1 -0
- package/dist/test/collection-browser.test.d.ts +1 -0
- package/dist/test/collection-browser.test.js +16 -2
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/mediatype-config.test.d.ts +1 -0
- package/dist/test/mediatype-config.test.js +17 -0
- package/dist/test/mediatype-config.test.js.map +1 -0
- package/dist/test/mediatype-icon.test.d.ts +0 -0
- package/dist/test/mediatype-icon.test.js +3 -0
- package/dist/test/mediatype-icon.test.js.map +1 -0
- package/dist/test/mediatypeConfig.test.d.ts +1 -0
- package/dist/test/mediatypeConfig.test.js +17 -0
- package/dist/test/mediatypeConfig.test.js.map +1 -0
- package/dist/test/utils/format-date.test.js +1 -1
- package/dist/test/utils/format-date.test.js.map +1 -1
- package/dist/test/utils/format-string.test.d.ts +1 -0
- package/dist/test/utils/format-string.test.js +17 -0
- package/dist/test/utils/format-string.test.js.map +1 -0
- package/dist/test/your-webcomponent.test.d.ts +1 -0
- package/dist/test/your-webcomponent.test.js +23 -0
- package/dist/test/your-webcomponent.test.js.map +1 -0
- package/index.ts +6 -0
- package/local.archive.org.cert +86 -0
- package/local.archive.org.key +27 -0
- package/package.json +9 -5
- package/src/assets/img/icons/chevron.ts +4 -0
- package/src/assets/img/icons/mediatype/account.ts +6 -4
- package/src/assets/img/icons/mediatype/audio.ts +7 -4
- package/src/assets/img/icons/mediatype/collection.ts +7 -4
- package/src/assets/img/icons/mediatype/data.ts +15 -0
- package/src/assets/img/icons/mediatype/etree.ts +10 -5
- package/src/assets/img/icons/mediatype/film.ts +2 -1
- package/src/assets/img/icons/mediatype/images.ts +9 -6
- package/src/assets/img/icons/mediatype/radio.ts +15 -0
- package/src/assets/img/icons/mediatype/software.ts +9 -6
- package/src/assets/img/icons/mediatype/texts.ts +9 -6
- package/src/assets/img/icons/mediatype/tv.ts +10 -5
- package/src/assets/img/icons/mediatype/video.ts +10 -6
- package/src/assets/img/icons/mediatype/web.ts +9 -6
- package/src/collection-browser.ts +532 -163
- package/src/collection-facets.ts +307 -205
- package/src/language-code-handler/language-code-handler.ts +64 -0
- package/src/language-code-handler/language-code-mapping.ts +564 -0
- package/src/mediatype/mediatype-config.ts +86 -0
- package/src/models.ts +141 -13
- package/src/restoration-state-handler.ts +266 -0
- package/src/sort-filter-bar/alpha-bar.ts +9 -3
- package/src/sort-filter-bar/img/compact.ts +5 -0
- package/src/sort-filter-bar/img/list.ts +1 -1
- package/src/sort-filter-bar/img/tile.ts +5 -0
- package/src/sort-filter-bar/sort-filter-bar.ts +557 -225
- package/src/tiles/collection-browser-loading-tile.ts +29 -0
- package/src/tiles/grid/account-tile.ts +1 -1
- package/src/tiles/grid/collection-tile.ts +1 -2
- package/src/tiles/grid/icons/views.ts +2 -2
- package/src/tiles/grid/item-tile.ts +54 -164
- package/src/tiles/item-image.ts +218 -0
- package/src/tiles/list/account-label.ts +6 -0
- package/src/tiles/list/date-label.ts +12 -0
- package/src/tiles/list/tile-list-compact-header.ts +77 -0
- package/src/tiles/list/tile-list-compact.ts +220 -0
- package/src/tiles/list/tile-list.ts +414 -107
- package/src/tiles/mediatype-icon.ts +75 -0
- package/src/tiles/tile-dispatcher.ts +71 -19
- package/src/utils/format-date.ts +2 -2
- package/test/collection-browser.test.ts +20 -1
- package/test/mediatype-config.test.ts +18 -0
- package/test/utils/format-date.test.ts +1 -1
- package/web-dev-server.config.mjs +3 -1
- package/src/mediatype-icon.ts +0 -83
- package/src/sort-filter-bar/img/grid.ts +0 -5
- package/src/tiles/loading-tile.ts +0 -70
|
@@ -1,21 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
css,
|
|
3
|
+
html,
|
|
4
|
+
LitElement,
|
|
5
|
+
nothing,
|
|
6
|
+
PropertyValues,
|
|
7
|
+
TemplateResult,
|
|
8
|
+
} from 'lit';
|
|
9
|
+
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
10
|
+
import { join } from 'lit/directives/join.js';
|
|
11
|
+
import { map } from 'lit/directives/map.js';
|
|
12
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
|
3
13
|
import { SortParam } from '@internetarchive/search-service';
|
|
4
14
|
import DOMPurify from 'dompurify';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// - no types
|
|
10
|
-
import { CollectionDisplayMode, TileModel } from '../../models';
|
|
15
|
+
import { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
|
|
16
|
+
import { dateLabel } from './date-label';
|
|
17
|
+
import { accountLabel } from './account-label';
|
|
18
|
+
import { TileModel } from '../../models';
|
|
11
19
|
import { formatCount, NumberFormat } from '../../utils/format-count';
|
|
12
20
|
import { formatDate, DateFormat } from '../../utils/format-date';
|
|
13
|
-
import '
|
|
14
|
-
|
|
15
|
-
/*
|
|
16
|
-
at 750 creator, title trimmed
|
|
17
|
-
at 530
|
|
18
|
-
*/
|
|
21
|
+
import '../mediatype-icon';
|
|
19
22
|
|
|
20
23
|
@customElement('tile-list')
|
|
21
24
|
export class TileList extends LitElement {
|
|
@@ -23,71 +26,315 @@ export class TileList extends LitElement {
|
|
|
23
26
|
|
|
24
27
|
@property({ type: String }) baseNavigationUrl?: string;
|
|
25
28
|
|
|
29
|
+
@property({ type: Object })
|
|
30
|
+
collectionNameCache?: CollectionNameCacheInterface;
|
|
31
|
+
|
|
26
32
|
@property({ type: Number }) currentWidth?: number;
|
|
27
33
|
|
|
28
34
|
@property({ type: Number }) currentHeight?: number;
|
|
29
35
|
|
|
30
|
-
@property({ type: Object }) sortParam
|
|
36
|
+
@property({ type: Object }) sortParam: SortParam | null = null;
|
|
37
|
+
|
|
38
|
+
@property({ type: Number }) mobileBreakpoint?: number;
|
|
31
39
|
|
|
32
|
-
@
|
|
33
|
-
'list-compact';
|
|
40
|
+
@state() private collectionLinks: TemplateResult[] = [];
|
|
34
41
|
|
|
35
|
-
|
|
42
|
+
@property({ type: String }) baseImageUrl?: string;
|
|
43
|
+
|
|
44
|
+
protected updated(changed: PropertyValues): void {
|
|
45
|
+
if (changed.has('model')) {
|
|
46
|
+
this.fetchCollectionNames();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private async fetchCollectionNames() {
|
|
51
|
+
if (
|
|
52
|
+
!this.model?.collections ||
|
|
53
|
+
this.model.collections.length === 0 ||
|
|
54
|
+
!this.collectionNameCache
|
|
55
|
+
) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Note: quirk of Lit: need to replace collectionLinks array,
|
|
59
|
+
// otherwise it will not re-render. Can't simply alter the array.
|
|
60
|
+
this.collectionLinks = [];
|
|
61
|
+
const newCollellectionLinks: TemplateResult[] = [];
|
|
62
|
+
const promises: Promise<void>[] = [];
|
|
63
|
+
for (const collection of this.model.collections) {
|
|
64
|
+
promises.push(
|
|
65
|
+
this.collectionNameCache?.collectionNameFor(collection).then(name => {
|
|
66
|
+
newCollellectionLinks.push(
|
|
67
|
+
this.detailsLink(collection, name ?? collection)
|
|
68
|
+
);
|
|
69
|
+
})
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
await Promise.all(promises);
|
|
73
|
+
this.collectionLinks = newCollellectionLinks;
|
|
74
|
+
}
|
|
36
75
|
|
|
37
76
|
render() {
|
|
38
77
|
return html`
|
|
39
78
|
<div id="list-line" class="${this.classSize}">
|
|
40
|
-
|
|
41
|
-
|
|
79
|
+
${this.classSize === 'mobile'
|
|
80
|
+
? this.mobileTemplate
|
|
81
|
+
: this.desktopTemplate}
|
|
82
|
+
</div>
|
|
83
|
+
`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private get mobileTemplate() {
|
|
87
|
+
return html`
|
|
88
|
+
<div id="list-line-top">
|
|
89
|
+
<div id="list-line-left">
|
|
90
|
+
<div id="thumb">${this.imgTemplate}</div>
|
|
42
91
|
</div>
|
|
43
|
-
<div id="
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
92
|
+
<div id="list-line-right">
|
|
93
|
+
<div id="title-line">
|
|
94
|
+
<div id="title">${this.titleTemplate}</div>
|
|
95
|
+
${this.iconRightTemplate}
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
<div id="list-line-bottom">${this.detailsTemplate}</div>
|
|
100
|
+
`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private get desktopTemplate() {
|
|
104
|
+
return html`
|
|
105
|
+
<div id="list-line-left">
|
|
106
|
+
<div id="thumb">${this.imgTemplate}</div>
|
|
107
|
+
</div>
|
|
108
|
+
<div id="list-line-right">
|
|
109
|
+
<div id="title-line">
|
|
110
|
+
<div id="title">${this.titleTemplate}</div>
|
|
111
|
+
${this.iconRightTemplate}
|
|
48
112
|
</div>
|
|
113
|
+
${this.detailsTemplate}
|
|
114
|
+
</div>
|
|
115
|
+
`;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private get detailsTemplate() {
|
|
119
|
+
return html`
|
|
120
|
+
${this.itemLineTemplate} ${this.creatorTemplate}
|
|
121
|
+
<div id="dates-line">
|
|
122
|
+
${this.datePublishedTemplate} ${this.dateSortByTemplate}
|
|
123
|
+
</div>
|
|
124
|
+
<div id="views-line">
|
|
125
|
+
${this.viewsTemplate} ${this.ratingTemplate} ${this.reviewsTemplate}
|
|
126
|
+
</div>
|
|
127
|
+
${this.topicsTemplate} ${this.collectionsTemplate}
|
|
128
|
+
${this.descriptionTemplate}
|
|
129
|
+
`;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Data templates
|
|
133
|
+
private get imgTemplate() {
|
|
134
|
+
if (!this.model?.identifier) {
|
|
135
|
+
return nothing;
|
|
136
|
+
}
|
|
137
|
+
return html` <img
|
|
138
|
+
src="${this.baseImageUrl}/services/img/${this.model.identifier}"
|
|
139
|
+
alt="${this.model.identifier}"
|
|
140
|
+
class=${this.model?.mediatype}
|
|
141
|
+
/>`;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private get iconRightTemplate() {
|
|
145
|
+
return html`
|
|
146
|
+
<div id="icon-right">
|
|
147
|
+
<mediatype-icon
|
|
148
|
+
.mediatype=${this.model?.mediatype}
|
|
149
|
+
.collections=${this.model?.collections}
|
|
150
|
+
style="--iconCustomFillColor: ${ifDefined(this.collectionColor)}"
|
|
151
|
+
>
|
|
152
|
+
</mediatype-icon>
|
|
153
|
+
</div>
|
|
154
|
+
`;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Only in list, not tile
|
|
158
|
+
private get collectionColor() {
|
|
159
|
+
if (this.model?.mediatype !== 'collection') {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
return '#4666FF';
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private get titleTemplate() {
|
|
166
|
+
if (!this.model?.title) {
|
|
167
|
+
return nothing;
|
|
168
|
+
}
|
|
169
|
+
return html` ${this.detailsLink(this.model.identifier, this.model.title)} `;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private get itemLineTemplate() {
|
|
173
|
+
const source = this.sourceTemplate;
|
|
174
|
+
const volume = this.volumeTemplate;
|
|
175
|
+
const issue = this.issueTemplate;
|
|
176
|
+
if (!source && !volume && !issue) {
|
|
177
|
+
return nothing;
|
|
178
|
+
}
|
|
179
|
+
return html` <div id="item-line">${source} ${volume} ${issue}</div> `;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
private get sourceTemplate() {
|
|
183
|
+
if (!this.model?.source) {
|
|
184
|
+
return nothing;
|
|
185
|
+
}
|
|
186
|
+
return html`
|
|
187
|
+
<div id="source" class="metadata">
|
|
188
|
+
${this.labelTemplate('Source')}
|
|
189
|
+
${this.searchLink('source', this.model.source)}
|
|
49
190
|
</div>
|
|
50
|
-
${this.displayMode === 'list-detail' ? this.detail() : html``}
|
|
51
191
|
`;
|
|
52
192
|
}
|
|
53
193
|
|
|
54
|
-
private
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
194
|
+
private get volumeTemplate() {
|
|
195
|
+
return this.metadataTemplate(this.model?.volume, 'Volume');
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private get issueTemplate() {
|
|
199
|
+
return this.metadataTemplate(this.model?.issue, 'Issue');
|
|
200
|
+
}
|
|
58
201
|
|
|
59
|
-
|
|
202
|
+
private get creatorTemplate() {
|
|
203
|
+
// "Achivist since" if account
|
|
204
|
+
if (this.model?.mediatype === 'account') {
|
|
60
205
|
return html`
|
|
61
|
-
<div id="
|
|
62
|
-
<
|
|
63
|
-
<div id="details">${descriptionHtml} ${topicHtml} ${sourceHtml}</div>
|
|
64
|
-
<div></div>
|
|
206
|
+
<div id="creator" class="metadata">
|
|
207
|
+
<span class="label"> ${accountLabel(this.model?.dateAdded)} </span>
|
|
65
208
|
</div>
|
|
66
209
|
`;
|
|
67
210
|
}
|
|
68
|
-
|
|
211
|
+
// "Creator" if not account tile
|
|
212
|
+
if (!this.model?.creators || this.model.creators.length === 0) {
|
|
213
|
+
return nothing;
|
|
214
|
+
}
|
|
215
|
+
return html`
|
|
216
|
+
<div id="creator" class="metadata">
|
|
217
|
+
${this.labelTemplate('By')}
|
|
218
|
+
${join(
|
|
219
|
+
map(this.model.creators, id => this.searchLink('creator', id)),
|
|
220
|
+
html`, `
|
|
221
|
+
)}
|
|
222
|
+
</div>
|
|
223
|
+
`;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
private get datePublishedTemplate() {
|
|
227
|
+
return this.metadataTemplate(
|
|
228
|
+
formatDate(this.model?.datePublished, 'long'),
|
|
229
|
+
'Published'
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Show date label/value when sorted by date type
|
|
234
|
+
// Except datePublished which is always shown
|
|
235
|
+
private get dateSortByTemplate() {
|
|
236
|
+
if (
|
|
237
|
+
this.sortParam &&
|
|
238
|
+
(this.sortParam.field === 'addeddate' ||
|
|
239
|
+
this.sortParam.field === 'reviewdate' ||
|
|
240
|
+
this.sortParam.field === 'publicdate')
|
|
241
|
+
) {
|
|
242
|
+
return this.metadataTemplate(
|
|
243
|
+
formatDate(this.date, 'long'),
|
|
244
|
+
dateLabel(this.sortParam.field)
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
return nothing;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
private get viewsTemplate() {
|
|
251
|
+
return this.metadataTemplate(
|
|
252
|
+
`${formatCount(this.model?.viewCount ?? 0, this.formatSize)}`,
|
|
253
|
+
'Views'
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
private get ratingTemplate() {
|
|
258
|
+
return this.metadataTemplate(this.model?.averageRating, 'Avg Rating');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
private get reviewsTemplate() {
|
|
262
|
+
return this.metadataTemplate(this.model?.commentCount, 'Reviews');
|
|
69
263
|
}
|
|
70
264
|
|
|
71
|
-
private
|
|
72
|
-
if (this.model?.
|
|
73
|
-
|
|
74
|
-
return html` <div id="description">${description}</div> `;
|
|
265
|
+
private get topicsTemplate() {
|
|
266
|
+
if (!this.model?.subjects || this.model.subjects.length === 0) {
|
|
267
|
+
return nothing;
|
|
75
268
|
}
|
|
76
|
-
return html
|
|
269
|
+
return html`
|
|
270
|
+
<div id="topics" class="metadata">
|
|
271
|
+
${this.labelTemplate('Topics')}
|
|
272
|
+
${join(
|
|
273
|
+
map(this.model.subjects, id => this.searchLink('subject', id)),
|
|
274
|
+
html`, `
|
|
275
|
+
)}
|
|
276
|
+
</div>
|
|
277
|
+
`;
|
|
77
278
|
}
|
|
78
279
|
|
|
79
|
-
private
|
|
80
|
-
if (this.
|
|
81
|
-
return
|
|
280
|
+
private get collectionsTemplate() {
|
|
281
|
+
if (!this.collectionLinks || this.collectionLinks.length === 0) {
|
|
282
|
+
return nothing;
|
|
82
283
|
}
|
|
83
|
-
return html
|
|
284
|
+
return html`
|
|
285
|
+
<div id="collections" class="metadata">
|
|
286
|
+
${this.labelTemplate('Collections')}
|
|
287
|
+
${join(this.collectionLinks, html`, `)}
|
|
288
|
+
</div>
|
|
289
|
+
`;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
private get descriptionTemplate() {
|
|
293
|
+
return this.metadataTemplate(
|
|
294
|
+
DOMPurify.sanitize(this.model?.description ?? ''),
|
|
295
|
+
'',
|
|
296
|
+
'description'
|
|
297
|
+
);
|
|
84
298
|
}
|
|
85
299
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
300
|
+
// Utility functions
|
|
301
|
+
private metadataTemplate(text: any, label = '', id?: string) {
|
|
302
|
+
if (!text) return nothing;
|
|
303
|
+
return html`
|
|
304
|
+
<div id=${ifDefined(id)} class="metadata">
|
|
305
|
+
${this.labelTemplate(label)} ${text}
|
|
306
|
+
</div>
|
|
307
|
+
`;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
private labelTemplate(label: string) {
|
|
311
|
+
return html` ${label
|
|
312
|
+
? html`<span class="label">${label}: </span>`
|
|
313
|
+
: nothing}`;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
private searchLink(field: string, searchTerm: string) {
|
|
317
|
+
if (!field || !searchTerm) {
|
|
318
|
+
return nothing;
|
|
89
319
|
}
|
|
90
|
-
|
|
320
|
+
const query = encodeURIComponent(`${field}:"${searchTerm}"`);
|
|
321
|
+
// No whitespace after closing tag
|
|
322
|
+
// Note: single ' for href='' to wrap " in query var gets changed back by yarn format
|
|
323
|
+
|
|
324
|
+
// eslint-disable-next-line lit/no-invalid-html
|
|
325
|
+
return html`<a href="${this.baseNavigationUrl}/search.php?query=${query}">
|
|
326
|
+
${DOMPurify.sanitize(searchTerm)}</a
|
|
327
|
+
>`;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
private detailsLink(identifier: string, text?: string): TemplateResult {
|
|
331
|
+
const linkText = text ?? identifier;
|
|
332
|
+
// No whitespace after closing tag
|
|
333
|
+
// identifiers (all ASCII in their creation) should be safe to use in href, but sanitize anyway
|
|
334
|
+
return html`<a
|
|
335
|
+
href="${this.baseNavigationUrl}/details/${encodeURI(identifier)}"
|
|
336
|
+
>${DOMPurify.sanitize(linkText)}</a
|
|
337
|
+
>`;
|
|
91
338
|
}
|
|
92
339
|
|
|
93
340
|
/*
|
|
@@ -109,118 +356,178 @@ export class TileList extends LitElement {
|
|
|
109
356
|
}
|
|
110
357
|
|
|
111
358
|
private get classSize(): string {
|
|
112
|
-
|
|
359
|
+
if (
|
|
360
|
+
this.mobileBreakpoint &&
|
|
361
|
+
this.currentWidth &&
|
|
362
|
+
this.currentWidth < this.mobileBreakpoint
|
|
363
|
+
) {
|
|
364
|
+
return 'mobile';
|
|
365
|
+
}
|
|
366
|
+
return 'desktop';
|
|
113
367
|
}
|
|
114
368
|
|
|
115
369
|
private get formatSize(): DateFormat | NumberFormat {
|
|
116
|
-
|
|
370
|
+
if (
|
|
371
|
+
this.mobileBreakpoint &&
|
|
372
|
+
this.currentWidth &&
|
|
373
|
+
this.currentWidth < this.mobileBreakpoint
|
|
374
|
+
) {
|
|
375
|
+
return 'short';
|
|
376
|
+
}
|
|
377
|
+
return 'long';
|
|
117
378
|
}
|
|
118
379
|
|
|
119
380
|
static get styles() {
|
|
120
381
|
return css`
|
|
121
|
-
|
|
122
|
-
font-size:
|
|
382
|
+
html {
|
|
383
|
+
font-size: unset;
|
|
123
384
|
}
|
|
124
|
-
|
|
385
|
+
|
|
386
|
+
div {
|
|
125
387
|
font-size: 14px;
|
|
126
388
|
}
|
|
127
389
|
|
|
390
|
+
div a {
|
|
391
|
+
text-decoration: none;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
.label {
|
|
395
|
+
font-weight: bold;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
#list-line.mobile {
|
|
399
|
+
--infiniteScrollerRowGap: 20px;
|
|
400
|
+
--infiniteScrollerRowHeight: auto;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
#list-line.desktop {
|
|
404
|
+
--infiniteScrollerRowGap: 30px;
|
|
405
|
+
--infiniteScrollerRowHeight: auto;
|
|
406
|
+
}
|
|
407
|
+
|
|
128
408
|
/* fields */
|
|
129
409
|
|
|
130
|
-
#
|
|
131
|
-
|
|
132
|
-
|
|
410
|
+
#thumb img {
|
|
411
|
+
object-fit: cover;
|
|
412
|
+
display: block;
|
|
133
413
|
}
|
|
134
414
|
|
|
135
|
-
#
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
#source {
|
|
139
|
-
text-overflow: ellipsis;
|
|
140
|
-
overflow: hidden;
|
|
415
|
+
.mobile #thumb img {
|
|
416
|
+
width: 90px;
|
|
417
|
+
height: 90px;
|
|
141
418
|
}
|
|
142
419
|
|
|
143
|
-
#
|
|
144
|
-
|
|
145
|
-
|
|
420
|
+
.desktop #thumb img {
|
|
421
|
+
width: 100px;
|
|
422
|
+
height: 100px;
|
|
146
423
|
}
|
|
147
424
|
|
|
148
|
-
#
|
|
149
|
-
|
|
150
|
-
|
|
425
|
+
#thumb img.collection {
|
|
426
|
+
border-radius: 8px;
|
|
427
|
+
-webkit-border-radius: 8px;
|
|
428
|
+
-moz-border-radius: 8px;
|
|
151
429
|
}
|
|
152
430
|
|
|
153
|
-
#
|
|
154
|
-
|
|
155
|
-
|
|
431
|
+
.mobile #thumb img.account {
|
|
432
|
+
border-radius: 45px;
|
|
433
|
+
-webkit-border-radius: 45px;
|
|
434
|
+
-moz-border-radius: 45px;
|
|
156
435
|
}
|
|
157
436
|
|
|
158
|
-
#
|
|
159
|
-
|
|
437
|
+
.desktop #thumb img.account {
|
|
438
|
+
border-radius: 50px;
|
|
439
|
+
-webkit-border-radius: 50px;
|
|
440
|
+
-moz-border-radius: 50px;
|
|
160
441
|
}
|
|
161
442
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
443
|
+
#icon-right {
|
|
444
|
+
width: 20px;
|
|
445
|
+
padding-top: 5px;
|
|
446
|
+
--iconHeight: 20px;
|
|
447
|
+
--iconWidth: 20px;
|
|
448
|
+
--iconTextAlign: right;
|
|
449
|
+
margin-top: -8px;
|
|
450
|
+
text-align: right;
|
|
166
451
|
}
|
|
167
452
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
font-size:
|
|
453
|
+
#title {
|
|
454
|
+
color: #4b64ff;
|
|
455
|
+
text-decoration: none;
|
|
456
|
+
font-size: 22px;
|
|
457
|
+
font-weight: bold;
|
|
458
|
+
/* align top of text with image */
|
|
459
|
+
line-height: 25px;
|
|
460
|
+
margin-top: -4px;
|
|
461
|
+
padding-bottom: 2px;
|
|
462
|
+
flex-grow: 1;
|
|
172
463
|
}
|
|
173
464
|
|
|
174
|
-
|
|
465
|
+
.metadata {
|
|
466
|
+
line-height: 20px;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
#description,
|
|
470
|
+
#creator,
|
|
471
|
+
#topics,
|
|
472
|
+
#source {
|
|
473
|
+
text-align: left;
|
|
175
474
|
overflow: hidden;
|
|
176
475
|
text-overflow: ellipsis;
|
|
177
|
-
-webkit-line-clamp: 2;
|
|
178
476
|
-webkit-box-orient: vertical;
|
|
179
477
|
display: -webkit-box;
|
|
180
478
|
word-break: break-word;
|
|
181
479
|
-webkit-line-clamp: 3; /* number of lines to show */
|
|
182
480
|
line-clamp: 3;
|
|
183
|
-
-webkit-box-orient: vertical;
|
|
184
|
-
text-align: left;
|
|
185
481
|
}
|
|
186
482
|
|
|
187
|
-
|
|
483
|
+
#icon {
|
|
484
|
+
padding-top: 5px;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
#description {
|
|
488
|
+
padding-top: 10px;
|
|
489
|
+
}
|
|
188
490
|
|
|
491
|
+
/* Top level container */
|
|
189
492
|
#list-line {
|
|
190
|
-
display:
|
|
191
|
-
column-gap: 10px;
|
|
192
|
-
line-height: 1.42857143;
|
|
193
|
-
border-top: 1px solid #ddd !important;
|
|
194
|
-
padding-top: 5px;
|
|
195
|
-
align-items: center;
|
|
493
|
+
display: flex;
|
|
196
494
|
}
|
|
197
495
|
|
|
198
496
|
#list-line.mobile {
|
|
199
|
-
|
|
497
|
+
flex-direction: column;
|
|
200
498
|
}
|
|
499
|
+
|
|
201
500
|
#list-line.desktop {
|
|
202
|
-
|
|
501
|
+
column-gap: 10px;
|
|
203
502
|
}
|
|
204
503
|
|
|
205
|
-
#list-line
|
|
206
|
-
|
|
504
|
+
#list-line-top {
|
|
505
|
+
display: flex;
|
|
506
|
+
column-gap: 7px;
|
|
207
507
|
}
|
|
208
508
|
|
|
209
|
-
|
|
509
|
+
#list-line-bottom {
|
|
510
|
+
padding-top: 4px;
|
|
511
|
+
}
|
|
210
512
|
|
|
211
|
-
#list-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
align-items: center;
|
|
513
|
+
#list-line-right,
|
|
514
|
+
#list-line-top,
|
|
515
|
+
#list-line-bottom {
|
|
516
|
+
width: 100%;
|
|
216
517
|
}
|
|
217
518
|
|
|
218
|
-
|
|
219
|
-
|
|
519
|
+
div a:hover {
|
|
520
|
+
text-decoration: underline;
|
|
220
521
|
}
|
|
221
522
|
|
|
222
|
-
|
|
223
|
-
|
|
523
|
+
/* Lines containing multiple div as row */
|
|
524
|
+
#item-line,
|
|
525
|
+
#dates-line,
|
|
526
|
+
#views-line,
|
|
527
|
+
#title-line {
|
|
528
|
+
display: flex;
|
|
529
|
+
flex-direction: row;
|
|
530
|
+
gap: 10px;
|
|
224
531
|
}
|
|
225
532
|
`;
|
|
226
533
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { css, CSSResultGroup, html, LitElement } from 'lit';
|
|
2
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
3
|
+
|
|
4
|
+
import { mediatypeConfig } from '../mediatype/mediatype-config';
|
|
5
|
+
|
|
6
|
+
@customElement('mediatype-icon')
|
|
7
|
+
export class MediatypeIcon extends LitElement {
|
|
8
|
+
@property({ type: String }) mediatype: string | undefined;
|
|
9
|
+
|
|
10
|
+
@property({ type: Array }) collections: string[] | undefined;
|
|
11
|
+
|
|
12
|
+
@property({ type: Boolean }) showText = false;
|
|
13
|
+
|
|
14
|
+
private get displayMediatype(): string {
|
|
15
|
+
const tvIdentifier = ['tvnews', 'tvarchive', 'television'];
|
|
16
|
+
const radioIdentifier = ['radio', 'radioprogram'];
|
|
17
|
+
|
|
18
|
+
if (
|
|
19
|
+
this.mediatype === 'movies' &&
|
|
20
|
+
this.collections?.some(id => tvIdentifier.indexOf(id) >= 0)
|
|
21
|
+
) {
|
|
22
|
+
return 'tv';
|
|
23
|
+
}
|
|
24
|
+
if (
|
|
25
|
+
this.mediatype === 'audio' &&
|
|
26
|
+
this.collections?.some(id => radioIdentifier.indexOf(id) >= 0)
|
|
27
|
+
) {
|
|
28
|
+
return 'radio';
|
|
29
|
+
}
|
|
30
|
+
return this.mediatype || '';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
render() {
|
|
34
|
+
const config = mediatypeConfig[this.displayMediatype];
|
|
35
|
+
if (!config) {
|
|
36
|
+
return html``;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return html`
|
|
40
|
+
<div
|
|
41
|
+
id="icon"
|
|
42
|
+
class="${this.showText ? 'show-text' : 'hide-text'}"
|
|
43
|
+
style="--iconFillColor: ${config.color}"
|
|
44
|
+
>
|
|
45
|
+
${config.icon}
|
|
46
|
+
<p class="status-text">${config.text}</p>
|
|
47
|
+
</div>
|
|
48
|
+
`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
static get styles(): CSSResultGroup {
|
|
52
|
+
return css`
|
|
53
|
+
.status-text {
|
|
54
|
+
font-size: 14px;
|
|
55
|
+
color: #2c2c2c;
|
|
56
|
+
margin: auto;
|
|
57
|
+
display: block;
|
|
58
|
+
text-align: var(--iconTextAlign, center);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
#icon.hide-text p {
|
|
62
|
+
display: none;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
svg {
|
|
66
|
+
height: var(--iconHeight, 10px);
|
|
67
|
+
width: var(--iconWidth, 10px);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.fill-color {
|
|
71
|
+
fill: var(--iconCustomFillColor, var(--iconFillColor, '#000000'));
|
|
72
|
+
}
|
|
73
|
+
`;
|
|
74
|
+
}
|
|
75
|
+
}
|