@internetarchive/collection-browser 0.0.1-alpha.2 → 0.0.1-alpha.22

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 (183) hide show
  1. package/demo/app-root.ts +24 -158
  2. package/dist/demo/app-root.d.ts +2 -16
  3. package/dist/demo/app-root.js +23 -141
  4. package/dist/demo/app-root.js.map +1 -1
  5. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  6. package/dist/src/assets/img/icons/chevron.js +4 -0
  7. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  8. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  9. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  10. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  11. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  12. package/dist/src/assets/img/icons/eye.js +5 -0
  13. package/dist/src/assets/img/icons/eye.js.map +1 -0
  14. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
  15. package/dist/src/assets/img/icons/mediatype/account.js +5 -4
  16. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
  17. package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
  18. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
  19. package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
  20. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
  21. package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
  22. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
  23. package/dist/src/assets/img/icons/mediatype/film.js +2 -1
  24. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
  25. package/dist/src/assets/img/icons/mediatype/images.js +9 -6
  26. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
  27. package/dist/src/assets/img/icons/mediatype/software.js +9 -6
  28. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
  29. package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
  30. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
  31. package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
  32. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
  33. package/dist/src/assets/img/icons/mediatype/video.js +10 -6
  34. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
  35. package/dist/src/assets/img/icons/mediatype/web.js +9 -6
  36. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
  37. package/dist/src/async-collection-name.d.ts +11 -0
  38. package/dist/src/async-collection-name.js +38 -0
  39. package/dist/src/async-collection-name.js.map +1 -0
  40. package/dist/src/collection-browser.d.ts +55 -17
  41. package/dist/src/collection-browser.js +466 -106
  42. package/dist/src/collection-browser.js.map +1 -1
  43. package/dist/src/collection-facets.d.ts +24 -5
  44. package/dist/src/collection-facets.js +300 -78
  45. package/dist/src/collection-facets.js.map +1 -1
  46. package/dist/src/collection-name-cache.d.ts +18 -0
  47. package/dist/src/collection-name-cache.js +89 -0
  48. package/dist/src/collection-name-cache.js.map +1 -0
  49. package/dist/src/mediatype-icon.js +10 -3
  50. package/dist/src/mediatype-icon.js.map +1 -1
  51. package/dist/src/models.d.ts +72 -14
  52. package/dist/src/models.js +57 -1
  53. package/dist/src/models.js.map +1 -1
  54. package/dist/src/restoration-state-handler.d.ts +37 -0
  55. package/dist/src/restoration-state-handler.js +177 -0
  56. package/dist/src/restoration-state-handler.js.map +1 -0
  57. package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -2
  58. package/dist/src/sort-filter-bar/alpha-bar.js +19 -9
  59. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  60. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  61. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  62. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  63. package/dist/src/sort-filter-bar/img/grid.d.ts +1 -0
  64. package/dist/src/sort-filter-bar/img/grid.js +5 -0
  65. package/dist/src/sort-filter-bar/img/grid.js.map +1 -0
  66. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  67. package/dist/src/sort-filter-bar/img/list.js +5 -0
  68. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  69. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  70. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  71. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  72. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  73. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  74. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  75. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +65 -11
  76. package/dist/src/sort-filter-bar/sort-filter-bar.js +453 -142
  77. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  78. package/dist/src/tiles/grid/collection-tile.js +1 -2
  79. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  80. package/dist/src/tiles/grid/item-tile.d.ts +4 -0
  81. package/dist/src/tiles/grid/item-tile.js +134 -45
  82. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  83. package/dist/src/tiles/list/tile-list-compact-header.d.ts +11 -0
  84. package/dist/src/tiles/list/tile-list-compact-header.js +79 -0
  85. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  86. package/dist/src/tiles/list/tile-list-compact.d.ts +1 -0
  87. package/dist/src/tiles/list/tile-list-compact.js +122 -31
  88. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  89. package/dist/src/tiles/list/tile-list-detail.d.ts +0 -10
  90. package/dist/src/tiles/list/tile-list-detail.js +6 -159
  91. package/dist/src/tiles/list/tile-list-detail.js.map +1 -1
  92. package/dist/src/tiles/list/tile-list.d.ts +19 -6
  93. package/dist/src/tiles/list/tile-list.js +240 -108
  94. package/dist/src/tiles/list/tile-list.js.map +1 -1
  95. package/dist/src/tiles/tile-dispatcher.d.ts +8 -1
  96. package/dist/src/tiles/tile-dispatcher.js +46 -11
  97. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  98. package/dist/src/utils/format-date.js +1 -2
  99. package/dist/src/utils/format-date.js.map +1 -1
  100. package/dist/test/{utils/format-string.test.d.ts → collection-name-cache.test.d.ts} +0 -0
  101. package/dist/test/collection-name-cache.test.js +158 -0
  102. package/dist/test/collection-name-cache.test.js.map +1 -0
  103. package/dist/test/mocks/mock-search-response.d.ts +5 -0
  104. package/dist/test/mocks/mock-search-response.js +62 -0
  105. package/dist/test/mocks/mock-search-response.js.map +1 -0
  106. package/dist/test/mocks/mock-search-service.d.ts +13 -0
  107. package/dist/test/mocks/mock-search-service.js +20 -0
  108. package/dist/test/mocks/mock-search-service.js.map +1 -0
  109. package/package.json +9 -4
  110. package/src/assets/img/icons/chevron.ts +4 -0
  111. package/src/assets/img/icons/eye-closed.ts +5 -0
  112. package/src/assets/img/icons/eye.ts +5 -0
  113. package/src/assets/img/icons/mediatype/account.ts +5 -4
  114. package/src/assets/img/icons/mediatype/audio.ts +7 -4
  115. package/src/assets/img/icons/mediatype/collection.ts +7 -4
  116. package/src/assets/img/icons/mediatype/etree.ts +10 -5
  117. package/src/assets/img/icons/mediatype/film.ts +2 -1
  118. package/src/assets/img/icons/mediatype/images.ts +9 -6
  119. package/src/assets/img/icons/mediatype/software.ts +9 -6
  120. package/src/assets/img/icons/mediatype/texts.ts +9 -6
  121. package/src/assets/img/icons/mediatype/tv.ts +10 -5
  122. package/src/assets/img/icons/mediatype/video.ts +10 -6
  123. package/src/assets/img/icons/mediatype/web.ts +9 -6
  124. package/src/collection-browser.ts +490 -105
  125. package/src/collection-facets.ts +325 -109
  126. package/src/mediatype-icon.ts +10 -3
  127. package/src/models.ts +139 -14
  128. package/src/restoration-state-handler.ts +234 -0
  129. package/src/sort-filter-bar/alpha-bar.ts +19 -9
  130. package/src/sort-filter-bar/img/compact.ts +5 -0
  131. package/src/sort-filter-bar/img/list.ts +5 -0
  132. package/src/sort-filter-bar/img/sort-triangle.ts +5 -0
  133. package/src/sort-filter-bar/img/tile.ts +5 -0
  134. package/src/sort-filter-bar/sort-filter-bar.ts +499 -149
  135. package/src/tiles/grid/collection-tile.ts +1 -2
  136. package/src/tiles/grid/item-tile.ts +138 -56
  137. package/src/tiles/list/tile-list-compact-header.ts +75 -0
  138. package/src/tiles/list/tile-list-compact.ts +209 -0
  139. package/src/tiles/list/tile-list.ts +261 -110
  140. package/src/tiles/tile-dispatcher.ts +51 -11
  141. package/src/utils/format-date.ts +1 -2
  142. package/dist/src/assets/img/icons/audio.d.ts +0 -1
  143. package/dist/src/assets/img/icons/audio.js +0 -9
  144. package/dist/src/assets/img/icons/audio.js.map +0 -1
  145. package/dist/src/assets/img/icons/collection.d.ts +0 -1
  146. package/dist/src/assets/img/icons/collection.js +0 -9
  147. package/dist/src/assets/img/icons/collection.js.map +0 -1
  148. package/dist/src/assets/img/icons/etree.d.ts +0 -1
  149. package/dist/src/assets/img/icons/etree.js +0 -9
  150. package/dist/src/assets/img/icons/etree.js.map +0 -1
  151. package/dist/src/assets/img/icons/images.d.ts +0 -1
  152. package/dist/src/assets/img/icons/images.js +0 -10
  153. package/dist/src/assets/img/icons/images.js.map +0 -1
  154. package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +0 -1
  155. package/dist/src/assets/img/icons/mediatype/etree copy.js +0 -9
  156. package/dist/src/assets/img/icons/mediatype/etree copy.js.map +0 -1
  157. package/dist/src/assets/img/icons/mediatype/livemusic.d.ts +0 -1
  158. package/dist/src/assets/img/icons/mediatype/livemusic.js +0 -7
  159. package/dist/src/assets/img/icons/mediatype/livemusic.js.map +0 -1
  160. package/dist/src/assets/img/icons/mediatype/photos.d.ts +0 -1
  161. package/dist/src/assets/img/icons/mediatype/photos.js +0 -7
  162. package/dist/src/assets/img/icons/mediatype/photos.js.map +0 -1
  163. package/dist/src/assets/img/icons/software.d.ts +0 -1
  164. package/dist/src/assets/img/icons/software.js +0 -10
  165. package/dist/src/assets/img/icons/software.js.map +0 -1
  166. package/dist/src/assets/img/icons/texts.d.ts +0 -1
  167. package/dist/src/assets/img/icons/texts.js +0 -10
  168. package/dist/src/assets/img/icons/texts.js.map +0 -1
  169. package/dist/src/assets/img/icons/tv.d.ts +0 -1
  170. package/dist/src/assets/img/icons/tv.js +0 -9
  171. package/dist/src/assets/img/icons/tv.js.map +0 -1
  172. package/dist/src/assets/img/icons/video.d.ts +0 -1
  173. package/dist/src/assets/img/icons/video.js +0 -10
  174. package/dist/src/assets/img/icons/video.js.map +0 -1
  175. package/dist/src/assets/img/icons/web.d.ts +0 -1
  176. package/dist/src/assets/img/icons/web.js +0 -10
  177. package/dist/src/assets/img/icons/web.js.map +0 -1
  178. package/dist/src/utils/format-string.d.ts +0 -2
  179. package/dist/src/utils/format-string.js +0 -7
  180. package/dist/src/utils/format-string.js.map +0 -1
  181. package/dist/test/utils/format-string.test.js +0 -17
  182. package/dist/test/utils/format-string.test.js.map +0 -1
  183. package/src/assets/img/icons/mediatype/foo.svg +0 -5
@@ -1,73 +1,187 @@
1
1
  import { __decorate } from "tslib";
2
- import { css, html, LitElement } from 'lit';
2
+ /* eslint-disable lit/no-invalid-html */
3
+ import { css, html, LitElement, nothing } from 'lit';
4
+ import { ifDefined } from 'lit/directives/if-defined.js';
5
+ import { join } from 'lit/directives/join.js';
6
+ import { map } from 'lit/directives/map.js';
3
7
  import { customElement, property } from 'lit/decorators.js';
4
8
  import DOMPurify from 'dompurify';
5
9
  import { formatCount } from '../../utils/format-count';
6
10
  import { formatDate } from '../../utils/format-date';
7
11
  import '../../mediatype-icon';
8
- /*
9
- at 750 creator, title trimmed
10
- at 530
11
- */
12
12
  let TileList = class TileList extends LitElement {
13
- constructor() {
14
- super(...arguments);
15
- this.displayMode = 'list-compact';
16
- }
17
- // private HtmlSanitizer = HtmlSanitizer();
18
13
  render() {
19
- var _a, _b, _c, _d, _e;
20
14
  return html `
21
15
  <div id="list-line" class="${this.classSize}">
22
- <div id="views">
23
- ${formatCount((_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.viewCount) !== null && _b !== void 0 ? _b : 0, this.formatSize)}
16
+ <div id="list-line-left">
17
+ <div id="thumb">${this.imgTemplate}</div>
18
+ ${this.iconLeftTemplate}
24
19
  </div>
25
- <div id="title">${(_c = this.model) === null || _c === void 0 ? void 0 : _c.title}</div>
26
- <div id="date">${formatDate(this.date, this.formatSize)}</div>
27
- <div id="creator">${(_d = this.model) === null || _d === void 0 ? void 0 : _d.creator}</div>
28
- <div id="icon">
29
- <mediatype-icon .mediatype=${(_e = this.model) === null || _e === void 0 ? void 0 : _e.mediatype}></mediatype-icon>
20
+ <div id="list-line-right">
21
+ <div id="title">${this.titleTemplate}</div>
22
+ ${this.itemLineTemplate} ${this.creatorTemplate}
23
+ <div id="date" class="metadata">
24
+ <span class="label">Published:</span> ${formatDate(this.date, this.formatSize)}
25
+ </div>
26
+ <div id="views-line">
27
+ ${this.viewsTemplate} ${this.ratingTemplate} ${this.reviewsTemplate}
28
+ </div>
29
+ ${this.topicsTemplate} ${this.collectionsTemplate}
30
+ ${this.descriptionTemplate}
30
31
  </div>
31
32
  </div>
32
- ${this.displayMode === 'list-detail' ? this.detail() : html ``}
33
33
  `;
34
34
  }
35
- detail() {
36
- const descriptionHtml = this.description();
37
- const topicHtml = this.topic();
38
- const sourceHtml = this.source();
39
- if (descriptionHtml || topicHtml || sourceHtml) {
40
- return html `
41
- <div id="list-detail" class="${this.classSize}">
42
- <div></div>
43
- <div id="details">${descriptionHtml} ${topicHtml} ${sourceHtml}</div>
44
- <div></div>
45
- </div>
46
- `;
35
+ // Display templates
36
+ get imgTemplate() {
37
+ var _a, _b;
38
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier)) {
39
+ return nothing;
47
40
  }
48
- return html ``;
41
+ return html ` <img
42
+ src="${this.baseNavigationUrl}/services/img/${this.model.identifier}"
43
+ alt="${this.model.identifier}"
44
+ class=${(_b = this.model) === null || _b === void 0 ? void 0 : _b.mediatype}
45
+ />`;
49
46
  }
50
- description() {
51
- var _a, _b;
52
- if ((_a = this.model) === null || _a === void 0 ? void 0 : _a.description) {
53
- const description = DOMPurify.sanitize(`${(_b = this.model) === null || _b === void 0 ? void 0 : _b.description}`);
54
- return html ` <div id="description">${description}</div> `;
47
+ get iconLeftTemplate() {
48
+ var _a;
49
+ if (this.classSize !== 'desktop') {
50
+ return nothing;
51
+ }
52
+ return html `
53
+ <div id="icon-left">
54
+ <mediatype-icon
55
+ .mediatype=${(_a = this.model) === null || _a === void 0 ? void 0 : _a.mediatype}
56
+ .showText=${true}
57
+ style="--iconHeight: 20px; --iconWidth: 20px;text-align: center;"
58
+ >
59
+ </mediatype-icon>
60
+ </div>
61
+ `;
62
+ }
63
+ get titleTemplate() {
64
+ var _a;
65
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.title)) {
66
+ return nothing;
67
+ }
68
+ return html ` ${this.detailsLink(this.model.identifier, this.model.title)} `;
69
+ }
70
+ get itemLineTemplate() {
71
+ const source = this.sourceTemplate;
72
+ const volume = this.volumeTemplate;
73
+ const issue = this.issueTemplate;
74
+ if (!source && !volume && !issue) {
75
+ return nothing;
76
+ }
77
+ return html ` <div id="item-line">${source} ${volume} ${issue}</div> `;
78
+ }
79
+ get volumeTemplate() {
80
+ var _a;
81
+ return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.volume, 'Volume');
82
+ }
83
+ get issueTemplate() {
84
+ var _a;
85
+ return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.issue, 'Issue');
86
+ }
87
+ get sourceTemplate() {
88
+ var _a;
89
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.source)) {
90
+ return nothing;
91
+ }
92
+ return html `
93
+ <div id="source">
94
+ ${this.labelTemplate('Source')}
95
+ ${this.searchLink('source', this.model.source)}
96
+ </div>
97
+ `;
98
+ }
99
+ get creatorTemplate() {
100
+ var _a;
101
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.creators) || this.model.creators.length === 0) {
102
+ return nothing;
55
103
  }
56
- return html ``;
104
+ return html `
105
+ <div id="creator" class="metadata">
106
+ ${this.labelTemplate('By')}
107
+ ${join(map(this.model.creators, id => this.searchLink('creator', id)), html `, `)}
108
+ </div>
109
+ `;
57
110
  }
58
- topic() {
111
+ get viewsTemplate() {
59
112
  var _a, _b;
60
- if ((_a = this.model) === null || _a === void 0 ? void 0 : _a.subject) {
61
- return html ` <div id="topic">Topic: ${(_b = this.model) === null || _b === void 0 ? void 0 : _b.subject}</div> `;
113
+ return this.metadataTemplate(`${formatCount((_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.viewCount) !== null && _b !== void 0 ? _b : 0, this.formatSize)}`, 'Views');
114
+ }
115
+ get ratingTemplate() {
116
+ var _a;
117
+ return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.averageRating, 'Avg Rating');
118
+ }
119
+ get reviewsTemplate() {
120
+ var _a;
121
+ return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.commentCount, 'Reviews');
122
+ }
123
+ get topicsTemplate() {
124
+ var _a;
125
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.subjects) || this.model.subjects.length === 0) {
126
+ return nothing;
62
127
  }
63
- return html ``;
128
+ return html `
129
+ <div id="topics" class="metadata">
130
+ ${this.labelTemplate('Topics')}
131
+ ${join(map(this.model.subjects, id => this.searchLink('subject', id)), html `, `)}
132
+ </div>
133
+ `;
134
+ }
135
+ get collectionsTemplate() {
136
+ var _a;
137
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.collections)) {
138
+ return nothing;
139
+ }
140
+ return html `
141
+ <div id="collections" class="metadata">
142
+ ${this.labelTemplate('Collections')}
143
+ ${join(map(this.model.collections, id => this.detailsLink(id)), html `, `)}
144
+ </div>
145
+ `;
64
146
  }
65
- source() {
147
+ get descriptionTemplate() {
66
148
  var _a, _b;
67
- if ((_a = this.model) === null || _a === void 0 ? void 0 : _a.source) {
68
- return html ` <div id="source">Source: ${(_b = this.model) === null || _b === void 0 ? void 0 : _b.source}</div> `;
149
+ return this.metadataTemplate(DOMPurify.sanitize((_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : ''), '', 'description');
150
+ }
151
+ // Utility functions
152
+ metadataTemplate(text, label = '', id) {
153
+ if (!text)
154
+ return nothing;
155
+ return html `
156
+ <div id=${ifDefined(id)} class="metadata">
157
+ ${this.labelTemplate(label)} ${text}
158
+ </div>
159
+ `;
160
+ }
161
+ labelTemplate(label) {
162
+ return html `${label
163
+ ? html `<span class="label">${label}: </span>`
164
+ : nothing}`;
165
+ }
166
+ searchLink(field, searchTerm) {
167
+ if (!field || !searchTerm) {
168
+ return nothing;
169
+ }
170
+ const query = encodeURIComponent(`${field}:"${searchTerm}"`);
171
+ // No whitespace after closing tag
172
+ return html ` <a href="${this.baseNavigationUrl}/search.php?query=${query}">
173
+ ${DOMPurify.sanitize(searchTerm)}</a
174
+ >`;
175
+ }
176
+ detailsLink(identifier, text) {
177
+ if (!identifier) {
178
+ return nothing;
69
179
  }
70
- return html ``;
180
+ const linkText = text !== null && text !== void 0 ? text : identifier;
181
+ // No whitespace after closing tag
182
+ return html ` <a href="${this.baseNavigationUrl}/details/${identifier}"
183
+ >${DOMPurify.sanitize(linkText)}</a
184
+ >`;
71
185
  }
72
186
  /*
73
187
  * TODO: fix field names to match model in src/collection-browser.ts
@@ -97,21 +211,85 @@ let TileList = class TileList extends LitElement {
97
211
  }
98
212
  static get styles() {
99
213
  return css `
100
- .mobile div {
101
- font-size: 11px;
214
+ html {
215
+ font-size: unset;
102
216
  }
103
- .desktop div {
217
+
218
+ div {
104
219
  font-size: 14px;
105
220
  }
106
221
 
222
+ div a {
223
+ text-decoration: none;
224
+ }
225
+
226
+ .label {
227
+ font-weight: bold;
228
+ }
229
+
230
+ .mobile {
231
+ --infiniteScrollerRowGap: 20px;
232
+ --infiniteScrollerRowHeight: auto;
233
+ }
234
+
235
+ .desktop {
236
+ --infiniteScrollerRowGap: 30px;
237
+ --infiniteScrollerRowHeight: auto;
238
+ }
107
239
  /* fields */
108
240
 
241
+ #thumb img {
242
+ object-fit: cover;
243
+ display: block;
244
+ }
245
+
246
+ .mobile #thumb img {
247
+ width: 90px;
248
+ height: 90px;
249
+ }
250
+
251
+ .desktop #thumb img {
252
+ width: 100px;
253
+ height: 100px;
254
+ }
255
+
256
+ #thumb img.collection {
257
+ border-radius: 8px;
258
+ -webkit-border-radius: 8px;
259
+ -moz-border-radius: 8px;
260
+ }
261
+
262
+ .mobile #thumb img.account {
263
+ border-radius: 45px;
264
+ -webkit-border-radius: 45px;
265
+ -moz-border-radius: 45px;
266
+ }
267
+
268
+ .desktop #thumb img.account {
269
+ border-radius: 50px;
270
+ -webkit-border-radius: 50px;
271
+ -moz-border-radius: 50px;
272
+ }
273
+
274
+ #icon-left {
275
+ padding-top: 5px;
276
+ }
277
+
109
278
  #title {
110
279
  color: #4b64ff;
111
280
  text-decoration: none;
281
+ font-size: 22px;
282
+ font-weight: bold;
283
+ /* align top of text with image */
284
+ line-height: 25px;
285
+ margin-top: -4px;
286
+ padding-bottom: 2px;
287
+ }
288
+
289
+ .metadata {
290
+ line-height: 20px;
112
291
  }
113
292
 
114
- #title,
115
293
  #creator,
116
294
  #topic,
117
295
  #source {
@@ -119,38 +297,16 @@ let TileList = class TileList extends LitElement {
119
297
  overflow: hidden;
120
298
  }
121
299
 
122
- #title,
123
- #creator {
124
- white-space: nowrap;
125
- }
126
-
127
- #views,
128
- #date {
129
- text-align: right;
130
- }
131
-
132
- #views,
133
- #details {
134
- color: #767676;
135
- }
136
-
137
300
  #icon {
138
- padding-right: 6px;
139
- }
140
-
141
- .desktop #description,
142
- .desktop #topic,
143
- .desktop #source {
144
- font-size: 12px;
301
+ padding-top: 5px;
145
302
  }
146
303
 
147
- .mobile #description,
148
- .mobile #topic,
149
- .mobile #source {
150
- font-size: 11px;
304
+ mediatype-icon {
305
+ --iconHeight: 20px;
151
306
  }
152
307
 
153
308
  #description {
309
+ padding-top: 10px;
154
310
  overflow: hidden;
155
311
  text-overflow: ellipsis;
156
312
  -webkit-line-clamp: 2;
@@ -166,40 +322,19 @@ let TileList = class TileList extends LitElement {
166
322
  /* list-line */
167
323
 
168
324
  #list-line {
169
- display: grid;
170
- column-gap: 10px;
171
- line-height: 1.42857143;
172
- border-top: 1px solid #ddd !important;
173
- padding-top: 5px;
174
- align-items: center;
175
- }
176
-
177
- #list-line.mobile {
178
- grid-template-columns: 33px 3fr 30px 2fr 29.5px;
179
- }
180
- #list-line.desktop {
181
- grid-template-columns: 60px 3fr 90px 2fr 29.5px;
325
+ display: flex;
326
+ column-gap: 5px;
182
327
  }
183
328
 
184
- #list-line:hover #title {
329
+ div a:hover {
185
330
  text-decoration: underline;
186
331
  }
187
332
 
188
- /* list-detail */
189
-
190
- #list-detail {
191
- display: grid;
192
- column-gap: 10px;
193
- line-height: 1.42857143;
194
- align-items: center;
195
- }
196
-
197
- #list-detail.mobile {
198
- grid-template-columns: 33px auto 29.5px;
199
- }
200
-
201
- #list-detail.desktop {
202
- grid-template-columns: 60px auto 29.5px;
333
+ #item-line,
334
+ #views-line {
335
+ display: flex;
336
+ flex-direction: row;
337
+ gap: 10px;
203
338
  }
204
339
  `;
205
340
  }
@@ -219,9 +354,6 @@ __decorate([
219
354
  __decorate([
220
355
  property({ type: Object })
221
356
  ], TileList.prototype, "sortParam", void 0);
222
- __decorate([
223
- property({ type: String })
224
- ], TileList.prototype, "displayMode", void 0);
225
357
  TileList = __decorate([
226
358
  customElement('tile-list')
227
359
  ], TileList);
@@ -1 +1 @@
1
- {"version":3,"file":"tile-list.js","sourceRoot":"","sources":["../../../../src/tiles/list/tile-list.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SortParam } from '@internetarchive/search-service';\nimport DOMPurify from 'dompurify';\n// import * as HtmlSanitizer from '@jitbit/htmlsanitizer';\n// import sanitizeHtml from 'sanitize-html';\n// - error\n// import DOMPurify from 'dompurify';\n// - no types\nimport { CollectionDisplayMode, TileModel } from '../../models';\nimport { formatCount, NumberFormat } from '../../utils/format-count';\nimport { formatDate, DateFormat } from '../../utils/format-date';\nimport '../../mediatype-icon';\n\n/*\nat 750 creator, title trimmed\nat 530\n*/\n\n@customElement('tile-list')\nexport class TileList extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Number }) currentWidth?: number;\n\n @property({ type: Number }) currentHeight?: number;\n\n @property({ type: Object }) sortParam?: SortParam;\n\n @property({ type: String }) displayMode: CollectionDisplayMode =\n 'list-compact';\n\n // private HtmlSanitizer = HtmlSanitizer();\n\n render() {\n return html`\n <div id=\"list-line\" class=\"${this.classSize}\">\n <div id=\"views\">\n ${formatCount(this.model?.viewCount ?? 0, this.formatSize)}\n </div>\n <div id=\"title\">${this.model?.title}</div>\n <div id=\"date\">${formatDate(this.date, this.formatSize)}</div>\n <div id=\"creator\">${this.model?.creator}</div>\n <div id=\"icon\">\n <mediatype-icon .mediatype=${this.model?.mediatype}></mediatype-icon>\n </div>\n </div>\n ${this.displayMode === 'list-detail' ? this.detail() : html``}\n `;\n }\n\n private detail() {\n const descriptionHtml = this.description();\n const topicHtml = this.topic();\n const sourceHtml = this.source();\n\n if (descriptionHtml || topicHtml || sourceHtml) {\n return html`\n <div id=\"list-detail\" class=\"${this.classSize}\">\n <div></div>\n <div id=\"details\">${descriptionHtml} ${topicHtml} ${sourceHtml}</div>\n <div></div>\n </div>\n `;\n }\n return html``;\n }\n\n private description() {\n if (this.model?.description) {\n const description = DOMPurify.sanitize(`${this.model?.description}`);\n return html` <div id=\"description\">${description}</div> `;\n }\n return html``;\n }\n\n private topic() {\n if (this.model?.subject) {\n return html` <div id=\"topic\">Topic: ${this.model?.subject}</div> `;\n }\n return html``;\n }\n\n private source() {\n if (this.model?.source) {\n return html` <div id=\"source\">Source: ${this.model?.source}</div> `;\n }\n return html``;\n }\n\n /*\n * TODO: fix field names to match model in src/collection-browser.ts\n * private get dateSortSelector()\n * @see src/models.ts\n */\n private get date(): Date | undefined {\n switch (this.sortParam?.field) {\n case 'date':\n return this.model?.datePublished;\n case 'reviewdate':\n return this.model?.dateReviewed;\n case 'addeddate':\n return this.model?.dateAdded;\n default:\n return this.model?.dateArchived; // publicdate\n }\n }\n\n private get classSize(): string {\n return (this.currentWidth ?? 531) < 530 ? 'mobile' : 'desktop';\n }\n\n private get formatSize(): DateFormat | NumberFormat {\n return (this.currentWidth ?? 531) < 530 ? 'short' : 'long';\n }\n\n static get styles() {\n return css`\n .mobile div {\n font-size: 11px;\n }\n .desktop div {\n font-size: 14px;\n }\n\n /* fields */\n\n #title {\n color: #4b64ff;\n text-decoration: none;\n }\n\n #title,\n #creator,\n #topic,\n #source {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n #title,\n #creator {\n white-space: nowrap;\n }\n\n #views,\n #date {\n text-align: right;\n }\n\n #views,\n #details {\n color: #767676;\n }\n\n #icon {\n padding-right: 6px;\n }\n\n .desktop #description,\n .desktop #topic,\n .desktop #source {\n font-size: 12px;\n }\n\n .mobile #description,\n .mobile #topic,\n .mobile #source {\n font-size: 11px;\n }\n\n #description {\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n word-break: break-word;\n -webkit-line-clamp: 3; /* number of lines to show */\n line-clamp: 3;\n -webkit-box-orient: vertical;\n text-align: left;\n }\n\n /* list-line */\n\n #list-line {\n display: grid;\n column-gap: 10px;\n line-height: 1.42857143;\n border-top: 1px solid #ddd !important;\n padding-top: 5px;\n align-items: center;\n }\n\n #list-line.mobile {\n grid-template-columns: 33px 3fr 30px 2fr 29.5px;\n }\n #list-line.desktop {\n grid-template-columns: 60px 3fr 90px 2fr 29.5px;\n }\n\n #list-line:hover #title {\n text-decoration: underline;\n }\n\n /* list-detail */\n\n #list-detail {\n display: grid;\n column-gap: 10px;\n line-height: 1.42857143;\n align-items: center;\n }\n\n #list-detail.mobile {\n grid-template-columns: 33px auto 29.5px;\n }\n\n #list-detail.desktop {\n grid-template-columns: 60px auto 29.5px;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"tile-list.js","sourceRoot":"","sources":["../../../../src/tiles/list/tile-list.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable lit/no-invalid-html */\nimport { css, html, LitElement, nothing } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { join } from 'lit/directives/join.js';\nimport { map } from 'lit/directives/map.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SortParam } from '@internetarchive/search-service';\nimport DOMPurify from 'dompurify';\nimport { TileModel } from '../../models';\nimport { formatCount, NumberFormat } from '../../utils/format-count';\nimport { formatDate, DateFormat } from '../../utils/format-date';\nimport '../../mediatype-icon';\n\n@customElement('tile-list')\nexport class TileList extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Number }) currentWidth?: number;\n\n @property({ type: Number }) currentHeight?: number;\n\n @property({ type: Object }) sortParam?: SortParam;\n\n render() {\n return html`\n <div id=\"list-line\" class=\"${this.classSize}\">\n <div id=\"list-line-left\">\n <div id=\"thumb\">${this.imgTemplate}</div>\n ${this.iconLeftTemplate}\n </div>\n <div id=\"list-line-right\">\n <div id=\"title\">${this.titleTemplate}</div>\n ${this.itemLineTemplate} ${this.creatorTemplate}\n <div id=\"date\" class=\"metadata\">\n <span class=\"label\">Published:</span> ${formatDate(\n this.date,\n this.formatSize\n )}\n </div>\n <div id=\"views-line\">\n ${this.viewsTemplate} ${this.ratingTemplate} ${this.reviewsTemplate}\n </div>\n ${this.topicsTemplate} ${this.collectionsTemplate}\n ${this.descriptionTemplate}\n </div>\n </div>\n `;\n }\n\n // Display templates\n private get imgTemplate() {\n if (!this.model?.identifier) {\n return nothing;\n }\n return html` <img\n src=\"${this.baseNavigationUrl}/services/img/${this.model.identifier}\"\n alt=\"${this.model.identifier}\"\n class=${this.model?.mediatype}\n />`;\n }\n\n private get iconLeftTemplate() {\n if (this.classSize !== 'desktop') {\n return nothing;\n }\n return html`\n <div id=\"icon-left\">\n <mediatype-icon\n .mediatype=${this.model?.mediatype}\n .showText=${true}\n style=\"--iconHeight: 20px; --iconWidth: 20px;text-align: center;\"\n >\n </mediatype-icon>\n </div>\n `;\n }\n\n private get titleTemplate() {\n if (!this.model?.title) {\n return nothing;\n }\n return html` ${this.detailsLink(this.model.identifier, this.model.title)} `;\n }\n\n private get itemLineTemplate() {\n const source = this.sourceTemplate;\n const volume = this.volumeTemplate;\n const issue = this.issueTemplate;\n if (!source && !volume && !issue) {\n return nothing;\n }\n return html` <div id=\"item-line\">${source} ${volume} ${issue}</div> `;\n }\n\n private get volumeTemplate() {\n return this.metadataTemplate(this.model?.volume, 'Volume');\n }\n\n private get issueTemplate() {\n return this.metadataTemplate(this.model?.issue, 'Issue');\n }\n\n private get sourceTemplate() {\n if (!this.model?.source) {\n return nothing;\n }\n return html`\n <div id=\"source\">\n ${this.labelTemplate('Source')}\n ${this.searchLink('source', this.model.source)}\n </div>\n `;\n }\n\n private get creatorTemplate() {\n if (!this.model?.creators || this.model.creators.length === 0) {\n return nothing;\n }\n return html`\n <div id=\"creator\" class=\"metadata\">\n ${this.labelTemplate('By')}\n ${join(\n map(this.model.creators, id => this.searchLink('creator', id)),\n html`, `\n )}\n </div>\n `;\n }\n\n private get viewsTemplate() {\n return this.metadataTemplate(\n `${formatCount(this.model?.viewCount ?? 0, this.formatSize)}`,\n 'Views'\n );\n }\n\n private get ratingTemplate() {\n return this.metadataTemplate(this.model?.averageRating, 'Avg Rating');\n }\n\n private get reviewsTemplate() {\n return this.metadataTemplate(this.model?.commentCount, 'Reviews');\n }\n\n private get topicsTemplate() {\n if (!this.model?.subjects || this.model.subjects.length === 0) {\n return nothing;\n }\n return html`\n <div id=\"topics\" class=\"metadata\">\n ${this.labelTemplate('Topics')}\n ${join(\n map(this.model.subjects, id => this.searchLink('subject', id)),\n html`, `\n )}\n </div>\n `;\n }\n\n private get collectionsTemplate() {\n if (!this.model?.collections) {\n return nothing;\n }\n return html`\n <div id=\"collections\" class=\"metadata\">\n ${this.labelTemplate('Collections')}\n ${join(\n map(this.model.collections, id => this.detailsLink(id)),\n html`, `\n )}\n </div>\n `;\n }\n\n private get descriptionTemplate() {\n return this.metadataTemplate(\n DOMPurify.sanitize(this.model?.description ?? ''),\n '',\n 'description'\n );\n }\n\n // Utility functions\n private metadataTemplate(text: any, label = '', id?: string) {\n if (!text) return nothing;\n return html`\n <div id=${ifDefined(id)} class=\"metadata\">\n ${this.labelTemplate(label)} ${text}\n </div>\n `;\n }\n\n private labelTemplate(label: string) {\n return html`${label\n ? html`<span class=\"label\">${label}: </span>`\n : nothing}`;\n }\n\n private searchLink(field: string, searchTerm: string) {\n if (!field || !searchTerm) {\n return nothing;\n }\n const query = encodeURIComponent(`${field}:\"${searchTerm}\"`);\n // No whitespace after closing tag\n return html` <a href=\"${this.baseNavigationUrl}/search.php?query=${query}\">\n ${DOMPurify.sanitize(searchTerm)}</a\n >`;\n }\n\n private detailsLink(identifier: string, text?: string) {\n if (!identifier) {\n return nothing;\n }\n const linkText = text ?? identifier;\n // No whitespace after closing tag\n return html` <a href=\"${this.baseNavigationUrl}/details/${identifier}\"\n >${DOMPurify.sanitize(linkText)}</a\n >`;\n }\n\n /*\n * TODO: fix field names to match model in src/collection-browser.ts\n * private get dateSortSelector()\n * @see src/models.ts\n */\n private get date(): Date | undefined {\n switch (this.sortParam?.field) {\n case 'date':\n return this.model?.datePublished;\n case 'reviewdate':\n return this.model?.dateReviewed;\n case 'addeddate':\n return this.model?.dateAdded;\n default:\n return this.model?.dateArchived; // publicdate\n }\n }\n\n private get classSize(): string {\n return (this.currentWidth ?? 531) < 530 ? 'mobile' : 'desktop';\n }\n\n private get formatSize(): DateFormat | NumberFormat {\n return (this.currentWidth ?? 531) < 530 ? 'short' : 'long';\n }\n\n static get styles() {\n return css`\n html {\n font-size: unset;\n }\n\n div {\n font-size: 14px;\n }\n\n div a {\n text-decoration: none;\n }\n\n .label {\n font-weight: bold;\n }\n\n .mobile {\n --infiniteScrollerRowGap: 20px;\n --infiniteScrollerRowHeight: auto;\n }\n\n .desktop {\n --infiniteScrollerRowGap: 30px;\n --infiniteScrollerRowHeight: auto;\n }\n /* fields */\n\n #thumb img {\n object-fit: cover;\n display: block;\n }\n\n .mobile #thumb img {\n width: 90px;\n height: 90px;\n }\n\n .desktop #thumb img {\n width: 100px;\n height: 100px;\n }\n\n #thumb img.collection {\n border-radius: 8px;\n -webkit-border-radius: 8px;\n -moz-border-radius: 8px;\n }\n\n .mobile #thumb img.account {\n border-radius: 45px;\n -webkit-border-radius: 45px;\n -moz-border-radius: 45px;\n }\n\n .desktop #thumb img.account {\n border-radius: 50px;\n -webkit-border-radius: 50px;\n -moz-border-radius: 50px;\n }\n\n #icon-left {\n padding-top: 5px;\n }\n\n #title {\n color: #4b64ff;\n text-decoration: none;\n font-size: 22px;\n font-weight: bold;\n /* align top of text with image */\n line-height: 25px;\n margin-top: -4px;\n padding-bottom: 2px;\n }\n\n .metadata {\n line-height: 20px;\n }\n\n #creator,\n #topic,\n #source {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n #icon {\n padding-top: 5px;\n }\n\n mediatype-icon {\n --iconHeight: 20px;\n }\n\n #description {\n padding-top: 10px;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n word-break: break-word;\n -webkit-line-clamp: 3; /* number of lines to show */\n line-clamp: 3;\n -webkit-box-orient: vertical;\n text-align: left;\n }\n\n /* list-line */\n\n #list-line {\n display: flex;\n column-gap: 5px;\n }\n\n div a:hover {\n text-decoration: underline;\n }\n\n #item-line,\n #views-line {\n display: flex;\n flex-direction: row;\n gap: 10px;\n }\n `;\n }\n}\n"]}
@@ -1,13 +1,16 @@
1
1
  import { LitElement, PropertyValues } from 'lit';
2
2
  import { SharedResizeObserverInterface, SharedResizeObserverResizeHandlerInterface } from '@internetarchive/shared-resize-observer';
3
3
  import { SortParam } from '@internetarchive/search-service';
4
+ import type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
4
5
  import type { CollectionDisplayMode, TileModel } from '../models';
5
6
  import './grid/collection-tile';
6
7
  import './grid/item-tile';
7
8
  import './grid/account-tile';
8
9
  import './list/tile-list';
10
+ import './list/tile-list-compact';
11
+ import './list/tile-list-compact-header';
9
12
  export declare class TileDispatcher extends LitElement implements SharedResizeObserverResizeHandlerInterface {
10
- displayMode: CollectionDisplayMode;
13
+ displayMode?: CollectionDisplayMode;
11
14
  model?: TileModel;
12
15
  baseNavigationUrl?: string;
13
16
  showDeleteButton: boolean;
@@ -15,8 +18,12 @@ export declare class TileDispatcher extends LitElement implements SharedResizeOb
15
18
  currentHeight?: number;
16
19
  resizeObserver?: SharedResizeObserverInterface;
17
20
  sortParam?: SortParam;
21
+ collectionNameCache?: CollectionNameCacheInterface;
18
22
  private container;
19
23
  render(): import("lit-html").TemplateResult<1>;
24
+ private get headerTemplate();
25
+ private get tileTemplate();
26
+ private get linkTileTemplate();
20
27
  handleResize(entry: ResizeObserverEntry): void;
21
28
  disconnectedCallback(): void;
22
29
  private stopResizeObservation;
@@ -6,26 +6,50 @@ import './grid/collection-tile';
6
6
  import './grid/item-tile';
7
7
  import './grid/account-tile';
8
8
  import './list/tile-list';
9
+ import './list/tile-list-compact';
10
+ import './list/tile-list-compact-header';
9
11
  let TileDispatcher = class TileDispatcher extends LitElement {
10
12
  constructor() {
11
13
  super(...arguments);
12
- this.displayMode = 'grid';
13
14
  this.showDeleteButton = false;
14
15
  }
15
16
  render() {
16
- var _a, _b;
17
17
  return html `
18
18
  <div id="container">
19
- ${this.showDeleteButton
19
+ ${this.displayMode === 'list-header'
20
+ ? this.headerTemplate
21
+ : this.tileTemplate}
22
+ </div>
23
+ `;
24
+ }
25
+ get headerTemplate() {
26
+ const { currentWidth, sortParam } = this;
27
+ return html `
28
+ <tile-list-compact-header
29
+ class="header"
30
+ .currentWidth=${currentWidth}
31
+ .sortParam=${sortParam}
32
+ >
33
+ </tile-list-compact-header>
34
+ `;
35
+ }
36
+ get tileTemplate() {
37
+ return html `
38
+ ${this.showDeleteButton
20
39
  ? html `<button id="delete-button">X</button>`
21
40
  : nothing}
22
- <a
23
- href="${this.baseNavigationUrl}/details/${(_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier}"
24
- title=${ifDefined((_b = this.model) === null || _b === void 0 ? void 0 : _b.title)}
25
- >
26
- ${this.tile}
27
- </a>
28
- </div>
41
+ ${this.displayMode === 'list-detail' ? this.tile : this.linkTileTemplate}
42
+ `;
43
+ }
44
+ get linkTileTemplate() {
45
+ var _a, _b;
46
+ return html `
47
+ <a
48
+ href="${this.baseNavigationUrl}/details/${(_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier}"
49
+ title=${ifDefined((_b = this.model) === null || _b === void 0 ? void 0 : _b.title)}
50
+ >
51
+ ${this.tile}
52
+ </a>
29
53
  `;
30
54
  }
31
55
  handleResize(entry) {
@@ -79,11 +103,20 @@ let TileDispatcher = class TileDispatcher extends LitElement {
79
103
  default:
80
104
  return html `<item-tile
81
105
  .model=${model}
106
+ .baseNavigationUrl=${baseNavigationUrl}
82
107
  .currentWidth=${currentWidth}
83
108
  .currentHeight=${currentHeight}
109
+ .collectionNameCache=${this.collectionNameCache}
84
110
  ></item-tile>`;
85
111
  }
86
112
  case 'list-compact':
113
+ return html `<tile-list-compact
114
+ .model=${model}
115
+ .currentWidth=${currentWidth}
116
+ .currentHeight=${currentHeight}
117
+ .baseNavigationUrl=${baseNavigationUrl}
118
+ .sortParam=${sortParam}
119
+ ></tile-list-compact>`;
87
120
  case 'list-detail':
88
121
  return html `<tile-list
89
122
  .model=${model}
@@ -91,7 +124,6 @@ let TileDispatcher = class TileDispatcher extends LitElement {
91
124
  .currentHeight=${currentHeight}
92
125
  .baseNavigationUrl=${baseNavigationUrl}
93
126
  .sortParam=${sortParam}
94
- .displayMode=${this.displayMode}
95
127
  ></tile-list>`;
96
128
  default:
97
129
  return nothing;
@@ -150,6 +182,9 @@ __decorate([
150
182
  __decorate([
151
183
  property({ type: Object })
152
184
  ], TileDispatcher.prototype, "sortParam", void 0);
185
+ __decorate([
186
+ property({ type: Object })
187
+ ], TileDispatcher.prototype, "collectionNameCache", void 0);
153
188
  __decorate([
154
189
  query('#container')
155
190
  ], TileDispatcher.prototype, "container", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"tile-dispatcher.js","sourceRoot":"","sources":["../../../src/tiles/tile-dispatcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, nothing, PropertyValues } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport {\n SharedResizeObserverInterface,\n SharedResizeObserverResizeHandlerInterface,\n} from '@internetarchive/shared-resize-observer';\nimport { SortParam } from '@internetarchive/search-service';\nimport type { CollectionDisplayMode, TileModel } from '../models';\nimport './grid/collection-tile';\nimport './grid/item-tile';\nimport './grid/account-tile';\nimport './list/tile-list';\n\n@customElement('tile-dispatcher')\nexport class TileDispatcher\n extends LitElement\n implements SharedResizeObserverResizeHandlerInterface\n{\n @property({ type: String }) displayMode: CollectionDisplayMode = 'grid';\n\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Boolean }) showDeleteButton = false;\n\n @property({ type: Number }) currentWidth?: number;\n\n @property({ type: Number }) currentHeight?: number;\n\n @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object }) sortParam?: SortParam;\n\n @query('#container') private container!: HTMLDivElement;\n\n render() {\n return html`\n <div id=\"container\">\n ${this.showDeleteButton\n ? html`<button id=\"delete-button\">X</button>`\n : nothing}\n <a\n href=\"${this.baseNavigationUrl}/details/${this.model?.identifier}\"\n title=${ifDefined(this.model?.title)}\n >\n ${this.tile}\n </a>\n </div>\n `;\n }\n\n handleResize(entry: ResizeObserverEntry): void {\n this.currentWidth = entry.contentRect.width;\n this.currentHeight = entry.contentRect.height;\n }\n\n disconnectedCallback(): void {\n this.stopResizeObservation(this.resizeObserver);\n }\n\n private stopResizeObservation(observer?: SharedResizeObserverInterface) {\n observer?.removeObserver({\n handler: this,\n target: this.container,\n });\n }\n\n private startResizeObservation() {\n this.stopResizeObservation(this.resizeObserver);\n this.resizeObserver?.addObserver({\n handler: this,\n target: this.container,\n });\n }\n\n updated(props: PropertyValues) {\n if (props.has('resizeObserver')) {\n const previousObserver = props.get(\n 'resizeObserver'\n ) as SharedResizeObserverInterface;\n this.stopResizeObservation(previousObserver);\n this.startResizeObservation();\n }\n }\n\n private get tile() {\n const { model, baseNavigationUrl, currentWidth, currentHeight, sortParam } =\n this;\n\n if (!model) return nothing;\n\n switch (this.displayMode) {\n case 'grid':\n switch (model.mediatype) {\n case 'collection':\n return html`<collection-tile\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n >\n </collection-tile>`;\n case 'account':\n return html`<account-tile\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n ></account-tile>`;\n default:\n return html`<item-tile\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n ></item-tile>`;\n }\n case 'list-compact':\n case 'list-detail':\n return html`<tile-list\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .baseNavigationUrl=${baseNavigationUrl}\n .sortParam=${sortParam}\n .displayMode=${this.displayMode}\n ></tile-list>`;\n default:\n return nothing;\n }\n }\n\n static get styles() {\n return css`\n :host {\n display: block;\n height: 100%;\n }\n\n #container {\n height: 100%;\n }\n\n #delete-button {\n float: right;\n }\n\n a {\n display: block;\n height: 100%;\n color: unset;\n text-decoration: none;\n }\n\n a :first-child {\n display: block;\n height: 100%;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"tile-dispatcher.js","sourceRoot":"","sources":["../../../src/tiles/tile-dispatcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, nothing, PropertyValues } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport {\n SharedResizeObserverInterface,\n SharedResizeObserverResizeHandlerInterface,\n} from '@internetarchive/shared-resize-observer';\nimport { SortParam } from '@internetarchive/search-service';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport type { CollectionDisplayMode, TileModel } from '../models';\nimport './grid/collection-tile';\nimport './grid/item-tile';\nimport './grid/account-tile';\nimport './list/tile-list';\nimport './list/tile-list-compact';\nimport './list/tile-list-compact-header';\n\n@customElement('tile-dispatcher')\nexport class TileDispatcher\n extends LitElement\n implements SharedResizeObserverResizeHandlerInterface\n{\n @property({ type: String }) displayMode?: CollectionDisplayMode;\n\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Boolean }) showDeleteButton = false;\n\n @property({ type: Number }) currentWidth?: number;\n\n @property({ type: Number }) currentHeight?: number;\n\n @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object }) sortParam?: SortParam;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @query('#container') private container!: HTMLDivElement;\n\n render() {\n return html`\n <div id=\"container\">\n ${this.displayMode === 'list-header'\n ? this.headerTemplate\n : this.tileTemplate}\n </div>\n `;\n }\n\n private get headerTemplate() {\n const { currentWidth, sortParam } = this;\n return html`\n <tile-list-compact-header\n class=\"header\"\n .currentWidth=${currentWidth}\n .sortParam=${sortParam}\n >\n </tile-list-compact-header>\n `;\n }\n\n private get tileTemplate() {\n return html`\n ${this.showDeleteButton\n ? html`<button id=\"delete-button\">X</button>`\n : nothing}\n ${this.displayMode === 'list-detail' ? this.tile : this.linkTileTemplate}\n `;\n }\n\n private get linkTileTemplate() {\n return html`\n <a\n href=\"${this.baseNavigationUrl}/details/${this.model?.identifier}\"\n title=${ifDefined(this.model?.title)}\n >\n ${this.tile}\n </a>\n `;\n }\n\n handleResize(entry: ResizeObserverEntry): void {\n this.currentWidth = entry.contentRect.width;\n this.currentHeight = entry.contentRect.height;\n }\n\n disconnectedCallback(): void {\n this.stopResizeObservation(this.resizeObserver);\n }\n\n private stopResizeObservation(observer?: SharedResizeObserverInterface) {\n observer?.removeObserver({\n handler: this,\n target: this.container,\n });\n }\n\n private startResizeObservation() {\n this.stopResizeObservation(this.resizeObserver);\n this.resizeObserver?.addObserver({\n handler: this,\n target: this.container,\n });\n }\n\n updated(props: PropertyValues) {\n if (props.has('resizeObserver')) {\n const previousObserver = props.get(\n 'resizeObserver'\n ) as SharedResizeObserverInterface;\n this.stopResizeObservation(previousObserver);\n this.startResizeObservation();\n }\n }\n\n private get tile() {\n const { model, baseNavigationUrl, currentWidth, currentHeight, sortParam } =\n this;\n\n if (!model) return nothing;\n\n switch (this.displayMode) {\n case 'grid':\n switch (model.mediatype) {\n case 'collection':\n return html`<collection-tile\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n >\n </collection-tile>`;\n case 'account':\n return html`<account-tile\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n ></account-tile>`;\n default:\n return html`<item-tile\n .model=${model}\n .baseNavigationUrl=${baseNavigationUrl}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .collectionNameCache=${this.collectionNameCache}\n ></item-tile>`;\n }\n case 'list-compact':\n return html`<tile-list-compact\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .baseNavigationUrl=${baseNavigationUrl}\n .sortParam=${sortParam}\n ></tile-list-compact>`;\n case 'list-detail':\n return html`<tile-list\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .baseNavigationUrl=${baseNavigationUrl}\n .sortParam=${sortParam}\n ></tile-list>`;\n default:\n return nothing;\n }\n }\n\n static get styles() {\n return css`\n :host {\n display: block;\n height: 100%;\n }\n\n #container {\n height: 100%;\n }\n\n #delete-button {\n float: right;\n }\n\n a {\n display: block;\n height: 100%;\n color: unset;\n text-decoration: none;\n }\n\n a :first-child {\n display: block;\n height: 100%;\n }\n `;\n }\n}\n"]}