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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/demo/app-root.ts +24 -158
  2. package/dist/demo/app-root.d.ts +2 -16
  3. package/dist/demo/app-root.js +23 -141
  4. package/dist/demo/app-root.js.map +1 -1
  5. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  6. package/dist/src/assets/img/icons/chevron.js +4 -0
  7. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  8. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  9. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  10. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  11. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  12. package/dist/src/assets/img/icons/eye.js +5 -0
  13. package/dist/src/assets/img/icons/eye.js.map +1 -0
  14. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
  15. package/dist/src/assets/img/icons/mediatype/account.js +5 -4
  16. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
  17. package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
  18. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
  19. package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
  20. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
  21. package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
  22. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
  23. package/dist/src/assets/img/icons/mediatype/film.js +2 -1
  24. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
  25. package/dist/src/assets/img/icons/mediatype/images.js +9 -6
  26. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
  27. package/dist/src/assets/img/icons/mediatype/software.js +9 -6
  28. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
  29. package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
  30. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
  31. package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
  32. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
  33. package/dist/src/assets/img/icons/mediatype/video.js +10 -6
  34. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
  35. package/dist/src/assets/img/icons/mediatype/web.js +9 -6
  36. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
  37. package/dist/src/async-collection-name.d.ts +11 -0
  38. package/dist/src/async-collection-name.js +38 -0
  39. package/dist/src/async-collection-name.js.map +1 -0
  40. package/dist/src/collection-browser.d.ts +55 -17
  41. package/dist/src/collection-browser.js +466 -106
  42. package/dist/src/collection-browser.js.map +1 -1
  43. package/dist/src/collection-facets.d.ts +24 -5
  44. package/dist/src/collection-facets.js +300 -78
  45. package/dist/src/collection-facets.js.map +1 -1
  46. package/dist/src/collection-name-cache.d.ts +18 -0
  47. package/dist/src/collection-name-cache.js +89 -0
  48. package/dist/src/collection-name-cache.js.map +1 -0
  49. package/dist/src/mediatype-icon.js +10 -3
  50. package/dist/src/mediatype-icon.js.map +1 -1
  51. package/dist/src/models.d.ts +72 -14
  52. package/dist/src/models.js +57 -1
  53. package/dist/src/models.js.map +1 -1
  54. package/dist/src/restoration-state-handler.d.ts +37 -0
  55. package/dist/src/restoration-state-handler.js +177 -0
  56. package/dist/src/restoration-state-handler.js.map +1 -0
  57. package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -2
  58. package/dist/src/sort-filter-bar/alpha-bar.js +19 -9
  59. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  60. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  61. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  62. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  63. package/dist/src/sort-filter-bar/img/grid.d.ts +1 -0
  64. package/dist/src/sort-filter-bar/img/grid.js +5 -0
  65. package/dist/src/sort-filter-bar/img/grid.js.map +1 -0
  66. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  67. package/dist/src/sort-filter-bar/img/list.js +5 -0
  68. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  69. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  70. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  71. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  72. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  73. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  74. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  75. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +65 -11
  76. package/dist/src/sort-filter-bar/sort-filter-bar.js +453 -142
  77. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  78. package/dist/src/tiles/grid/collection-tile.js +1 -2
  79. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  80. package/dist/src/tiles/grid/item-tile.d.ts +4 -0
  81. package/dist/src/tiles/grid/item-tile.js +134 -45
  82. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  83. package/dist/src/tiles/list/tile-list-compact-header.d.ts +11 -0
  84. package/dist/src/tiles/list/tile-list-compact-header.js +79 -0
  85. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  86. package/dist/src/tiles/list/tile-list-compact.d.ts +1 -0
  87. package/dist/src/tiles/list/tile-list-compact.js +122 -31
  88. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  89. package/dist/src/tiles/list/tile-list-detail.d.ts +0 -10
  90. package/dist/src/tiles/list/tile-list-detail.js +6 -159
  91. package/dist/src/tiles/list/tile-list-detail.js.map +1 -1
  92. package/dist/src/tiles/list/tile-list.d.ts +19 -6
  93. package/dist/src/tiles/list/tile-list.js +240 -108
  94. package/dist/src/tiles/list/tile-list.js.map +1 -1
  95. package/dist/src/tiles/tile-dispatcher.d.ts +8 -1
  96. package/dist/src/tiles/tile-dispatcher.js +46 -11
  97. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  98. package/dist/src/utils/format-date.js +1 -2
  99. package/dist/src/utils/format-date.js.map +1 -1
  100. package/dist/test/{utils/format-string.test.d.ts → collection-name-cache.test.d.ts} +0 -0
  101. package/dist/test/collection-name-cache.test.js +158 -0
  102. package/dist/test/collection-name-cache.test.js.map +1 -0
  103. package/dist/test/mocks/mock-search-response.d.ts +5 -0
  104. package/dist/test/mocks/mock-search-response.js +62 -0
  105. package/dist/test/mocks/mock-search-response.js.map +1 -0
  106. package/dist/test/mocks/mock-search-service.d.ts +13 -0
  107. package/dist/test/mocks/mock-search-service.js +20 -0
  108. package/dist/test/mocks/mock-search-service.js.map +1 -0
  109. package/package.json +9 -4
  110. package/src/assets/img/icons/chevron.ts +4 -0
  111. package/src/assets/img/icons/eye-closed.ts +5 -0
  112. package/src/assets/img/icons/eye.ts +5 -0
  113. package/src/assets/img/icons/mediatype/account.ts +5 -4
  114. package/src/assets/img/icons/mediatype/audio.ts +7 -4
  115. package/src/assets/img/icons/mediatype/collection.ts +7 -4
  116. package/src/assets/img/icons/mediatype/etree.ts +10 -5
  117. package/src/assets/img/icons/mediatype/film.ts +2 -1
  118. package/src/assets/img/icons/mediatype/images.ts +9 -6
  119. package/src/assets/img/icons/mediatype/software.ts +9 -6
  120. package/src/assets/img/icons/mediatype/texts.ts +9 -6
  121. package/src/assets/img/icons/mediatype/tv.ts +10 -5
  122. package/src/assets/img/icons/mediatype/video.ts +10 -6
  123. package/src/assets/img/icons/mediatype/web.ts +9 -6
  124. package/src/collection-browser.ts +490 -105
  125. package/src/collection-facets.ts +325 -109
  126. package/src/mediatype-icon.ts +10 -3
  127. package/src/models.ts +139 -14
  128. package/src/restoration-state-handler.ts +234 -0
  129. package/src/sort-filter-bar/alpha-bar.ts +19 -9
  130. package/src/sort-filter-bar/img/compact.ts +5 -0
  131. package/src/sort-filter-bar/img/list.ts +5 -0
  132. package/src/sort-filter-bar/img/sort-triangle.ts +5 -0
  133. package/src/sort-filter-bar/img/tile.ts +5 -0
  134. package/src/sort-filter-bar/sort-filter-bar.ts +499 -149
  135. package/src/tiles/grid/collection-tile.ts +1 -2
  136. package/src/tiles/grid/item-tile.ts +138 -56
  137. package/src/tiles/list/tile-list-compact-header.ts +75 -0
  138. package/src/tiles/list/tile-list-compact.ts +209 -0
  139. package/src/tiles/list/tile-list.ts +261 -110
  140. package/src/tiles/tile-dispatcher.ts +51 -11
  141. package/src/utils/format-date.ts +1 -2
  142. package/dist/src/assets/img/icons/audio.d.ts +0 -1
  143. package/dist/src/assets/img/icons/audio.js +0 -9
  144. package/dist/src/assets/img/icons/audio.js.map +0 -1
  145. package/dist/src/assets/img/icons/collection.d.ts +0 -1
  146. package/dist/src/assets/img/icons/collection.js +0 -9
  147. package/dist/src/assets/img/icons/collection.js.map +0 -1
  148. package/dist/src/assets/img/icons/etree.d.ts +0 -1
  149. package/dist/src/assets/img/icons/etree.js +0 -9
  150. package/dist/src/assets/img/icons/etree.js.map +0 -1
  151. package/dist/src/assets/img/icons/images.d.ts +0 -1
  152. package/dist/src/assets/img/icons/images.js +0 -10
  153. package/dist/src/assets/img/icons/images.js.map +0 -1
  154. package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +0 -1
  155. package/dist/src/assets/img/icons/mediatype/etree copy.js +0 -9
  156. package/dist/src/assets/img/icons/mediatype/etree copy.js.map +0 -1
  157. package/dist/src/assets/img/icons/mediatype/livemusic.d.ts +0 -1
  158. package/dist/src/assets/img/icons/mediatype/livemusic.js +0 -7
  159. package/dist/src/assets/img/icons/mediatype/livemusic.js.map +0 -1
  160. package/dist/src/assets/img/icons/mediatype/photos.d.ts +0 -1
  161. package/dist/src/assets/img/icons/mediatype/photos.js +0 -7
  162. package/dist/src/assets/img/icons/mediatype/photos.js.map +0 -1
  163. package/dist/src/assets/img/icons/software.d.ts +0 -1
  164. package/dist/src/assets/img/icons/software.js +0 -10
  165. package/dist/src/assets/img/icons/software.js.map +0 -1
  166. package/dist/src/assets/img/icons/texts.d.ts +0 -1
  167. package/dist/src/assets/img/icons/texts.js +0 -10
  168. package/dist/src/assets/img/icons/texts.js.map +0 -1
  169. package/dist/src/assets/img/icons/tv.d.ts +0 -1
  170. package/dist/src/assets/img/icons/tv.js +0 -9
  171. package/dist/src/assets/img/icons/tv.js.map +0 -1
  172. package/dist/src/assets/img/icons/video.d.ts +0 -1
  173. package/dist/src/assets/img/icons/video.js +0 -10
  174. package/dist/src/assets/img/icons/video.js.map +0 -1
  175. package/dist/src/assets/img/icons/web.d.ts +0 -1
  176. package/dist/src/assets/img/icons/web.js +0 -10
  177. package/dist/src/assets/img/icons/web.js.map +0 -1
  178. package/dist/src/utils/format-string.d.ts +0 -2
  179. package/dist/src/utils/format-string.js +0 -7
  180. package/dist/src/utils/format-string.js.map +0 -1
  181. package/dist/test/utils/format-string.test.js +0 -17
  182. package/dist/test/utils/format-string.test.js.map +0 -1
  183. package/src/assets/img/icons/mediatype/foo.svg +0 -5
@@ -1,165 +1,337 @@
1
1
  import { __decorate } from "tslib";
2
- import { SortParam } from '@internetarchive/search-service';
3
- import { LitElement, html, css, nothing } from 'lit';
4
- 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';
5
5
  import './alpha-bar';
6
+ import { sortIcon } from './img/sort-triangle';
7
+ import { tileIcon } from './img/tile';
8
+ import { listIcon } from './img/list';
9
+ import { compactIcon } from './img/compact';
6
10
  let SortFilterBar = class SortFilterBar extends LitElement {
7
11
  constructor() {
8
12
  super(...arguments);
9
- this.displayMode = 'grid';
10
- this.sortDirection = 'desc';
11
- this.sortField = 'week';
13
+ this.sortDirection = null;
14
+ this.selectedSort = SortField.relevance;
15
+ this.selectedTitleFilter = null;
16
+ this.selectedCreatorFilter = null;
17
+ this.showRelevance = true;
12
18
  this.titleSelectorVisible = false;
13
19
  this.creatorSelectorVisible = false;
14
20
  this.dateSortSelectorVisible = false;
21
+ this.desktopSelectorBarWidth = 0;
22
+ this.selectorBarContainerWidth = 0;
15
23
  }
16
24
  render() {
17
25
  return html `
18
- <div id="sort-bar">
19
- <div id="sort-selector">
20
- <ul>
21
- <li>
22
- <button
23
- @click=${() => {
24
- this.sortDirection = 'desc';
25
- }}
26
- >
27
- Desc
28
- </button>
29
- <button
30
- @click=${() => {
31
- this.sortDirection = 'asc';
32
- }}
33
- >
34
- Asc</button
35
- >Sort By
36
- </li>
37
- <li>
38
- <button
39
- @click=${() => {
40
- this.sortField = 'week';
41
- }}
42
- >
43
- Views
44
- </button>
45
- </li>
46
- <li>
47
- <button
48
- @click=${() => {
49
- this.titleSelectorVisible = !this.titleSelectorVisible;
50
- this.sortField = 'titleSorter';
51
- }}
52
- >
53
- Title
54
- </button>
55
- </li>
56
- <li>
57
- <button
58
- @click=${() => {
59
- this.dateSortSelectorVisible = !this.dateSortSelectorVisible;
60
- }}
61
- >
62
- Date Archived
63
- </button>
64
- </li>
65
- <li>
66
- <button
67
- @click=${() => {
68
- this.creatorSelectorVisible = !this.creatorSelectorVisible;
69
- this.sortField = 'creatorSorter';
70
- }}
71
- >
72
- Creator
73
- </button>
74
- </li>
75
- </ul>
76
- </div>
77
-
78
- <div id="display-style">
79
- <ul>
80
- ${this.displayMode !== 'grid'
81
- ? html `<li>
82
- <input type="checkbox" @click=${this.detailSelected} />
83
- Details
84
- </li>`
26
+ <div id="container">
27
+ ${this.titleSelectorVisible || this.selectedSort === 'title'
28
+ ? this.titleSelectorBar
85
29
  : nothing}
30
+ ${this.creatorSelectorVisible || this.selectedSort === 'creator'
31
+ ? this.creatorSelectorBar
32
+ : nothing}
33
+
34
+ <div id="sort-bar">
35
+ <div id="sort-direction-container">
36
+ ${this.sortDirectionSelectorTemplate}
37
+ </div>
86
38
 
87
- <li>
88
- <button id="grid-button" @click=${this.gridSelected}>Grid</button>
89
- </li>
90
- <li>
91
- <button id="list-button" @click=${this.listSelected}>List</button>
92
- </li>
93
- </ul>
39
+ <div id="sort-selector-container">
40
+ ${this.mobileSortSelectorTemplate}
41
+ ${this.desktopSortSelectorTemplate}
42
+ </div>
43
+
44
+ <div id="display-style-selector">${this.displayOptionTemplate}</div>
94
45
  </div>
95
- </div>
96
46
 
97
- ${this.dateSortSelectorVisible ? this.dateSortSelector : nothing}
98
- ${this.titleSelectorVisible ? this.titleSelectorBar : nothing}
99
- ${this.creatorSelectorVisible ? this.creatorSelectorBar : nothing}
47
+ ${this.dateSortSelectorVisible ? this.dateSortSelector : nothing}
48
+
49
+ <div id="bottom-shadow"></div>
50
+ </div>
100
51
  `;
101
52
  }
102
53
  updated(changed) {
103
54
  if (changed.has('displayMode')) {
104
55
  this.displayModeChanged();
105
56
  }
106
- if (changed.has('sortDirection') || changed.has('sortField')) {
107
- this.sortChanged();
57
+ if (changed.has('selectedSort') && this.sortDirection === null) {
58
+ this.sortDirection = 'desc';
59
+ }
60
+ if (changed.has('selectedTitleFilter') && this.selectedTitleFilter) {
61
+ this.titleSelectorVisible = true;
62
+ }
63
+ if (changed.has('selectedCreatorFilter') && this.selectedCreatorFilter) {
64
+ this.creatorSelectorVisible = true;
65
+ }
66
+ if (changed.has('resizeObserver')) {
67
+ const oldObserver = changed.get('resizeObserver');
68
+ if (oldObserver)
69
+ this.disconnectResizeObserver(oldObserver);
70
+ this.setupResizeObserver();
108
71
  }
109
72
  }
110
- get dateSortSelector() {
73
+ disconnectedCallback() {
74
+ if (this.resizeObserver) {
75
+ this.disconnectResizeObserver(this.resizeObserver);
76
+ }
77
+ }
78
+ disconnectResizeObserver(resizeObserver) {
79
+ resizeObserver.removeObserver({
80
+ target: this.sortSelectorContainer,
81
+ handler: this,
82
+ });
83
+ resizeObserver.removeObserver({
84
+ target: this.desktopSortSelector,
85
+ handler: this,
86
+ });
87
+ }
88
+ setupResizeObserver() {
89
+ if (!this.resizeObserver)
90
+ return;
91
+ this.resizeObserver.addObserver({
92
+ target: this.sortSelectorContainer,
93
+ handler: this,
94
+ });
95
+ this.resizeObserver.addObserver({
96
+ target: this.desktopSortSelector,
97
+ handler: this,
98
+ });
99
+ }
100
+ get mobileSelectorVisible() {
101
+ return this.selectorBarContainerWidth - 10 < this.desktopSelectorBarWidth;
102
+ }
103
+ handleResize(entry) {
104
+ if (entry.target === this.desktopSortSelector)
105
+ this.desktopSelectorBarWidth = entry.contentRect.width;
106
+ else if (entry.target === this.sortSelectorContainer)
107
+ this.selectorBarContainerWidth = entry.contentRect.width;
108
+ }
109
+ get sortDirectionSelectorTemplate() {
111
110
  return html `
112
- <div id="date-sort-selector">
113
- <ul>
114
- <li>
115
- <button
116
- @click=${() => {
117
- this.sortField = 'publicdate';
111
+ <div id="sort-direction-selector">
112
+ <button
113
+ id="sort-ascending-btn"
114
+ class="sort-button ${this.sortDirection === 'asc' ? 'selected' : ''}"
115
+ ?disabled=${this.selectedSort === 'relevance'}
116
+ @click=${() => {
117
+ this.setSortDirections('asc');
118
118
  }}
119
- >
120
- Date Archived
121
- </button>
122
- </li>
123
- <li>
124
- <button
125
- @click=${() => {
126
- this.sortField = 'date';
119
+ >
120
+ ${sortIcon}
121
+ </button>
122
+ <button
123
+ id="sort-descending-btn"
124
+ class="sort-button ${this.sortDirection === 'desc' ? 'selected' : ''}"
125
+ ?disabled=${this.selectedSort === 'relevance'}
126
+ @click=${() => {
127
+ this.setSortDirections('desc');
127
128
  }}
128
- >
129
- Date Published
130
- </button>
131
- </li>
132
- <li>
133
- <button
134
- @click=${() => {
135
- this.sortField = 'reviewdate';
129
+ >
130
+ ${sortIcon}
131
+ </button>
132
+ </div>
133
+ `;
134
+ }
135
+ get desktopSortSelectorTemplate() {
136
+ return html `
137
+ <ul
138
+ id="desktop-sort-selector"
139
+ class=${this.mobileSelectorVisible ? 'hidden' : 'visible'}
140
+ >
141
+ <li id="sort-by-text">Sort By</li>
142
+ <li>
143
+ ${this.showRelevance
144
+ ? this.getSortDisplayOption(SortField.relevance)
145
+ : nothing}
146
+ </li>
147
+ <li>${this.getSortDisplayOption(SortField.views)}</li>
148
+ <li>${this.getSortDisplayOption(SortField.title)}</li>
149
+ <li>
150
+ ${this.getSortDisplayOption(SortField.datearchived, {
151
+ additionalClickEvent: () => {
152
+ this.dateSortSelectorVisible = !this.dateSortSelectorVisible;
153
+ },
154
+ displayName: html `${this.dateSortField}`,
155
+ isSelected: () => this.dateOptionSelected,
156
+ })}
157
+ </li>
158
+ <li>
159
+ ${this.getSortDisplayOption(SortField.creator, {
160
+ additionalClickEvent: () => {
161
+ this.creatorSelectorVisible = !this.creatorSelectorVisible;
162
+ },
163
+ })}
164
+ </li>
165
+ </ul>
166
+ `;
167
+ }
168
+ /**
169
+ * This generates each of the sort option links.
170
+ *
171
+ * It manages the display value and the selected state of the option.
172
+ *
173
+ * @param sortField
174
+ * @param options {
175
+ * additionalClickEvent?: () => void; If this is provided, it will also be called when the option is clicked.
176
+ * displayName?: TemplateResult; The name to display for the option. Defaults to the sortField display name.
177
+ * isSelected?: () => boolean; A function that returns true if the option is selected. Defaults to the selectedSort === sortField.
178
+ * }
179
+ * @returns
180
+ */
181
+ getSortDisplayOption(sortField, options) {
182
+ var _a, _b;
183
+ const isSelected = (_a = options === null || options === void 0 ? void 0 : options.isSelected) !== null && _a !== void 0 ? _a : (() => this.selectedSort === sortField);
184
+ const displayName = (_b = options === null || options === void 0 ? void 0 : options.displayName) !== null && _b !== void 0 ? _b : SortFieldDisplayName[sortField];
185
+ return html `
186
+ <a
187
+ href="#"
188
+ @click=${(e) => {
189
+ var _a;
190
+ e.preventDefault();
191
+ this.setSelectedSort(sortField);
192
+ (_a = options === null || options === void 0 ? void 0 : options.additionalClickEvent) === null || _a === void 0 ? void 0 : _a.call(options, e);
193
+ }}
194
+ class=${isSelected() ? 'selected' : ''}
195
+ >
196
+ ${displayName}
197
+ </a>
198
+ `;
199
+ }
200
+ get mobileSortSelectorTemplate() {
201
+ return html `
202
+ <select
203
+ id="mobile-sort-selector"
204
+ @change=${this.mobileSortChanged}
205
+ class=${this.mobileSelectorVisible ? 'visible' : 'hidden'}
206
+ >
207
+ ${Object.keys(SortField).map(field => html `
208
+ <option value="${field}" ?selected=${this.selectedSort === field}>
209
+ ${SortFieldDisplayName[field]}
210
+ </option>
211
+ `)}
212
+ </select>
213
+ `;
214
+ }
215
+ mobileSortChanged(e) {
216
+ const target = e.target;
217
+ this.setSelectedSort(target.value);
218
+ }
219
+ get displayOptionTemplate() {
220
+ return html `
221
+ <ul>
222
+ <li>
223
+ <button
224
+ id="grid-button"
225
+ @click=${() => {
226
+ this.displayMode = 'grid';
227
+ }}
228
+ class=${this.displayMode === 'grid' ? 'active' : ''}
229
+ >
230
+ ${tileIcon}
231
+ </button>
232
+ </li>
233
+ <li>
234
+ <button
235
+ id="grid-button"
236
+ @click=${() => {
237
+ this.displayMode = 'list-detail';
136
238
  }}
137
- >
138
- Date Reviewed
139
- </button>
140
- </li>
141
- <li>
142
- <button
143
- @click=${() => {
144
- this.sortField = 'addeddate';
239
+ class=${this.displayMode === 'list-detail' ? 'active' : ''}
240
+ >
241
+ ${listIcon}
242
+ </button>
243
+ </li>
244
+ <li>
245
+ <button
246
+ id="list-button"
247
+ @click=${() => {
248
+ this.displayMode = 'list-compact';
145
249
  }}
146
- >
147
- Date Added
148
- </button>
149
- </li>
250
+ class=${this.displayMode === 'list-compact' ? 'active' : ''}
251
+ >
252
+ ${compactIcon}
253
+ </button>
254
+ </li>
255
+ </ul>
256
+ `;
257
+ }
258
+ get dateSortSelector() {
259
+ return html `
260
+ <div id="date-sort-selector">
261
+ <ul>
262
+ <li>${this.getDateSortButton(SortField.datearchived)}</li>
263
+ <li>${this.getDateSortButton(SortField.datepublished)}</li>
264
+ <li>${this.getDateSortButton(SortField.datereviewed)}</li>
265
+ <li>${this.getDateSortButton(SortField.dateadded)}</li>
150
266
  </ul>
151
267
  </div>
152
268
  `;
153
269
  }
270
+ getDateSortButton(sortField) {
271
+ return html `
272
+ <button
273
+ @click=${() => {
274
+ this.selectDateSort(sortField);
275
+ }}
276
+ >
277
+ ${SortFieldDisplayName[sortField]}
278
+ </button>
279
+ `;
280
+ }
281
+ selectDateSort(sortField) {
282
+ this.dateSortSelectorVisible = false;
283
+ this.setSelectedSort(sortField);
284
+ }
285
+ setSortDirections(sortDirection) {
286
+ this.sortDirection = sortDirection;
287
+ this.emitSortChangedEvent();
288
+ }
289
+ setSelectedSort(sort) {
290
+ this.selectedSort = sort;
291
+ this.emitSortChangedEvent();
292
+ }
293
+ /**
294
+ * There are four date sort options.
295
+ *
296
+ * This checks to see if the current sort is one of them.
297
+ *
298
+ * @readonly
299
+ * @private
300
+ * @type {boolean}
301
+ * @memberof SortFilterBar
302
+ */
303
+ get dateOptionSelected() {
304
+ return [
305
+ 'datearchived',
306
+ 'datepublished',
307
+ 'datereviewed',
308
+ 'dateadded',
309
+ ].includes(this.selectedSort);
310
+ }
311
+ /**
312
+ * The display name of the current date field
313
+ *
314
+ * @readonly
315
+ * @private
316
+ * @type {string}
317
+ * @memberof SortFilterBar
318
+ */
319
+ get dateSortField() {
320
+ var _a;
321
+ const defaultSort = SortFieldDisplayName[SortField.datearchived];
322
+ return this.dateOptionSelected
323
+ ? (_a = SortFieldDisplayName[this.selectedSort]) !== null && _a !== void 0 ? _a : defaultSort
324
+ : defaultSort;
325
+ }
154
326
  get titleSelectorBar() {
155
327
  return html ` <alpha-bar
156
- headline="Title Starts With"
328
+ .selectedLetter=${this.selectedTitleFilter}
157
329
  @letterChanged=${this.titleLetterChanged}
158
330
  ></alpha-bar>`;
159
331
  }
160
332
  get creatorSelectorBar() {
161
333
  return html ` <alpha-bar
162
- headline="Creator Starts With"
334
+ .selectedLetter=${this.selectedCreatorFilter}
163
335
  @letterChanged=${this.creatorLetterChanged}
164
336
  ></alpha-bar>`;
165
337
  }
@@ -175,27 +347,18 @@ let SortFilterBar = class SortFilterBar extends LitElement {
175
347
  });
176
348
  this.dispatchEvent(event);
177
349
  }
178
- gridSelected() {
179
- this.displayMode = 'grid';
180
- }
181
- listSelected() {
182
- this.displayMode = 'list-compact';
183
- }
184
- detailSelected(e) {
185
- this.displayMode = e.target.checked
186
- ? 'list-detail'
187
- : 'list-compact';
188
- }
189
350
  displayModeChanged() {
190
351
  const event = new CustomEvent('displayModeChanged', {
191
352
  detail: { displayMode: this.displayMode },
192
353
  });
193
354
  this.dispatchEvent(event);
194
355
  }
195
- sortChanged() {
196
- const sort = new SortParam(this.sortField, this.sortDirection);
356
+ emitSortChangedEvent() {
197
357
  const event = new CustomEvent('sortChanged', {
198
- detail: { sort },
358
+ detail: {
359
+ selectedSort: this.selectedSort,
360
+ sortDirection: this.sortDirection,
361
+ },
199
362
  });
200
363
  this.dispatchEvent(event);
201
364
  }
@@ -204,6 +367,24 @@ SortFilterBar.styles = css `
204
367
  #sort-bar {
205
368
  display: flex;
206
369
  justify-content: space-between;
370
+ border: 1px solid rgb(232, 232, 232);
371
+ align-items: center;
372
+ padding: 0.5rem 1.5rem;
373
+ }
374
+
375
+ #sort-direction-container {
376
+ flex: 0;
377
+ }
378
+
379
+ #sort-by-text {
380
+ text-transform: uppercase;
381
+ }
382
+
383
+ #bottom-shadow {
384
+ height: 1px;
385
+ width: 100%;
386
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
387
+ background-color: #bbb;
207
388
  }
208
389
 
209
390
  ul {
@@ -215,22 +396,128 @@ SortFilterBar.styles = css `
215
396
  }
216
397
 
217
398
  li {
218
- padding: 0.5rem 0 0.5rem 0;
399
+ padding: 0;
400
+ }
401
+
402
+ .sort-button {
403
+ background: none;
404
+ color: inherit;
405
+ border: none;
406
+ padding: 0;
407
+ cursor: pointer;
408
+ outline: inherit;
409
+ width: 12px;
410
+ height: 12px;
411
+ opacity: 0.5;
412
+ }
413
+
414
+ .sort-button.selected {
415
+ opacity: 1;
416
+ }
417
+
418
+ .sort-button:disabled {
419
+ opacity: 0.25;
420
+ cursor: default;
421
+ }
422
+
423
+ #show-details {
424
+ text-transform: uppercase;
425
+ cursor: pointer;
426
+ display: flex;
427
+ }
428
+
429
+ #show-details input {
430
+ margin-right: 0.5rem;
431
+ flex: 0 0 12px;
432
+ }
433
+
434
+ #sort-descending-btn {
435
+ transform: rotate(180deg);
436
+ }
437
+
438
+ #sort-direction-selector {
439
+ display: flex;
440
+ flex-direction: column;
441
+ gap: 3px;
442
+ margin-right: 1rem;
443
+ }
444
+
445
+ #sort-selector-container {
446
+ flex: 1;
447
+ }
448
+
449
+ /*
450
+ we move the desktop sort selector offscreen instead of display: none
451
+ because we need to observe the width of it vs its container to determine
452
+ if it's wide enough to display the desktop version and if you displY: none,
453
+ the width becomes 0
454
+ */
455
+ #desktop-sort-selector.hidden {
456
+ position: absolute;
457
+ top: -9999px;
458
+ left: -9999px;
219
459
  }
220
460
 
221
- #sort-selector li::after {
461
+ #mobile-sort-selector.hidden {
462
+ display: none;
463
+ }
464
+
465
+ #desktop-sort-selector {
466
+ display: inline-flex;
467
+ }
468
+
469
+ #desktop-sort-selector li {
470
+ display: flex;
471
+ align-items: center;
472
+ }
473
+
474
+ #desktop-sort-selector li a {
475
+ text-decoration: none;
476
+ text-transform: uppercase;
477
+ font-size: 1.4rem;
478
+ color: #333;
479
+ }
480
+
481
+ #desktop-sort-selector li a.selected {
482
+ font-weight: bold;
483
+ }
484
+
485
+ #desktop-sort-selector li::after {
222
486
  content: '•';
223
487
  padding-left: 1rem;
224
488
  padding-right: 1rem;
225
489
  }
226
490
 
227
- #sort-selector li:first-child::after {
491
+ #desktop-sort-selector li:first-child::after {
228
492
  content: '';
229
493
  }
230
494
 
231
- #sort-selector li:last-child::after {
495
+ #desktop-sort-selector li:last-child::after {
232
496
  content: '';
233
497
  }
498
+
499
+ #display-style-selector {
500
+ flex: 0;
501
+ }
502
+
503
+ #display-style-selector button {
504
+ background: none;
505
+ color: inherit;
506
+ border: none;
507
+ appearance: none;
508
+ cursor: pointer;
509
+ -webkit-appearance: none;
510
+ opacity: 0.5;
511
+ }
512
+
513
+ #display-style-selector button.active {
514
+ opacity: 1;
515
+ }
516
+
517
+ #display-style-selector button svg {
518
+ width: 24px;
519
+ height: 24px;
520
+ }
234
521
  `;
235
522
  __decorate([
236
523
  property({ type: String })
@@ -240,7 +527,19 @@ __decorate([
240
527
  ], SortFilterBar.prototype, "sortDirection", void 0);
241
528
  __decorate([
242
529
  property({ type: String })
243
- ], SortFilterBar.prototype, "sortField", void 0);
530
+ ], SortFilterBar.prototype, "selectedSort", void 0);
531
+ __decorate([
532
+ property({ type: String })
533
+ ], SortFilterBar.prototype, "selectedTitleFilter", void 0);
534
+ __decorate([
535
+ property({ type: String })
536
+ ], SortFilterBar.prototype, "selectedCreatorFilter", void 0);
537
+ __decorate([
538
+ property({ type: Boolean })
539
+ ], SortFilterBar.prototype, "showRelevance", void 0);
540
+ __decorate([
541
+ property({ type: Object })
542
+ ], SortFilterBar.prototype, "resizeObserver", void 0);
244
543
  __decorate([
245
544
  state()
246
545
  ], SortFilterBar.prototype, "titleSelectorVisible", void 0);
@@ -250,6 +549,18 @@ __decorate([
250
549
  __decorate([
251
550
  state()
252
551
  ], SortFilterBar.prototype, "dateSortSelectorVisible", void 0);
552
+ __decorate([
553
+ state()
554
+ ], SortFilterBar.prototype, "desktopSelectorBarWidth", void 0);
555
+ __decorate([
556
+ state()
557
+ ], SortFilterBar.prototype, "selectorBarContainerWidth", void 0);
558
+ __decorate([
559
+ query('#desktop-sort-selector')
560
+ ], SortFilterBar.prototype, "desktopSortSelector", void 0);
561
+ __decorate([
562
+ query('#sort-selector-container')
563
+ ], SortFilterBar.prototype, "sortSelectorContainer", void 0);
253
564
  SortFilterBar = __decorate([
254
565
  customElement('sort-filter-bar')
255
566
  ], SortFilterBar);