@internetarchive/collection-browser 0.2.4-rc1 → 0.2.6-alpha1

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 (52) hide show
  1. package/dist/src/{tiles/grid → assets/img}/icons/favorite-filled.d.ts +0 -0
  2. package/dist/src/{tiles/grid → assets/img}/icons/favorite-filled.js +0 -0
  3. package/dist/src/{tiles/grid → assets/img}/icons/favorite-filled.js.map +1 -1
  4. package/dist/src/{tiles/grid → assets/img}/icons/reviews.d.ts +0 -0
  5. package/dist/src/{tiles/grid → assets/img}/icons/reviews.js +0 -0
  6. package/dist/src/{tiles/grid → assets/img}/icons/reviews.js.map +1 -1
  7. package/dist/src/{tiles/grid → assets/img}/icons/upload.d.ts +0 -0
  8. package/dist/src/{tiles/grid → assets/img}/icons/upload.js +0 -0
  9. package/dist/src/{tiles/grid → assets/img}/icons/upload.js.map +1 -1
  10. package/dist/src/assets/img/icons/views.d.ts +1 -0
  11. package/dist/src/{tiles/grid → assets/img}/icons/views.js +1 -1
  12. package/dist/src/assets/img/icons/views.js.map +1 -0
  13. package/dist/src/sort-filter-bar/sort-filter-bar.js +1 -1
  14. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  15. package/dist/src/tiles/grid/account-tile.d.ts +1 -0
  16. package/dist/src/tiles/grid/account-tile.js +45 -78
  17. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  18. package/dist/src/tiles/grid/item-tile.d.ts +6 -0
  19. package/dist/src/tiles/grid/item-tile.js +96 -124
  20. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  21. package/dist/src/tiles/grid/tile-stats.d.ts +10 -0
  22. package/dist/src/tiles/grid/tile-stats.js +134 -0
  23. package/dist/src/tiles/grid/tile-stats.js.map +1 -0
  24. package/dist/src/tiles/mediatype-icon.js +4 -0
  25. package/dist/src/tiles/mediatype-icon.js.map +1 -1
  26. package/dist/src/tiles/tile-dispatcher.js +1 -0
  27. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  28. package/dist/test/tile-stats.test.d.ts +1 -0
  29. package/dist/test/tile-stats.test.js +42 -0
  30. package/dist/test/tile-stats.test.js.map +1 -0
  31. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -0
  32. package/dist/test/tiles/grid/item-tile.test.js +96 -0
  33. package/dist/test/tiles/grid/item-tile.test.js.map +1 -0
  34. package/package.json +1 -1
  35. package/src/{tiles/grid → assets/img}/icons/favorite-filled.ts +0 -0
  36. package/src/{tiles/grid → assets/img}/icons/reviews.ts +0 -0
  37. package/src/{tiles/grid → assets/img}/icons/upload.ts +0 -0
  38. package/src/{tiles/grid → assets/img}/icons/views.ts +1 -1
  39. package/src/sort-filter-bar/sort-filter-bar.ts +1 -1
  40. package/src/tiles/grid/account-tile.ts +44 -77
  41. package/src/tiles/grid/item-tile.ts +103 -125
  42. package/src/tiles/grid/tile-stats.ts +132 -0
  43. package/src/tiles/mediatype-icon.ts +4 -0
  44. package/src/tiles/tile-dispatcher.ts +1 -0
  45. package/test/tile-stats.test.ts +57 -0
  46. package/test/tiles/grid/item-tile.test.ts +116 -0
  47. package/dist/src/tiles/grid/icons/account.d.ts +0 -1
  48. package/dist/src/tiles/grid/icons/account.js +0 -12
  49. package/dist/src/tiles/grid/icons/account.js.map +0 -1
  50. package/dist/src/tiles/grid/icons/views.d.ts +0 -2
  51. package/dist/src/tiles/grid/icons/views.js.map +0 -1
  52. package/src/tiles/grid/icons/account.ts +0 -12
@@ -0,0 +1 @@
1
+ import '../../../src/tiles/grid/item-tile';
@@ -0,0 +1,96 @@
1
+ /* eslint-disable import/no-duplicates */
2
+ import { expect, fixture } from '@open-wc/testing';
3
+ import { html } from 'lit';
4
+ import '../../../src/tiles/grid/item-tile';
5
+ describe('Item Tile', () => {
6
+ it('should render initial component', async () => {
7
+ var _a, _b, _c;
8
+ const el = await fixture(html `<item-tile></item-tile>`);
9
+ const itemInfo = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.item-info');
10
+ const itemImage = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('item-image');
11
+ const itemTitle = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('#title');
12
+ expect(itemInfo).to.exist;
13
+ expect(itemImage).to.exist;
14
+ expect(itemTitle).to.exist;
15
+ });
16
+ it('should render with created-by element', async () => {
17
+ var _a, _b, _c;
18
+ const el = await fixture(html `<item-tile></item-tile>`);
19
+ const itemInfo = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.item-info');
20
+ const createdBy = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.created-by');
21
+ const dateSortedBy = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('.date-sorted-by');
22
+ expect(itemInfo).to.exist;
23
+ expect(createdBy).to.exist;
24
+ expect(dateSortedBy).to.not.exist;
25
+ });
26
+ it('should not render with created-by but date element', async () => {
27
+ var _a, _b;
28
+ const el = await fixture(html `<item-tile></item-tile>`);
29
+ el.sortParam = {
30
+ field: 'date',
31
+ direction: 'desc',
32
+ };
33
+ await el.updateComplete;
34
+ const createdBy = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.created-by');
35
+ const dateSortedBy = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.date-sorted-by');
36
+ expect(createdBy).to.not.exist;
37
+ expect(dateSortedBy).to.exist;
38
+ });
39
+ it('should not render with created-by but reviewdate element', async () => {
40
+ var _a, _b;
41
+ const el = await fixture(html `<item-tile></item-tile>`);
42
+ el.sortParam = {
43
+ field: 'reviewdate',
44
+ direction: 'desc',
45
+ };
46
+ await el.updateComplete;
47
+ const createdBy = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.created-by');
48
+ const dateSortedBy = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.date-sorted-by');
49
+ expect(createdBy).to.not.exist;
50
+ expect(dateSortedBy).to.exist;
51
+ });
52
+ it('should not render with created-by but publicdate element', async () => {
53
+ var _a, _b;
54
+ const el = await fixture(html `<item-tile></item-tile>`);
55
+ el.sortParam = {
56
+ field: 'publicdate',
57
+ direction: 'desc',
58
+ };
59
+ await el.updateComplete;
60
+ const createdBy = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.created-by');
61
+ const dateSortedBy = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.date-sorted-by');
62
+ expect(createdBy).to.not.exist;
63
+ expect(dateSortedBy).to.exist;
64
+ });
65
+ it('should render with created-by when sorting not related to date', async () => {
66
+ var _a, _b, _c;
67
+ const el = await fixture(html `<item-tile></item-tile>`);
68
+ el.sortParam = {
69
+ field: 'addeddate',
70
+ direction: 'asc',
71
+ };
72
+ await el.updateComplete;
73
+ const itemInfo = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.item-info');
74
+ const createdBy = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.created-by');
75
+ const dateSortedBy = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('.date-sorted-by');
76
+ expect(itemInfo).to.exist;
77
+ expect(createdBy).to.not.exist;
78
+ expect(dateSortedBy).to.exist;
79
+ });
80
+ it('should render with created-by when sort field id not like date', async () => {
81
+ var _a, _b, _c;
82
+ const el = await fixture(html `<item-tile></item-tile>`);
83
+ el.sortParam = {
84
+ field: 'week',
85
+ direction: 'asc',
86
+ };
87
+ await el.updateComplete;
88
+ const itemInfo = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.item-info');
89
+ const createdBy = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.created-by');
90
+ const dateSortedBy = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('.date-sorted-by');
91
+ expect(itemInfo).to.exist;
92
+ expect(dateSortedBy).to.not.exist; // it should be exist because this is not related to date sort
93
+ expect(createdBy).to.exist;
94
+ });
95
+ });
96
+ //# sourceMappingURL=item-tile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-tile.test.js","sourceRoot":"","sources":["../../../../test/tiles/grid/item-tile.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport { ItemTile } from '../../../src/tiles/grid/item-tile';\n\nimport '../../../src/tiles/grid/item-tile';\n\ndescribe('Item Tile', () => {\n it('should render initial component', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const itemImage = el.shadowRoot?.querySelector('item-image');\n const itemTitle = el.shadowRoot?.querySelector('#title');\n\n expect(itemInfo).to.exist;\n expect(itemImage).to.exist;\n expect(itemTitle).to.exist;\n });\n\n it('should render with created-by element', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(itemInfo).to.exist;\n expect(createdBy).to.exist;\n expect(dateSortedBy).to.not.exist;\n });\n\n it('should not render with created-by but date element', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n el.sortParam = {\n field: 'date',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should not render with created-by but reviewdate element', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n el.sortParam = {\n field: 'reviewdate',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should not render with created-by but publicdate element', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n el.sortParam = {\n field: 'publicdate',\n direction: 'desc',\n };\n await el.updateComplete;\n\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should render with created-by when sorting not related to date', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n el.sortParam = {\n field: 'addeddate',\n direction: 'asc',\n };\n await el.updateComplete;\n\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(itemInfo).to.exist;\n expect(createdBy).to.not.exist;\n expect(dateSortedBy).to.exist;\n });\n\n it('should render with created-by when sort field id not like date', async () => {\n const el = await fixture<ItemTile>(html`<item-tile></item-tile>`);\n\n el.sortParam = {\n field: 'week',\n direction: 'asc',\n };\n await el.updateComplete;\n\n const itemInfo = el.shadowRoot?.querySelector('.item-info');\n const createdBy = el.shadowRoot?.querySelector('.created-by');\n const dateSortedBy = el.shadowRoot?.querySelector('.date-sorted-by');\n\n expect(itemInfo).to.exist;\n expect(dateSortedBy).to.not.exist; // it should be exist because this is not related to date sort\n expect(createdBy).to.exist;\n });\n});\n"]}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "The Internet Archive Collection Browser.",
4
4
  "license": "AGPL-3.0-only",
5
5
  "author": "Internet Archive",
6
- "version": "0.2.4-rc1",
6
+ "version": "0.2.6-alpha1",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
9
  "scripts": {
File without changes
File without changes
@@ -1,6 +1,6 @@
1
1
  import { svg } from 'lit';
2
2
 
3
- export default svg`
3
+ export const viewsIcon = svg`
4
4
  <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
5
5
  <path
6
6
  d="m98 50.5704143c-.2830293-.471515-.671154-1.1088947-1.1643742-1.9121392s-1.6003642-2.3617474-3.3214321-4.6755089c-1.7210678-2.3137614-3.522258-4.5325939-5.4035703-6.6564975-1.8813124-2.1239037-4.2828993-4.473133-7.2047606-7.0476881-2.9218612-2.5745551-5.8895067-4.7933876-8.9029363-6.6564976-3.0134295-1.86311-6.4628491-3.4330878-10.3482587-4.7099336-3.8854095-1.2768458-7.7822651-1.9142256-11.6905667-1.9121443-3.9083017.0020914-7.8051573.6154781-11.6905668 1.8401652-3.8854096 1.2246871-7.3702078 2.8301329-10.4543947 4.8163375-3.0841869 1.9862045-6.0278997 4.1695691-8.8311384 6.5500937s-5.2048256 4.7652219-7.2047605 7.1540919c-1.99993501 2.38887-3.75430043 4.5722346-5.26309632 6.5500938s-2.63883199 3.583305-3.39010829 4.8163374l-1.13003609 1.8401602c.2830293.4715149.67115403 1.1088946 1.16437421 1.9121391.49322017.8032445 1.5878776 2.3617475 3.28397229 4.6755089s3.47439274 4.521119 5.3348942 6.6220728c1.8605014 2.1009538 4.2506422 4.4387083 7.1704224 7.0132633 2.9197801 2.5745551 5.8874256 4.7819127 8.9029363 6.6220729 3.0155106 1.8401601 6.4774168 3.398663 10.3857184 4.6755088 3.9083017 1.2768458 7.8176438 1.9142256 11.7280266 1.9121443 3.9103827-.0020914 7.7957922-.6154781 11.6562286-1.8401652s7.3337886-2.818658 10.4200566-4.7819127 6.0299808-4.1351444 8.8311384-6.515669 5.2152311-4.7652219 7.2422203-7.1540919 3.8052873-4.5607597 5.3348942-6.515669c1.5296068-1.9549093 2.6721295-3.5488802 3.427568-4.7819127zm-24.5142913 0c0 6.467683-2.3079374 12.0152859-6.9238123 16.6428087s-10.1495139 6.9412843-16.600917 6.9412843c-6.4992683 0-12.0453939-2.3137615-16.6383767-6.9412843s-6.8894742-10.1751257-6.8894742-16.6428087 2.2964914-12.003811 6.8894742-16.608384 10.1391084-6.9068595 16.6383767-6.9068595c6.4534842 0 11.9871232 2.3022865 16.600917 6.9068595s6.9217312 10.140701 6.9238123 16.608384zm-23.5247293-10.552755c2.8261308 0 5.2870289 1.0619518 7.3826944 3.1858555 2.0956655 2.1239036 3.1434982 4.5795368 3.1434982 7.3668995 0 2.8332624-1.0478327 5.2888956-3.1434982 7.3668995-2.0956655 2.078004-4.5565636 3.1170059-7.3826944 3.1170059-2.873996 0-5.3348941-1.0264838-7.3826944-3.0794516-2.0478002-2.0529677-3.0717003-4.5200758-3.0717003-7.4013243 0-2.8332624 1.0239001-5.3003705 3.0717003-7.4013243 2.0478003-2.1009538 4.5086984-3.1514307 7.3826944-3.1514307z"
@@ -371,7 +371,7 @@ export class SortFilterBar
371
371
  this.displayMode = 'list-detail';
372
372
  }}
373
373
  class=${this.displayMode === 'list-detail' ? 'active' : ''}
374
- title="Extended list view"
374
+ title="List view"
375
375
  >
376
376
  ${listIcon}
377
377
  </button>
@@ -2,10 +2,7 @@ import { css, html, LitElement } from 'lit';
2
2
  import { customElement, property } from 'lit/decorators.js';
3
3
  import { TileModel } from '../../models';
4
4
 
5
- import { accountIcon } from './icons/account';
6
- import { favoriteFilledIcon } from './icons/favorite-filled';
7
- import { reviewsIcon } from './icons/reviews';
8
- import { uploadIcon } from './icons/upload';
5
+ import './tile-stats';
9
6
 
10
7
  @customElement('account-tile')
11
8
  export class AccountTile extends LitElement {
@@ -13,44 +10,32 @@ export class AccountTile extends LitElement {
13
10
 
14
11
  render() {
15
12
  return html`
16
- <div class="outer-holder">
17
- <div class="inner-holder">
18
- <div id="header-holder">
19
- <div id="title-holder">
20
- <h1 class="truncated">${this.model?.identifier}</h1>
21
- </div>
22
- <div id="avatar-holder">
23
- <div
24
- id="avatar"
25
- style="background-image: url('https://archive.org/services/img/${this
26
- .model?.identifier}')"
27
- ></div>
28
- </div>
29
- </div>
30
- <div id="year-holder">
31
- <div id="archivist-since">
32
- <h3>Archivist Since</h3>
33
- </div>
34
- <div id="year-holder">
35
- <h3>${this.model?.dateAdded?.getFullYear()}</h3>
36
- </div>
37
- </div>
38
- <div id="status-holder">
39
- <div id="patron-icon">${accountIcon}</div>
40
- <div class="stat-icon">
41
- ${uploadIcon}
42
- <h3>${this.model?.itemCount}</h3>
43
- </div>
44
- <div class="stat-icon">
45
- ${favoriteFilledIcon}
46
- <h3>${this.model?.favCount}</h3>
47
- </div>
48
- <div class="stat-icon">
49
- ${reviewsIcon}
50
- <h3>${this.model?.commentCount}</h3>
51
- </div>
13
+ <div class="account-tile-main">
14
+ <div id="title">
15
+ <h1 class="truncated">${this.model?.identifier}</h1>
16
+ </div>
17
+
18
+ <div class="account-info">
19
+ <div id="avatar-info">
20
+ <img
21
+ id="avatar"
22
+ alt="patron-avatar"
23
+ src="https://archive.org/services/img/${this.model?.identifier}"
24
+ />
52
25
  </div>
26
+
27
+ <span id="archivist-since">
28
+ Archivist since ${this.model?.dateAdded?.getFullYear()}
29
+ </span>
53
30
  </div>
31
+
32
+ <tile-stats
33
+ .mediatype=${this.model?.mediatype}
34
+ .itemCount=${this.model?.itemCount}
35
+ .favCount=${this.model?.favCount}
36
+ .commentCount=${this.model?.commentCount}
37
+ >
38
+ </tile-stats>
54
39
  </div>
55
40
  `;
56
41
  }
@@ -63,41 +48,45 @@ export class AccountTile extends LitElement {
63
48
  margin: 0;
64
49
  }
65
50
 
66
- h3 {
51
+ span {
67
52
  font-size: 14px;
68
- font-weight: bold;
69
53
  color: #2c2c2c;
70
54
  margin: 0px;
71
55
  }
72
56
 
73
- .outer-holder {
57
+ .account-tile-main {
74
58
  background-color: #fcf5e6;
75
59
  border: 1px #2c2c2c;
76
60
  border-radius: 4px;
77
61
  box-shadow: 1px 1px 2px 0px;
78
62
  height: 100%;
79
63
  display: flex;
64
+ flex-direction: column;
80
65
  text-align: center;
81
66
  width: 100%;
82
67
  }
83
68
 
84
- .inner-holder {
85
- padding: 5px;
86
- width: 100%;
87
- display: flex;
88
- flex-direction: column;
69
+ .account-info {
70
+ flex-grow: 1;
89
71
  }
90
72
 
91
- #header-holder {
92
- flex: 1;
73
+ #title {
74
+ padding: 5px 5px 0px 5px;
75
+ flex-shrink: 0;
76
+ height: 40px;
93
77
  }
94
78
 
95
- #title-holder {
96
- height: 40px;
97
- margin-bottom: 5px;
79
+ .account-tile-main:hover > #title > .truncated {
80
+ text-decoration: underline;
81
+ }
82
+
83
+ /** this is a workaround for Safari 15 where the hover effects are not working */
84
+ #title:hover > .truncated {
85
+ text-decoration: underline;
98
86
  }
99
87
 
100
- #avatar-holder {
88
+ #avatar-info {
89
+ margin-top: 5px;
101
90
  margin-bottom: 5px;
102
91
  display: flex;
103
92
  align-items: center;
@@ -112,27 +101,11 @@ export class AccountTile extends LitElement {
112
101
  box-shadow: 1px 1px 2px #888888;
113
102
  }
114
103
 
115
- #year-holder {
104
+ #archivist-since {
116
105
  margin-bottom: 5px;
117
106
  height: 40px;
118
107
  }
119
108
 
120
- #year-holder {
121
- margin: 0px;
122
- }
123
-
124
- #status-holder {
125
- height: 25px;
126
- display: flex;
127
- justify-content: space-evenly;
128
- line-height: initial;
129
- }
130
-
131
- #patron-icon {
132
- height: 25px;
133
- width: 25px;
134
- }
135
-
136
109
  .truncated {
137
110
  flex: 1;
138
111
  min-width: 0; /* Important for long words! */
@@ -142,15 +115,9 @@ export class AccountTile extends LitElement {
142
115
  display: -webkit-box;
143
116
  -webkit-box-orient: vertical;
144
117
  word-wrap: break-word;
145
- word-break: break-all;
146
118
  line-height: 2rem;
147
119
  text-align: center;
148
120
  }
149
-
150
- .stat-icon {
151
- height: 10px;
152
- width: 10px;
153
- }
154
121
  `;
155
122
  }
156
123
  }
@@ -1,16 +1,15 @@
1
1
  /* eslint-disable import/no-duplicates */
2
2
  import { css, CSSResultGroup, html, LitElement, nothing } from 'lit';
3
3
  import { customElement, property } from 'lit/decorators.js';
4
+ import { ifDefined } from 'lit/directives/if-defined.js';
5
+ import { SortParam } from '@internetarchive/search-service';
4
6
 
7
+ import { formatDate } from '../../utils/format-date';
5
8
  import { TileModel } from '../../models';
6
- import { formatCount } from '../../utils/format-count';
7
-
8
- import { favoriteFilledIcon } from './icons/favorite-filled';
9
- import { reviewsIcon } from './icons/reviews';
10
- import viewsIcon from './icons/views';
11
9
 
12
10
  import '../mediatype-icon';
13
11
  import '../item-image';
12
+ import './tile-stats';
14
13
 
15
14
  @customElement('item-tile')
16
15
  export class ItemTile extends LitElement {
@@ -18,183 +17,162 @@ export class ItemTile extends LitElement {
18
17
 
19
18
  @property({ type: String }) baseImageUrl?: string;
20
19
 
20
+ @property({ type: Object }) sortParam?: SortParam;
21
+
21
22
  render() {
22
- const itemTitle = this.model?.title || nothing;
23
- const itemCreator = this.model?.creator;
23
+ const itemTitle = this.model?.title;
24
24
  return html`
25
- <div id="container">
26
- <div id="title-image-container">
27
- <h1 id="item-title" title=${itemTitle}>${itemTitle}</h1>
28
- <div id="item-image-container">
29
- <item-image .model=${this.model} .baseImageUrl=${this.baseImageUrl}>
30
- </item-image>
25
+ <div class="container">
26
+ <div class="item-info">
27
+ <div id="title">
28
+ <h1 class="truncated" title=${ifDefined(
29
+ itemTitle
30
+ )}>${itemTitle}</h1>
31
31
  </div>
32
- <div class="item-creator">
33
- <div class="truncated">
34
- ${itemCreator
35
- ? html`<span>by&nbsp;${itemCreator}</span>`
36
- : nothing}
37
- </div>
32
+
33
+ <div id="image">
34
+ <item-image
35
+ .model=${this.model}
36
+ .baseImageUrl=${this.baseImageUrl}>
37
+ </item-image>
38
38
  </div>
39
+ ${
40
+ this.doesSortedByDate
41
+ ? this.sortedDateInfoTemplate
42
+ : this.creatorTemplate
43
+ }
39
44
  </div>
40
45
 
41
- <div class="hr"></div>
42
-
43
- <div id="item-stats-container">
44
- <div id="stats-holder">
45
- <div class="col">
46
- <mediatype-icon
47
- .mediatype=${this.model?.mediatype}
48
- .collection=${this.model?.collections}
49
- style="--iconHeight:25px; --iconWidth:25px;"
50
- >
51
- </mediatype-icon>
52
- </div>
53
- <div class="col">
54
- ${viewsIcon}
55
- <p class="status-text">
56
- ${formatCount(this.model?.viewCount, 'short', 'short')}
57
- </p>
58
- </div>
59
- <div class="col">
60
- ${favoriteFilledIcon}
61
- <p class="status-text">
62
- ${formatCount(this.model?.itemCount, 'short', 'short')}
63
- </p>
64
- </div>
65
- <div class="col">
66
- ${reviewsIcon}
67
- <p class="status-text">
68
- ${formatCount(this.model?.favCount, 'short', 'short')}
69
- </p>
70
- </div>
71
- </div>
46
+ <tile-stats
47
+ .mediatype=${this.model?.mediatype}
48
+ .viewCount=${this.model?.viewCount}
49
+ .favCount=${this.model?.favCount}
50
+ .commentCount=${this.model?.commentCount}>
51
+ </tile-stats>
72
52
  </div>
73
53
  </div>
74
54
  `;
75
55
  }
76
56
 
77
- static get styles(): CSSResultGroup {
78
- const cornerRadiusCss = css`var(--collectionTileCornerRadius, 4px)`;
57
+ private get doesSortedByDate() {
58
+ return ['date', 'reviewdate', 'addeddate', 'publicdate'].includes(
59
+ this.sortParam?.field as string
60
+ );
61
+ }
62
+
63
+ private get sortedDateInfoTemplate() {
64
+ let sortedValue;
65
+
66
+ switch (this.sortParam?.field) {
67
+ case 'date':
68
+ sortedValue = { field: 'published', value: this.model?.datePublished };
69
+ break;
70
+ case 'reviewdate':
71
+ sortedValue = { field: 'reviewed', value: this.model?.dateReviewed };
72
+ break;
73
+ case 'addeddate':
74
+ sortedValue = { field: 'added', value: this.model?.dateAdded };
75
+ break;
76
+ case 'publicdate':
77
+ sortedValue = { field: 'archived', value: this.model?.dateArchived };
78
+ break;
79
+ default:
80
+ break;
81
+ }
82
+
83
+ return html`
84
+ <div class="date-sorted-by truncated">
85
+ <span>
86
+ ${sortedValue?.field} ${formatDate(sortedValue?.value, 'long')}
87
+ </span>
88
+ </div>
89
+ `;
90
+ }
91
+
92
+ private get creatorTemplate() {
93
+ return html`
94
+ <div class="created-by truncated">
95
+ ${this.model?.creator
96
+ ? html`<span>by&nbsp;${this.model?.creator}</span>`
97
+ : nothing}
98
+ </div>
99
+ `;
100
+ }
79
101
 
102
+ static get styles(): CSSResultGroup {
80
103
  return css`
81
- #container {
104
+ .container {
82
105
  background-color: #ffffff;
83
- border-radius: ${cornerRadiusCss};
106
+ border-radius: var(--collectionTileCornerRadius, 4px);
84
107
  box-shadow: 1px 1px 2px 0px;
85
108
  display: flex;
86
109
  flex-direction: column;
87
110
  height: 100%;
88
- position: relative;
89
111
  }
90
112
 
91
- #title-image-container {
92
- display: flex;
93
- flex: 1;
94
- flex-direction: column;
95
- padding: 0.5rem 0.5rem 0 0.5rem;
113
+ .item-info {
114
+ padding: 5px 5px 0 5px;
115
+ flex-grow: 1;
96
116
  }
97
117
 
98
- #item-title {
99
- color: #2c2c2c;
100
- font-size: 1.6rem;
101
- text-align: center;
102
- margin-top: 0rem;
103
- margin-bottom: 0.5rem;
104
- overflow: hidden;
105
- text-overflow: ellipsis;
106
- display: -webkit-box;
107
- -webkit-line-clamp: 2;
108
- -webkit-box-orient: vertical;
109
- line-height: 2rem;
110
- height: 4rem;
118
+ #title {
119
+ flex-shrink: 0;
111
120
  }
112
121
 
113
- #item-image-container {
122
+ #image {
114
123
  display: flex;
115
124
  justify-content: center;
116
125
  flex: 1;
126
+ height: 16rem;
117
127
  }
118
128
 
119
129
  .hidden {
120
130
  display: none;
121
131
  }
122
132
 
123
- #container:hover > #title-image-container > .item-title {
133
+ .container:hover > .item-info > #title > .truncated {
124
134
  text-decoration: underline;
125
135
  }
126
136
 
127
137
  /** this is a workaround for Safari 15 where the hover effects are not working */
128
- #title-image-container:hover > #item-title {
138
+ #title:hover > .truncated {
129
139
  text-decoration: underline;
130
140
  }
131
141
 
132
- #container:hover > #item-title {
133
- background-color: #fcfcfc;
134
- }
135
-
136
- .item-creator {
142
+ .created-by,
143
+ .date-sorted-by {
137
144
  display: flex;
138
145
  justify-content: center;
139
146
  align-items: flex-end; /* Important to start text from bottom */
140
147
  height: 3rem;
141
148
  padding-top: 1rem;
149
+ margin-top: 5px;
142
150
  }
143
151
 
144
152
  .truncated {
145
153
  flex: 1;
146
- min-width: 0; /* Important for long words! */
147
- }
148
-
149
- .truncated span {
150
- font-size: 1.4rem;
151
154
  color: #2c2c2c;
152
- -webkit-line-clamp: 2;
155
+ min-width: 0; /* Important for long words! */
156
+ text-align: center;
157
+ line-height: 2rem;
153
158
  text-overflow: ellipsis;
154
159
  overflow: hidden;
155
- display: -webkit-box;
156
- -webkit-box-orient: vertical;
157
160
  word-wrap: break-word;
158
- line-height: 2rem;
159
- text-align: center;
160
- }
161
-
162
- .hr {
163
- border: 0.5px solid #ccc;
164
- }
165
-
166
- #item-stats-container {
167
- align-items: center;
168
- display: flex;
169
- height: 5.5rem;
170
- padding-left: 1rem;
171
- padding-right: 0.5rem;
172
- }
173
-
174
- #stats-holder {
175
- align-items: center;
176
- display: flex;
177
- flex: 1;
178
- justify-content: space-evenly;
179
- text-align: center;
180
- width: 100%;
181
- }
182
-
183
- svg {
184
- height: 10px;
185
- width: 10px;
161
+ -webkit-line-clamp: 2;
162
+ -webkit-box-orient: vertical;
186
163
  }
187
164
 
188
- .status-text {
189
- font-size: 14px;
190
- color: #2c2c2c;
191
- margin: auto;
192
- display: block;
193
- text-align: center;
165
+ .truncated span {
166
+ font-size: 1.4rem;
167
+ display: -webkit-box;
194
168
  }
195
169
 
196
- .col {
197
- width: 25%;
170
+ h1.truncated {
171
+ margin-top: 0rem;
172
+ margin-bottom: 0.5rem;
173
+ font-size: 1.6rem;
174
+ height: 4rem;
175
+ display: -webkit-box;
198
176
  }
199
177
  `;
200
178
  }