@internetarchive/collection-browser 0.0.1-alpha.13 → 0.0.1-alpha.16
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/demo/app-root.ts +0 -4
- package/dist/demo/app-root.js +0 -4
- package/dist/demo/app-root.js.map +1 -1
- package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
- package/dist/src/assets/img/icons/arrow-right.js +4 -0
- package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
- 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/collection-browser.d.ts +13 -3
- package/dist/src/collection-browser.js +178 -32
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets.d.ts +4 -1
- package/dist/src/collection-facets.js +88 -9
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/mediatype-icon.js +2 -2
- package/dist/src/mediatype-icon.js.map +1 -1
- package/dist/src/models.d.ts +14 -2
- package/dist/src/models.js +31 -7
- package/dist/src/models.js.map +1 -1
- package/dist/src/sort-filter-bar/alpha-bar.js +1 -1
- package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
- package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +38 -4
- package/dist/src/sort-filter-bar/sort-filter-bar.js +297 -200
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/tiles/list/tile-list-compact-header.d.ts +11 -0
- package/dist/src/tiles/list/tile-list-compact-header.js +77 -0
- package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
- package/dist/src/tiles/list/tile-list-compact.d.ts +1 -1
- package/dist/src/tiles/list/tile-list-compact.js +12 -12
- package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
- package/dist/src/tiles/list/tile-list.d.ts +10 -10
- package/dist/src/tiles/list/tile-list.js +41 -36
- package/dist/src/tiles/list/tile-list.js.map +1 -1
- package/dist/src/tiles/tile-dispatcher.d.ts +3 -0
- package/dist/src/tiles/tile-dispatcher.js +31 -12
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/package.json +1 -1
- package/src/assets/img/icons/chevron.ts +4 -0
- package/src/collection-browser.ts +187 -38
- package/src/collection-facets.ts +87 -11
- package/src/mediatype-icon.ts +2 -2
- package/src/models.ts +35 -17
- package/src/sort-filter-bar/alpha-bar.ts +1 -1
- package/src/sort-filter-bar/sort-filter-bar.ts +339 -208
- package/src/tiles/list/tile-list-compact-header.ts +73 -0
- package/src/tiles/list/tile-list-compact.ts +12 -12
- package/src/tiles/list/tile-list.ts +41 -39
- package/src/tiles/tile-dispatcher.ts +33 -12
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { css, html, LitElement } from 'lit';
|
|
2
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
3
|
+
import { SortParam } from '@internetarchive/search-service';
|
|
4
|
+
import eyeIcon from '../../assets/img/icons/eye';
|
|
5
|
+
import { TileModel } from '../../models';
|
|
6
|
+
|
|
7
|
+
@customElement('tile-list-compact-header')
|
|
8
|
+
export class TileListCompactHeader extends LitElement {
|
|
9
|
+
@property({ type: Object }) model?: TileModel;
|
|
10
|
+
|
|
11
|
+
@property({ type: Number }) currentWidth?: number;
|
|
12
|
+
|
|
13
|
+
@property({ type: Object }) sortParam?: SortParam;
|
|
14
|
+
|
|
15
|
+
render() {
|
|
16
|
+
return html`
|
|
17
|
+
<div id="list-line-header" class="${this.classSize}">
|
|
18
|
+
<div id="thumb"></div>
|
|
19
|
+
<div id="title">Title</div>
|
|
20
|
+
<div id="date">Date Archived</div>
|
|
21
|
+
<div id="creator">Creator</div>
|
|
22
|
+
<div id="views">${eyeIcon}</div>
|
|
23
|
+
<div id="icon"></div>
|
|
24
|
+
</div>
|
|
25
|
+
`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
private get classSize(): string {
|
|
29
|
+
return (this.currentWidth ?? 531) < 530 ? 'mobile' : 'desktop';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static get styles() {
|
|
33
|
+
return css`
|
|
34
|
+
html {
|
|
35
|
+
font-size: unset;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
div {
|
|
39
|
+
font-size: 14px;
|
|
40
|
+
font-weight: bold;
|
|
41
|
+
line-height: 20px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.mobile #views {
|
|
45
|
+
display: none;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
#views {
|
|
49
|
+
text-align: right;
|
|
50
|
+
padding-right: 6px;
|
|
51
|
+
}
|
|
52
|
+
#views svg {
|
|
53
|
+
height: 18px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
#list-line-header {
|
|
57
|
+
display: grid;
|
|
58
|
+
column-gap: 10px;
|
|
59
|
+
align-items: center;
|
|
60
|
+
padding-left: 1rem;
|
|
61
|
+
padding-right: 1rem;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
#list-line-header.mobile {
|
|
65
|
+
grid-template-columns: 30px 3fr 29px 2fr 19px;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
#list-line-header.desktop {
|
|
69
|
+
grid-template-columns: 51px 3fr 100px 2fr 60px 26px;
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { css, html, LitElement } from 'lit';
|
|
1
|
+
import { css, html, LitElement, nothing } from 'lit';
|
|
2
2
|
import { customElement, property } from 'lit/decorators.js';
|
|
3
3
|
import { SortParam } from '@internetarchive/search-service';
|
|
4
4
|
import DOMPurify from 'dompurify';
|
|
@@ -22,7 +22,7 @@ export class TileListCompact extends LitElement {
|
|
|
22
22
|
render() {
|
|
23
23
|
return html`
|
|
24
24
|
<div id="list-line" class="${this.classSize}">
|
|
25
|
-
<div id="thumb">${this.
|
|
25
|
+
<div id="thumb">${this.imageTemplate}</div>
|
|
26
26
|
<div id="title">${DOMPurify.sanitize(this.model?.title ?? '')}</div>
|
|
27
27
|
<div id="date">${formatDate(this.date, this.formatSize)}</div>
|
|
28
28
|
<div id="creator">${DOMPurify.sanitize(this.model?.creator ?? '')}</div>
|
|
@@ -36,15 +36,15 @@ export class TileListCompact extends LitElement {
|
|
|
36
36
|
`;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
private
|
|
40
|
-
if (this.model?.identifier) {
|
|
41
|
-
return
|
|
42
|
-
src="${this.baseNavigationUrl}/services/img/${this.model.identifier}"
|
|
43
|
-
alt="${this.model.identifier}"
|
|
44
|
-
class=${this.model?.mediatype}
|
|
45
|
-
/>`;
|
|
39
|
+
private get imageTemplate() {
|
|
40
|
+
if (!this.model?.identifier) {
|
|
41
|
+
return nothing;
|
|
46
42
|
}
|
|
47
|
-
return html
|
|
43
|
+
return html` <img
|
|
44
|
+
src="${this.baseNavigationUrl}/services/img/${this.model.identifier}"
|
|
45
|
+
alt="${this.model.identifier}"
|
|
46
|
+
class="${this.model?.mediatype}"
|
|
47
|
+
/>`;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
/*
|
|
@@ -160,7 +160,7 @@ export class TileListCompact extends LitElement {
|
|
|
160
160
|
#list-line {
|
|
161
161
|
display: grid;
|
|
162
162
|
column-gap: 10px;
|
|
163
|
-
border-top: 1px solid #ddd
|
|
163
|
+
border-top: 1px solid #ddd;
|
|
164
164
|
align-items: center;
|
|
165
165
|
line-height: 20px;
|
|
166
166
|
}
|
|
@@ -195,7 +195,7 @@ export class TileListCompact extends LitElement {
|
|
|
195
195
|
flex-shrink: 1;
|
|
196
196
|
flex-basis: 0;
|
|
197
197
|
}
|
|
198
|
-
|
|
198
|
+
*/
|
|
199
199
|
|
|
200
200
|
#list-line:hover #title {
|
|
201
201
|
text-decoration: underline;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable lit/no-invalid-html */
|
|
2
|
-
import { css, html, LitElement } from 'lit';
|
|
2
|
+
import { css, html, LitElement, nothing } from 'lit';
|
|
3
3
|
import { customElement, property } from 'lit/decorators.js';
|
|
4
4
|
import { SortParam } from '@internetarchive/search-service';
|
|
5
5
|
import DOMPurify from 'dompurify';
|
|
@@ -24,12 +24,12 @@ export class TileList extends LitElement {
|
|
|
24
24
|
return html`
|
|
25
25
|
<div id="list-line" class="${this.classSize}">
|
|
26
26
|
<div id="list-line-left">
|
|
27
|
-
<div id="thumb">${this.
|
|
28
|
-
${this.
|
|
27
|
+
<div id="thumb">${this.imgTemplate}</div>
|
|
28
|
+
${this.iconLeftTemplate}
|
|
29
29
|
</div>
|
|
30
30
|
<div id="list-line-right">
|
|
31
31
|
<div id="title">${DOMPurify.sanitize(this.model?.title ?? '')}</div>
|
|
32
|
-
${this.
|
|
32
|
+
${this.itemLineTemplate} ${this.creatorTemplate}
|
|
33
33
|
<div id="date">
|
|
34
34
|
<span class="label">Published:</span> ${formatDate(
|
|
35
35
|
this.date,
|
|
@@ -37,17 +37,17 @@ export class TileList extends LitElement {
|
|
|
37
37
|
)}
|
|
38
38
|
</div>
|
|
39
39
|
<div id="views-line">
|
|
40
|
-
${this.
|
|
40
|
+
${this.viewsTemplate} ${this.ratingTemplate} ${this.reviewsTemplate}
|
|
41
41
|
</div>
|
|
42
|
-
${this.
|
|
42
|
+
${this.topicsTemplate} ${this.descriptionTemplate}
|
|
43
43
|
</div>
|
|
44
44
|
</div>
|
|
45
45
|
`;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
private
|
|
48
|
+
private get imgTemplate() {
|
|
49
49
|
if (!this.model?.identifier) {
|
|
50
|
-
return
|
|
50
|
+
return nothing;
|
|
51
51
|
}
|
|
52
52
|
return html` <img
|
|
53
53
|
src="${this.baseNavigationUrl}/services/img/${this.model.identifier}"
|
|
@@ -56,9 +56,9 @@ export class TileList extends LitElement {
|
|
|
56
56
|
/>`;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
private
|
|
59
|
+
private get iconLeftTemplate() {
|
|
60
60
|
if (this.classSize !== 'desktop') {
|
|
61
|
-
return
|
|
61
|
+
return nothing;
|
|
62
62
|
}
|
|
63
63
|
return html`
|
|
64
64
|
<div id="icon-left">
|
|
@@ -68,9 +68,9 @@ export class TileList extends LitElement {
|
|
|
68
68
|
`;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
private
|
|
71
|
+
private get creatorTemplate() {
|
|
72
72
|
if (!this.model?.creator) {
|
|
73
|
-
return
|
|
73
|
+
return nothing;
|
|
74
74
|
}
|
|
75
75
|
return html`
|
|
76
76
|
<div id="creator">
|
|
@@ -80,15 +80,15 @@ export class TileList extends LitElement {
|
|
|
80
80
|
`;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
private
|
|
84
|
-
const source = this.
|
|
83
|
+
private get itemLineTemplate() {
|
|
84
|
+
const source = this.sourceTemplate;
|
|
85
85
|
if (!source) {
|
|
86
|
-
return
|
|
86
|
+
return nothing;
|
|
87
87
|
}
|
|
88
88
|
return html` <div id="item-line">${source}</div> `;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
private
|
|
91
|
+
private get viewsTemplate() {
|
|
92
92
|
return html`
|
|
93
93
|
<div id="views">
|
|
94
94
|
<span class="label">Views: </span>
|
|
@@ -97,9 +97,9 @@ export class TileList extends LitElement {
|
|
|
97
97
|
`;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
private
|
|
100
|
+
private get ratingTemplate() {
|
|
101
101
|
if (!this.model?.averageRating) {
|
|
102
|
-
return
|
|
102
|
+
return nothing;
|
|
103
103
|
}
|
|
104
104
|
return html`
|
|
105
105
|
<div id="reviews">
|
|
@@ -109,9 +109,9 @@ export class TileList extends LitElement {
|
|
|
109
109
|
`;
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
private
|
|
112
|
+
private get reviewsTemplate() {
|
|
113
113
|
if (!this.model?.commentCount) {
|
|
114
|
-
return
|
|
114
|
+
return nothing;
|
|
115
115
|
}
|
|
116
116
|
return html`
|
|
117
117
|
<div id="reviews">
|
|
@@ -121,39 +121,41 @@ export class TileList extends LitElement {
|
|
|
121
121
|
`;
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
private
|
|
124
|
+
private get descriptionTemplate() {
|
|
125
125
|
if (!this.model?.description) {
|
|
126
|
-
return
|
|
126
|
+
return nothing;
|
|
127
127
|
}
|
|
128
128
|
const description = DOMPurify.sanitize(`${this.model?.description}`);
|
|
129
|
-
return html
|
|
129
|
+
return html` <div id="description">${description}</div> `;
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
private
|
|
132
|
+
private get topicsTemplate() {
|
|
133
133
|
if (!this.model?.subject) {
|
|
134
|
-
return
|
|
134
|
+
return nothing;
|
|
135
135
|
}
|
|
136
|
-
return html`
|
|
137
|
-
<
|
|
138
|
-
|
|
139
|
-
|
|
136
|
+
return html`
|
|
137
|
+
<div id="topics">
|
|
138
|
+
<span class="label">Topics: </span>
|
|
139
|
+
${DOMPurify.sanitize(this.model?.subject)}
|
|
140
|
+
</div>
|
|
141
|
+
`;
|
|
140
142
|
}
|
|
141
143
|
|
|
142
|
-
private
|
|
143
|
-
if (this.model?.source) {
|
|
144
|
-
return
|
|
145
|
-
<span class="label">Source: </span>${this.searchLink(
|
|
146
|
-
'source',
|
|
147
|
-
this.model.source
|
|
148
|
-
)}
|
|
149
|
-
</div>`;
|
|
144
|
+
private get sourceTemplate() {
|
|
145
|
+
if (!this.model?.source) {
|
|
146
|
+
return nothing;
|
|
150
147
|
}
|
|
151
|
-
return html
|
|
148
|
+
return html`
|
|
149
|
+
<div id="source">
|
|
150
|
+
<span class="label">Source: </span>
|
|
151
|
+
${this.searchLink('source', this.model.source)}
|
|
152
|
+
</div>
|
|
153
|
+
`;
|
|
152
154
|
}
|
|
153
155
|
|
|
154
156
|
private searchLink(field: string, searchTerm: string) {
|
|
155
157
|
if (!field || !searchTerm) {
|
|
156
|
-
return
|
|
158
|
+
return nothing;
|
|
157
159
|
}
|
|
158
160
|
const query = encodeURIComponent(`${field}:"${searchTerm}"`);
|
|
159
161
|
// eslint-disable-next-line lit/no-invalid-html
|
|
@@ -12,6 +12,7 @@ import './grid/item-tile';
|
|
|
12
12
|
import './grid/account-tile';
|
|
13
13
|
import './list/tile-list';
|
|
14
14
|
import './list/tile-list-compact';
|
|
15
|
+
import './list/tile-list-compact-header';
|
|
15
16
|
|
|
16
17
|
@customElement('tile-dispatcher')
|
|
17
18
|
export class TileDispatcher
|
|
@@ -39,19 +40,39 @@ export class TileDispatcher
|
|
|
39
40
|
render() {
|
|
40
41
|
return html`
|
|
41
42
|
<div id="container">
|
|
42
|
-
${this.
|
|
43
|
-
?
|
|
44
|
-
:
|
|
45
|
-
<a
|
|
46
|
-
href="${this.baseNavigationUrl}/details/${this.model?.identifier}"
|
|
47
|
-
title=${ifDefined(this.model?.title)}
|
|
48
|
-
>
|
|
49
|
-
${this.tile}
|
|
50
|
-
</a>
|
|
43
|
+
${this.displayMode === 'list-header'
|
|
44
|
+
? this.headerTemplate
|
|
45
|
+
: this.tileTemplate}
|
|
51
46
|
</div>
|
|
52
47
|
`;
|
|
53
48
|
}
|
|
54
49
|
|
|
50
|
+
private get headerTemplate() {
|
|
51
|
+
const { currentWidth, sortParam } = this;
|
|
52
|
+
return html`
|
|
53
|
+
<tile-list-compact-header
|
|
54
|
+
class="header"
|
|
55
|
+
.currentWidth=${currentWidth}
|
|
56
|
+
.sortParam=${sortParam}
|
|
57
|
+
>
|
|
58
|
+
</tile-list-compact-header>
|
|
59
|
+
`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private get tileTemplate() {
|
|
63
|
+
return html`
|
|
64
|
+
${this.showDeleteButton
|
|
65
|
+
? html`<button id="delete-button">X</button>`
|
|
66
|
+
: nothing}
|
|
67
|
+
<a
|
|
68
|
+
href="${this.baseNavigationUrl}/details/${this.model?.identifier}"
|
|
69
|
+
title=${ifDefined(this.model?.title)}
|
|
70
|
+
>
|
|
71
|
+
${this.tile}
|
|
72
|
+
</a>
|
|
73
|
+
`;
|
|
74
|
+
}
|
|
75
|
+
|
|
55
76
|
handleResize(entry: ResizeObserverEntry): void {
|
|
56
77
|
this.currentWidth = entry.contentRect.width;
|
|
57
78
|
this.currentHeight = entry.contentRect.height;
|
|
@@ -111,9 +132,9 @@ export class TileDispatcher
|
|
|
111
132
|
default:
|
|
112
133
|
return html`<item-tile
|
|
113
134
|
.model=${model}
|
|
114
|
-
.baseNavigationUrl=${
|
|
115
|
-
.currentWidth=${
|
|
116
|
-
.currentHeight=${
|
|
135
|
+
.baseNavigationUrl=${baseNavigationUrl}
|
|
136
|
+
.currentWidth=${currentWidth}
|
|
137
|
+
.currentHeight=${currentHeight}
|
|
117
138
|
></item-tile>`;
|
|
118
139
|
}
|
|
119
140
|
case 'list-compact':
|