@internetarchive/collection-browser 0.2.12 → 0.2.14

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 (245) hide show
  1. package/dist/index.d.ts +9 -0
  2. package/dist/index.js +1 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/src/app-root.d.ts +32 -0
  5. package/dist/src/app-root.js +285 -0
  6. package/dist/src/app-root.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/assets/img/icons/empty-query.d.ts +2 -0
  11. package/dist/src/assets/img/icons/empty-query.js +5 -0
  12. package/dist/src/assets/img/icons/empty-query.js.map +1 -0
  13. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  14. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  15. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  16. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  17. package/dist/src/assets/img/icons/eye.js +5 -0
  18. package/dist/src/assets/img/icons/eye.js.map +1 -0
  19. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -0
  20. package/dist/src/assets/img/icons/favorite-filled.js +11 -0
  21. package/dist/src/assets/img/icons/favorite-filled.js.map +1 -0
  22. package/dist/src/assets/img/icons/login-required.d.ts +1 -0
  23. package/dist/src/assets/img/icons/login-required.js +30 -0
  24. package/dist/src/assets/img/icons/login-required.js.map +1 -0
  25. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -0
  26. package/dist/src/assets/img/icons/mediatype/account.js +14 -0
  27. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -0
  28. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -0
  29. package/dist/src/assets/img/icons/mediatype/audio.js +14 -0
  30. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -0
  31. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -0
  32. package/dist/src/assets/img/icons/mediatype/collection.js +12 -0
  33. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -0
  34. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  35. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  36. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  37. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -0
  38. package/dist/src/assets/img/icons/mediatype/etree.js +14 -0
  39. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -0
  40. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -0
  41. package/dist/src/assets/img/icons/mediatype/film.js +14 -0
  42. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -0
  43. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -0
  44. package/dist/src/assets/img/icons/mediatype/images.js +13 -0
  45. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -0
  46. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  47. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  48. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  49. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -0
  50. package/dist/src/assets/img/icons/mediatype/software.js +13 -0
  51. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -0
  52. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -0
  53. package/dist/src/assets/img/icons/mediatype/texts.js +13 -0
  54. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -0
  55. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -0
  56. package/dist/src/assets/img/icons/mediatype/tv.js +14 -0
  57. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -0
  58. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -0
  59. package/dist/src/assets/img/icons/mediatype/video.js +14 -0
  60. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -0
  61. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -0
  62. package/dist/src/assets/img/icons/mediatype/web.js +13 -0
  63. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -0
  64. package/dist/src/assets/img/icons/null-result.d.ts +2 -0
  65. package/dist/src/assets/img/icons/null-result.js +5 -0
  66. package/dist/src/assets/img/icons/null-result.js.map +1 -0
  67. package/dist/src/assets/img/icons/restricted.d.ts +1 -0
  68. package/dist/src/assets/img/icons/restricted.js +29 -0
  69. package/dist/src/assets/img/icons/restricted.js.map +1 -0
  70. package/dist/src/assets/img/icons/reviews.d.ts +1 -0
  71. package/dist/src/assets/img/icons/reviews.js +11 -0
  72. package/dist/src/assets/img/icons/reviews.js.map +1 -0
  73. package/dist/src/assets/img/icons/upload.d.ts +1 -0
  74. package/dist/src/assets/img/icons/upload.js +12 -0
  75. package/dist/src/assets/img/icons/upload.js.map +1 -0
  76. package/dist/src/assets/img/icons/views.d.ts +1 -0
  77. package/dist/src/assets/img/icons/views.js +11 -0
  78. package/dist/src/assets/img/icons/views.js.map +1 -0
  79. package/dist/src/circular-activity-indicator.d.ts +5 -0
  80. package/dist/src/circular-activity-indicator.js +66 -0
  81. package/dist/src/circular-activity-indicator.js.map +1 -0
  82. package/dist/src/collection-browser.d.ts +214 -0
  83. package/dist/src/collection-browser.js +1241 -0
  84. package/dist/src/collection-browser.js.map +1 -0
  85. package/dist/src/collection-facets.d.ts +63 -0
  86. package/dist/src/collection-facets.js +560 -0
  87. package/dist/src/collection-facets.js.map +1 -0
  88. package/dist/src/empty-placeholder.d.ts +11 -0
  89. package/dist/src/empty-placeholder.js +83 -0
  90. package/dist/src/empty-placeholder.js.map +1 -0
  91. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  92. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  93. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  94. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  95. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  96. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  97. package/dist/src/mediatype/mediatype-config.d.ts +3 -0
  98. package/dist/src/mediatype/mediatype-config.js +86 -0
  99. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  100. package/dist/src/models.d.ts +84 -0
  101. package/dist/src/models.js +58 -0
  102. package/dist/src/models.js.map +1 -0
  103. package/dist/src/restoration-state-handler.d.ts +38 -0
  104. package/dist/src/restoration-state-handler.js +204 -0
  105. package/dist/src/restoration-state-handler.js.map +1 -0
  106. package/dist/src/sort-filter-bar/alpha-bar.d.ts +9 -0
  107. package/dist/src/sort-filter-bar/alpha-bar.js +98 -0
  108. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -0
  109. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  110. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  111. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  112. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  113. package/dist/src/sort-filter-bar/img/list.js +5 -0
  114. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  115. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  116. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  117. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  118. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  119. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  120. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  121. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +85 -0
  122. package/dist/src/sort-filter-bar/sort-filter-bar.js +698 -0
  123. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -0
  124. package/dist/src/styles/item-image-styles.d.ts +8 -0
  125. package/dist/src/styles/item-image-styles.js +102 -0
  126. package/dist/src/styles/item-image-styles.js.map +1 -0
  127. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
  128. package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
  129. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  130. package/dist/src/tiles/grid/account-tile.d.ts +8 -0
  131. package/dist/src/tiles/grid/account-tile.js +126 -0
  132. package/dist/src/tiles/grid/account-tile.js.map +1 -0
  133. package/dist/src/tiles/grid/collection-tile.d.ts +7 -0
  134. package/dist/src/tiles/grid/collection-tile.js +159 -0
  135. package/dist/src/tiles/grid/collection-tile.js.map +1 -0
  136. package/dist/src/tiles/grid/item-tile.d.ts +21 -0
  137. package/dist/src/tiles/grid/item-tile.js +183 -0
  138. package/dist/src/tiles/grid/item-tile.js.map +1 -0
  139. package/dist/src/tiles/grid/tile-stats.d.ts +10 -0
  140. package/dist/src/tiles/grid/tile-stats.js +134 -0
  141. package/dist/src/tiles/grid/tile-stats.js.map +1 -0
  142. package/dist/src/tiles/image-block.d.ts +17 -0
  143. package/dist/src/tiles/image-block.js +136 -0
  144. package/dist/src/tiles/image-block.js.map +1 -0
  145. package/dist/src/tiles/item-image.d.ts +31 -0
  146. package/dist/src/tiles/item-image.js +118 -0
  147. package/dist/src/tiles/item-image.js.map +1 -0
  148. package/dist/src/tiles/list/account-label.d.ts +1 -0
  149. package/dist/src/tiles/list/account-label.js +7 -0
  150. package/dist/src/tiles/list/account-label.js.map +1 -0
  151. package/dist/src/tiles/list/date-label.d.ts +1 -0
  152. package/dist/src/tiles/list/date-label.js +13 -0
  153. package/dist/src/tiles/list/date-label.js.map +1 -0
  154. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
  155. package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
  156. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  157. package/dist/src/tiles/list/tile-list-compact.d.ts +20 -0
  158. package/dist/src/tiles/list/tile-list-compact.js +180 -0
  159. package/dist/src/tiles/list/tile-list-compact.js.map +1 -0
  160. package/dist/src/tiles/list/tile-list.d.ts +48 -0
  161. package/dist/src/tiles/list/tile-list.js +455 -0
  162. package/dist/src/tiles/list/tile-list.js.map +1 -0
  163. package/dist/src/tiles/mediatype-icon.d.ts +9 -0
  164. package/dist/src/tiles/mediatype-icon.js +82 -0
  165. package/dist/src/tiles/mediatype-icon.js.map +1 -0
  166. package/dist/src/tiles/overlay/icon-overlay.d.ts +7 -0
  167. package/dist/src/tiles/overlay/icon-overlay.js +43 -0
  168. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -0
  169. package/dist/src/tiles/overlay/text-overlay.d.ts +8 -0
  170. package/dist/src/tiles/overlay/text-overlay.js +57 -0
  171. package/dist/src/tiles/overlay/text-overlay.js.map +1 -0
  172. package/dist/src/tiles/tile-dispatcher.d.ts +36 -0
  173. package/dist/src/tiles/tile-dispatcher.js +215 -0
  174. package/dist/src/tiles/tile-dispatcher.js.map +1 -0
  175. package/dist/src/utils/format-count.d.ts +7 -0
  176. package/dist/src/utils/format-count.js +76 -0
  177. package/dist/src/utils/format-count.js.map +1 -0
  178. package/dist/src/utils/format-date.d.ts +2 -0
  179. package/dist/src/utils/format-date.js +24 -0
  180. package/dist/src/utils/format-date.js.map +1 -0
  181. package/dist/test/collection-browser.test.d.ts +1 -0
  182. package/dist/test/collection-browser.test.js +47 -0
  183. package/dist/test/collection-browser.test.js.map +1 -0
  184. package/dist/test/empty-placeholder.test.d.ts +1 -0
  185. package/dist/test/empty-placeholder.test.js +34 -0
  186. package/dist/test/empty-placeholder.test.js.map +1 -0
  187. package/dist/test/icon-overlay.test.d.ts +1 -0
  188. package/dist/test/icon-overlay.test.js +31 -0
  189. package/dist/test/icon-overlay.test.js.map +1 -0
  190. package/dist/test/item-image.test.d.ts +1 -0
  191. package/dist/test/item-image.test.js +73 -0
  192. package/dist/test/item-image.test.js.map +1 -0
  193. package/dist/test/mediatype-config.test.d.ts +1 -0
  194. package/dist/test/mediatype-config.test.js +17 -0
  195. package/dist/test/mediatype-config.test.js.map +1 -0
  196. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -0
  197. package/dist/test/mocks/mock-collection-name-cache.js +14 -0
  198. package/dist/test/mocks/mock-collection-name-cache.js.map +1 -0
  199. package/dist/test/mocks/mock-search-responses.d.ts +3 -0
  200. package/dist/test/mocks/mock-search-responses.js +32 -0
  201. package/dist/test/mocks/mock-search-responses.js.map +1 -0
  202. package/dist/test/mocks/mock-search-service.d.ts +8 -0
  203. package/dist/test/mocks/mock-search-service.js +16 -0
  204. package/dist/test/mocks/mock-search-service.js.map +1 -0
  205. package/dist/test/text-overlay.test.d.ts +1 -0
  206. package/dist/test/text-overlay.test.js +48 -0
  207. package/dist/test/text-overlay.test.js.map +1 -0
  208. package/dist/test/tile-stats.test.d.ts +1 -0
  209. package/dist/test/tile-stats.test.js +42 -0
  210. package/dist/test/tile-stats.test.js.map +1 -0
  211. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -0
  212. package/dist/test/tiles/grid/item-tile.test.js +96 -0
  213. package/dist/test/tiles/grid/item-tile.test.js.map +1 -0
  214. package/dist/test/utils/format-count.test.d.ts +1 -0
  215. package/dist/test/utils/format-count.test.js +24 -0
  216. package/dist/test/utils/format-count.test.js.map +1 -0
  217. package/dist/test/utils/format-date.test.d.ts +1 -0
  218. package/dist/test/utils/format-date.test.js +18 -0
  219. package/dist/test/utils/format-date.test.js.map +1 -0
  220. package/package.json +3 -2
  221. package/src/collection-browser.ts +2 -2
  222. package/src/collection-facets.ts +3 -3
  223. package/src/restoration-state-handler.ts +1 -1
  224. package/src/sort-filter-bar/sort-filter-bar.ts +1 -1
  225. package/src/tiles/grid/account-tile.ts +1 -1
  226. package/src/tiles/grid/collection-tile.ts +1 -1
  227. package/src/tiles/grid/item-tile.ts +2 -2
  228. package/src/tiles/image-block.ts +1 -1
  229. package/src/tiles/item-image.ts +1 -1
  230. package/src/tiles/list/tile-list-compact-header.ts +2 -2
  231. package/src/tiles/list/tile-list-compact.ts +2 -2
  232. package/src/tiles/list/tile-list.ts +4 -4
  233. package/src/tiles/tile-dispatcher.ts +2 -2
  234. package/test/collection-browser.test.ts +1 -1
  235. package/test/empty-placeholder.test.ts +2 -1
  236. package/test/icon-overlay.test.ts +1 -1
  237. package/test/item-image.test.ts +2 -2
  238. package/test/mocks/mock-collection-name-cache.ts +1 -1
  239. package/test/mocks/mock-search-responses.ts +1 -1
  240. package/test/mocks/mock-search-service.ts +2 -2
  241. package/test/text-overlay.test.ts +1 -1
  242. package/test/tile-stats.test.ts +1 -1
  243. package/test/tiles/grid/item-tile.test.ts +1 -1
  244. package/tsconfig.json +3 -2
  245. package/types/dompurify.d.ts +1 -0
@@ -0,0 +1,455 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, html, LitElement, nothing, } from 'lit';
3
+ import { ifDefined } from 'lit/directives/if-defined.js';
4
+ import { join } from 'lit/directives/join.js';
5
+ import { map } from 'lit/directives/map.js';
6
+ import { customElement, property, state } from 'lit/decorators.js';
7
+ import DOMPurify from 'dompurify';
8
+ import { dateLabel } from './date-label';
9
+ import { accountLabel } from './account-label';
10
+ import { formatCount } from '../../utils/format-count';
11
+ import { formatDate } from '../../utils/format-date';
12
+ import '../image-block';
13
+ import '../mediatype-icon';
14
+ let TileList = class TileList extends LitElement {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.sortParam = null;
18
+ this.collectionLinks = [];
19
+ this.loggedIn = false;
20
+ }
21
+ updated(changed) {
22
+ if (changed.has('model')) {
23
+ this.fetchCollectionNames();
24
+ }
25
+ }
26
+ async fetchCollectionNames() {
27
+ var _a, _b;
28
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.collections) ||
29
+ this.model.collections.length === 0 ||
30
+ !this.collectionNameCache) {
31
+ return;
32
+ }
33
+ // Note: quirk of Lit: need to replace collectionLinks array,
34
+ // otherwise it will not re-render. Can't simply alter the array.
35
+ this.collectionLinks = [];
36
+ const newCollellectionLinks = [];
37
+ const promises = [];
38
+ for (const collection of this.model.collections) {
39
+ promises.push((_b = this.collectionNameCache) === null || _b === void 0 ? void 0 : _b.collectionNameFor(collection).then(name => {
40
+ newCollellectionLinks.push(this.detailsLink(collection, name !== null && name !== void 0 ? name : collection));
41
+ }));
42
+ }
43
+ await Promise.all(promises);
44
+ this.collectionLinks = newCollellectionLinks;
45
+ }
46
+ render() {
47
+ return html `
48
+ <div id="list-line" class="${this.classSize}">
49
+ ${this.classSize === 'mobile'
50
+ ? this.mobileTemplate
51
+ : this.desktopTemplate}
52
+ </div>
53
+ `;
54
+ }
55
+ get mobileTemplate() {
56
+ return html `
57
+ <div id="list-line-top">
58
+ <div id="list-line-left">${this.imageBlockTemplate}</div>
59
+ <div id="list-line-right">
60
+ <div id="title-line">
61
+ <div id="title">${this.titleTemplate}</div>
62
+ ${this.iconRightTemplate}
63
+ </div>
64
+ </div>
65
+ </div>
66
+ <div id="list-line-bottom">${this.detailsTemplate}</div>
67
+ `;
68
+ }
69
+ get desktopTemplate() {
70
+ return html `
71
+ <div id="list-line-left">${this.imageBlockTemplate}</div>
72
+ <div id="list-line-right">
73
+ <div id="title-line">
74
+ <div id="title">${this.titleTemplate}</div>
75
+ ${this.iconRightTemplate}
76
+ </div>
77
+ ${this.detailsTemplate}
78
+ </div>
79
+ `;
80
+ }
81
+ get imageBlockTemplate() {
82
+ return html `
83
+ <image-block
84
+ .model=${this.model}
85
+ .baseImageUrl=${this.baseImageUrl}
86
+ .isCompactTile=${false}
87
+ .isListTile=${true}
88
+ .viewSize=${this.classSize}
89
+ >
90
+ </image-block>
91
+ `;
92
+ }
93
+ get detailsTemplate() {
94
+ return html `
95
+ ${this.itemLineTemplate} ${this.creatorTemplate}
96
+ <div id="dates-line">
97
+ ${this.datePublishedTemplate} ${this.dateSortByTemplate}
98
+ </div>
99
+ <div id="views-line">
100
+ ${this.viewsTemplate} ${this.ratingTemplate} ${this.reviewsTemplate}
101
+ </div>
102
+ ${this.topicsTemplate} ${this.collectionsTemplate}
103
+ ${this.descriptionTemplate}
104
+ `;
105
+ }
106
+ // Data templates
107
+ get iconRightTemplate() {
108
+ var _a, _b;
109
+ return html `
110
+ <div id="icon-right">
111
+ <mediatype-icon
112
+ .mediatype=${(_a = this.model) === null || _a === void 0 ? void 0 : _a.mediatype}
113
+ .collections=${(_b = this.model) === null || _b === void 0 ? void 0 : _b.collections}
114
+ >
115
+ </mediatype-icon>
116
+ </div>
117
+ `;
118
+ }
119
+ get titleTemplate() {
120
+ var _a;
121
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.title)) {
122
+ return nothing;
123
+ }
124
+ return html ` ${this.detailsLink(this.model.identifier, this.model.title)} `;
125
+ }
126
+ get itemLineTemplate() {
127
+ const source = this.sourceTemplate;
128
+ const volume = this.volumeTemplate;
129
+ const issue = this.issueTemplate;
130
+ if (!source && !volume && !issue) {
131
+ return nothing;
132
+ }
133
+ return html ` <div id="item-line">${source} ${volume} ${issue}</div> `;
134
+ }
135
+ get sourceTemplate() {
136
+ var _a;
137
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.source)) {
138
+ return nothing;
139
+ }
140
+ return html `
141
+ <div id="source" class="metadata">
142
+ ${this.labelTemplate('Source')}
143
+ ${this.searchLink('source', this.model.source)}
144
+ </div>
145
+ `;
146
+ }
147
+ get volumeTemplate() {
148
+ var _a;
149
+ return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.volume, 'Volume');
150
+ }
151
+ get issueTemplate() {
152
+ var _a;
153
+ return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.issue, 'Issue');
154
+ }
155
+ get creatorTemplate() {
156
+ var _a, _b, _c;
157
+ // "Achivist since" if account
158
+ if (((_a = this.model) === null || _a === void 0 ? void 0 : _a.mediatype) === 'account') {
159
+ return html `
160
+ <div id="creator" class="metadata">
161
+ <span class="label"> ${accountLabel((_b = this.model) === null || _b === void 0 ? void 0 : _b.dateAdded)} </span>
162
+ </div>
163
+ `;
164
+ }
165
+ // "Creator" if not account tile
166
+ if (!((_c = this.model) === null || _c === void 0 ? void 0 : _c.creators) || this.model.creators.length === 0) {
167
+ return nothing;
168
+ }
169
+ return html `
170
+ <div id="creator" class="metadata">
171
+ ${this.labelTemplate('By')}
172
+ ${join(map(this.model.creators, id => this.searchLink('creator', id)), html `, `)}
173
+ </div>
174
+ `;
175
+ }
176
+ get datePublishedTemplate() {
177
+ var _a;
178
+ return this.metadataTemplate(formatDate((_a = this.model) === null || _a === void 0 ? void 0 : _a.datePublished, 'long'), 'Published');
179
+ }
180
+ // Show date label/value when sorted by date type
181
+ // Except datePublished which is always shown
182
+ get dateSortByTemplate() {
183
+ if (this.sortParam &&
184
+ (this.sortParam.field === 'addeddate' ||
185
+ this.sortParam.field === 'reviewdate' ||
186
+ this.sortParam.field === 'publicdate')) {
187
+ return this.metadataTemplate(formatDate(this.date, 'long'), dateLabel(this.sortParam.field));
188
+ }
189
+ return nothing;
190
+ }
191
+ get viewsTemplate() {
192
+ var _a, _b;
193
+ 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');
194
+ }
195
+ get ratingTemplate() {
196
+ var _a;
197
+ return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.averageRating, 'Avg Rating');
198
+ }
199
+ get reviewsTemplate() {
200
+ var _a;
201
+ return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.commentCount, 'Reviews');
202
+ }
203
+ get topicsTemplate() {
204
+ var _a;
205
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.subjects) || this.model.subjects.length === 0) {
206
+ return nothing;
207
+ }
208
+ return html `
209
+ <div id="topics" class="metadata">
210
+ ${this.labelTemplate('Topics')}
211
+ ${join(map(this.model.subjects, id => this.searchLink('subject', id)), html `, `)}
212
+ </div>
213
+ `;
214
+ }
215
+ get collectionsTemplate() {
216
+ if (!this.collectionLinks || this.collectionLinks.length === 0) {
217
+ return nothing;
218
+ }
219
+ return html `
220
+ <div id="collections" class="metadata">
221
+ ${this.labelTemplate('Collections')}
222
+ ${join(this.collectionLinks, html `, `)}
223
+ </div>
224
+ `;
225
+ }
226
+ get descriptionTemplate() {
227
+ var _a, _b;
228
+ return this.metadataTemplate(DOMPurify.sanitize((_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : ''), '', 'description');
229
+ }
230
+ // Utility functions
231
+ metadataTemplate(text, label = '', id) {
232
+ if (!text)
233
+ return nothing;
234
+ return html `
235
+ <div id=${ifDefined(id)} class="metadata">
236
+ ${this.labelTemplate(label)} ${text}
237
+ </div>
238
+ `;
239
+ }
240
+ labelTemplate(label) {
241
+ return html ` ${label
242
+ ? html `<span class="label">${label}: </span>`
243
+ : nothing}`;
244
+ }
245
+ searchLink(field, searchTerm) {
246
+ if (!field || !searchTerm) {
247
+ return nothing;
248
+ }
249
+ const query = encodeURIComponent(`${field}:"${searchTerm}"`);
250
+ // No whitespace after closing tag
251
+ // Note: single ' for href='' to wrap " in query var gets changed back by yarn format
252
+ // eslint-disable-next-line lit/no-invalid-html
253
+ return html `<a href="${this.baseNavigationUrl}/search.php?query=${query}">
254
+ ${DOMPurify.sanitize(searchTerm)}</a
255
+ >`;
256
+ }
257
+ detailsLink(identifier, text) {
258
+ const linkText = text !== null && text !== void 0 ? text : identifier;
259
+ // No whitespace after closing tag
260
+ // identifiers (all ASCII in their creation) should be safe to use in href, but sanitize anyway
261
+ return html `<a
262
+ href="${this.baseNavigationUrl}/details/${encodeURI(identifier)}"
263
+ >${DOMPurify.sanitize(linkText)}</a
264
+ >`;
265
+ }
266
+ /*
267
+ * TODO: fix field names to match model in src/collection-browser.ts
268
+ * private get dateSortSelector()
269
+ * @see src/models.ts
270
+ */
271
+ get date() {
272
+ var _a, _b, _c, _d, _e;
273
+ switch ((_a = this.sortParam) === null || _a === void 0 ? void 0 : _a.field) {
274
+ case 'date':
275
+ return (_b = this.model) === null || _b === void 0 ? void 0 : _b.datePublished;
276
+ case 'reviewdate':
277
+ return (_c = this.model) === null || _c === void 0 ? void 0 : _c.dateReviewed;
278
+ case 'addeddate':
279
+ return (_d = this.model) === null || _d === void 0 ? void 0 : _d.dateAdded;
280
+ default:
281
+ return (_e = this.model) === null || _e === void 0 ? void 0 : _e.dateArchived; // publicdate
282
+ }
283
+ }
284
+ get classSize() {
285
+ if (this.mobileBreakpoint &&
286
+ this.currentWidth &&
287
+ this.currentWidth < this.mobileBreakpoint) {
288
+ return 'mobile';
289
+ }
290
+ return 'desktop';
291
+ }
292
+ get formatSize() {
293
+ if (this.mobileBreakpoint &&
294
+ this.currentWidth &&
295
+ this.currentWidth < this.mobileBreakpoint) {
296
+ return 'short';
297
+ }
298
+ return 'long';
299
+ }
300
+ static get styles() {
301
+ return css `
302
+ html {
303
+ font-size: unset;
304
+ }
305
+
306
+ div {
307
+ font-size: 14px;
308
+ }
309
+
310
+ div a {
311
+ text-decoration: none;
312
+ }
313
+
314
+ .label {
315
+ font-weight: bold;
316
+ }
317
+
318
+ #list-line.mobile {
319
+ --infiniteScrollerRowGap: 20px;
320
+ --infiniteScrollerRowHeight: auto;
321
+ }
322
+
323
+ #list-line.desktop {
324
+ --infiniteScrollerRowGap: 30px;
325
+ --infiniteScrollerRowHeight: auto;
326
+ }
327
+
328
+ /* fields */
329
+ #icon-right {
330
+ width: 20px;
331
+ padding-top: 5px;
332
+ --iconHeight: 20px;
333
+ --iconWidth: 20px;
334
+ --iconTextAlign: right;
335
+ margin-top: -8px;
336
+ text-align: right;
337
+ }
338
+
339
+ #title {
340
+ color: #4b64ff;
341
+ text-decoration: none;
342
+ font-size: 22px;
343
+ font-weight: bold;
344
+ /* align top of text with image */
345
+ line-height: 25px;
346
+ margin-top: -4px;
347
+ padding-bottom: 2px;
348
+ flex-grow: 1;
349
+ }
350
+
351
+ .metadata {
352
+ line-height: 20px;
353
+ }
354
+
355
+ #description,
356
+ #creator,
357
+ #topics,
358
+ #source {
359
+ text-align: left;
360
+ overflow: hidden;
361
+ text-overflow: ellipsis;
362
+ -webkit-box-orient: vertical;
363
+ display: -webkit-box;
364
+ word-break: break-word;
365
+ -webkit-line-clamp: 3; /* number of lines to show */
366
+ line-clamp: 3;
367
+ }
368
+
369
+ #icon {
370
+ padding-top: 5px;
371
+ }
372
+
373
+ #description {
374
+ padding-top: 10px;
375
+ }
376
+
377
+ /* Top level container */
378
+ #list-line {
379
+ display: flex;
380
+ }
381
+
382
+ #list-line.mobile {
383
+ flex-direction: column;
384
+ }
385
+
386
+ #list-line.desktop {
387
+ column-gap: 10px;
388
+ }
389
+
390
+ #list-line-top {
391
+ display: flex;
392
+ column-gap: 7px;
393
+ }
394
+
395
+ #list-line-bottom {
396
+ padding-top: 4px;
397
+ }
398
+
399
+ #list-line-right,
400
+ #list-line-top,
401
+ #list-line-bottom {
402
+ width: 100%;
403
+ }
404
+
405
+ div a:hover {
406
+ text-decoration: underline;
407
+ }
408
+
409
+ /* Lines containing multiple div as row */
410
+ #item-line,
411
+ #dates-line,
412
+ #views-line,
413
+ #title-line {
414
+ display: flex;
415
+ flex-direction: row;
416
+ gap: 10px;
417
+ }
418
+ `;
419
+ }
420
+ };
421
+ __decorate([
422
+ property({ type: Object })
423
+ ], TileList.prototype, "model", void 0);
424
+ __decorate([
425
+ property({ type: String })
426
+ ], TileList.prototype, "baseNavigationUrl", void 0);
427
+ __decorate([
428
+ property({ type: Object })
429
+ ], TileList.prototype, "collectionNameCache", void 0);
430
+ __decorate([
431
+ property({ type: Number })
432
+ ], TileList.prototype, "currentWidth", void 0);
433
+ __decorate([
434
+ property({ type: Number })
435
+ ], TileList.prototype, "currentHeight", void 0);
436
+ __decorate([
437
+ property({ type: Object })
438
+ ], TileList.prototype, "sortParam", void 0);
439
+ __decorate([
440
+ property({ type: Number })
441
+ ], TileList.prototype, "mobileBreakpoint", void 0);
442
+ __decorate([
443
+ state()
444
+ ], TileList.prototype, "collectionLinks", void 0);
445
+ __decorate([
446
+ property({ type: String })
447
+ ], TileList.prototype, "baseImageUrl", void 0);
448
+ __decorate([
449
+ property({ type: Boolean })
450
+ ], TileList.prototype, "loggedIn", void 0);
451
+ TileList = __decorate([
452
+ customElement('tile-list')
453
+ ], TileList);
454
+ export { TileList };
455
+ //# sourceMappingURL=tile-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile-list.js","sourceRoot":"","sources":["../../../../src/tiles/list/tile-list.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n html,\n LitElement,\n nothing,\n PropertyValues,\n TemplateResult,\n} 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, state } from 'lit/decorators.js';\nimport DOMPurify from 'dompurify';\n\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport type { SortParam } from '@internetarchive/search-service';\nimport type { TileModel } from '../../models';\n\nimport { dateLabel } from './date-label';\nimport { accountLabel } from './account-label';\nimport { formatCount, NumberFormat } from '../../utils/format-count';\nimport { formatDate, DateFormat } from '../../utils/format-date';\n\nimport '../image-block';\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: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @property({ type: Number }) currentWidth?: number;\n\n @property({ type: Number }) currentHeight?: number;\n\n @property({ type: Object }) sortParam: SortParam | null = null;\n\n @property({ type: Number }) mobileBreakpoint?: number;\n\n @state() private collectionLinks: TemplateResult[] = [];\n\n @property({ type: String }) baseImageUrl?: string;\n\n @property({ type: Boolean }) loggedIn = false;\n\n protected updated(changed: PropertyValues): void {\n if (changed.has('model')) {\n this.fetchCollectionNames();\n }\n }\n\n private async fetchCollectionNames() {\n if (\n !this.model?.collections ||\n this.model.collections.length === 0 ||\n !this.collectionNameCache\n ) {\n return;\n }\n // Note: quirk of Lit: need to replace collectionLinks array,\n // otherwise it will not re-render. Can't simply alter the array.\n this.collectionLinks = [];\n const newCollellectionLinks: TemplateResult[] = [];\n const promises: Promise<void>[] = [];\n for (const collection of this.model.collections) {\n promises.push(\n this.collectionNameCache?.collectionNameFor(collection).then(name => {\n newCollellectionLinks.push(\n this.detailsLink(collection, name ?? collection)\n );\n })\n );\n }\n await Promise.all(promises);\n this.collectionLinks = newCollellectionLinks;\n }\n\n render() {\n return html`\n <div id=\"list-line\" class=\"${this.classSize}\">\n ${this.classSize === 'mobile'\n ? this.mobileTemplate\n : this.desktopTemplate}\n </div>\n `;\n }\n\n private get mobileTemplate() {\n return html`\n <div id=\"list-line-top\">\n <div id=\"list-line-left\">${this.imageBlockTemplate}</div>\n <div id=\"list-line-right\">\n <div id=\"title-line\">\n <div id=\"title\">${this.titleTemplate}</div>\n ${this.iconRightTemplate}\n </div>\n </div>\n </div>\n <div id=\"list-line-bottom\">${this.detailsTemplate}</div>\n `;\n }\n\n private get desktopTemplate() {\n return html`\n <div id=\"list-line-left\">${this.imageBlockTemplate}</div>\n <div id=\"list-line-right\">\n <div id=\"title-line\">\n <div id=\"title\">${this.titleTemplate}</div>\n ${this.iconRightTemplate}\n </div>\n ${this.detailsTemplate}\n </div>\n `;\n }\n\n private get imageBlockTemplate() {\n return html`\n <image-block\n .model=${this.model}\n .baseImageUrl=${this.baseImageUrl}\n .isCompactTile=${false}\n .isListTile=${true}\n .viewSize=${this.classSize}\n >\n </image-block>\n `;\n }\n\n private get detailsTemplate() {\n return html`\n ${this.itemLineTemplate} ${this.creatorTemplate}\n <div id=\"dates-line\">\n ${this.datePublishedTemplate} ${this.dateSortByTemplate}\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 `;\n }\n\n // Data templates\n private get iconRightTemplate() {\n return html`\n <div id=\"icon-right\">\n <mediatype-icon\n .mediatype=${this.model?.mediatype}\n .collections=${this.model?.collections}\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 sourceTemplate() {\n if (!this.model?.source) {\n return nothing;\n }\n return html`\n <div id=\"source\" class=\"metadata\">\n ${this.labelTemplate('Source')}\n ${this.searchLink('source', this.model.source)}\n </div>\n `;\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 creatorTemplate() {\n // \"Achivist since\" if account\n if (this.model?.mediatype === 'account') {\n return html`\n <div id=\"creator\" class=\"metadata\">\n <span class=\"label\"> ${accountLabel(this.model?.dateAdded)} </span>\n </div>\n `;\n }\n // \"Creator\" if not account tile\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 datePublishedTemplate() {\n return this.metadataTemplate(\n formatDate(this.model?.datePublished, 'long'),\n 'Published'\n );\n }\n\n // Show date label/value when sorted by date type\n // Except datePublished which is always shown\n private get dateSortByTemplate() {\n if (\n this.sortParam &&\n (this.sortParam.field === 'addeddate' ||\n this.sortParam.field === 'reviewdate' ||\n this.sortParam.field === 'publicdate')\n ) {\n return this.metadataTemplate(\n formatDate(this.date, 'long'),\n dateLabel(this.sortParam.field)\n );\n }\n return nothing;\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.collectionLinks || this.collectionLinks.length === 0) {\n return nothing;\n }\n return html`\n <div id=\"collections\" class=\"metadata\">\n ${this.labelTemplate('Collections')}\n ${join(this.collectionLinks, html`, `)}\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 // Note: single ' for href='' to wrap \" in query var gets changed back by yarn format\n\n // eslint-disable-next-line lit/no-invalid-html\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): TemplateResult {\n const linkText = text ?? identifier;\n // No whitespace after closing tag\n // identifiers (all ASCII in their creation) should be safe to use in href, but sanitize anyway\n return html`<a\n href=\"${this.baseNavigationUrl}/details/${encodeURI(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 if (\n this.mobileBreakpoint &&\n this.currentWidth &&\n this.currentWidth < this.mobileBreakpoint\n ) {\n return 'mobile';\n }\n return 'desktop';\n }\n\n private get formatSize(): DateFormat | NumberFormat {\n if (\n this.mobileBreakpoint &&\n this.currentWidth &&\n this.currentWidth < this.mobileBreakpoint\n ) {\n return 'short';\n }\n return '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 #list-line.mobile {\n --infiniteScrollerRowGap: 20px;\n --infiniteScrollerRowHeight: auto;\n }\n\n #list-line.desktop {\n --infiniteScrollerRowGap: 30px;\n --infiniteScrollerRowHeight: auto;\n }\n\n /* fields */\n #icon-right {\n width: 20px;\n padding-top: 5px;\n --iconHeight: 20px;\n --iconWidth: 20px;\n --iconTextAlign: right;\n margin-top: -8px;\n text-align: right;\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 flex-grow: 1;\n }\n\n .metadata {\n line-height: 20px;\n }\n\n #description,\n #creator,\n #topics,\n #source {\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\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 }\n\n #icon {\n padding-top: 5px;\n }\n\n #description {\n padding-top: 10px;\n }\n\n /* Top level container */\n #list-line {\n display: flex;\n }\n\n #list-line.mobile {\n flex-direction: column;\n }\n\n #list-line.desktop {\n column-gap: 10px;\n }\n\n #list-line-top {\n display: flex;\n column-gap: 7px;\n }\n\n #list-line-bottom {\n padding-top: 4px;\n }\n\n #list-line-right,\n #list-line-top,\n #list-line-bottom {\n width: 100%;\n }\n\n div a:hover {\n text-decoration: underline;\n }\n\n /* Lines containing multiple div as row */\n #item-line,\n #dates-line,\n #views-line,\n #title-line {\n display: flex;\n flex-direction: row;\n gap: 10px;\n }\n `;\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import { CSSResultGroup, LitElement } from 'lit';
2
+ export declare class MediatypeIcon extends LitElement {
3
+ mediatype: string | undefined;
4
+ collections: string[] | undefined;
5
+ showText: boolean;
6
+ private get displayMediatype();
7
+ render(): import("lit-html").TemplateResult<1>;
8
+ static get styles(): CSSResultGroup;
9
+ }
@@ -0,0 +1,82 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, html, LitElement } from 'lit';
3
+ import { customElement, property } from 'lit/decorators.js';
4
+ import { mediatypeConfig } from '../mediatype/mediatype-config';
5
+ let MediatypeIcon = class MediatypeIcon extends LitElement {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.showText = false;
9
+ }
10
+ get displayMediatype() {
11
+ var _a, _b;
12
+ const tvIdentifier = ['tvnews', 'tvarchive', 'television'];
13
+ const radioIdentifier = ['radio', 'radioprogram'];
14
+ if (this.mediatype === 'movies' &&
15
+ ((_a = this.collections) === null || _a === void 0 ? void 0 : _a.some(id => tvIdentifier.indexOf(id) >= 0))) {
16
+ return 'tv';
17
+ }
18
+ if (this.mediatype === 'audio' &&
19
+ ((_b = this.collections) === null || _b === void 0 ? void 0 : _b.some(id => radioIdentifier.indexOf(id) >= 0))) {
20
+ return 'radio';
21
+ }
22
+ return this.mediatype || '';
23
+ }
24
+ render() {
25
+ const config = mediatypeConfig[this.displayMediatype];
26
+ if (!config) {
27
+ return html ``;
28
+ }
29
+ return html `
30
+ <div
31
+ id="icon"
32
+ class="${this.showText ? 'show-text' : 'hide-text'}"
33
+ style="--iconFillColor: ${config.color}"
34
+ >
35
+ ${config.icon}
36
+ <p class="status-text">${config.text}</p>
37
+ </div>
38
+ `;
39
+ }
40
+ static get styles() {
41
+ return css `
42
+ #icon {
43
+ height: var(--iconHeight, 25px);
44
+ }
45
+
46
+ .status-text {
47
+ font-size: 14px;
48
+ color: #2c2c2c;
49
+ margin: auto;
50
+ display: block;
51
+ text-align: var(--iconTextAlign, center);
52
+ }
53
+
54
+ #icon.hide-text p {
55
+ display: none;
56
+ }
57
+
58
+ svg {
59
+ height: var(--iconHeight, 10px);
60
+ width: var(--iconWidth, 10px);
61
+ }
62
+
63
+ .fill-color {
64
+ fill: var(--iconFillColor, '#000000');
65
+ }
66
+ `;
67
+ }
68
+ };
69
+ __decorate([
70
+ property({ type: String })
71
+ ], MediatypeIcon.prototype, "mediatype", void 0);
72
+ __decorate([
73
+ property({ type: Array })
74
+ ], MediatypeIcon.prototype, "collections", void 0);
75
+ __decorate([
76
+ property({ type: Boolean })
77
+ ], MediatypeIcon.prototype, "showText", void 0);
78
+ MediatypeIcon = __decorate([
79
+ customElement('mediatype-icon')
80
+ ], MediatypeIcon);
81
+ export { MediatypeIcon };
82
+ //# sourceMappingURL=mediatype-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediatype-icon.js","sourceRoot":"","sources":["../../../src/tiles/mediatype-icon.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAkB,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,IAAa,aAAa,GAA1B,MAAa,aAAc,SAAQ,UAAU;IAA7C;;QAK+B,aAAQ,GAAG,KAAK,CAAC;IAmEhD,CAAC;IAjEC,IAAY,gBAAgB;;QAC1B,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;QAC3D,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAElD,IACE,IAAI,CAAC,SAAS,KAAK,QAAQ;aAC3B,MAAA,IAAI,CAAC,WAAW,0CAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA,EAC3D;YACA,OAAO,IAAI,CAAC;SACb;QACD,IACE,IAAI,CAAC,SAAS,KAAK,OAAO;aAC1B,MAAA,IAAI,CAAC,WAAW,0CAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA,EAC9D;YACA,OAAO,OAAO,CAAC;SAChB;QACD,OAAO,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,IAAI,CAAA,EAAE,CAAC;SACf;QAED,OAAO,IAAI,CAAA;;;iBAGE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;kCACxB,MAAM,CAAC,KAAK;;UAEpC,MAAM,CAAC,IAAI;iCACY,MAAM,CAAC,IAAI;;KAEvC,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;KAyBT,CAAC;IACJ,CAAC;CACF,CAAA;AAvE6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAA+B;AAE/B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;kDAAmC;AAEhC;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;+CAAkB;AALnC,aAAa;IADzB,aAAa,CAAC,gBAAgB,CAAC;GACnB,aAAa,CAwEzB;SAxEY,aAAa","sourcesContent":["import { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { mediatypeConfig } from '../mediatype/mediatype-config';\n\n@customElement('mediatype-icon')\nexport class MediatypeIcon extends LitElement {\n @property({ type: String }) mediatype: string | undefined;\n\n @property({ type: Array }) collections: string[] | undefined;\n\n @property({ type: Boolean }) showText = false;\n\n private get displayMediatype(): string {\n const tvIdentifier = ['tvnews', 'tvarchive', 'television'];\n const radioIdentifier = ['radio', 'radioprogram'];\n\n if (\n this.mediatype === 'movies' &&\n this.collections?.some(id => tvIdentifier.indexOf(id) >= 0)\n ) {\n return 'tv';\n }\n if (\n this.mediatype === 'audio' &&\n this.collections?.some(id => radioIdentifier.indexOf(id) >= 0)\n ) {\n return 'radio';\n }\n return this.mediatype || '';\n }\n\n render() {\n const config = mediatypeConfig[this.displayMediatype];\n if (!config) {\n return html``;\n }\n\n return html`\n <div\n id=\"icon\"\n class=\"${this.showText ? 'show-text' : 'hide-text'}\"\n style=\"--iconFillColor: ${config.color}\"\n >\n ${config.icon}\n <p class=\"status-text\">${config.text}</p>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n return css`\n #icon {\n height: var(--iconHeight, 25px);\n }\n\n .status-text {\n font-size: 14px;\n color: #2c2c2c;\n margin: auto;\n display: block;\n text-align: var(--iconTextAlign, center);\n }\n\n #icon.hide-text p {\n display: none;\n }\n\n svg {\n height: var(--iconHeight, 10px);\n width: var(--iconWidth, 10px);\n }\n\n .fill-color {\n fill: var(--iconFillColor, '#000000');\n }\n `;\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { CSSResultGroup, LitElement } from 'lit';
2
+ export declare class IconOverlay extends LitElement {
3
+ loggedIn: boolean;
4
+ loginRequired: boolean;
5
+ render(): import("lit-html").TemplateResult<1>;
6
+ static get styles(): CSSResultGroup;
7
+ }
@@ -0,0 +1,43 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, html, LitElement } from 'lit';
3
+ import { customElement, property } from 'lit/decorators.js';
4
+ import { restrictedIcon } from '../../assets/img/icons/restricted';
5
+ import { loginRequiredIcon } from '../../assets/img/icons/login-required';
6
+ let IconOverlay = class IconOverlay extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.loggedIn = false;
10
+ this.loginRequired = false;
11
+ }
12
+ render() {
13
+ if (this.loginRequired && !this.loggedIn) {
14
+ return html `${loginRequiredIcon} `;
15
+ }
16
+ return html `${restrictedIcon}`;
17
+ }
18
+ static get styles() {
19
+ return css `
20
+ :host {
21
+ position: absolute;
22
+ top: 50%;
23
+ left: 50%;
24
+ transform: translate(-50%, -50%);
25
+ -ms-transform: translate(-50%, -50%);
26
+ width: 50%;
27
+ height: 50%;
28
+ z-index: 2;
29
+ }
30
+ `;
31
+ }
32
+ };
33
+ __decorate([
34
+ property({ type: Boolean })
35
+ ], IconOverlay.prototype, "loggedIn", void 0);
36
+ __decorate([
37
+ property({ type: Boolean })
38
+ ], IconOverlay.prototype, "loginRequired", void 0);
39
+ IconOverlay = __decorate([
40
+ customElement('icon-overlay')
41
+ ], IconOverlay);
42
+ export { IconOverlay };
43
+ //# sourceMappingURL=icon-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-overlay.js","sourceRoot":"","sources":["../../../../src/tiles/overlay/icon-overlay.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAkB,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAG1E,IAAa,WAAW,GAAxB,MAAa,WAAY,SAAQ,UAAU;IAA3C;;QAC+B,aAAQ,GAAG,KAAK,CAAC;QAEjB,kBAAa,GAAG,KAAK,CAAC;IAuBrD,CAAC;IArBC,MAAM;QACJ,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YACxC,OAAO,IAAI,CAAA,GAAG,iBAAiB,GAAG,CAAC;SACpC;QACD,OAAO,IAAI,CAAA,GAAG,cAAc,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;KAWT,CAAC;IACJ,CAAC;CACF,CAAA;AAzB8B;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;6CAAkB;AAEjB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;kDAAuB;AAHxC,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CA0BvB;SA1BY,WAAW","sourcesContent":["import { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { restrictedIcon } from '../../assets/img/icons/restricted';\nimport { loginRequiredIcon } from '../../assets/img/icons/login-required';\n\n@customElement('icon-overlay')\nexport class IconOverlay extends LitElement {\n @property({ type: Boolean }) loggedIn = false;\n\n @property({ type: Boolean }) loginRequired = false;\n\n render() {\n if (this.loginRequired && !this.loggedIn) {\n return html`${loginRequiredIcon} `;\n }\n return html`${restrictedIcon}`;\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n -ms-transform: translate(-50%, -50%);\n width: 50%;\n height: 50%;\n z-index: 2;\n }\n `;\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { CSSResultGroup, LitElement } from 'lit';
2
+ export declare class TextOverlay extends LitElement {
3
+ loggedIn: boolean;
4
+ loginRequired: boolean;
5
+ render(): import("lit-html").TemplateResult<1>;
6
+ private get textDisplay();
7
+ static get styles(): CSSResultGroup;
8
+ }