@internetarchive/collection-browser 0.0.1-alpha.8 → 0.1.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 (261) hide show
  1. package/README.md +8 -11
  2. package/demo/app-root.ts +16 -92
  3. package/dist/demo/app-root.d.ts +3 -5
  4. package/dist/demo/app-root.js +13 -83
  5. package/dist/demo/app-root.js.map +1 -1
  6. package/dist/index.d.ts +6 -0
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  10. package/dist/src/assets/img/icons/chevron.js +4 -0
  11. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  12. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
  13. package/dist/src/assets/img/icons/mediatype/account.js +6 -4
  14. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
  15. package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
  16. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
  17. package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
  18. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
  19. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  20. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  21. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  22. package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
  23. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
  24. package/dist/src/assets/img/icons/mediatype/film.js +2 -1
  25. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
  26. package/dist/src/assets/img/icons/mediatype/images.js +9 -6
  27. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
  28. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  29. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  30. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  31. package/dist/src/assets/img/icons/mediatype/software.js +9 -6
  32. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
  33. package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
  34. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
  35. package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
  36. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
  37. package/dist/src/assets/img/icons/mediatype/video.js +10 -6
  38. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
  39. package/dist/src/assets/img/icons/mediatype/web.js +9 -6
  40. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
  41. package/dist/src/collection-browser.d.ts +53 -31
  42. package/dist/src/collection-browser.js +504 -166
  43. package/dist/src/collection-browser.js.map +1 -1
  44. package/dist/src/collection-facets.d.ts +28 -13
  45. package/dist/src/collection-facets.js +276 -160
  46. package/dist/src/collection-facets.js.map +1 -1
  47. package/dist/src/helpers.d.ts +1 -0
  48. package/dist/src/helpers.js +20 -0
  49. package/dist/src/helpers.js.map +1 -0
  50. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  51. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  52. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  53. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  54. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  55. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  56. package/dist/src/mediatype/mediatype-color.d.ts +3 -0
  57. package/dist/src/mediatype/mediatype-color.js +15 -0
  58. package/dist/src/mediatype/mediatype-color.js.map +1 -0
  59. package/dist/src/mediatype/mediatype-config.d.ts +3 -0
  60. package/dist/src/mediatype/mediatype-config.js +86 -0
  61. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  62. package/dist/src/mediatype/mediatype-display.d.ts +3 -0
  63. package/dist/src/mediatype/mediatype-display.js +86 -0
  64. package/dist/src/mediatype/mediatype-display.js.map +1 -0
  65. package/dist/src/mediatype/mediatype-icon.d.ts +10 -0
  66. package/dist/src/mediatype/mediatype-icon.js +105 -0
  67. package/dist/src/mediatype/mediatype-icon.js.map +1 -0
  68. package/dist/src/mediatype/mediatype-text.d.ts +3 -0
  69. package/dist/src/mediatype/mediatype-text.js +17 -0
  70. package/dist/src/mediatype/mediatype-text.js.map +1 -0
  71. package/dist/src/mediatype/mediatypeConfig.d.ts +3 -0
  72. package/dist/src/mediatype/mediatypeConfig.js +86 -0
  73. package/dist/src/mediatype/mediatypeConfig.js.map +1 -0
  74. package/dist/src/mediatype-icon.d.ts +2 -2
  75. package/dist/src/mediatype-icon.js +35 -46
  76. package/dist/src/mediatype-icon.js.map +1 -1
  77. package/dist/src/models.d.ts +72 -13
  78. package/dist/src/models.js +57 -1
  79. package/dist/src/models.js.map +1 -1
  80. package/dist/src/restoration-state-handler.d.ts +38 -0
  81. package/dist/src/restoration-state-handler.js +204 -0
  82. package/dist/src/restoration-state-handler.js.map +1 -0
  83. package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -1
  84. package/dist/src/sort-filter-bar/alpha-bar.js +9 -2
  85. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  86. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  87. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  88. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  89. package/dist/src/sort-filter-bar/img/list.js +1 -1
  90. package/dist/src/sort-filter-bar/img/list.js.map +1 -1
  91. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  92. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  93. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  94. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +71 -14
  95. package/dist/src/sort-filter-bar/sort-filter-bar.js +499 -216
  96. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  97. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
  98. package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
  99. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  100. package/dist/src/tiles/grid/account-tile.d.ts +1 -1
  101. package/dist/src/tiles/grid/account-tile.js +5 -5
  102. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  103. package/dist/src/tiles/grid/collection-tile.js +1 -2
  104. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  105. package/dist/src/tiles/grid/icons/views.d.ts +1 -1
  106. package/dist/src/tiles/grid/icons/views.js +2 -2
  107. package/dist/src/tiles/grid/icons/views.js.map +1 -1
  108. package/dist/src/tiles/grid/item-tile.d.ts +2 -2
  109. package/dist/src/tiles/grid/item-tile.js +58 -150
  110. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  111. package/dist/src/tiles/item-image.d.ts +21 -0
  112. package/dist/src/tiles/item-image.js +215 -0
  113. package/dist/src/tiles/item-image.js.map +1 -0
  114. package/dist/src/tiles/list/account-label.d.ts +1 -0
  115. package/dist/src/tiles/list/account-label.js +7 -0
  116. package/dist/src/tiles/list/account-label.js.map +1 -0
  117. package/dist/src/tiles/list/date-label.d.ts +1 -0
  118. package/dist/src/tiles/list/date-label.js +13 -0
  119. package/dist/src/tiles/list/date-label.js.map +1 -0
  120. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
  121. package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
  122. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  123. package/dist/src/tiles/list/tile-list-compact.d.ts +12 -0
  124. package/dist/src/tiles/list/tile-list-compact.js +203 -6
  125. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  126. package/dist/src/tiles/list/tile-list.d.ts +35 -10
  127. package/dist/src/tiles/list/tile-list.js +368 -104
  128. package/dist/src/tiles/list/tile-list.js.map +1 -1
  129. package/dist/src/tiles/loading-tile.js +1 -42
  130. package/dist/src/tiles/loading-tile.js.map +1 -1
  131. package/dist/src/tiles/mediatype-icon.d.ts +9 -0
  132. package/dist/src/tiles/mediatype-icon.js +78 -0
  133. package/dist/src/tiles/mediatype-icon.js.map +1 -0
  134. package/dist/src/tiles/tile-dispatcher.d.ts +11 -4
  135. package/dist/src/tiles/tile-dispatcher.js +56 -19
  136. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  137. package/dist/src/utils/format-date.js +2 -2
  138. package/dist/src/utils/format-date.js.map +1 -1
  139. package/dist/src/waveform-thumbnail.d.ts +7 -0
  140. package/dist/src/waveform-thumbnail.js +106 -0
  141. package/dist/src/waveform-thumbnail.js.map +1 -0
  142. package/dist/{demo/icon-provider-icon.d.ts → src/waveform-view.d.ts} +0 -0
  143. package/dist/src/waveform-view.js +2 -0
  144. package/dist/src/waveform-view.js.map +1 -0
  145. package/dist/src/your-webcomponent.d.ts +8 -0
  146. package/dist/src/your-webcomponent.js +38 -0
  147. package/dist/src/your-webcomponent.js.map +1 -0
  148. package/dist/test/collection-browser.test.d.ts +1 -0
  149. package/dist/test/collection-browser.test.js +16 -2
  150. package/dist/test/collection-browser.test.js.map +1 -1
  151. package/dist/test/mediatype-config.test.d.ts +1 -0
  152. package/dist/test/mediatype-config.test.js +17 -0
  153. package/dist/test/mediatype-config.test.js.map +1 -0
  154. package/dist/{src/assets/img/icons/eye-hidden.d.ts → test/mediatype-icon.test.d.ts} +0 -0
  155. package/dist/test/mediatype-icon.test.js +3 -0
  156. package/dist/test/mediatype-icon.test.js.map +1 -0
  157. package/dist/test/mediatypeConfig.test.d.ts +1 -0
  158. package/dist/test/mediatypeConfig.test.js +17 -0
  159. package/dist/test/mediatypeConfig.test.js.map +1 -0
  160. package/dist/test/utils/format-date.test.js +1 -1
  161. package/dist/test/utils/format-date.test.js.map +1 -1
  162. package/dist/test/your-webcomponent.test.d.ts +1 -0
  163. package/dist/test/your-webcomponent.test.js +23 -0
  164. package/dist/test/your-webcomponent.test.js.map +1 -0
  165. package/index.ts +6 -0
  166. package/local.archive.org.cert +86 -0
  167. package/local.archive.org.key +27 -0
  168. package/package.json +9 -5
  169. package/src/assets/img/icons/chevron.ts +4 -0
  170. package/src/assets/img/icons/mediatype/account.ts +6 -4
  171. package/src/assets/img/icons/mediatype/audio.ts +7 -4
  172. package/src/assets/img/icons/mediatype/collection.ts +7 -4
  173. package/src/assets/img/icons/mediatype/data.ts +15 -0
  174. package/src/assets/img/icons/mediatype/etree.ts +10 -5
  175. package/src/assets/img/icons/mediatype/film.ts +2 -1
  176. package/src/assets/img/icons/mediatype/images.ts +9 -6
  177. package/src/assets/img/icons/mediatype/radio.ts +15 -0
  178. package/src/assets/img/icons/mediatype/software.ts +9 -6
  179. package/src/assets/img/icons/mediatype/texts.ts +9 -6
  180. package/src/assets/img/icons/mediatype/tv.ts +10 -5
  181. package/src/assets/img/icons/mediatype/video.ts +10 -6
  182. package/src/assets/img/icons/mediatype/web.ts +9 -6
  183. package/src/collection-browser.ts +529 -163
  184. package/src/collection-facets.ts +307 -205
  185. package/src/language-code-handler/language-code-handler.ts +64 -0
  186. package/src/language-code-handler/language-code-mapping.ts +564 -0
  187. package/src/mediatype/mediatype-config.ts +86 -0
  188. package/src/models.ts +141 -13
  189. package/src/restoration-state-handler.ts +266 -0
  190. package/src/sort-filter-bar/alpha-bar.ts +9 -3
  191. package/src/sort-filter-bar/img/compact.ts +5 -0
  192. package/src/sort-filter-bar/img/list.ts +1 -1
  193. package/src/sort-filter-bar/img/tile.ts +5 -0
  194. package/src/sort-filter-bar/sort-filter-bar.ts +557 -225
  195. package/src/tiles/collection-browser-loading-tile.ts +29 -0
  196. package/src/tiles/grid/account-tile.ts +1 -1
  197. package/src/tiles/grid/collection-tile.ts +1 -2
  198. package/src/tiles/grid/icons/views.ts +2 -2
  199. package/src/tiles/grid/item-tile.ts +57 -162
  200. package/src/tiles/item-image.ts +218 -0
  201. package/src/tiles/list/account-label.ts +6 -0
  202. package/src/tiles/list/date-label.ts +12 -0
  203. package/src/tiles/list/tile-list-compact-header.ts +77 -0
  204. package/src/tiles/list/tile-list-compact.ts +218 -0
  205. package/src/tiles/list/tile-list.ts +412 -107
  206. package/src/tiles/mediatype-icon.ts +75 -0
  207. package/src/tiles/tile-dispatcher.ts +66 -18
  208. package/src/utils/format-date.ts +2 -2
  209. package/test/collection-browser.test.ts +20 -1
  210. package/test/mediatype-config.test.ts +18 -0
  211. package/test/utils/format-date.test.ts +1 -1
  212. package/web-dev-server.config.mjs +3 -1
  213. package/dist/demo/icon-provider/icon-provider-icon.d.ts +0 -10
  214. package/dist/demo/icon-provider/icon-provider-icon.js +0 -32
  215. package/dist/demo/icon-provider/icon-provider-icon.js.map +0 -1
  216. package/dist/demo/icon-provider/icon-provider.d.ts +0 -10
  217. package/dist/demo/icon-provider/icon-provider.js +0 -9
  218. package/dist/demo/icon-provider/icon-provider.js.map +0 -1
  219. package/dist/demo/icon-provider-icon.js +0 -2
  220. package/dist/demo/icon-provider-icon.js.map +0 -1
  221. package/dist/demo/icon-provider.d.ts +0 -10
  222. package/dist/demo/icon-provider.js +0 -12
  223. package/dist/demo/icon-provider.js.map +0 -1
  224. package/dist/src/assets/img/icons/audio.d.ts +0 -1
  225. package/dist/src/assets/img/icons/audio.js +0 -9
  226. package/dist/src/assets/img/icons/audio.js.map +0 -1
  227. package/dist/src/assets/img/icons/collection.d.ts +0 -1
  228. package/dist/src/assets/img/icons/collection.js +0 -9
  229. package/dist/src/assets/img/icons/collection.js.map +0 -1
  230. package/dist/src/assets/img/icons/etree.d.ts +0 -1
  231. package/dist/src/assets/img/icons/etree.js +0 -9
  232. package/dist/src/assets/img/icons/etree.js.map +0 -1
  233. package/dist/src/assets/img/icons/eye-hidden.js +0 -2
  234. package/dist/src/assets/img/icons/eye-hidden.js.map +0 -1
  235. package/dist/src/assets/img/icons/images.d.ts +0 -1
  236. package/dist/src/assets/img/icons/images.js +0 -10
  237. package/dist/src/assets/img/icons/images.js.map +0 -1
  238. package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +0 -1
  239. package/dist/src/assets/img/icons/mediatype/etree copy.js +0 -9
  240. package/dist/src/assets/img/icons/mediatype/etree copy.js.map +0 -1
  241. package/dist/src/assets/img/icons/software.d.ts +0 -1
  242. package/dist/src/assets/img/icons/software.js +0 -10
  243. package/dist/src/assets/img/icons/software.js.map +0 -1
  244. package/dist/src/assets/img/icons/texts.d.ts +0 -1
  245. package/dist/src/assets/img/icons/texts.js +0 -10
  246. package/dist/src/assets/img/icons/texts.js.map +0 -1
  247. package/dist/src/assets/img/icons/tv.d.ts +0 -1
  248. package/dist/src/assets/img/icons/tv.js +0 -9
  249. package/dist/src/assets/img/icons/tv.js.map +0 -1
  250. package/dist/src/assets/img/icons/video.d.ts +0 -1
  251. package/dist/src/assets/img/icons/video.js +0 -10
  252. package/dist/src/assets/img/icons/video.js.map +0 -1
  253. package/dist/src/assets/img/icons/web.d.ts +0 -1
  254. package/dist/src/assets/img/icons/web.js +0 -10
  255. package/dist/src/assets/img/icons/web.js.map +0 -1
  256. package/dist/src/search-handler.d.ts +0 -11
  257. package/dist/src/search-handler.js +0 -34
  258. package/dist/src/search-handler.js.map +0 -1
  259. package/src/mediatype-icon.ts +0 -83
  260. package/src/sort-filter-bar/img/grid.ts +0 -5
  261. package/src/tiles/loading-tile.ts +0 -70
@@ -1,165 +1,51 @@
1
1
  import { __decorate } from "tslib";
2
- import { LitElement, html, css, nothing } from 'lit';
3
- import { customElement, property, state } from 'lit/decorators.js';
2
+ import { LitElement, html, css, nothing, } from 'lit';
3
+ import { customElement, property, query, state } from 'lit/decorators.js';
4
+ import { SortField, SortFieldDisplayName, } from '../models';
4
5
  import './alpha-bar';
5
6
  import { sortIcon } from './img/sort-triangle';
6
- import { gridIcon } from './img/grid';
7
+ import { tileIcon } from './img/tile';
7
8
  import { listIcon } from './img/list';
8
- var SortFieldName;
9
- (function (SortFieldName) {
10
- SortFieldName["publicdate"] = "Date Archived";
11
- SortFieldName["date"] = "Date Published";
12
- SortFieldName["reviewdate"] = "Date Reviewed";
13
- SortFieldName["addeddate"] = "Date Added";
14
- })(SortFieldName || (SortFieldName = {}));
9
+ import { compactIcon } from './img/compact';
15
10
  let SortFilterBar = class SortFilterBar extends LitElement {
16
11
  constructor() {
17
12
  super(...arguments);
18
- this.displayMode = 'grid';
19
- this.sortDirection = 'asc';
20
- this.sortField = null;
21
- this.selectedSort = 'relevance';
22
- this.titleSelectorVisible = false;
23
- this.creatorSelectorVisible = false;
13
+ this.sortDirection = null;
14
+ this.selectedSort = SortField.relevance;
15
+ this.selectedTitleFilter = null;
16
+ this.selectedCreatorFilter = null;
17
+ this.showRelevance = true;
18
+ this.alphaSelectorVisible = null;
24
19
  this.dateSortSelectorVisible = false;
20
+ this.desktopSelectorBarWidth = 0;
21
+ this.selectorBarContainerWidth = 0;
22
+ this.hoveringOverDateSortOptions = false;
23
+ this.boundDateSelectorEscapeListener = (e) => {
24
+ if (e.key === 'Escape') {
25
+ this.dateSortSelectorVisible = false;
26
+ }
27
+ };
25
28
  }
26
29
  render() {
27
30
  return html `
28
31
  <div id="container">
29
- ${this.titleSelectorVisible ? this.titleSelectorBar : nothing}
30
- ${this.creatorSelectorVisible ? this.creatorSelectorBar : nothing}
31
-
32
32
  <div id="sort-bar">
33
- <div id="sort-selector">
34
- <ul>
35
- <li>
36
- <div id="sort-direction-container">
37
- <button
38
- id="sort-ascending-btn"
39
- class="sort-button"
40
- @click=${() => {
41
- this.sortDirection = 'asc';
42
- }}
43
- >
44
- ${sortIcon}
45
- </button>
46
- <button
47
- id="sort-descending-btn"
48
- class="sort-button"
49
- @click=${() => {
50
- this.sortDirection = 'desc';
51
- }}
52
- >
53
- ${sortIcon}
54
- </button>
55
- </div>
56
- </li>
57
- <li id="sort-by-text">Sort By</li>
58
- <li>
59
- <a
60
- href="#"
61
- @click=${(e) => {
62
- e.preventDefault();
63
- this.sortField = null;
64
- this.selectedSort = 'relevance';
65
- }}
66
- class=${this.selectedSort === 'relevance' ? 'selected' : ''}
67
- >
68
- Relevance
69
- </a>
70
- </li>
71
- <li>
72
- <a
73
- href="#"
74
- @click=${(e) => {
75
- e.preventDefault();
76
- this.sortField = 'week';
77
- this.selectedSort = 'views';
78
- }}
79
- class=${this.selectedSort === 'views' ? 'selected' : ''}
80
- >
81
- Views
82
- </a>
83
- </li>
84
- <li>
85
- <a
86
- href="#"
87
- @click=${(e) => {
88
- e.preventDefault();
89
- this.titleSelectorVisible = !this.titleSelectorVisible;
90
- this.sortField = 'titleSorter';
91
- this.selectedSort = 'title';
92
- }}
93
- class=${this.selectedSort === 'title' ? 'selected' : ''}
94
- >
95
- Title
96
- </a>
97
- </li>
98
- <li>
99
- <a
100
- href="#"
101
- @click=${(e) => {
102
- e.preventDefault();
103
- this.dateSortSelectorVisible =
104
- !this.dateSortSelectorVisible;
105
- this.selectedSort = 'date';
106
- }}
107
- class=${this.selectedSort === 'date' ? 'selected' : ''}
108
- >
109
- ${this.dateSortField}
110
- </a>
111
- </li>
112
- <li>
113
- <a
114
- href="#"
115
- @click=${(e) => {
116
- e.preventDefault();
117
- this.creatorSelectorVisible = !this.creatorSelectorVisible;
118
- this.sortField = 'creatorSorter';
119
- this.selectedSort = 'creator';
120
- }}
121
- class=${this.selectedSort === 'creator' ? 'selected' : ''}
122
- >
123
- Creator
124
- </a>
125
- </li>
126
- </ul>
33
+ <div id="sort-direction-container">
34
+ ${this.sortDirectionSelectorTemplate}
127
35
  </div>
128
36
 
129
- <div id="display-style">
130
- <ul>
131
- ${this.displayMode !== 'grid'
132
- ? html `<li>
133
- <label id="show-details">
134
- <input type="checkbox" @click=${this.detailSelected} />
135
- Show Details
136
- </label>
137
- </li>`
138
- : nothing}
139
-
140
- <li>
141
- <button
142
- id="grid-button"
143
- @click=${this.gridSelected}
144
- class=${this.displayMode === 'grid' ? 'active' : ''}
145
- >
146
- ${gridIcon}
147
- </button>
148
- </li>
149
- <li>
150
- <button
151
- id="list-button"
152
- @click=${this.listSelected}
153
- class=${this.displayMode !== 'grid' ? 'active' : ''}
154
- >
155
- ${listIcon}
156
- </button>
157
- </li>
158
- </ul>
37
+ <div id="sort-selector-container">
38
+ ${this.mobileSortSelectorTemplate}
39
+ ${this.desktopSortSelectorTemplate}
159
40
  </div>
41
+
42
+ <div id="display-style-selector">${this.displayOptionTemplate}</div>
160
43
  </div>
161
44
 
162
- ${this.dateSortSelectorVisible ? this.dateSortSelector : nothing}
45
+ ${this.dateSortSelectorVisible && !this.mobileSelectorVisible
46
+ ? this.dateSortSelector
47
+ : nothing}
48
+ ${this.alphaBarTemplate}
163
49
 
164
50
  <div id="bottom-shadow"></div>
165
51
  </div>
@@ -169,105 +55,390 @@ let SortFilterBar = class SortFilterBar extends LitElement {
169
55
  if (changed.has('displayMode')) {
170
56
  this.displayModeChanged();
171
57
  }
172
- if (changed.has('sortDirection') || changed.has('sortField')) {
173
- this.sortChanged();
58
+ if (changed.has('selectedSort') && this.sortDirection === null) {
59
+ this.sortDirection = 'desc';
60
+ }
61
+ if (changed.has('selectedTitleFilter') && this.selectedTitleFilter) {
62
+ this.alphaSelectorVisible = 'title';
63
+ }
64
+ if (changed.has('selectedCreatorFilter') && this.selectedCreatorFilter) {
65
+ this.alphaSelectorVisible = 'creator';
66
+ }
67
+ if (changed.has('dateSortSelectorVisible')) {
68
+ this.setupEscapeListeners();
69
+ }
70
+ if (changed.has('resizeObserver')) {
71
+ const oldObserver = changed.get('resizeObserver');
72
+ if (oldObserver)
73
+ this.disconnectResizeObserver(oldObserver);
74
+ this.setupResizeObserver();
174
75
  }
175
76
  }
176
- get dateSortSelector() {
77
+ setupEscapeListeners() {
78
+ if (this.dateSortSelectorVisible) {
79
+ document.addEventListener('keydown', this.boundDateSelectorEscapeListener);
80
+ }
81
+ else {
82
+ document.removeEventListener('keydown', this.boundDateSelectorEscapeListener);
83
+ }
84
+ }
85
+ disconnectedCallback() {
86
+ if (this.resizeObserver) {
87
+ this.disconnectResizeObserver(this.resizeObserver);
88
+ }
89
+ }
90
+ disconnectResizeObserver(resizeObserver) {
91
+ resizeObserver.removeObserver({
92
+ target: this.sortSelectorContainer,
93
+ handler: this,
94
+ });
95
+ resizeObserver.removeObserver({
96
+ target: this.desktopSortSelector,
97
+ handler: this,
98
+ });
99
+ }
100
+ setupResizeObserver() {
101
+ if (!this.resizeObserver)
102
+ return;
103
+ this.resizeObserver.addObserver({
104
+ target: this.sortSelectorContainer,
105
+ handler: this,
106
+ });
107
+ this.resizeObserver.addObserver({
108
+ target: this.desktopSortSelector,
109
+ handler: this,
110
+ });
111
+ }
112
+ get mobileSelectorVisible() {
113
+ return this.selectorBarContainerWidth - 10 < this.desktopSelectorBarWidth;
114
+ }
115
+ get alphaBarTemplate() {
116
+ if (!['title', 'creator'].includes(this.selectedSort))
117
+ return nothing;
118
+ if (this.alphaSelectorVisible === null) {
119
+ if (this.selectedSort === 'creator')
120
+ return this.creatorSelectorBar;
121
+ if (this.selectedSort === 'title')
122
+ return this.titleSelectorBar;
123
+ }
124
+ else {
125
+ return this.alphaSelectorVisible === 'creator'
126
+ ? this.creatorSelectorBar
127
+ : this.titleSelectorBar;
128
+ }
129
+ return nothing;
130
+ }
131
+ handleResize(entry) {
132
+ if (entry.target === this.desktopSortSelector) {
133
+ this.desktopSelectorBarWidth = entry.contentRect.width;
134
+ }
135
+ else if (entry.target === this.sortSelectorContainer) {
136
+ this.selectorBarContainerWidth = entry.contentRect.width;
137
+ }
138
+ }
139
+ get sortDirectionSelectorTemplate() {
177
140
  return html `
178
- <div id="date-sort-selector">
179
- <ul>
180
- <li>
181
- <button
182
- @click=${() => {
183
- this.sortField = 'publicdate';
184
- this.dateSortSelectorVisible = false;
141
+ <div id="sort-direction-selector">
142
+ <button
143
+ id="sort-ascending-btn"
144
+ class="sort-button ${this.sortDirection === 'asc' ? 'selected' : ''}"
145
+ ?disabled=${this.selectedSort === 'relevance'}
146
+ @click=${() => {
147
+ this.setSortDirections('asc');
185
148
  }}
186
- >
187
- Date Archived
188
- </button>
189
- </li>
190
- <li>
191
- <button
192
- @click=${() => {
193
- this.sortField = 'date';
194
- this.dateSortSelectorVisible = false;
149
+ >
150
+ ${sortIcon}
151
+ </button>
152
+ <button
153
+ id="sort-descending-btn"
154
+ class="sort-button ${this.sortDirection === 'desc' ? 'selected' : ''}"
155
+ ?disabled=${this.selectedSort === 'relevance'}
156
+ @click=${() => {
157
+ this.setSortDirections('desc');
195
158
  }}
196
- >
197
- Date Published
198
- </button>
199
- </li>
200
- <li>
201
- <button
202
- @click=${() => {
203
- this.sortField = 'reviewdate';
159
+ >
160
+ ${sortIcon}
161
+ </button>
162
+ </div>
163
+ `;
164
+ }
165
+ get desktopSortSelectorTemplate() {
166
+ return html `
167
+ <ul
168
+ id="desktop-sort-selector"
169
+ class=${this.mobileSelectorVisible ? 'hidden' : 'visible'}
170
+ >
171
+ <li id="sort-by-text">Sort By</li>
172
+ <li>
173
+ ${this.showRelevance
174
+ ? this.getSortDisplayOption(SortField.relevance)
175
+ : nothing}
176
+ </li>
177
+ <li>${this.getSortDisplayOption(SortField.views)}</li>
178
+ <li>
179
+ ${this.getSortDisplayOption(SortField.title, {
180
+ clickEvent: () => {
181
+ this.alphaSelectorVisible = 'title';
182
+ this.selectedCreatorFilter = null;
183
+ this.dateSortSelectorVisible = false;
184
+ this.setSelectedSort(SortField.title);
185
+ this.emitCreatorLetterChangedEvent();
186
+ },
187
+ })}
188
+ </li>
189
+ <li>
190
+ ${this.getSortDisplayOption(SortField.date, {
191
+ clickEvent: () => {
192
+ if (!this.dateOptionSelected)
193
+ this.setSelectedSort(SortField.date);
194
+ this.dateSortSelectorVisible = !this.dateSortSelectorVisible;
195
+ this.alphaSelectorVisible = null;
196
+ this.selectedTitleFilter = null;
197
+ this.selectedCreatorFilter = null;
198
+ this.emitTitleLetterChangedEvent();
199
+ this.emitCreatorLetterChangedEvent();
200
+ },
201
+ displayName: html `${this.dateSortField}`,
202
+ isSelected: () => this.dateOptionSelected,
203
+ })}
204
+ </li>
205
+ <li>
206
+ ${this.getSortDisplayOption(SortField.creator, {
207
+ clickEvent: () => {
208
+ this.alphaSelectorVisible = 'creator';
209
+ this.selectedTitleFilter = null;
210
+ this.dateSortSelectorVisible = false;
211
+ this.setSelectedSort(SortField.creator);
212
+ this.emitTitleLetterChangedEvent();
213
+ },
214
+ })}
215
+ </li>
216
+ </ul>
217
+ `;
218
+ }
219
+ /**
220
+ * This generates each of the sort option links.
221
+ *
222
+ * It manages the display value and the selected state of the option.
223
+ *
224
+ * @param sortField
225
+ * @param options {
226
+ * additionalClickEvent?: () => void; If this is provided, it will also be called when the option is clicked.
227
+ * displayName?: TemplateResult; The name to display for the option. Defaults to the sortField display name.
228
+ * isSelected?: () => boolean; A function that returns true if the option is selected. Defaults to the selectedSort === sortField.
229
+ * }
230
+ * @returns
231
+ */
232
+ getSortDisplayOption(sortField, options) {
233
+ var _a, _b;
234
+ const isSelected = (_a = options === null || options === void 0 ? void 0 : options.isSelected) !== null && _a !== void 0 ? _a : (() => this.selectedSort === sortField);
235
+ const displayName = (_b = options === null || options === void 0 ? void 0 : options.displayName) !== null && _b !== void 0 ? _b : SortFieldDisplayName[sortField];
236
+ return html `
237
+ <a
238
+ href="#"
239
+ @click=${(e) => {
240
+ e.preventDefault();
241
+ if (options === null || options === void 0 ? void 0 : options.clickEvent) {
242
+ options.clickEvent(e);
243
+ }
244
+ else {
245
+ this.alphaSelectorVisible = null;
246
+ this.dateSortSelectorVisible = false;
247
+ this.selectedTitleFilter = null;
248
+ this.selectedCreatorFilter = null;
249
+ this.setSelectedSort(sortField);
250
+ this.emitTitleLetterChangedEvent();
251
+ this.emitCreatorLetterChangedEvent();
252
+ }
253
+ }}
254
+ class=${isSelected() ? 'selected' : ''}
255
+ >
256
+ ${displayName}
257
+ </a>
258
+ `;
259
+ }
260
+ get mobileSortSelectorTemplate() {
261
+ return html `
262
+ <select
263
+ id="mobile-sort-selector"
264
+ @change=${this.mobileSortChanged}
265
+ class=${this.mobileSelectorVisible ? 'visible' : 'hidden'}
266
+ >
267
+ ${Object.keys(SortField).map(field => html `
268
+ <option value="${field}" ?selected=${this.selectedSort === field}>
269
+ ${SortFieldDisplayName[field]}
270
+ </option>
271
+ `)}
272
+ </select>
273
+ `;
274
+ }
275
+ mobileSortChanged(e) {
276
+ const target = e.target;
277
+ this.setSelectedSort(target.value);
278
+ }
279
+ get displayOptionTemplate() {
280
+ return html `
281
+ <ul>
282
+ <li>
283
+ <button
284
+ id="grid-button"
285
+ @click=${() => {
286
+ this.displayMode = 'grid';
287
+ }}
288
+ class=${this.displayMode === 'grid' ? 'active' : ''}
289
+ >
290
+ ${tileIcon}
291
+ </button>
292
+ </li>
293
+ <li>
294
+ <button
295
+ id="grid-button"
296
+ @click=${() => {
297
+ this.displayMode = 'list-detail';
298
+ }}
299
+ class=${this.displayMode === 'list-detail' ? 'active' : ''}
300
+ >
301
+ ${listIcon}
302
+ </button>
303
+ </li>
304
+ <li>
305
+ <button
306
+ id="list-button"
307
+ @click=${() => {
308
+ this.displayMode = 'list-compact';
309
+ }}
310
+ class=${this.displayMode === 'list-compact' ? 'active' : ''}
311
+ >
312
+ ${compactIcon}
313
+ </button>
314
+ </li>
315
+ </ul>
316
+ `;
317
+ }
318
+ get dateSortSelector() {
319
+ return html `
320
+ <div
321
+ id="date-sort-selector-backdrop"
322
+ @keyup=${() => {
204
323
  this.dateSortSelectorVisible = false;
205
324
  }}
206
- >
207
- Date Reviewed
208
- </button>
209
- </li>
210
- <li>
211
- <button
212
- @click=${() => {
213
- this.sortField = 'addeddate';
325
+ @click=${() => {
214
326
  this.dateSortSelectorVisible = false;
215
327
  }}
216
- >
217
- Date Added
218
- </button>
219
- </li>
328
+ ></div>
329
+ <div id="date-sort-selector">
330
+ <ul>
331
+ <li>${this.getDateSortButton(SortField.datearchived)}</li>
332
+ <li>${this.getDateSortButton(SortField.date)}</li>
333
+ <li>${this.getDateSortButton(SortField.datereviewed)}</li>
334
+ <li>${this.getDateSortButton(SortField.dateadded)}</li>
220
335
  </ul>
221
336
  </div>
222
337
  `;
223
338
  }
339
+ getDateSortButton(sortField) {
340
+ return html `
341
+ <button
342
+ @click=${() => {
343
+ this.selectDateSort(sortField);
344
+ }}
345
+ class=${this.selectedSort === sortField ? 'selected' : ''}
346
+ >
347
+ ${SortFieldDisplayName[sortField]}
348
+ </button>
349
+ `;
350
+ }
351
+ selectDateSort(sortField) {
352
+ this.dateSortSelectorVisible = false;
353
+ this.setSelectedSort(sortField);
354
+ }
355
+ setSortDirections(sortDirection) {
356
+ this.sortDirection = sortDirection;
357
+ this.emitSortChangedEvent();
358
+ }
359
+ setSelectedSort(sort) {
360
+ this.selectedSort = sort;
361
+ this.emitSortChangedEvent();
362
+ }
363
+ /**
364
+ * There are four date sort options.
365
+ *
366
+ * This checks to see if the current sort is one of them.
367
+ *
368
+ * @readonly
369
+ * @private
370
+ * @type {boolean}
371
+ * @memberof SortFilterBar
372
+ */
373
+ get dateOptionSelected() {
374
+ const dateSortFields = [
375
+ SortField.datearchived,
376
+ SortField.date,
377
+ SortField.datereviewed,
378
+ SortField.dateadded,
379
+ ];
380
+ return dateSortFields.includes(this.selectedSort);
381
+ }
382
+ /**
383
+ * The display name of the current date field
384
+ *
385
+ * @readonly
386
+ * @private
387
+ * @type {string}
388
+ * @memberof SortFilterBar
389
+ */
224
390
  get dateSortField() {
225
391
  var _a;
226
- return ((_a = SortFieldName[this.sortField]) !== null && _a !== void 0 ? _a : 'Date Archived');
392
+ const defaultSort = SortFieldDisplayName[SortField.date];
393
+ const name = this.dateOptionSelected
394
+ ? (_a = SortFieldDisplayName[this.selectedSort]) !== null && _a !== void 0 ? _a : defaultSort
395
+ : defaultSort;
396
+ return name;
227
397
  }
228
398
  get titleSelectorBar() {
229
399
  return html ` <alpha-bar
400
+ .selectedLetter=${this.selectedTitleFilter}
230
401
  @letterChanged=${this.titleLetterChanged}
231
402
  ></alpha-bar>`;
232
403
  }
233
404
  get creatorSelectorBar() {
234
405
  return html ` <alpha-bar
406
+ .selectedLetter=${this.selectedCreatorFilter}
235
407
  @letterChanged=${this.creatorLetterChanged}
236
408
  ></alpha-bar>`;
237
409
  }
238
410
  titleLetterChanged(e) {
411
+ var _a;
412
+ this.selectedTitleFilter = (_a = e.detail.selectedLetter) !== null && _a !== void 0 ? _a : null;
413
+ this.emitTitleLetterChangedEvent();
414
+ }
415
+ creatorLetterChanged(e) {
416
+ var _a;
417
+ this.selectedCreatorFilter = (_a = e.detail.selectedLetter) !== null && _a !== void 0 ? _a : null;
418
+ this.emitCreatorLetterChangedEvent();
419
+ }
420
+ emitTitleLetterChangedEvent() {
239
421
  const event = new CustomEvent('titleLetterChanged', {
240
- detail: { selectedLetter: e.detail.selectedLetter },
422
+ detail: { selectedLetter: this.selectedTitleFilter },
241
423
  });
242
424
  this.dispatchEvent(event);
243
425
  }
244
- creatorLetterChanged(e) {
426
+ emitCreatorLetterChangedEvent() {
245
427
  const event = new CustomEvent('creatorLetterChanged', {
246
- detail: { selectedLetter: e.detail.selectedLetter },
428
+ detail: { selectedLetter: this.selectedCreatorFilter },
247
429
  });
248
430
  this.dispatchEvent(event);
249
431
  }
250
- gridSelected() {
251
- this.displayMode = 'grid';
252
- }
253
- listSelected() {
254
- this.displayMode = 'list-compact';
255
- }
256
- detailSelected(e) {
257
- this.displayMode = e.target.checked
258
- ? 'list-detail'
259
- : 'list-compact';
260
- }
261
432
  displayModeChanged() {
262
433
  const event = new CustomEvent('displayModeChanged', {
263
434
  detail: { displayMode: this.displayMode },
264
435
  });
265
436
  this.dispatchEvent(event);
266
437
  }
267
- sortChanged() {
438
+ emitSortChangedEvent() {
268
439
  const event = new CustomEvent('sortChanged', {
269
440
  detail: {
270
- sortField: this.sortField,
441
+ selectedSort: this.selectedSort,
271
442
  sortDirection: this.sortDirection,
272
443
  },
273
444
  });
@@ -276,7 +447,7 @@ let SortFilterBar = class SortFilterBar extends LitElement {
276
447
  };
277
448
  SortFilterBar.styles = css `
278
449
  #container {
279
- margin: 0 1rem 2.5rem 1rem;
450
+ position: relative;
280
451
  }
281
452
 
282
453
  #sort-bar {
@@ -287,6 +458,10 @@ SortFilterBar.styles = css `
287
458
  padding: 0.5rem 1.5rem;
288
459
  }
289
460
 
461
+ #sort-direction-container {
462
+ flex: 0;
463
+ }
464
+
290
465
  #sort-by-text {
291
466
  text-transform: uppercase;
292
467
  }
@@ -319,53 +494,140 @@ SortFilterBar.styles = css `
319
494
  outline: inherit;
320
495
  width: 12px;
321
496
  height: 12px;
497
+ opacity: 0.5;
498
+ }
499
+
500
+ .sort-button.selected {
501
+ opacity: 1;
502
+ }
503
+
504
+ .sort-button:disabled {
505
+ opacity: 0.25;
506
+ cursor: default;
507
+ }
508
+
509
+ #date-sort-selector {
510
+ position: absolute;
511
+ left: 150px;
512
+ top: 45px;
513
+
514
+ z-index: 1;
515
+ padding: 1rem;
516
+ background-color: white;
517
+ border-radius: 2.5rem;
518
+ border: 1px solid #404142;
519
+ }
520
+
521
+ #date-sort-selector button {
522
+ background: none;
523
+ border-radius: 15px;
524
+ color: #404142;
525
+ border: none;
526
+ appearance: none;
527
+ cursor: pointer;
528
+ -webkit-appearance: none;
529
+ font-size: 1.4rem;
530
+ font-weight: 400;
531
+ padding: 0.5rem 1.2rem;
532
+ }
533
+
534
+ #date-sort-selector button.selected {
535
+ background-color: #404142;
536
+ color: white;
322
537
  }
323
538
 
324
539
  #show-details {
325
540
  text-transform: uppercase;
326
541
  cursor: pointer;
542
+ display: flex;
543
+ }
544
+
545
+ #show-details input {
546
+ margin-right: 0.5rem;
547
+ flex: 0 0 12px;
327
548
  }
328
549
 
329
550
  #sort-descending-btn {
330
551
  transform: rotate(180deg);
331
552
  }
332
553
 
333
- #sort-direction-container {
554
+ #sort-direction-selector {
334
555
  display: flex;
335
556
  flex-direction: column;
557
+ gap: 3px;
558
+ margin-right: 1rem;
559
+ }
560
+
561
+ #sort-selector-container {
562
+ flex: 1;
563
+ }
564
+
565
+ /*
566
+ we move the desktop sort selector offscreen instead of display: none
567
+ because we need to observe the width of it vs its container to determine
568
+ if it's wide enough to display the desktop version and if you displY: none,
569
+ the width becomes 0
570
+ */
571
+ #desktop-sort-selector.hidden {
572
+ position: absolute;
573
+ top: -9999px;
574
+ left: -9999px;
575
+ }
576
+
577
+ #mobile-sort-selector.hidden {
578
+ display: none;
336
579
  }
337
580
 
338
- #sort-selector li {
581
+ #date-sort-selector-backdrop {
582
+ position: fixed;
583
+ top: 0;
584
+ left: 0;
585
+ width: 100%;
586
+ height: 100%;
587
+ z-index: 1;
588
+ background-color: rgba(255, 255, 255, 0.5);
589
+ }
590
+
591
+ #desktop-sort-selector {
592
+ display: inline-flex;
593
+ }
594
+
595
+ #desktop-sort-selector li {
339
596
  display: flex;
340
597
  align-items: center;
341
598
  }
342
599
 
343
- #sort-selector li a {
600
+ #desktop-sort-selector li a {
344
601
  text-decoration: none;
345
602
  text-transform: uppercase;
346
603
  font-size: 1.4rem;
347
604
  color: #333;
605
+ line-height: 2.5;
348
606
  }
349
607
 
350
- #sort-selector li a.selected {
608
+ #desktop-sort-selector li a.selected {
351
609
  font-weight: bold;
352
610
  }
353
611
 
354
- #sort-selector li::after {
612
+ #desktop-sort-selector li::after {
355
613
  content: '•';
356
614
  padding-left: 1rem;
357
615
  padding-right: 1rem;
358
616
  }
359
617
 
360
- #sort-selector li:first-child::after {
618
+ #desktop-sort-selector li:first-child::after {
361
619
  content: '';
362
620
  }
363
621
 
364
- #sort-selector li:last-child::after {
622
+ #desktop-sort-selector li:last-child::after {
365
623
  content: '';
366
624
  }
367
625
 
368
- #display-style button {
626
+ #display-style-selector {
627
+ flex: 0;
628
+ }
629
+
630
+ #display-style-selector button {
369
631
  background: none;
370
632
  color: inherit;
371
633
  border: none;
@@ -375,11 +637,11 @@ SortFilterBar.styles = css `
375
637
  opacity: 0.5;
376
638
  }
377
639
 
378
- #display-style button.active {
640
+ #display-style-selector button.active {
379
641
  opacity: 1;
380
642
  }
381
643
 
382
- #display-style button svg {
644
+ #display-style-selector button svg {
383
645
  width: 24px;
384
646
  height: 24px;
385
647
  }
@@ -392,19 +654,40 @@ __decorate([
392
654
  ], SortFilterBar.prototype, "sortDirection", void 0);
393
655
  __decorate([
394
656
  property({ type: String })
395
- ], SortFilterBar.prototype, "sortField", void 0);
657
+ ], SortFilterBar.prototype, "selectedSort", void 0);
396
658
  __decorate([
397
659
  property({ type: String })
398
- ], SortFilterBar.prototype, "selectedSort", void 0);
660
+ ], SortFilterBar.prototype, "selectedTitleFilter", void 0);
399
661
  __decorate([
400
- state()
401
- ], SortFilterBar.prototype, "titleSelectorVisible", void 0);
662
+ property({ type: String })
663
+ ], SortFilterBar.prototype, "selectedCreatorFilter", void 0);
664
+ __decorate([
665
+ property({ type: Boolean })
666
+ ], SortFilterBar.prototype, "showRelevance", void 0);
667
+ __decorate([
668
+ property({ type: Object })
669
+ ], SortFilterBar.prototype, "resizeObserver", void 0);
402
670
  __decorate([
403
671
  state()
404
- ], SortFilterBar.prototype, "creatorSelectorVisible", void 0);
672
+ ], SortFilterBar.prototype, "alphaSelectorVisible", void 0);
405
673
  __decorate([
406
674
  state()
407
675
  ], SortFilterBar.prototype, "dateSortSelectorVisible", void 0);
676
+ __decorate([
677
+ state()
678
+ ], SortFilterBar.prototype, "desktopSelectorBarWidth", void 0);
679
+ __decorate([
680
+ state()
681
+ ], SortFilterBar.prototype, "selectorBarContainerWidth", void 0);
682
+ __decorate([
683
+ state()
684
+ ], SortFilterBar.prototype, "hoveringOverDateSortOptions", void 0);
685
+ __decorate([
686
+ query('#desktop-sort-selector')
687
+ ], SortFilterBar.prototype, "desktopSortSelector", void 0);
688
+ __decorate([
689
+ query('#sort-selector-container')
690
+ ], SortFilterBar.prototype, "sortSelectorContainer", void 0);
408
691
  SortFilterBar = __decorate([
409
692
  customElement('sort-filter-bar')
410
693
  ], SortFilterBar);