@internetarchive/collection-browser 0.3.10-alpha.1 → 0.4.1

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 (254) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +26 -26
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.husky/pre-commit +4 -4
  7. package/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/index.d.ts +9 -9
  10. package/dist/index.js +9 -9
  11. package/dist/src/app-root.d.ts +48 -48
  12. package/dist/src/app-root.js +258 -258
  13. package/dist/src/app-root.js.map +1 -1
  14. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  15. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  16. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  17. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  18. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  19. package/dist/src/assets/img/icons/chevron.js +2 -2
  20. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  21. package/dist/src/assets/img/icons/empty-query.js +2 -2
  22. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  23. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  24. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  25. package/dist/src/assets/img/icons/eye.js +2 -2
  26. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  27. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  28. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  29. package/dist/src/assets/img/icons/login-required.js +5 -17
  30. package/dist/src/assets/img/icons/login-required.js.map +1 -1
  31. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  32. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  33. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  34. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  35. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  36. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  37. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  38. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  39. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  40. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  41. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  42. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  43. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  44. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  45. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  46. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  47. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  48. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  49. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  50. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  51. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  52. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  53. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  54. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  55. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  56. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  57. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  58. package/dist/src/assets/img/icons/null-result.js +2 -2
  59. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  60. package/dist/src/assets/img/icons/restricted.js +3 -19
  61. package/dist/src/assets/img/icons/restricted.js.map +1 -1
  62. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  63. package/dist/src/assets/img/icons/reviews.js +2 -2
  64. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  65. package/dist/src/assets/img/icons/upload.js +2 -2
  66. package/dist/src/assets/img/icons/views.d.ts +1 -1
  67. package/dist/src/assets/img/icons/views.js +2 -2
  68. package/dist/src/circular-activity-indicator.d.ts +5 -5
  69. package/dist/src/circular-activity-indicator.js +17 -17
  70. package/dist/src/collection-browser.d.ts +315 -278
  71. package/dist/src/collection-browser.js +1275 -1119
  72. package/dist/src/collection-browser.js.map +1 -1
  73. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  74. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  75. package/dist/src/collection-facets/facets-template.d.ts +16 -16
  76. package/dist/src/collection-facets/facets-template.js +125 -125
  77. package/dist/src/collection-facets/more-facets-content.d.ts +77 -76
  78. package/dist/src/collection-facets/more-facets-content.js +357 -353
  79. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  80. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  81. package/dist/src/collection-facets/more-facets-pagination.js +192 -192
  82. package/dist/src/collection-facets.d.ts +78 -77
  83. package/dist/src/collection-facets.js +393 -389
  84. package/dist/src/collection-facets.js.map +1 -1
  85. package/dist/src/empty-placeholder.d.ts +11 -11
  86. package/dist/src/empty-placeholder.js +42 -42
  87. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  88. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  89. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  90. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  91. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  92. package/dist/src/mediatype/mediatype-config.js +85 -85
  93. package/dist/src/models.d.ts +112 -103
  94. package/dist/src/models.js +125 -117
  95. package/dist/src/models.js.map +1 -1
  96. package/dist/src/restoration-state-handler.d.ts +45 -46
  97. package/dist/src/restoration-state-handler.js +230 -230
  98. package/dist/src/restoration-state-handler.js.map +1 -1
  99. package/dist/src/sort-filter-bar/alpha-bar.d.ts +12 -9
  100. package/dist/src/sort-filter-bar/alpha-bar.js +69 -50
  101. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  102. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  103. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  104. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  105. package/dist/src/sort-filter-bar/img/list.js +2 -2
  106. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  107. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  108. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  109. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  110. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +108 -107
  111. package/dist/src/sort-filter-bar/sort-filter-bar.js +430 -423
  112. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  113. package/dist/src/styles/item-image-styles.d.ts +8 -8
  114. package/dist/src/styles/item-image-styles.js +12 -15
  115. package/dist/src/styles/item-image-styles.js.map +1 -1
  116. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  117. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  118. package/dist/src/tiles/grid/account-tile.d.ts +8 -8
  119. package/dist/src/tiles/grid/account-tile.js +20 -20
  120. package/dist/src/tiles/grid/collection-tile.d.ts +7 -7
  121. package/dist/src/tiles/grid/collection-tile.js +23 -23
  122. package/dist/src/tiles/grid/item-tile.d.ts +24 -24
  123. package/dist/src/tiles/grid/item-tile.js +89 -87
  124. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  125. package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
  126. package/dist/src/tiles/grid/tile-stats.js +40 -40
  127. package/dist/src/tiles/image-block.d.ts +17 -17
  128. package/dist/src/tiles/image-block.js +77 -69
  129. package/dist/src/tiles/image-block.js.map +1 -1
  130. package/dist/src/tiles/item-image.d.ts +31 -31
  131. package/dist/src/tiles/item-image.js +106 -106
  132. package/dist/src/tiles/list/account-label.d.ts +1 -1
  133. package/dist/src/tiles/list/account-label.js +6 -6
  134. package/dist/src/tiles/list/date-label.d.ts +1 -1
  135. package/dist/src/tiles/list/date-label.js +12 -12
  136. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -12
  137. package/dist/src/tiles/list/tile-list-compact-header.js +41 -41
  138. package/dist/src/tiles/list/tile-list-compact.d.ts +21 -21
  139. package/dist/src/tiles/list/tile-list-compact.js +93 -93
  140. package/dist/src/tiles/list/tile-list.d.ts +50 -50
  141. package/dist/src/tiles/list/tile-list.js +276 -276
  142. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  143. package/dist/src/tiles/mediatype-icon.js +47 -47
  144. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -7
  145. package/dist/src/tiles/overlay/icon-overlay.js +63 -33
  146. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -1
  147. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -0
  148. package/dist/src/tiles/overlay/icon-text-overlay.js +83 -0
  149. package/dist/src/tiles/overlay/icon-text-overlay.js.map +1 -0
  150. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -8
  151. package/dist/src/tiles/overlay/text-overlay.js +63 -35
  152. package/dist/src/tiles/overlay/text-overlay.js.map +1 -1
  153. package/dist/src/tiles/text-snippet-block.d.ts +29 -29
  154. package/dist/src/tiles/text-snippet-block.js +81 -81
  155. package/dist/src/tiles/tile-dispatcher.d.ts +36 -36
  156. package/dist/src/tiles/tile-dispatcher.js +128 -128
  157. package/dist/src/utils/analytics-events.d.ts +22 -22
  158. package/dist/src/utils/analytics-events.js +24 -24
  159. package/dist/src/utils/format-count.d.ts +7 -7
  160. package/dist/src/utils/format-count.js +76 -76
  161. package/dist/src/utils/format-date.d.ts +2 -2
  162. package/dist/src/utils/format-date.js +23 -23
  163. package/dist/test/collection-browser.test.d.ts +1 -1
  164. package/dist/test/collection-browser.test.js +647 -575
  165. package/dist/test/collection-browser.test.js.map +1 -1
  166. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  167. package/dist/test/collection-facets/facets-template.test.js +62 -62
  168. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  169. package/dist/test/collection-facets/more-facets-content.test.js +114 -114
  170. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
  171. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  172. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  173. package/dist/test/collection-facets.test.d.ts +2 -2
  174. package/dist/test/collection-facets.test.js +544 -544
  175. package/dist/test/empty-placeholder.test.d.ts +1 -1
  176. package/dist/test/empty-placeholder.test.js +33 -33
  177. package/dist/test/icon-overlay.test.d.ts +1 -1
  178. package/dist/test/icon-overlay.test.js +24 -24
  179. package/dist/test/image-block.test.d.ts +1 -1
  180. package/dist/test/image-block.test.js +48 -48
  181. package/dist/test/item-image.test.d.ts +1 -1
  182. package/dist/test/item-image.test.js +80 -80
  183. package/dist/test/item-image.test.js.map +1 -1
  184. package/dist/test/mediatype-config.test.d.ts +1 -1
  185. package/dist/test/mediatype-config.test.js +16 -16
  186. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  187. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  188. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -7
  189. package/dist/test/mocks/mock-collection-name-cache.js +13 -13
  190. package/dist/test/mocks/mock-search-responses.d.ts +12 -10
  191. package/dist/test/mocks/mock-search-responses.js +341 -271
  192. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  193. package/dist/test/mocks/mock-search-service.d.ts +13 -13
  194. package/dist/test/mocks/mock-search-service.js +40 -36
  195. package/dist/test/mocks/mock-search-service.js.map +1 -1
  196. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  197. package/dist/test/restoration-state-handler.test.js +125 -126
  198. package/dist/test/restoration-state-handler.test.js.map +1 -1
  199. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -0
  200. package/dist/test/sort-filter-bar/alpha-bar.test.js +44 -0
  201. package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -0
  202. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  203. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +145 -113
  204. package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
  205. package/dist/test/text-overlay.test.d.ts +1 -1
  206. package/dist/test/text-overlay.test.js +48 -41
  207. package/dist/test/text-overlay.test.js.map +1 -1
  208. package/dist/test/text-snippet-block.test.d.ts +1 -1
  209. package/dist/test/text-snippet-block.test.js +57 -57
  210. package/dist/test/tile-stats.test.d.ts +1 -1
  211. package/dist/test/tile-stats.test.js +33 -33
  212. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  213. package/dist/test/tiles/grid/item-tile.test.js +107 -107
  214. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  215. package/dist/test/tiles/list/tile-list-compact.test.js +92 -92
  216. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  217. package/dist/test/tiles/list/tile-list.test.js +123 -123
  218. package/dist/test/utils/format-count.test.d.ts +1 -1
  219. package/dist/test/utils/format-count.test.js +23 -23
  220. package/dist/test/utils/format-date.test.d.ts +1 -1
  221. package/dist/test/utils/format-date.test.js +17 -17
  222. package/index.html +24 -24
  223. package/local.archive.org.cert +86 -86
  224. package/local.archive.org.key +27 -27
  225. package/package.json +3 -3
  226. package/renovate.json +6 -6
  227. package/src/app-root.ts +1 -1
  228. package/src/assets/img/icons/login-required.ts +3 -15
  229. package/src/assets/img/icons/restricted.ts +1 -17
  230. package/src/collection-browser.ts +273 -57
  231. package/src/collection-facets/more-facets-content.ts +6 -2
  232. package/src/collection-facets.ts +6 -2
  233. package/src/models.ts +15 -0
  234. package/src/restoration-state-handler.ts +7 -5
  235. package/src/sort-filter-bar/alpha-bar.ts +26 -9
  236. package/src/sort-filter-bar/sort-filter-bar.ts +9 -0
  237. package/src/styles/item-image-styles.ts +3 -6
  238. package/src/tiles/grid/item-tile.ts +2 -0
  239. package/src/tiles/image-block.ts +8 -0
  240. package/src/tiles/overlay/icon-overlay.ts +33 -3
  241. package/src/tiles/overlay/icon-text-overlay.ts +75 -0
  242. package/src/tiles/overlay/text-overlay.ts +34 -7
  243. package/test/collection-browser.test.ts +90 -10
  244. package/test/collection-facets/more-facets-content.test.ts +2 -2
  245. package/test/item-image.test.ts +2 -2
  246. package/test/mocks/mock-search-responses.ts +78 -0
  247. package/test/mocks/mock-search-service.ts +6 -0
  248. package/test/restoration-state-handler.test.ts +0 -3
  249. package/test/sort-filter-bar/alpha-bar.test.ts +52 -0
  250. package/test/sort-filter-bar/sort-filter-bar.test.ts +44 -0
  251. package/test/text-overlay.test.ts +10 -3
  252. package/tsconfig.json +21 -21
  253. package/web-dev-server.config.mjs +30 -30
  254. package/web-test-runner.config.mjs +41 -41
@@ -1,10 +1,13 @@
1
1
  import { LitElement, html, css } from 'lit';
2
2
  import { customElement, property } from 'lit/decorators.js';
3
+ import type { PrefixFilterCounts } from '../models';
3
4
 
4
5
  @customElement('alpha-bar')
5
6
  export class AlphaBar extends LitElement {
6
7
  @property({ type: String }) selectedLetter: string | null = null;
7
8
 
9
+ @property({ type: Object }) letterCounts?: PrefixFilterCounts;
10
+
8
11
  private get selectedUppercaseLetter(): string | undefined {
9
12
  return this.selectedLetter?.toUpperCase();
10
13
  }
@@ -21,15 +24,9 @@ export class AlphaBar extends LitElement {
21
24
  ? 'selected'
22
25
  : ''}
23
26
  >
24
- <a
25
- href="#"
26
- @click=${(e: Event) => {
27
- e.preventDefault();
28
- this.letterClicked(letter);
29
- }}
30
- >
31
- ${letter}
32
- </a>
27
+ ${this.letterCounts?.[letter]
28
+ ? this.letterLinkTemplate(letter)
29
+ : html`<span>${letter}</span>`}
33
30
  </li>
34
31
  `
35
32
  )}
@@ -38,6 +35,20 @@ export class AlphaBar extends LitElement {
38
35
  `;
39
36
  }
40
37
 
38
+ private letterLinkTemplate(letter: string) {
39
+ return html`
40
+ <a
41
+ href="#"
42
+ @click=${(e: Event) => {
43
+ e.preventDefault();
44
+ this.letterClicked(letter);
45
+ }}
46
+ >
47
+ ${letter}
48
+ </a>
49
+ `;
50
+ }
51
+
41
52
  private letterClicked(letter: string) {
42
53
  if (letter === this.selectedUppercaseLetter) {
43
54
  this.selectedLetter = null;
@@ -85,6 +96,12 @@ export class AlphaBar extends LitElement {
85
96
  display: block;
86
97
  }
87
98
 
99
+ span {
100
+ color: #aaa;
101
+ padding: 0.5rem 0;
102
+ display: block;
103
+ }
104
+
88
105
  .selected {
89
106
  background-color: darkgray;
90
107
  }
@@ -13,6 +13,8 @@ import type {
13
13
  } from '@internetarchive/shared-resize-observer';
14
14
  import {
15
15
  CollectionDisplayMode,
16
+ PrefixFilterCounts,
17
+ PrefixFilterType,
16
18
  SortField,
17
19
  SortFieldDisplayName,
18
20
  } from '../models';
@@ -42,6 +44,11 @@ export class SortFilterBar
42
44
 
43
45
  @property({ type: Boolean }) showRelevance: boolean = true;
44
46
 
47
+ @property({ type: Object }) prefixFilterCountMap?: Record<
48
+ PrefixFilterType,
49
+ PrefixFilterCounts
50
+ >;
51
+
45
52
  @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;
46
53
 
47
54
  @state() alphaSelectorVisible: AlphaSelector | null = null;
@@ -563,6 +570,7 @@ export class SortFilterBar
563
570
  private get titleSelectorBar() {
564
571
  return html` <alpha-bar
565
572
  .selectedLetter=${this.selectedTitleFilter}
573
+ .letterCounts=${this.prefixFilterCountMap?.title}
566
574
  @letterChanged=${this.titleLetterChanged}
567
575
  ></alpha-bar>`;
568
576
  }
@@ -570,6 +578,7 @@ export class SortFilterBar
570
578
  private get creatorSelectorBar() {
571
579
  return html` <alpha-bar
572
580
  .selectedLetter=${this.selectedCreatorFilter}
581
+ .letterCounts=${this.prefixFilterCountMap?.creator}
573
582
  @letterChanged=${this.creatorLetterChanged}
574
583
  ></alpha-bar>`;
575
584
  }
@@ -11,18 +11,14 @@ export const baseItemImageStyles = css`
11
11
  }
12
12
 
13
13
  .list-box {
14
- width: 100%;
15
- height: 100%;
16
14
  overflow: hidden;
17
15
  box-sizing: border-box;
18
- display: flex;
16
+ display: inline-block;
19
17
  position: relative;
20
- max-width: 100px;
21
18
  }
22
19
 
23
20
  .contain {
24
21
  object-fit: contain;
25
- object-position: top;
26
22
  height: 100%;
27
23
  width: 100%;
28
24
  }
@@ -32,7 +28,8 @@ export const baseItemImageStyles = css`
32
28
  }
33
29
 
34
30
  .blur {
35
- filter: blur(5px);
31
+ filter: blur(15px);
32
+ box-shadow: 1px 1px 2px 0px;
36
33
  }
37
34
  `;
38
35
 
@@ -169,6 +169,8 @@ export class ItemTile extends LitElement {
169
169
  image-block {
170
170
  display: block;
171
171
  margin-bottom: 5px;
172
+ position: relative;
173
+ text-align: center;
172
174
  }
173
175
 
174
176
  image-block.has-snippets {
@@ -58,6 +58,7 @@ export class ImageBlock extends LitElement {
58
58
  <icon-overlay
59
59
  .loggedIn=${this.loggedIn}
60
60
  .loginRequired=${this.model?.loginRequired}
61
+ .isCompactTile=${this.isCompactTile}
61
62
  >
62
63
  </icon-overlay>
63
64
  `;
@@ -73,6 +74,7 @@ export class ImageBlock extends LitElement {
73
74
  <text-overlay
74
75
  .loggedIn=${this.loggedIn}
75
76
  .loginRequired=${this.model?.loginRequired}
77
+ ?iconRequired=${true}
76
78
  >
77
79
  </text-overlay>
78
80
  `;
@@ -89,12 +91,17 @@ export class ImageBlock extends LitElement {
89
91
  .grid {
90
92
  height: var(--imgBlockHeight, 16rem);
91
93
  flex: 1;
94
+ display: inline-block;
95
+ position: initial;
92
96
  }
93
97
 
94
98
  /** tile-list view */
95
99
  .list.desktop {
96
100
  width: 100px;
97
101
  height: 100px;
102
+ display: inline-block;
103
+ position: relative;
104
+ text-align: center;
98
105
  }
99
106
 
100
107
  .list.mobile {
@@ -105,6 +112,7 @@ export class ImageBlock extends LitElement {
105
112
  /** tile-list-compact view */
106
113
  .list-compact {
107
114
  display: block;
115
+ text-align: center;
108
116
  }
109
117
 
110
118
  .list-compact.desktop {
@@ -10,7 +10,19 @@ export class IconOverlay extends LitElement {
10
10
 
11
11
  @property({ type: Boolean }) loginRequired = false;
12
12
 
13
+ @property({ type: Boolean }) isCompactTile = false;
14
+
13
15
  render() {
16
+ return html`<div class="icon-overlay ${this.getClass}">
17
+ ${this.iconDisplay}
18
+ </div>`;
19
+ }
20
+
21
+ private get getClass() {
22
+ return this.isCompactTile ? 'list-compact' : 'list-detail';
23
+ }
24
+
25
+ private get iconDisplay() {
14
26
  return this.loginRequired && !this.loggedIn
15
27
  ? html`${loginRequiredIcon}`
16
28
  : html`${restrictedIcon}`;
@@ -23,10 +35,28 @@ export class IconOverlay extends LitElement {
23
35
  top: 50%;
24
36
  left: 50%;
25
37
  transform: translate(-50%, -50%);
26
- -ms-transform: translate(-50%, -50%);
27
- width: 50%;
28
- height: 50%;
38
+ width: 100%;
29
39
  z-index: 2;
40
+ background-color: rgb(255, 254, 203);
41
+ display: flex;
42
+ justify-content: center;
43
+ border: 1px solid #2c2c2c;
44
+ }
45
+
46
+ .icon-overlay {
47
+ height: 20px;
48
+ width: 20px;
49
+ padding: 2px;
50
+ padding: 2px;
51
+ }
52
+
53
+ .list-detail {
54
+ height: 20px;
55
+ width: 20px;
56
+ }
57
+ .list-compact {
58
+ height: 15px;
59
+ width: 15px;
30
60
  }
31
61
  `;
32
62
  }
@@ -0,0 +1,75 @@
1
+ import { css, CSSResultGroup, html, LitElement } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+ import { loginRequiredIcon } from '../../assets/img/icons/login-required';
4
+ import { restrictedIcon } from '../../assets/img/icons/restricted';
5
+
6
+ @customElement('icon-text-overlay')
7
+ export class IconTextOverlay extends LitElement {
8
+ @property({ type: Boolean }) loggedIn = false;
9
+
10
+ @property({ type: Boolean }) loginRequired = false;
11
+
12
+ render() {
13
+ return html`
14
+ <div class="overlay no-preview">
15
+ <div class="icon-overlay">${this.iconDisplay}</div>
16
+ <p class="text-overlay">${this.textDisplay}</p>
17
+ </div>
18
+ `;
19
+ }
20
+
21
+ private get iconDisplay() {
22
+ return this.loginRequired && !this.loggedIn
23
+ ? html`${loginRequiredIcon}`
24
+ : html`${restrictedIcon}`;
25
+ }
26
+
27
+ private get textDisplay() {
28
+ return this.loginRequired && !this.loggedIn
29
+ ? 'Log in\nto view this item'
30
+ : 'Content may be inappropriate';
31
+ }
32
+
33
+ static get styles(): CSSResultGroup {
34
+ return css`
35
+ :host {
36
+ align-items: center;
37
+ display: flex;
38
+ }
39
+
40
+ .overlay {
41
+ border: 1px solid #2c2c2c;
42
+ border-radius: 1px;
43
+ position: absolute;
44
+ right: 0;
45
+ left: 0;
46
+ width: auto;
47
+ height: auto;
48
+ padding: 5px;
49
+ display: flex;
50
+ align-items: center;
51
+ border-radius: 1px;
52
+ text-align: center;
53
+ }
54
+
55
+ .icon-overlay {
56
+ width: 40px;
57
+ height: 40px;
58
+ display: inherit;
59
+ }
60
+ .text-overlay {
61
+ margin: 0;
62
+ vertical-align: bottom;
63
+ padding-left: 5px;
64
+ }
65
+
66
+ .no-preview {
67
+ background-color: #fffecb;
68
+ border: 1px solid #2c2c2c;
69
+ color: #2c2c2c;
70
+ font-size: 1.4rem;
71
+ line-height: 2rem;
72
+ }
73
+ `;
74
+ }
75
+ }
@@ -1,5 +1,7 @@
1
1
  import { css, CSSResultGroup, html, LitElement } from 'lit';
2
2
  import { customElement, property } from 'lit/decorators.js';
3
+ import { loginRequiredIcon } from '../../assets/img/icons/login-required';
4
+ import { restrictedIcon } from '../../assets/img/icons/restricted';
3
5
 
4
6
  @customElement('text-overlay')
5
7
  export class TextOverlay extends LitElement {
@@ -7,14 +9,27 @@ export class TextOverlay extends LitElement {
7
9
 
8
10
  @property({ type: Boolean }) loginRequired = false;
9
11
 
12
+ @property({ type: Boolean }) iconRequired = false;
13
+
10
14
  render() {
11
- return html` <div class="overlay no-preview">${this.textDisplay}</div> `;
15
+ return html`
16
+ <div class="overlay no-preview">
17
+ <div class="icon-overlay">${this.iconDisplay}</div>
18
+ <p class="text-overlay">${this.textDisplay}</p>
19
+ </div>
20
+ `;
21
+ }
22
+
23
+ private get iconDisplay() {
24
+ return this.loginRequired && !this.loggedIn
25
+ ? html`${loginRequiredIcon}`
26
+ : html`${restrictedIcon}`;
12
27
  }
13
28
 
14
29
  private get textDisplay() {
15
30
  return this.loginRequired && !this.loggedIn
16
- ? 'Log in\nto view this item'
17
- : 'Content may be inappropriate';
31
+ ? html`Log in to view this item`
32
+ : html`Content may be inappropriate`;
18
33
  }
19
34
 
20
35
  static get styles(): CSSResultGroup {
@@ -30,18 +45,30 @@ export class TextOverlay extends LitElement {
30
45
  position: absolute;
31
46
  right: 0;
32
47
  left: 0;
48
+ top: 50%;
49
+ transform: translate(0px, -50%);
33
50
  width: auto;
34
51
  height: auto;
35
52
  padding: 5px;
53
+ background-color: #fffecb;
54
+ display: flex;
55
+ align-items: center;
56
+ border-radius: 1px;
36
57
  }
37
58
 
38
- .no-preview {
39
- background-color: #fffecb;
59
+ .icon-overlay {
60
+ width: 40px;
61
+ height: 40px;
62
+ display: inherit;
63
+ }
64
+ .text-overlay {
65
+ margin: 0;
66
+ vertical-align: bottom;
67
+ padding-left: 5px;
68
+ text-align: center;
40
69
  color: #2c2c2c;
41
70
  font-size: 1.4rem;
42
71
  line-height: 2rem;
43
- text-align: center;
44
- white-space: pre-wrap; // for the newline character
45
72
  }
46
73
  `;
47
74
  }
@@ -20,6 +20,20 @@ import { analyticsCategories } from '../src/utils/analytics-events';
20
20
  import type { TileDispatcher } from '../src/tiles/tile-dispatcher';
21
21
  import type { CollectionFacets } from '../src/collection-facets';
22
22
 
23
+ /**
24
+ * Wait for the next tick of the event loop.
25
+ *
26
+ * This is necessary in some of the tests because certain collection browser
27
+ * updates take more than one tick to render (e.g., date picker & query changes).
28
+ * These delays are non-ideal and should eventually be investigated and fixed,
29
+ * but they are minor enough that waiting for the next tick is a reasonable
30
+ * testing solution for now.
31
+ */
32
+ const nextTick = () =>
33
+ new Promise(resolve => {
34
+ setTimeout(resolve, 0);
35
+ });
36
+
23
37
  describe('Collection Browser', () => {
24
38
  beforeEach(async () => {
25
39
  // Apparently query params set by one test can bleed into other tests.
@@ -61,6 +75,8 @@ describe('Collection Browser', () => {
61
75
  );
62
76
 
63
77
  el.searchContext = 'betaSearchService';
78
+ el.selectedSort = 'creator' as SortField;
79
+ el.sortDirection = 'asc';
64
80
  el.selectedCreatorFilter = 'A';
65
81
  await el.updateComplete;
66
82
 
@@ -86,6 +102,7 @@ describe('Collection Browser', () => {
86
102
 
87
103
  el.searchContext = 'beta-search-service';
88
104
  el.selectedSort = 'title' as SortField;
105
+ el.sortDirection = 'asc';
89
106
  el.selectedTitleFilter = 'A';
90
107
  await el.updateComplete;
91
108
 
@@ -199,6 +216,7 @@ describe('Collection Browser', () => {
199
216
 
200
217
  el.baseQuery = 'collection:foo';
201
218
  await el.updateComplete;
219
+ await nextTick();
202
220
 
203
221
  expect(searchService.searchParams?.query).to.equal('collection:foo');
204
222
  expect(
@@ -219,6 +237,7 @@ describe('Collection Browser', () => {
219
237
 
220
238
  el.baseQuery = 'collection:foo';
221
239
  await el.updateComplete;
240
+ await nextTick();
222
241
 
223
242
  expect(searchService.searchParams?.query).to.equal('collection:foo');
224
243
  expect(searchService.searchType).to.equal(SearchType.METADATA);
@@ -240,6 +259,7 @@ describe('Collection Browser', () => {
240
259
 
241
260
  el.baseQuery = 'collection:foo';
242
261
  await el.updateComplete;
262
+ await nextTick();
243
263
 
244
264
  expect(searchService.searchParams?.query).to.equal('collection:foo');
245
265
  expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
@@ -286,9 +306,16 @@ describe('Collection Browser', () => {
286
306
  el.selectedFacets = selectedFacets;
287
307
  await el.updateComplete;
288
308
 
289
- expect(searchService.searchParams?.query).to.equal(
290
- 'collection:foo AND (subject:("foo" OR -"bar") AND language:("en"))'
291
- );
309
+ expect(searchService.searchParams?.query).to.equal('collection:foo');
310
+ expect(searchService.searchParams?.filters).to.deep.equal({
311
+ subject: {
312
+ foo: 'inc',
313
+ bar: 'exc',
314
+ },
315
+ language: {
316
+ en: 'inc',
317
+ },
318
+ });
292
319
  });
293
320
 
294
321
  it('fires a separate date histogram query when year facets are applied', async () => {
@@ -337,7 +364,8 @@ describe('Collection Browser', () => {
337
364
 
338
365
  el.baseQuery = 'collection:foo';
339
366
  el.showHistogramDatePicker = true;
340
- el.dateRangeQueryClause = 'year:[1995 TO 2005]';
367
+ el.minSelectedDate = '1995';
368
+ el.maxSelectedDate = '2005';
341
369
  await el.updateComplete;
342
370
 
343
371
  expect(
@@ -375,7 +403,8 @@ describe('Collection Browser', () => {
375
403
 
376
404
  el.baseQuery = 'collection:foo';
377
405
  el.showHistogramDatePicker = false;
378
- el.dateRangeQueryClause = 'year:[1995 TO 2005]';
406
+ el.minSelectedDate = '1995';
407
+ el.maxSelectedDate = '2005';
379
408
  await el.updateComplete;
380
409
 
381
410
  expect(searchService.searchParams?.aggregations?.simpleParams).to.satisfy(
@@ -675,7 +704,9 @@ describe('Collection Browser', () => {
675
704
  </collection-browser>`
676
705
  );
677
706
 
678
- el.baseQuery = 'collection:foo';
707
+ el.baseQuery = 'first-title';
708
+ el.selectedSort = 'title' as SortField;
709
+ el.sortDirection = 'asc';
679
710
  el.selectedTitleFilter = 'X';
680
711
  await el.updateComplete;
681
712
 
@@ -685,7 +716,7 @@ describe('Collection Browser', () => {
685
716
  });
686
717
 
687
718
  expect(searchService.searchParams?.query).to.equal(
688
- 'collection:foo AND firstTitle:X'
719
+ 'first-title AND firstTitle:X'
689
720
  );
690
721
  });
691
722
 
@@ -696,7 +727,9 @@ describe('Collection Browser', () => {
696
727
  </collection-browser>`
697
728
  );
698
729
 
699
- el.baseQuery = 'collection:foo';
730
+ el.baseQuery = 'first-creator';
731
+ el.selectedSort = 'creator' as SortField;
732
+ el.sortDirection = 'asc';
700
733
  el.selectedCreatorFilter = 'X';
701
734
  await el.updateComplete;
702
735
 
@@ -706,10 +739,55 @@ describe('Collection Browser', () => {
706
739
  });
707
740
 
708
741
  expect(searchService.searchParams?.query).to.equal(
709
- 'collection:foo AND firstCreator:X'
742
+ 'first-creator AND firstCreator:X'
710
743
  );
711
744
  });
712
745
 
746
+ it('sets sort filter properties simultaneous with facets and date range', async () => {
747
+ const searchService = new MockSearchService();
748
+ const selectedFacets: SelectedFacets = {
749
+ collection: { foo: { key: 'foo', state: 'selected', count: 1 } },
750
+ creator: {},
751
+ language: {},
752
+ lending: {},
753
+ mediatype: {},
754
+ subject: {},
755
+ year: {},
756
+ };
757
+
758
+ const el = await fixture<CollectionBrowser>(
759
+ html`<collection-browser .searchService=${searchService}>
760
+ </collection-browser>`
761
+ );
762
+
763
+ el.baseQuery = 'first-creator';
764
+ el.selectedSort = 'creator' as SortField;
765
+ el.selectedFacets = selectedFacets;
766
+ el.minSelectedDate = '1950';
767
+ el.maxSelectedDate = '1970';
768
+ el.sortDirection = 'asc';
769
+ el.selectedCreatorFilter = 'X';
770
+ await el.updateComplete;
771
+
772
+ // Wait an extra tick
773
+ await new Promise(res => {
774
+ setTimeout(res, 0);
775
+ });
776
+
777
+ expect(searchService.searchParams?.query).to.equal(
778
+ 'first-creator AND firstCreator:X'
779
+ );
780
+ expect(searchService.searchParams?.filters).to.deep.equal({
781
+ collection: {
782
+ foo: 'inc',
783
+ },
784
+ year: {
785
+ '1950': 'gte',
786
+ '1970': 'lte',
787
+ },
788
+ });
789
+ });
790
+
713
791
  it('sets date range query when date picker selection changed', async () => {
714
792
  const searchService = new MockSearchService();
715
793
  const el = await fixture<CollectionBrowser>(
@@ -756,7 +834,8 @@ describe('Collection Browser', () => {
756
834
  // Ensure that the histogram change propagated to the collection browser's
757
835
  // date query correctly.
758
836
  await el.updateComplete;
759
- expect(el.dateRangeQueryClause).to.equal('year:[1960 TO 2000]');
837
+ expect(el.minSelectedDate).to.equal('1960');
838
+ expect(el.maxSelectedDate).to.equal('2000');
760
839
  });
761
840
 
762
841
  it('scrolls to page', async () => {
@@ -862,6 +941,7 @@ describe('Collection Browser', () => {
862
941
 
863
942
  el.baseQuery = 'single-result';
864
943
  await el.updateComplete;
944
+ await nextTick();
865
945
 
866
946
  expect(
867
947
  el.shadowRoot?.querySelector('#big-results-label')?.textContent
@@ -80,7 +80,7 @@ describe('More facets content', () => {
80
80
  );
81
81
 
82
82
  el.facetKey = 'collection';
83
- el.fullQuery = 'title:hello';
83
+ el.query = 'title:hello';
84
84
  await el.updateComplete;
85
85
 
86
86
  expect(searchService.searchParams?.query).to.equal('title:hello');
@@ -97,7 +97,7 @@ describe('More facets content', () => {
97
97
  );
98
98
 
99
99
  el.facetKey = 'collection';
100
- el.fullQuery = 'title:hello';
100
+ el.query = 'title:hello';
101
101
  await el.updateComplete;
102
102
 
103
103
  expect(searchService.searchParams?.query).to.equal('title:hello');
@@ -106,7 +106,7 @@ describe('ItemImage component', () => {
106
106
  </item-image>
107
107
  `);
108
108
 
109
- // Doesn't set the image src if base url is undefined
109
+ // Doesn't set the image src if model is not present
110
110
  const img = el.shadowRoot?.querySelector('img');
111
111
  expect(img).to.exist;
112
112
  expect(img?.getAttribute('src')).not.to.exist;
@@ -123,7 +123,7 @@ describe('ItemImage component', () => {
123
123
  </item-image>
124
124
  `);
125
125
 
126
- // Doesn't set the image src if base url is undefined
126
+ // Doesn't set the image src if identifier is not present
127
127
  const img = el.shadowRoot?.querySelector('img');
128
128
  expect(img).to.exist;
129
129
  expect(img?.getAttribute('src')).not.to.exist;