@internetarchive/collection-browser 0.2.15-alpha.1 → 0.2.15

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 (224) hide show
  1. package/package.json +1 -1
  2. package/src/collection-browser.ts +2 -13
  3. package/src/models.ts +9 -4
  4. package/src/sort-filter-bar/sort-filter-bar.ts +98 -12
  5. package/test/collection-browser.test.ts +43 -0
  6. package/test/sort-filter-bar/sort-filter-bar.test.ts +187 -0
  7. package/dist/index.d.ts +0 -9
  8. package/dist/index.js.map +0 -1
  9. package/dist/src/app-root.d.ts +0 -32
  10. package/dist/src/app-root.js +0 -285
  11. package/dist/src/app-root.js.map +0 -1
  12. package/dist/src/assets/img/icons/chevron.d.ts +0 -2
  13. package/dist/src/assets/img/icons/chevron.js +0 -4
  14. package/dist/src/assets/img/icons/chevron.js.map +0 -1
  15. package/dist/src/assets/img/icons/empty-query.d.ts +0 -2
  16. package/dist/src/assets/img/icons/empty-query.js +0 -5
  17. package/dist/src/assets/img/icons/empty-query.js.map +0 -1
  18. package/dist/src/assets/img/icons/eye-closed.d.ts +0 -2
  19. package/dist/src/assets/img/icons/eye-closed.js +0 -5
  20. package/dist/src/assets/img/icons/eye-closed.js.map +0 -1
  21. package/dist/src/assets/img/icons/eye.d.ts +0 -2
  22. package/dist/src/assets/img/icons/eye.js +0 -5
  23. package/dist/src/assets/img/icons/eye.js.map +0 -1
  24. package/dist/src/assets/img/icons/favorite-filled.d.ts +0 -1
  25. package/dist/src/assets/img/icons/favorite-filled.js +0 -11
  26. package/dist/src/assets/img/icons/favorite-filled.js.map +0 -1
  27. package/dist/src/assets/img/icons/login-required.d.ts +0 -1
  28. package/dist/src/assets/img/icons/login-required.js +0 -30
  29. package/dist/src/assets/img/icons/login-required.js.map +0 -1
  30. package/dist/src/assets/img/icons/mediatype/account.d.ts +0 -1
  31. package/dist/src/assets/img/icons/mediatype/account.js +0 -14
  32. package/dist/src/assets/img/icons/mediatype/account.js.map +0 -1
  33. package/dist/src/assets/img/icons/mediatype/audio.d.ts +0 -1
  34. package/dist/src/assets/img/icons/mediatype/audio.js +0 -14
  35. package/dist/src/assets/img/icons/mediatype/audio.js.map +0 -1
  36. package/dist/src/assets/img/icons/mediatype/collection.d.ts +0 -1
  37. package/dist/src/assets/img/icons/mediatype/collection.js +0 -12
  38. package/dist/src/assets/img/icons/mediatype/collection.js.map +0 -1
  39. package/dist/src/assets/img/icons/mediatype/data.d.ts +0 -1
  40. package/dist/src/assets/img/icons/mediatype/data.js +0 -15
  41. package/dist/src/assets/img/icons/mediatype/data.js.map +0 -1
  42. package/dist/src/assets/img/icons/mediatype/etree.d.ts +0 -1
  43. package/dist/src/assets/img/icons/mediatype/etree.js +0 -14
  44. package/dist/src/assets/img/icons/mediatype/etree.js.map +0 -1
  45. package/dist/src/assets/img/icons/mediatype/film.d.ts +0 -1
  46. package/dist/src/assets/img/icons/mediatype/film.js +0 -14
  47. package/dist/src/assets/img/icons/mediatype/film.js.map +0 -1
  48. package/dist/src/assets/img/icons/mediatype/images.d.ts +0 -1
  49. package/dist/src/assets/img/icons/mediatype/images.js +0 -13
  50. package/dist/src/assets/img/icons/mediatype/images.js.map +0 -1
  51. package/dist/src/assets/img/icons/mediatype/radio.d.ts +0 -1
  52. package/dist/src/assets/img/icons/mediatype/radio.js +0 -15
  53. package/dist/src/assets/img/icons/mediatype/radio.js.map +0 -1
  54. package/dist/src/assets/img/icons/mediatype/software.d.ts +0 -1
  55. package/dist/src/assets/img/icons/mediatype/software.js +0 -13
  56. package/dist/src/assets/img/icons/mediatype/software.js.map +0 -1
  57. package/dist/src/assets/img/icons/mediatype/texts.d.ts +0 -1
  58. package/dist/src/assets/img/icons/mediatype/texts.js +0 -13
  59. package/dist/src/assets/img/icons/mediatype/texts.js.map +0 -1
  60. package/dist/src/assets/img/icons/mediatype/tv.d.ts +0 -1
  61. package/dist/src/assets/img/icons/mediatype/tv.js +0 -14
  62. package/dist/src/assets/img/icons/mediatype/tv.js.map +0 -1
  63. package/dist/src/assets/img/icons/mediatype/video.d.ts +0 -1
  64. package/dist/src/assets/img/icons/mediatype/video.js +0 -14
  65. package/dist/src/assets/img/icons/mediatype/video.js.map +0 -1
  66. package/dist/src/assets/img/icons/mediatype/web.d.ts +0 -1
  67. package/dist/src/assets/img/icons/mediatype/web.js +0 -13
  68. package/dist/src/assets/img/icons/mediatype/web.js.map +0 -1
  69. package/dist/src/assets/img/icons/null-result.d.ts +0 -2
  70. package/dist/src/assets/img/icons/null-result.js +0 -5
  71. package/dist/src/assets/img/icons/null-result.js.map +0 -1
  72. package/dist/src/assets/img/icons/restricted.d.ts +0 -1
  73. package/dist/src/assets/img/icons/restricted.js +0 -29
  74. package/dist/src/assets/img/icons/restricted.js.map +0 -1
  75. package/dist/src/assets/img/icons/reviews.d.ts +0 -1
  76. package/dist/src/assets/img/icons/reviews.js +0 -11
  77. package/dist/src/assets/img/icons/reviews.js.map +0 -1
  78. package/dist/src/assets/img/icons/upload.d.ts +0 -1
  79. package/dist/src/assets/img/icons/upload.js +0 -12
  80. package/dist/src/assets/img/icons/upload.js.map +0 -1
  81. package/dist/src/assets/img/icons/views.d.ts +0 -1
  82. package/dist/src/assets/img/icons/views.js +0 -11
  83. package/dist/src/assets/img/icons/views.js.map +0 -1
  84. package/dist/src/circular-activity-indicator.d.ts +0 -5
  85. package/dist/src/circular-activity-indicator.js +0 -66
  86. package/dist/src/circular-activity-indicator.js.map +0 -1
  87. package/dist/src/collection-browser.d.ts +0 -214
  88. package/dist/src/collection-browser.js +0 -1253
  89. package/dist/src/collection-browser.js.map +0 -1
  90. package/dist/src/collection-facets.d.ts +0 -63
  91. package/dist/src/collection-facets.js +0 -560
  92. package/dist/src/collection-facets.js.map +0 -1
  93. package/dist/src/empty-placeholder.d.ts +0 -11
  94. package/dist/src/empty-placeholder.js +0 -83
  95. package/dist/src/empty-placeholder.js.map +0 -1
  96. package/dist/src/language-code-handler/language-code-handler.d.ts +0 -37
  97. package/dist/src/language-code-handler/language-code-handler.js +0 -27
  98. package/dist/src/language-code-handler/language-code-handler.js.map +0 -1
  99. package/dist/src/language-code-handler/language-code-mapping.d.ts +0 -1
  100. package/dist/src/language-code-handler/language-code-mapping.js +0 -563
  101. package/dist/src/language-code-handler/language-code-mapping.js.map +0 -1
  102. package/dist/src/mediatype/mediatype-config.d.ts +0 -3
  103. package/dist/src/mediatype/mediatype-config.js +0 -86
  104. package/dist/src/mediatype/mediatype-config.js.map +0 -1
  105. package/dist/src/models.d.ts +0 -84
  106. package/dist/src/models.js +0 -58
  107. package/dist/src/models.js.map +0 -1
  108. package/dist/src/restoration-state-handler.d.ts +0 -38
  109. package/dist/src/restoration-state-handler.js +0 -204
  110. package/dist/src/restoration-state-handler.js.map +0 -1
  111. package/dist/src/sort-filter-bar/alpha-bar.d.ts +0 -9
  112. package/dist/src/sort-filter-bar/alpha-bar.js +0 -98
  113. package/dist/src/sort-filter-bar/alpha-bar.js.map +0 -1
  114. package/dist/src/sort-filter-bar/img/compact.d.ts +0 -1
  115. package/dist/src/sort-filter-bar/img/compact.js +0 -5
  116. package/dist/src/sort-filter-bar/img/compact.js.map +0 -1
  117. package/dist/src/sort-filter-bar/img/list.d.ts +0 -1
  118. package/dist/src/sort-filter-bar/img/list.js +0 -5
  119. package/dist/src/sort-filter-bar/img/list.js.map +0 -1
  120. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +0 -1
  121. package/dist/src/sort-filter-bar/img/sort-triangle.js +0 -5
  122. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +0 -1
  123. package/dist/src/sort-filter-bar/img/tile.d.ts +0 -1
  124. package/dist/src/sort-filter-bar/img/tile.js +0 -5
  125. package/dist/src/sort-filter-bar/img/tile.js.map +0 -1
  126. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +0 -85
  127. package/dist/src/sort-filter-bar/sort-filter-bar.js +0 -698
  128. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +0 -1
  129. package/dist/src/styles/item-image-styles.d.ts +0 -8
  130. package/dist/src/styles/item-image-styles.js +0 -102
  131. package/dist/src/styles/item-image-styles.js.map +0 -1
  132. package/dist/src/tiles/collection-browser-loading-tile.d.ts +0 -5
  133. package/dist/src/tiles/collection-browser-loading-tile.js +0 -32
  134. package/dist/src/tiles/collection-browser-loading-tile.js.map +0 -1
  135. package/dist/src/tiles/grid/account-tile.d.ts +0 -8
  136. package/dist/src/tiles/grid/account-tile.js +0 -126
  137. package/dist/src/tiles/grid/account-tile.js.map +0 -1
  138. package/dist/src/tiles/grid/collection-tile.d.ts +0 -7
  139. package/dist/src/tiles/grid/collection-tile.js +0 -159
  140. package/dist/src/tiles/grid/collection-tile.js.map +0 -1
  141. package/dist/src/tiles/grid/item-tile.d.ts +0 -21
  142. package/dist/src/tiles/grid/item-tile.js +0 -183
  143. package/dist/src/tiles/grid/item-tile.js.map +0 -1
  144. package/dist/src/tiles/grid/tile-stats.d.ts +0 -10
  145. package/dist/src/tiles/grid/tile-stats.js +0 -134
  146. package/dist/src/tiles/grid/tile-stats.js.map +0 -1
  147. package/dist/src/tiles/image-block.d.ts +0 -17
  148. package/dist/src/tiles/image-block.js +0 -136
  149. package/dist/src/tiles/image-block.js.map +0 -1
  150. package/dist/src/tiles/item-image.d.ts +0 -31
  151. package/dist/src/tiles/item-image.js +0 -118
  152. package/dist/src/tiles/item-image.js.map +0 -1
  153. package/dist/src/tiles/list/account-label.d.ts +0 -1
  154. package/dist/src/tiles/list/account-label.js +0 -7
  155. package/dist/src/tiles/list/account-label.js.map +0 -1
  156. package/dist/src/tiles/list/date-label.d.ts +0 -1
  157. package/dist/src/tiles/list/date-label.js +0 -13
  158. package/dist/src/tiles/list/date-label.js.map +0 -1
  159. package/dist/src/tiles/list/tile-list-compact-header.d.ts +0 -12
  160. package/dist/src/tiles/list/tile-list-compact-header.js +0 -84
  161. package/dist/src/tiles/list/tile-list-compact-header.js.map +0 -1
  162. package/dist/src/tiles/list/tile-list-compact.d.ts +0 -20
  163. package/dist/src/tiles/list/tile-list-compact.js +0 -180
  164. package/dist/src/tiles/list/tile-list-compact.js.map +0 -1
  165. package/dist/src/tiles/list/tile-list.d.ts +0 -48
  166. package/dist/src/tiles/list/tile-list.js +0 -455
  167. package/dist/src/tiles/list/tile-list.js.map +0 -1
  168. package/dist/src/tiles/mediatype-icon.d.ts +0 -9
  169. package/dist/src/tiles/mediatype-icon.js +0 -82
  170. package/dist/src/tiles/mediatype-icon.js.map +0 -1
  171. package/dist/src/tiles/overlay/icon-overlay.d.ts +0 -7
  172. package/dist/src/tiles/overlay/icon-overlay.js +0 -43
  173. package/dist/src/tiles/overlay/icon-overlay.js.map +0 -1
  174. package/dist/src/tiles/overlay/text-overlay.d.ts +0 -8
  175. package/dist/src/tiles/overlay/text-overlay.js +0 -57
  176. package/dist/src/tiles/overlay/text-overlay.js.map +0 -1
  177. package/dist/src/tiles/tile-dispatcher.d.ts +0 -36
  178. package/dist/src/tiles/tile-dispatcher.js +0 -215
  179. package/dist/src/tiles/tile-dispatcher.js.map +0 -1
  180. package/dist/src/utils/format-count.d.ts +0 -7
  181. package/dist/src/utils/format-count.js +0 -76
  182. package/dist/src/utils/format-count.js.map +0 -1
  183. package/dist/src/utils/format-date.d.ts +0 -2
  184. package/dist/src/utils/format-date.js +0 -24
  185. package/dist/src/utils/format-date.js.map +0 -1
  186. package/dist/test/collection-browser.test.d.ts +0 -1
  187. package/dist/test/collection-browser.test.js +0 -47
  188. package/dist/test/collection-browser.test.js.map +0 -1
  189. package/dist/test/empty-placeholder.test.d.ts +0 -1
  190. package/dist/test/empty-placeholder.test.js +0 -34
  191. package/dist/test/empty-placeholder.test.js.map +0 -1
  192. package/dist/test/icon-overlay.test.d.ts +0 -1
  193. package/dist/test/icon-overlay.test.js +0 -31
  194. package/dist/test/icon-overlay.test.js.map +0 -1
  195. package/dist/test/item-image.test.d.ts +0 -1
  196. package/dist/test/item-image.test.js +0 -73
  197. package/dist/test/item-image.test.js.map +0 -1
  198. package/dist/test/mediatype-config.test.d.ts +0 -1
  199. package/dist/test/mediatype-config.test.js +0 -17
  200. package/dist/test/mediatype-config.test.js.map +0 -1
  201. package/dist/test/mocks/mock-collection-name-cache.d.ts +0 -7
  202. package/dist/test/mocks/mock-collection-name-cache.js +0 -14
  203. package/dist/test/mocks/mock-collection-name-cache.js.map +0 -1
  204. package/dist/test/mocks/mock-search-responses.d.ts +0 -3
  205. package/dist/test/mocks/mock-search-responses.js +0 -32
  206. package/dist/test/mocks/mock-search-responses.js.map +0 -1
  207. package/dist/test/mocks/mock-search-service.d.ts +0 -8
  208. package/dist/test/mocks/mock-search-service.js +0 -16
  209. package/dist/test/mocks/mock-search-service.js.map +0 -1
  210. package/dist/test/text-overlay.test.d.ts +0 -1
  211. package/dist/test/text-overlay.test.js +0 -48
  212. package/dist/test/text-overlay.test.js.map +0 -1
  213. package/dist/test/tile-stats.test.d.ts +0 -1
  214. package/dist/test/tile-stats.test.js +0 -42
  215. package/dist/test/tile-stats.test.js.map +0 -1
  216. package/dist/test/tiles/grid/item-tile.test.d.ts +0 -1
  217. package/dist/test/tiles/grid/item-tile.test.js +0 -96
  218. package/dist/test/tiles/grid/item-tile.test.js.map +0 -1
  219. package/dist/test/utils/format-count.test.d.ts +0 -1
  220. package/dist/test/utils/format-count.test.js +0 -24
  221. package/dist/test/utils/format-count.test.js.map +0 -1
  222. package/dist/test/utils/format-date.test.d.ts +0 -1
  223. package/dist/test/utils/format-date.test.js +0 -18
  224. package/dist/test/utils/format-date.test.js.map +0 -1
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "The Internet Archive Collection Browser.",
4
4
  "license": "AGPL-3.0-only",
5
5
  "author": "Internet Archive",
6
- "version": "0.2.15-alpha.1",
6
+ "version": "0.2.15",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
9
  "scripts": {
@@ -497,7 +497,8 @@ export class CollectionBrowser
497
497
  if (
498
498
  changed.has('displayMode') ||
499
499
  changed.has('baseNavigationUrl') ||
500
- changed.has('baseImageUrl')
500
+ changed.has('baseImageUrl') ||
501
+ changed.has('loggedIn')
501
502
  ) {
502
503
  this.infiniteScroller?.reload();
503
504
  }
@@ -1208,17 +1209,6 @@ export class CollectionBrowser
1208
1209
  width: 18rem;
1209
1210
  padding-right: 12px;
1210
1211
  padding-right: 1rem;
1211
- padding-bottom: 20px;
1212
- top: 0;
1213
- position: sticky;
1214
- max-height: 100vh;
1215
- overflow: scroll;
1216
- -ms-overflow-style: none; /* hide scrollbar IE and Edge */
1217
- scrollbar-width: none; /* hide scrollbar Firefox */
1218
- }
1219
-
1220
- #left-column::-webkit-scrollbar {
1221
- display: none;
1222
1212
  }
1223
1213
 
1224
1214
  .mobile #left-column {
@@ -1236,7 +1226,6 @@ export class CollectionBrowser
1236
1226
  max-height: 0;
1237
1227
  transition: max-height 0.2s ease-in-out;
1238
1228
  z-index: 1;
1239
- padding-bottom: 2rem;
1240
1229
  }
1241
1230
 
1242
1231
  .mobile #facets-container {
package/src/models.ts CHANGED
@@ -47,7 +47,8 @@ export type CollectionBrowserContext = 'collection' | 'search';
47
47
  */
48
48
  export enum SortField {
49
49
  'relevance' = 'relevance',
50
- 'views' = 'views',
50
+ 'alltimeview' = 'alltimeview',
51
+ 'weeklyview' = 'weeklyview',
51
52
  'title' = 'title',
52
53
  'datearchived' = 'datearchived',
53
54
  'date' = 'date',
@@ -60,6 +61,7 @@ export enum SortField {
60
61
  * The metadata fields we sort by that map to the SortFields above
61
62
  */
62
63
  export type MetadataSortField =
64
+ | 'downloads'
63
65
  | 'week'
64
66
  | 'titleSorter'
65
67
  | 'date'
@@ -72,7 +74,8 @@ export const SortFieldDisplayName: {
72
74
  [key in SortField]: string;
73
75
  } = {
74
76
  relevance: 'Relevance',
75
- views: 'Views',
77
+ alltimeview: 'All-time Views',
78
+ weeklyview: 'Weekly Views',
76
79
  title: 'Title',
77
80
  datearchived: 'Date Archived',
78
81
  date: 'Date Published',
@@ -88,7 +91,8 @@ export const SortFieldToMetadataField: {
88
91
  [key in SortField]: MetadataSortField | null;
89
92
  } = {
90
93
  relevance: null,
91
- views: 'week',
94
+ alltimeview: 'downloads',
95
+ weeklyview: 'week',
92
96
  title: 'titleSorter',
93
97
  datearchived: 'publicdate',
94
98
  date: 'date',
@@ -103,13 +107,14 @@ export const SortFieldToMetadataField: {
103
107
  export const MetadataFieldToSortField: {
104
108
  [key in MetadataSortField]: SortField;
105
109
  } = {
110
+ week: SortField.weeklyview,
111
+ downloads: SortField.alltimeview,
106
112
  titleSorter: SortField.title,
107
113
  date: SortField.date,
108
114
  publicdate: SortField.datearchived,
109
115
  reviewdate: SortField.datereviewed,
110
116
  addeddate: SortField.dateadded,
111
117
  creatorSorter: SortField.creator,
112
- week: SortField.views,
113
118
  };
114
119
 
115
120
  export type FacetOption =
@@ -48,6 +48,8 @@ export class SortFilterBar
48
48
 
49
49
  @state() dateSortSelectorVisible = false;
50
50
 
51
+ @state() viewSortSelectorVisible = false;
52
+
51
53
  @state() desktopSelectorBarWidth = 0;
52
54
 
53
55
  @state() selectorBarContainerWidth = 0;
@@ -76,6 +78,9 @@ export class SortFilterBar
76
78
  <div id="display-style-selector">${this.displayOptionTemplate}</div>
77
79
  </div>
78
80
 
81
+ ${this.viewSortSelectorVisible && !this.mobileSelectorVisible
82
+ ? this.viewSortSelector
83
+ : nothing}
79
84
  ${this.dateSortSelectorVisible && !this.mobileSelectorVisible
80
85
  ? this.dateSortSelector
81
86
  : nothing}
@@ -103,7 +108,10 @@ export class SortFilterBar
103
108
  this.alphaSelectorVisible = 'creator';
104
109
  }
105
110
 
106
- if (changed.has('dateSortSelectorVisible')) {
111
+ if (
112
+ changed.has('dateSortSelectorVisible') ||
113
+ changed.has('viewSortSelectorVisible')
114
+ ) {
107
115
  this.setupEscapeListeners();
108
116
  }
109
117
 
@@ -117,21 +125,22 @@ export class SortFilterBar
117
125
  }
118
126
 
119
127
  private setupEscapeListeners() {
120
- if (this.dateSortSelectorVisible) {
128
+ if (this.dateSortSelectorVisible || this.viewSortSelectorVisible) {
121
129
  document.addEventListener(
122
130
  'keydown',
123
- this.boundDateSelectorEscapeListener
131
+ this.boundSortBarSelectorEscapeListener
124
132
  );
125
133
  } else {
126
134
  document.removeEventListener(
127
135
  'keydown',
128
- this.boundDateSelectorEscapeListener
136
+ this.boundSortBarSelectorEscapeListener
129
137
  );
130
138
  }
131
139
  }
132
140
 
133
- private boundDateSelectorEscapeListener = (e: KeyboardEvent) => {
141
+ private boundSortBarSelectorEscapeListener = (e: KeyboardEvent) => {
134
142
  if (e.key === 'Escape') {
143
+ this.viewSortSelectorVisible = false;
135
144
  this.dateSortSelectorVisible = false;
136
145
  }
137
146
  };
@@ -235,13 +244,30 @@ export class SortFilterBar
235
244
  ? this.getSortDisplayOption(SortField.relevance)
236
245
  : nothing}
237
246
  </li>
238
- <li>${this.getSortDisplayOption(SortField.views)}</li>
247
+ <li>
248
+ ${this.getSortDisplayOption(SortField.weeklyview, {
249
+ clickEvent: () => {
250
+ if (!this.viewOptionSelected)
251
+ this.setSelectedSort(SortField.weeklyview);
252
+ this.viewSortSelectorVisible = !this.viewSortSelectorVisible;
253
+ this.dateSortSelectorVisible = false;
254
+ this.alphaSelectorVisible = null;
255
+ this.selectedTitleFilter = null;
256
+ this.selectedCreatorFilter = null;
257
+ this.emitTitleLetterChangedEvent();
258
+ this.emitCreatorLetterChangedEvent();
259
+ },
260
+ displayName: html`${this.viewSortField}`,
261
+ isSelected: () => this.viewOptionSelected,
262
+ })}
263
+ </li>
239
264
  <li>
240
265
  ${this.getSortDisplayOption(SortField.title, {
241
266
  clickEvent: () => {
242
267
  this.alphaSelectorVisible = 'title';
243
268
  this.selectedCreatorFilter = null;
244
269
  this.dateSortSelectorVisible = false;
270
+ this.viewSortSelectorVisible = false;
245
271
  this.setSelectedSort(SortField.title);
246
272
  this.emitCreatorLetterChangedEvent();
247
273
  },
@@ -253,6 +279,7 @@ export class SortFilterBar
253
279
  if (!this.dateOptionSelected)
254
280
  this.setSelectedSort(SortField.date);
255
281
  this.dateSortSelectorVisible = !this.dateSortSelectorVisible;
282
+ this.viewSortSelectorVisible = false;
256
283
  this.alphaSelectorVisible = null;
257
284
  this.selectedTitleFilter = null;
258
285
  this.selectedCreatorFilter = null;
@@ -366,7 +393,7 @@ export class SortFilterBar
366
393
  </li>
367
394
  <li>
368
395
  <button
369
- id="grid-button"
396
+ id="list-detail-button"
370
397
  @click=${() => {
371
398
  this.displayMode = 'list-detail';
372
399
  }}
@@ -378,7 +405,7 @@ export class SortFilterBar
378
405
  </li>
379
406
  <li>
380
407
  <button
381
- id="list-button"
408
+ id="list-compact-button"
382
409
  @click=${() => {
383
410
  this.displayMode = 'list-compact';
384
411
  }}
@@ -414,6 +441,26 @@ export class SortFilterBar
414
441
  `;
415
442
  }
416
443
 
444
+ private get viewSortSelector() {
445
+ return html`
446
+ <div
447
+ id="view-sort-selector-backdrop"
448
+ @keyup=${() => {
449
+ this.viewSortSelectorVisible = false;
450
+ }}
451
+ @click=${() => {
452
+ this.viewSortSelectorVisible = false;
453
+ }}
454
+ ></div>
455
+ <div id="view-sort-selector">
456
+ <ul>
457
+ <li>${this.getDateSortButton(SortField.alltimeview)}</li>
458
+ <li>${this.getDateSortButton(SortField.weeklyview)}</li>
459
+ </ul>
460
+ </div>
461
+ `;
462
+ }
463
+
417
464
  private getDateSortButton(sortField: SortField) {
418
465
  return html`
419
466
  <button
@@ -429,6 +476,7 @@ export class SortFilterBar
429
476
 
430
477
  private selectDateSort(sortField: SortField) {
431
478
  this.dateSortSelectorVisible = false;
479
+ this.viewSortSelectorVisible = false;
432
480
  this.setSelectedSort(sortField);
433
481
  }
434
482
 
@@ -462,6 +510,24 @@ export class SortFilterBar
462
510
  return dateSortFields.includes(this.selectedSort);
463
511
  }
464
512
 
513
+ /**
514
+ * There are two view sort options.
515
+ *
516
+ * This checks to see if the current sort is one of them.
517
+ *
518
+ * @readonly
519
+ * @private
520
+ * @type {boolean}
521
+ * @memberof SortFilterBar
522
+ */
523
+ private get viewOptionSelected(): boolean {
524
+ const viewSortFields: SortField[] = [
525
+ SortField.alltimeview,
526
+ SortField.weeklyview,
527
+ ];
528
+ return viewSortFields.includes(this.selectedSort);
529
+ }
530
+
465
531
  /**
466
532
  * The display name of the current date field
467
533
  *
@@ -478,6 +544,22 @@ export class SortFilterBar
478
544
  return name;
479
545
  }
480
546
 
547
+ /**
548
+ * The display name of the current view field
549
+ *
550
+ * @readonly
551
+ * @private
552
+ * @type {string}
553
+ * @memberof SortFilterBar
554
+ */
555
+ private get viewSortField(): string {
556
+ const defaultSort = SortFieldDisplayName[SortField.weeklyview];
557
+ const name = this.viewOptionSelected
558
+ ? SortFieldDisplayName[this.selectedSort] ?? defaultSort
559
+ : defaultSort;
560
+ return name;
561
+ }
562
+
481
563
  private get titleSelectorBar() {
482
564
  return html` <alpha-bar
483
565
  .selectedLetter=${this.selectedTitleFilter}
@@ -607,7 +689,8 @@ export class SortFilterBar
607
689
  cursor: default;
608
690
  }
609
691
 
610
- #date-sort-selector {
692
+ #date-sort-selector,
693
+ #view-sort-selector {
611
694
  position: absolute;
612
695
  left: 150px;
613
696
  top: 45px;
@@ -619,7 +702,8 @@ export class SortFilterBar
619
702
  border: 1px solid #404142;
620
703
  }
621
704
 
622
- #date-sort-selector button {
705
+ #date-sort-selector button,
706
+ #view-sort-selector button {
623
707
  background: none;
624
708
  border-radius: 15px;
625
709
  color: #404142;
@@ -632,7 +716,8 @@ export class SortFilterBar
632
716
  padding: 0.5rem 1.2rem;
633
717
  }
634
718
 
635
- #date-sort-selector button.selected {
719
+ #date-sort-selector button.selected,
720
+ #view-sort-selector button.selected {
636
721
  background-color: #404142;
637
722
  color: white;
638
723
  }
@@ -679,7 +764,8 @@ export class SortFilterBar
679
764
  display: none;
680
765
  }
681
766
 
682
- #date-sort-selector-backdrop {
767
+ #date-sort-selector-backdrop,
768
+ #view-sort-selector-backdrop {
683
769
  position: fixed;
684
770
  top: 0;
685
771
  left: 0;
@@ -1,6 +1,8 @@
1
1
  /* eslint-disable import/no-duplicates */
2
2
  import { expect, fixture } from '@open-wc/testing';
3
3
  import { html } from 'lit';
4
+ import sinon from 'sinon';
5
+ import type { InfiniteScroller } from '@internetarchive/infinite-scroller';
4
6
  import type { CollectionBrowser } from '../src/collection-browser';
5
7
  import '../src/collection-browser';
6
8
  import { MockSearchService } from './mocks/mock-search-service';
@@ -59,4 +61,45 @@ describe('Collection Browser', () => {
59
61
  'boop',
60
62
  ]);
61
63
  });
64
+ it('refreshes when certain properties change', async () => {
65
+ const searchService = new MockSearchService();
66
+ const collectionNameCache = new MockCollectionNameCache();
67
+ const el = await fixture<CollectionBrowser>(
68
+ html`<collection-browser
69
+ .searchService=${searchService}
70
+ .collectionNameCache=${collectionNameCache}
71
+ ></collection-browser>`
72
+ );
73
+ const infiniteScrollerRefreshSpy = sinon.spy();
74
+
75
+ const infiniteScroller = el.shadowRoot?.querySelector('infinite-scroller');
76
+ (infiniteScroller as InfiniteScroller).reload = infiniteScrollerRefreshSpy;
77
+ expect(infiniteScrollerRefreshSpy.called).to.be.false;
78
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(0);
79
+
80
+ // testing: `loggedIn`
81
+ el.loggedIn = true;
82
+ await el.updateComplete;
83
+ expect(infiniteScrollerRefreshSpy.called).to.be.true;
84
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(1);
85
+
86
+ el.loggedIn = false;
87
+ await el.updateComplete;
88
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(2);
89
+
90
+ // testing: `displayMode`
91
+ el.displayMode = 'list-compact';
92
+ await el.updateComplete;
93
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(3);
94
+
95
+ // testing: `baseNavigationUrl`
96
+ el.baseNavigationUrl = 'https://funtestsite.com';
97
+ await el.updateComplete;
98
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(4);
99
+
100
+ // testing: `baseImageUrl`
101
+ el.baseImageUrl = 'https://funtestsiteforimages.com';
102
+ await el.updateComplete;
103
+ expect(infiniteScrollerRefreshSpy.callCount).to.equal(5);
104
+ });
62
105
  });
@@ -0,0 +1,187 @@
1
+ /* eslint-disable import/no-duplicates */
2
+ import { expect, fixture } from '@open-wc/testing';
3
+ import { html } from 'lit';
4
+ import type { SortFilterBar } from '../../src/sort-filter-bar/sort-filter-bar';
5
+ import type { SortField } from '../../src/models';
6
+
7
+ import '../../src/sort-filter-bar/sort-filter-bar';
8
+
9
+ describe('Sort direction buttons', () => {
10
+ it('should render sort direction button', async () => {
11
+ const el = await fixture<SortFilterBar>(html`
12
+ <sort-filter-bar> </sort-filter-bar>
13
+ `);
14
+
15
+ el.sortDirection = 'asc'; // selected sort
16
+ await el.updateComplete;
17
+
18
+ const sortDirectionButtonList = el.shadowRoot?.querySelector(
19
+ '#sort-direction-selector'
20
+ );
21
+
22
+ const sortByAscButton = sortDirectionButtonList?.querySelector(
23
+ '#sort-ascending-btn'
24
+ );
25
+ expect(sortByAscButton).to.exist;
26
+ // ascending order button is selected
27
+ expect(sortByAscButton?.getAttribute('class')).to.equal(
28
+ 'sort-button selected'
29
+ );
30
+
31
+ const sortByDescButton = sortDirectionButtonList?.querySelector(
32
+ '#sort-descending-btn'
33
+ );
34
+ expect(sortByDescButton).to.exist;
35
+ // descending order button is not selected
36
+ expect(sortByDescButton?.getAttribute('class')).to.not.equal(
37
+ 'sort-button selected'
38
+ );
39
+ });
40
+ });
41
+
42
+ describe('Sort selector default buttons', async () => {
43
+ const el = await fixture<SortFilterBar>(html`
44
+ <sort-filter-bar> </sort-filter-bar>
45
+ `);
46
+ const sortSelectorContainer = el.shadowRoot?.querySelector(
47
+ '#desktop-sort-selector'
48
+ );
49
+
50
+ it('should render sort-by label', async () => {
51
+ expect(sortSelectorContainer?.children.item(0)?.textContent).to.equal(
52
+ 'Sort By'
53
+ );
54
+ });
55
+
56
+ it('should render default relevance-sort selector', async () => {
57
+ const defaultSortSelector = sortSelectorContainer?.children
58
+ .item(1)
59
+ ?.querySelector('a');
60
+ expect(defaultSortSelector?.textContent).to.contain('Relevance');
61
+ expect(defaultSortSelector?.getAttribute('class')).to.equal('selected');
62
+ });
63
+
64
+ it('should render default view-sort selector', async () => {
65
+ const defaultSortSelector = sortSelectorContainer?.children
66
+ .item(2)
67
+ ?.querySelector('a');
68
+ expect(defaultSortSelector?.textContent).to.contain('Weekly Views');
69
+ });
70
+
71
+ it('should render active view-sort selectors', async () => {
72
+ el.selectedSort = 'alltimeview' as SortField;
73
+ await el.updateComplete;
74
+
75
+ const defaultSortSelector =
76
+ sortSelectorContainer?.querySelector('a.selected');
77
+ expect(defaultSortSelector?.textContent).to.contain('All-time Views');
78
+ });
79
+
80
+ it('should render default title-sort selector', async () => {
81
+ const defaultSortSelector = sortSelectorContainer?.children
82
+ .item(3)
83
+ ?.querySelector('a');
84
+ expect(defaultSortSelector?.textContent).to.contain('Title');
85
+ });
86
+
87
+ it('should render default date-sort selector', async () => {
88
+ const defaultSortSelector = sortSelectorContainer?.children
89
+ .item(4)
90
+ ?.querySelector('a');
91
+ expect(defaultSortSelector?.textContent).to.contain('Date Published');
92
+ });
93
+
94
+ it('should render active date-sort selectors', async () => {
95
+ el.selectedSort = 'datereviewed' as SortField;
96
+ await el.updateComplete;
97
+
98
+ const defaultSortSelector =
99
+ sortSelectorContainer?.querySelector('a.selected');
100
+ expect(defaultSortSelector?.textContent).to.contain('Date Reviewed');
101
+ });
102
+
103
+ it('should render default creator-sort selector', async () => {
104
+ const defaultSortSelector = sortSelectorContainer?.children
105
+ .item(5)
106
+ ?.querySelector('a');
107
+ expect(defaultSortSelector?.textContent).to.contain('Creator');
108
+ });
109
+
110
+ it('click event on view-sort selector', async () => {
111
+ const defaultSortSelector = sortSelectorContainer?.children
112
+ .item(2)
113
+ ?.querySelector('a');
114
+
115
+ await defaultSortSelector?.click();
116
+ expect(el.selectedSort).to.equal('weeklyview');
117
+ });
118
+
119
+ it('click event on title selector', async () => {
120
+ const defaultSortSelector = sortSelectorContainer?.children
121
+ .item(3)
122
+ ?.querySelector('a');
123
+
124
+ await defaultSortSelector?.click();
125
+ expect(el.selectedSort).to.equal('title');
126
+ });
127
+
128
+ it('click event on date-sort selector', async () => {
129
+ const defaultSortSelector = sortSelectorContainer?.children
130
+ .item(4)
131
+ ?.querySelector('a');
132
+
133
+ await defaultSortSelector?.click();
134
+ expect(el.selectedSort).to.equal('date');
135
+ });
136
+
137
+ it('click event on creator selector', async () => {
138
+ const defaultSortSelector = sortSelectorContainer?.children
139
+ .item(5)
140
+ ?.querySelector('a');
141
+
142
+ await defaultSortSelector?.click();
143
+ expect(el.selectedSort).to.equal('creator');
144
+ });
145
+ });
146
+
147
+ describe('Display mode/style buttons', () => {
148
+ it('should render all display mode buttons', async () => {
149
+ const el = await fixture<SortFilterBar>(html`
150
+ <sort-filter-bar> </sort-filter-bar>
151
+ `);
152
+
153
+ const displayModeButtonList = el.shadowRoot
154
+ ?.querySelector('#display-style-selector')
155
+ ?.querySelector('ul');
156
+
157
+ const gridButton = displayModeButtonList?.children
158
+ .item(0)
159
+ ?.querySelector('#grid-button');
160
+ expect(gridButton).to.exist;
161
+
162
+ const detailListButton = displayModeButtonList?.children
163
+ .item(1)
164
+ ?.querySelector('#list-detail-button');
165
+ expect(detailListButton).to.exist;
166
+
167
+ const compactListButton = displayModeButtonList?.children
168
+ .item(2)
169
+ ?.querySelector('#list-compact-button');
170
+ expect(compactListButton).to.exist;
171
+ });
172
+
173
+ it('should active current display mode', async () => {
174
+ const el = await fixture<SortFilterBar>(html`
175
+ <sort-filter-bar> </sort-filter-bar>
176
+ `);
177
+
178
+ el.displayMode = 'grid';
179
+ await el.updateComplete;
180
+
181
+ const displayModeTitle = el.shadowRoot
182
+ ?.querySelector('#display-style-selector')
183
+ ?.querySelector('button.active')
184
+ ?.getAttribute('title');
185
+ expect(displayModeTitle).to.equal('Tile view');
186
+ });
187
+ });
package/dist/index.d.ts DELETED
@@ -1,9 +0,0 @@
1
- export { CollectionBrowser } from './src/collection-browser';
2
- export { SortFilterBar } from './src/sort-filter-bar/sort-filter-bar';
3
- export { CollectionDisplayMode } from './src/models';
4
- export { CollectionBrowserLoadingTile } from './src/tiles/collection-browser-loading-tile';
5
- export { CollectionTile } from './src/tiles/grid/collection-tile';
6
- export { AccountTile } from './src/tiles/grid/account-tile';
7
- export { ItemTile } from './src/tiles/grid/item-tile';
8
- export { TileList } from './src/tiles/list/tile-list';
9
- export { TileListCompact } from './src/tiles/list/tile-list-compact';
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAyB,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC","sourcesContent":["export { CollectionBrowser } from './src/collection-browser';\nexport { SortFilterBar } from './src/sort-filter-bar/sort-filter-bar';\nexport { CollectionDisplayMode } from './src/models';\nexport { CollectionBrowserLoadingTile } from './src/tiles/collection-browser-loading-tile';\nexport { CollectionTile } from './src/tiles/grid/collection-tile';\nexport { AccountTile } from './src/tiles/grid/account-tile';\nexport { ItemTile } from './src/tiles/grid/item-tile';\nexport { TileList } from './src/tiles/list/tile-list';\nexport { TileListCompact } from './src/tiles/list/tile-list-compact';\n"]}
@@ -1,32 +0,0 @@
1
- import { LitElement, PropertyValues } from 'lit';
2
- import '../src/collection-browser';
3
- export declare class AppRoot extends LitElement {
4
- private searchService;
5
- private resizeObserver;
6
- private localCache;
7
- private collectionNameCache;
8
- private currentPage?;
9
- private searchQuery?;
10
- private cellWidth;
11
- private cellHeight;
12
- private rowGap;
13
- private colGap;
14
- private loggedIn;
15
- private baseQueryField;
16
- private pageNumberInput;
17
- private collectionBrowser;
18
- private searchPressed;
19
- private changePagePressed;
20
- protected updated(changed: PropertyValues): void;
21
- private queryUpdated;
22
- render(): import("lit-html").TemplateResult<1>;
23
- private baseQueryChanged;
24
- private loginChanged;
25
- private outlineChanged;
26
- private rowGapChanged;
27
- private colGapChanged;
28
- private widthChanged;
29
- private heightChanged;
30
- private visiblePageChanged;
31
- static styles: import("lit").CSSResult;
32
- }