@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.
Files changed (49) hide show
  1. package/demo/app-root.ts +0 -4
  2. package/dist/demo/app-root.js +0 -4
  3. package/dist/demo/app-root.js.map +1 -1
  4. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
  5. package/dist/src/assets/img/icons/arrow-right.js +4 -0
  6. package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
  7. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  8. package/dist/src/assets/img/icons/chevron.js +4 -0
  9. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  10. package/dist/src/collection-browser.d.ts +13 -3
  11. package/dist/src/collection-browser.js +178 -32
  12. package/dist/src/collection-browser.js.map +1 -1
  13. package/dist/src/collection-facets.d.ts +4 -1
  14. package/dist/src/collection-facets.js +88 -9
  15. package/dist/src/collection-facets.js.map +1 -1
  16. package/dist/src/mediatype-icon.js +2 -2
  17. package/dist/src/mediatype-icon.js.map +1 -1
  18. package/dist/src/models.d.ts +14 -2
  19. package/dist/src/models.js +31 -7
  20. package/dist/src/models.js.map +1 -1
  21. package/dist/src/sort-filter-bar/alpha-bar.js +1 -1
  22. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  23. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +38 -4
  24. package/dist/src/sort-filter-bar/sort-filter-bar.js +297 -200
  25. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  26. package/dist/src/tiles/list/tile-list-compact-header.d.ts +11 -0
  27. package/dist/src/tiles/list/tile-list-compact-header.js +77 -0
  28. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  29. package/dist/src/tiles/list/tile-list-compact.d.ts +1 -1
  30. package/dist/src/tiles/list/tile-list-compact.js +12 -12
  31. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  32. package/dist/src/tiles/list/tile-list.d.ts +10 -10
  33. package/dist/src/tiles/list/tile-list.js +41 -36
  34. package/dist/src/tiles/list/tile-list.js.map +1 -1
  35. package/dist/src/tiles/tile-dispatcher.d.ts +3 -0
  36. package/dist/src/tiles/tile-dispatcher.js +31 -12
  37. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/assets/img/icons/chevron.ts +4 -0
  40. package/src/collection-browser.ts +187 -38
  41. package/src/collection-facets.ts +87 -11
  42. package/src/mediatype-icon.ts +2 -2
  43. package/src/models.ts +35 -17
  44. package/src/sort-filter-bar/alpha-bar.ts +1 -1
  45. package/src/sort-filter-bar/sort-filter-bar.ts +339 -208
  46. package/src/tiles/list/tile-list-compact-header.ts +73 -0
  47. package/src/tiles/list/tile-list-compact.ts +12 -12
  48. package/src/tiles/list/tile-list.ts +41 -39
  49. 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.img()}</div>
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 img() {
40
- if (this.model?.identifier) {
41
- return html` <img
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 !important;
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.img()}</div>
28
- ${this.iconLeft()}
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.itemLine()} ${this.creator()}
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.views()} ${this.rating()} ${this.reviews()}
40
+ ${this.viewsTemplate} ${this.ratingTemplate} ${this.reviewsTemplate}
41
41
  </div>
42
- ${this.topics()} ${this.description()}
42
+ ${this.topicsTemplate} ${this.descriptionTemplate}
43
43
  </div>
44
44
  </div>
45
45
  `;
46
46
  }
47
47
 
48
- private img() {
48
+ private get imgTemplate() {
49
49
  if (!this.model?.identifier) {
50
- return html``;
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 iconLeft() {
59
+ private get iconLeftTemplate() {
60
60
  if (this.classSize !== 'desktop') {
61
- return html``;
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 creator() {
71
+ private get creatorTemplate() {
72
72
  if (!this.model?.creator) {
73
- return html``;
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 itemLine() {
84
- const source = this.source();
83
+ private get itemLineTemplate() {
84
+ const source = this.sourceTemplate;
85
85
  if (!source) {
86
- return html``;
86
+ return nothing;
87
87
  }
88
88
  return html` <div id="item-line">${source}</div> `;
89
89
  }
90
90
 
91
- private views() {
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 rating() {
100
+ private get ratingTemplate() {
101
101
  if (!this.model?.averageRating) {
102
- return html``;
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 reviews() {
112
+ private get reviewsTemplate() {
113
113
  if (!this.model?.commentCount) {
114
- return html``;
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 description() {
124
+ private get descriptionTemplate() {
125
125
  if (!this.model?.description) {
126
- return html``;
126
+ return nothing;
127
127
  }
128
128
  const description = DOMPurify.sanitize(`${this.model?.description}`);
129
- return html`<div id="description">${description}</div>`;
129
+ return html` <div id="description">${description}</div> `;
130
130
  }
131
131
 
132
- private topics() {
132
+ private get topicsTemplate() {
133
133
  if (!this.model?.subject) {
134
- return html``;
134
+ return nothing;
135
135
  }
136
- return html` <div id="topics">
137
- <span class="label">Topics: </span>
138
- ${DOMPurify.sanitize(this.model?.subject)}
139
- </div>`;
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 source() {
143
- if (this.model?.source) {
144
- return html`<div id="source">
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 html``;
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.showDeleteButton
43
- ? html`<button id="delete-button">X</button>`
44
- : nothing}
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=${this.baseNavigationUrl}
115
- .currentWidth=${this.currentWidth}
116
- .currentHeight=${this.currentHeight}
135
+ .baseNavigationUrl=${baseNavigationUrl}
136
+ .currentWidth=${currentWidth}
137
+ .currentHeight=${currentHeight}
117
138
  ></item-tile>`;
118
139
  }
119
140
  case 'list-compact':