@internetarchive/collection-browser 0.4.12 → 0.4.13

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 (43) hide show
  1. package/dist/src/collection-browser.js +3 -0
  2. package/dist/src/collection-browser.js.map +1 -1
  3. package/dist/src/collection-facets.js +1 -10
  4. package/dist/src/collection-facets.js.map +1 -1
  5. package/dist/src/models.d.ts +5 -1
  6. package/dist/src/models.js +19 -8
  7. package/dist/src/models.js.map +1 -1
  8. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +1 -2
  9. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js.map +1 -1
  10. package/dist/src/sort-filter-bar/img/list.js +1 -1
  11. package/dist/src/sort-filter-bar/img/list.js.map +1 -1
  12. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -0
  13. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +15 -0
  14. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js.map +1 -0
  15. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -0
  16. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +17 -0
  17. package/dist/src/sort-filter-bar/img/sort-toggle-down.js.map +1 -0
  18. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -0
  19. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +17 -0
  20. package/dist/src/sort-filter-bar/img/sort-toggle-up.js.map +1 -0
  21. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +95 -14
  22. package/dist/src/sort-filter-bar/sort-filter-bar.js +386 -292
  23. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  24. package/dist/src/tiles/grid/item-tile.js +9 -5
  25. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  26. package/dist/src/tiles/grid/tile-stats.d.ts +1 -0
  27. package/dist/src/tiles/grid/tile-stats.js +5 -1
  28. package/dist/src/tiles/grid/tile-stats.js.map +1 -1
  29. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +241 -68
  30. package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
  31. package/package.json +2 -1
  32. package/src/collection-browser.ts +3 -0
  33. package/src/collection-facets.ts +1 -10
  34. package/src/models.ts +23 -8
  35. package/src/sort-filter-bar/alpha-bar-tooltip.ts +1 -2
  36. package/src/sort-filter-bar/img/list.ts +1 -1
  37. package/src/sort-filter-bar/img/sort-toggle-disabled.ts +15 -0
  38. package/src/sort-filter-bar/img/sort-toggle-down.ts +17 -0
  39. package/src/sort-filter-bar/img/sort-toggle-up.ts +17 -0
  40. package/src/sort-filter-bar/sort-filter-bar.ts +433 -303
  41. package/src/tiles/grid/item-tile.ts +6 -1
  42. package/src/tiles/grid/tile-stats.ts +3 -1
  43. package/test/sort-filter-bar/sort-filter-bar.test.ts +377 -101
@@ -35,6 +35,10 @@ export class ItemTile extends LitElement {
35
35
 
36
36
  render() {
37
37
  const itemTitle = this.model?.title;
38
+ const [viewCount, viewLabel] =
39
+ this.sortParam?.field === 'week'
40
+ ? [this.model?.weeklyViewCount, 'weekly views']
41
+ : [this.model?.viewCount, 'all-time views'];
38
42
 
39
43
  return html`
40
44
  <div class="container">
@@ -58,7 +62,8 @@ export class ItemTile extends LitElement {
58
62
 
59
63
  <tile-stats
60
64
  .mediatype=${this.model?.mediatype}
61
- .viewCount=${this.model?.viewCount}
65
+ .viewCount=${viewCount}
66
+ .viewLabel=${viewLabel}
62
67
  .favCount=${this.model?.favCount}
63
68
  .commentCount=${this.model?.commentCount}
64
69
  >
@@ -16,6 +16,8 @@ export class TileStats extends LitElement {
16
16
 
17
17
  @property({ type: Number }) viewCount?: number;
18
18
 
19
+ @property({ type: String }) viewLabel?: number;
20
+
19
21
  @property({ type: Number }) favCount?: number;
20
22
 
21
23
  @property({ type: Number }) commentCount?: number;
@@ -31,7 +33,7 @@ export class TileStats extends LitElement {
31
33
  const uploadsOrViewsTitle =
32
34
  this.mediatype === 'account'
33
35
  ? `${this.itemCount} uploads`
34
- : `${this.viewCount} all-time views`;
36
+ : `${this.viewCount} ${this.viewLabel ?? 'all-time views'}`;
35
37
 
36
38
  return html`
37
39
  <div class="item-stats">
@@ -1,146 +1,351 @@
1
1
  /* eslint-disable import/no-duplicates */
2
2
  import { expect, fixture } from '@open-wc/testing';
3
3
  import { html } from 'lit';
4
+ import type { IaDropdown } from '@internetarchive/ia-dropdown';
5
+ import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
4
6
  import type { SortFilterBar } from '../../src/sort-filter-bar/sort-filter-bar';
5
7
  import type { SortField } from '../../src/models';
6
8
 
7
9
  import '../../src/sort-filter-bar/sort-filter-bar';
8
10
 
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
11
  describe('Sort selector default buttons', async () => {
43
12
  const el = await fixture<SortFilterBar>(html`
44
13
  <sort-filter-bar> </sort-filter-bar>
45
14
  `);
46
15
  const sortSelectorContainer = el.shadowRoot?.querySelector(
16
+ '#sort-selector-container'
17
+ );
18
+ const desktopSortSelector = sortSelectorContainer?.querySelector(
47
19
  '#desktop-sort-selector'
48
20
  );
49
21
 
22
+ before(async () => {
23
+ el.resizeObserver = new SharedResizeObserver();
24
+ await el.updateComplete;
25
+ });
26
+
27
+ it('should render basic component', async () => {
28
+ expect(sortSelectorContainer).to.exist;
29
+ expect(desktopSortSelector).to.exist;
30
+ });
31
+
50
32
  it('should render sort-by label', async () => {
51
- expect(sortSelectorContainer?.children.item(0)?.textContent).to.equal(
52
- 'Sort By'
33
+ const sortByLabel = el.shadowRoot?.querySelector('.sort-by-text');
34
+ expect(sortByLabel).to.exist;
35
+ expect(sortByLabel?.textContent?.trim()).to.equal('Sort by:');
36
+ });
37
+
38
+ it('should render sort direction button', async () => {
39
+ const sortDirections = el.shadowRoot?.querySelector(
40
+ '.sort-direction-container'
53
41
  );
42
+ expect(sortDirections).to.exist;
43
+ expect(sortDirections?.querySelector('.sort-direction-icon')).to.exist;
54
44
  });
55
45
 
56
46
  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');
47
+ const defaultSortSelector =
48
+ desktopSortSelector?.querySelector('a.selected');
49
+ expect(defaultSortSelector?.textContent?.trim()).to.equal('Relevance');
62
50
  });
63
51
 
64
52
  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');
53
+ const defaultSortSelector = desktopSortSelector?.children
54
+ .item(1)
55
+ ?.querySelector('ia-dropdown');
56
+ expect(defaultSortSelector?.textContent?.trim()).to.equal('Weekly views');
69
57
  });
70
58
 
71
59
  it('should render active view-sort selectors', async () => {
72
60
  el.selectedSort = 'alltimeview' as SortField;
73
61
  await el.updateComplete;
74
62
 
75
- const defaultSortSelector =
76
- sortSelectorContainer?.querySelector('a.selected');
77
- expect(defaultSortSelector?.textContent).to.contain('All-time Views');
63
+ const defaultSortSelector = desktopSortSelector?.querySelector(
64
+ 'ia-dropdown.selected'
65
+ );
66
+ expect(defaultSortSelector?.textContent?.trim()).to.equal('All-time views');
78
67
  });
79
68
 
80
69
  it('should render default title-sort selector', async () => {
81
- const defaultSortSelector = sortSelectorContainer?.children
82
- .item(3)
70
+ const defaultSortSelector = desktopSortSelector?.children
71
+ .item(2)
83
72
  ?.querySelector('a');
84
- expect(defaultSortSelector?.textContent).to.contain('Title');
73
+ expect(defaultSortSelector?.textContent?.trim()).to.equal('Title');
85
74
  });
86
75
 
87
76
  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');
77
+ const defaultSortSelector = desktopSortSelector?.children
78
+ .item(3)
79
+ ?.querySelector('ia-dropdown');
80
+ expect(defaultSortSelector?.textContent?.trim()).to.equal('Date published');
92
81
  });
93
82
 
94
83
  it('should render active date-sort selectors', async () => {
95
84
  el.selectedSort = 'datereviewed' as SortField;
96
85
  await el.updateComplete;
97
86
 
98
- const defaultSortSelector =
99
- sortSelectorContainer?.querySelector('a.selected');
100
- expect(defaultSortSelector?.textContent).to.contain('Date Reviewed');
87
+ const defaultSortSelector = desktopSortSelector?.querySelector(
88
+ 'ia-dropdown.selected'
89
+ );
90
+ expect(defaultSortSelector?.textContent?.trim()).to.equal('Date reviewed');
101
91
  });
102
92
 
103
93
  it('should render default creator-sort selector', async () => {
104
- const defaultSortSelector = sortSelectorContainer?.children
105
- .item(5)
94
+ const defaultSortSelector = desktopSortSelector?.children
95
+ .item(4)
106
96
  ?.querySelector('a');
107
- expect(defaultSortSelector?.textContent).to.contain('Creator');
97
+ expect(defaultSortSelector?.textContent?.trim()).to.equal('Creator');
108
98
  });
109
99
 
110
- it('click event on view-sort selector', async () => {
111
- const defaultSortSelector = sortSelectorContainer?.children
100
+ it('handles click event on view-sort selector', async () => {
101
+ const defaultSortSelector = desktopSortSelector?.children
102
+ .item(1)
103
+ ?.querySelector('.dropdown-label') as HTMLElement;
104
+
105
+ defaultSortSelector?.click();
106
+ await el.updateComplete;
107
+
108
+ expect(el.selectedSort).to.equal('weeklyview');
109
+ });
110
+
111
+ it('handles click event on title selector', async () => {
112
+ const defaultSortSelector = desktopSortSelector?.children
112
113
  .item(2)
113
114
  ?.querySelector('a');
114
115
 
115
- await defaultSortSelector?.click();
116
+ defaultSortSelector?.click();
117
+ await el.updateComplete;
118
+
119
+ expect(el.selectedSort).to.equal('title');
120
+ });
121
+
122
+ it('handles click event on date-sort selector', async () => {
123
+ const defaultSortSelector = desktopSortSelector?.children
124
+ .item(3)
125
+ ?.querySelector('.dropdown-label') as HTMLElement;
126
+
127
+ defaultSortSelector?.click();
128
+ await el.updateComplete;
129
+
130
+ expect(el.selectedSort).to.equal('date');
131
+ });
132
+
133
+ it('handles return/space key event on view-sort selector', async () => {
134
+ const defaultSortSelector = desktopSortSelector?.children
135
+ .item(1)
136
+ ?.querySelector('.dropdown-label') as HTMLElement;
137
+
138
+ el.selectedSort = 'relevance' as SortField;
139
+ const enterEvent = new KeyboardEvent('keydown', { key: 'Enter' });
140
+ defaultSortSelector?.dispatchEvent(enterEvent);
141
+ await el.updateComplete;
142
+
143
+ expect(el.selectedSort).to.equal('weeklyview');
144
+
145
+ el.selectedSort = 'relevance' as SortField;
146
+ const spaceEvent = new KeyboardEvent('keydown', { key: ' ' });
147
+ defaultSortSelector?.dispatchEvent(spaceEvent);
148
+ await el.updateComplete;
149
+
116
150
  expect(el.selectedSort).to.equal('weeklyview');
117
151
  });
118
152
 
119
- it('click event on title selector', async () => {
120
- const defaultSortSelector = sortSelectorContainer?.children
153
+ it('handles return/space key event on date-sort selector', async () => {
154
+ const defaultSortSelector = desktopSortSelector?.children
121
155
  .item(3)
122
- ?.querySelector('a');
156
+ ?.querySelector('.dropdown-label') as HTMLElement;
123
157
 
124
- await defaultSortSelector?.click();
125
- expect(el.selectedSort).to.equal('title');
158
+ el.selectedSort = 'relevance' as SortField;
159
+ const enterEvent = new KeyboardEvent('keydown', { key: 'Enter' });
160
+ defaultSortSelector?.dispatchEvent(enterEvent);
161
+ await el.updateComplete;
162
+
163
+ expect(el.selectedSort).to.equal('date');
164
+
165
+ el.selectedSort = 'relevance' as SortField;
166
+ const spaceEvent = new KeyboardEvent('keydown', { key: ' ' });
167
+ defaultSortSelector?.dispatchEvent(spaceEvent);
168
+ await el.updateComplete;
169
+
170
+ expect(el.selectedSort).to.equal('date');
126
171
  });
127
172
 
128
- it('click event on date-sort selector', async () => {
129
- const defaultSortSelector = sortSelectorContainer?.children
173
+ it('handles click event on creator selector', async () => {
174
+ const defaultSortSelector = desktopSortSelector?.children
130
175
  .item(4)
131
176
  ?.querySelector('a');
132
177
 
133
- await defaultSortSelector?.click();
178
+ defaultSortSelector?.click();
179
+ await el.updateComplete;
180
+
181
+ expect(el.selectedSort).to.equal('creator');
182
+ });
183
+
184
+ it('handles click event on view-sort dropdown option', async () => {
185
+ const defaultSortSelector = desktopSortSelector?.children
186
+ .item(1)
187
+ ?.querySelector('ia-dropdown') as IaDropdown;
188
+
189
+ const firstOption = defaultSortSelector?.shadowRoot?.querySelector(
190
+ 'li > button'
191
+ ) as HTMLButtonElement;
192
+ expect(firstOption).to.exist;
193
+
194
+ firstOption?.click();
195
+ await el.updateComplete;
196
+
197
+ expect(el.selectedSort).to.equal('weeklyview');
198
+ });
199
+
200
+ it('handles click event on date-sort dropdown option', async () => {
201
+ const defaultSortSelector = desktopSortSelector?.children
202
+ .item(3)
203
+ ?.querySelector('ia-dropdown') as IaDropdown;
204
+
205
+ const firstOption = defaultSortSelector?.shadowRoot?.querySelector(
206
+ 'li > button'
207
+ ) as HTMLButtonElement;
208
+ expect(firstOption).to.exist;
209
+
210
+ firstOption?.click();
211
+ await el.updateComplete;
212
+
134
213
  expect(el.selectedSort).to.equal('date');
135
214
  });
136
215
 
137
- it('click event on creator selector', async () => {
138
- const defaultSortSelector = sortSelectorContainer?.children
139
- .item(5)
140
- ?.querySelector('a');
216
+ it('shows view sort selector backdrop when view sort open', async () => {
217
+ const defaultSortSelector = desktopSortSelector?.children
218
+ .item(1)
219
+ ?.querySelector('ia-dropdown') as IaDropdown;
141
220
 
142
- await defaultSortSelector?.click();
143
- expect(el.selectedSort).to.equal('creator');
221
+ const caret = defaultSortSelector?.shadowRoot?.querySelector(
222
+ '.caret'
223
+ ) as HTMLElement;
224
+ expect(caret).to.exist;
225
+
226
+ caret?.click();
227
+ await el.updateComplete;
228
+
229
+ let backdrop = el.shadowRoot?.querySelector(
230
+ '#sort-selector-backdrop'
231
+ ) as HTMLElement;
232
+ expect(backdrop).to.exist;
233
+
234
+ backdrop?.click();
235
+ await el.updateComplete;
236
+
237
+ backdrop = el.shadowRoot?.querySelector(
238
+ '#sort-selector-backdrop'
239
+ ) as HTMLElement;
240
+ expect(backdrop).not.to.exist;
241
+ });
242
+
243
+ it('shows date sort selector backdrop when date sort open', async () => {
244
+ const defaultSortSelector = desktopSortSelector?.children
245
+ .item(3)
246
+ ?.querySelector('ia-dropdown') as IaDropdown;
247
+
248
+ const caret = defaultSortSelector?.shadowRoot?.querySelector(
249
+ '.caret'
250
+ ) as HTMLElement;
251
+ expect(caret).to.exist;
252
+
253
+ caret?.click();
254
+ await el.updateComplete;
255
+
256
+ let backdrop = el.shadowRoot?.querySelector(
257
+ '#sort-selector-backdrop'
258
+ ) as HTMLElement;
259
+ expect(backdrop).to.exist;
260
+
261
+ backdrop?.click();
262
+ await el.updateComplete;
263
+
264
+ backdrop = el.shadowRoot?.querySelector(
265
+ '#sort-selector-backdrop'
266
+ ) as HTMLElement;
267
+ expect(backdrop).not.to.exist;
268
+ });
269
+
270
+ it('closes dropdown by hitting escape key', async () => {
271
+ const defaultSortSelector = desktopSortSelector?.children
272
+ .item(3)
273
+ ?.querySelector('ia-dropdown') as IaDropdown;
274
+
275
+ const caret = defaultSortSelector?.shadowRoot?.querySelector(
276
+ '.caret'
277
+ ) as HTMLElement;
278
+ expect(caret).to.exist;
279
+
280
+ caret?.click();
281
+ await el.updateComplete;
282
+
283
+ let backdrop = el.shadowRoot?.querySelector(
284
+ '#sort-selector-backdrop'
285
+ ) as HTMLElement;
286
+ expect(backdrop).to.exist;
287
+
288
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
289
+ await el.updateComplete;
290
+
291
+ backdrop = el.shadowRoot?.querySelector(
292
+ '#sort-selector-backdrop'
293
+ ) as HTMLElement;
294
+ expect(backdrop).not.to.exist;
295
+ });
296
+ });
297
+
298
+ describe('Sort direction button behavior', () => {
299
+ it('should disable sort direction button when sorting by relevance', async () => {
300
+ const el = await fixture<SortFilterBar>(html`
301
+ <sort-filter-bar> </sort-filter-bar>
302
+ `);
303
+
304
+ el.selectedSort = 'relevance' as SortField;
305
+ await el.updateComplete;
306
+
307
+ const sortDirectionButton = el.shadowRoot?.querySelector(
308
+ '.sort-direction-selector'
309
+ ) as HTMLButtonElement;
310
+ expect(sortDirectionButton).to.exist;
311
+ expect(sortDirectionButton.disabled).to.be.true;
312
+ });
313
+
314
+ it('should enable sort direction button when not sorting by relevance', async () => {
315
+ const el = await fixture<SortFilterBar>(html`
316
+ <sort-filter-bar> </sort-filter-bar>
317
+ `);
318
+
319
+ el.selectedSort = 'title' as SortField;
320
+ await el.updateComplete;
321
+
322
+ const sortDirectionButton = el.shadowRoot?.querySelector(
323
+ '.sort-direction-selector'
324
+ ) as HTMLButtonElement;
325
+ expect(sortDirectionButton).to.exist;
326
+ expect(sortDirectionButton.disabled).to.be.false;
327
+ });
328
+
329
+ it('should toggle sort direction when clicked', async () => {
330
+ const el = await fixture<SortFilterBar>(html`
331
+ <sort-filter-bar> </sort-filter-bar>
332
+ `);
333
+
334
+ el.selectedSort = 'title' as SortField;
335
+ el.sortDirection = 'asc';
336
+ await el.updateComplete;
337
+
338
+ const sortDirectionButton = el.shadowRoot?.querySelector(
339
+ '.sort-direction-selector'
340
+ ) as HTMLButtonElement;
341
+
342
+ sortDirectionButton.click();
343
+ await el.updateComplete;
344
+ expect(el.sortDirection).to.equal('desc');
345
+
346
+ sortDirectionButton.click();
347
+ await el.updateComplete;
348
+ expect(el.sortDirection).to.equal('asc');
144
349
  });
145
350
  });
146
351
 
@@ -184,6 +389,36 @@ describe('Display mode/style buttons', () => {
184
389
  ?.getAttribute('title');
185
390
  expect(displayModeTitle).to.equal('Tile view');
186
391
  });
392
+
393
+ it('should change displayMode prop to the one clicked', async () => {
394
+ const el = await fixture<SortFilterBar>(html`
395
+ <sort-filter-bar> </sort-filter-bar>
396
+ `);
397
+
398
+ el.displayMode = 'grid';
399
+ await el.updateComplete;
400
+
401
+ const extendedListButton = el.shadowRoot?.querySelector(
402
+ '#list-detail-button'
403
+ ) as HTMLElement;
404
+ extendedListButton.click();
405
+ await el.updateComplete;
406
+ expect(el.displayMode).to.equal('list-detail');
407
+
408
+ const compactListButton = el.shadowRoot?.querySelector(
409
+ '#list-compact-button'
410
+ ) as HTMLElement;
411
+ compactListButton.click();
412
+ await el.updateComplete;
413
+ expect(el.displayMode).to.equal('list-compact');
414
+
415
+ const gridModeButton = el.shadowRoot?.querySelector(
416
+ '#grid-button'
417
+ ) as HTMLElement;
418
+ gridModeButton.click();
419
+ await el.updateComplete;
420
+ expect(el.displayMode).to.equal('grid');
421
+ });
187
422
  });
188
423
 
189
424
  describe('Sort/filter bar letter behavior', () => {
@@ -246,15 +481,15 @@ describe('Sort/filter bar mobile view', () => {
246
481
  <sort-filter-bar></sort-filter-bar>
247
482
  `);
248
483
 
249
- const mobileSortSelector = el.shadowRoot?.querySelector(
250
- '#mobile-sort-selector'
484
+ const mobileSortContainer = el.shadowRoot?.querySelector(
485
+ '#mobile-sort-container'
251
486
  );
252
- const desktopSortSelector = el.shadowRoot?.querySelector(
253
- '#desktop-sort-selector'
487
+ const desktopSortContainer = el.shadowRoot?.querySelector(
488
+ '#desktop-sort-container'
254
489
  );
255
490
 
256
- expect(mobileSortSelector?.classList?.contains('visible')).to.be.true;
257
- expect(desktopSortSelector?.classList?.contains('hidden')).to.be.true;
491
+ expect(mobileSortContainer?.classList?.contains('visible')).to.be.true;
492
+ expect(desktopSortContainer?.classList?.contains('hidden')).to.be.true;
258
493
  });
259
494
 
260
495
  it('changes selected sort in mobile view', async () => {
@@ -262,13 +497,16 @@ describe('Sort/filter bar mobile view', () => {
262
497
  <sort-filter-bar></sort-filter-bar>
263
498
  `);
264
499
 
265
- const mobileSortSelector = el.shadowRoot?.querySelector(
266
- '#mobile-sort-selector'
267
- ) as HTMLSelectElement;
268
- expect(mobileSortSelector).to.exist;
500
+ const mobileDropdown = el.shadowRoot?.querySelector(
501
+ '#mobile-dropdown'
502
+ ) as IaDropdown;
503
+ expect(mobileDropdown).to.exist;
269
504
 
270
- mobileSortSelector.value = 'title';
271
- mobileSortSelector.dispatchEvent(new Event('change'));
505
+ mobileDropdown.selectedOption = 'title';
506
+ const option = { id: 'title' };
507
+ mobileDropdown.dispatchEvent(
508
+ new CustomEvent('optionSelected', { detail: { option } })
509
+ );
272
510
  await el.updateComplete;
273
511
 
274
512
  expect(el.selectedSort).to.equal('title');
@@ -283,13 +521,16 @@ describe('Sort/filter bar mobile view', () => {
283
521
  el.selectedTitleFilter = 'A';
284
522
  await el.updateComplete;
285
523
 
286
- const mobileSortSelector = el.shadowRoot?.querySelector(
287
- '#mobile-sort-selector'
288
- ) as HTMLSelectElement;
289
- expect(mobileSortSelector).to.exist;
524
+ const mobileDropdown = el.shadowRoot?.querySelector(
525
+ '#mobile-dropdown'
526
+ ) as IaDropdown;
527
+ expect(mobileDropdown).to.exist;
290
528
 
291
- mobileSortSelector.value = 'relevance';
292
- mobileSortSelector.dispatchEvent(new Event('change'));
529
+ mobileDropdown.selectedOption = 'relevance';
530
+ const option = { id: 'relevance' };
531
+ mobileDropdown.dispatchEvent(
532
+ new CustomEvent('optionSelected', { detail: { option } })
533
+ );
293
534
  await el.updateComplete;
294
535
 
295
536
  expect(el.selectedSort).to.equal('relevance');
@@ -305,16 +546,51 @@ describe('Sort/filter bar mobile view', () => {
305
546
  el.selectedCreatorFilter = 'A';
306
547
  await el.updateComplete;
307
548
 
308
- const mobileSortSelector = el.shadowRoot?.querySelector(
309
- '#mobile-sort-selector'
310
- ) as HTMLSelectElement;
311
- expect(mobileSortSelector).to.exist;
549
+ const mobileDropdown = el.shadowRoot?.querySelector(
550
+ '#mobile-dropdown'
551
+ ) as IaDropdown;
552
+ expect(mobileDropdown).to.exist;
312
553
 
313
- mobileSortSelector.value = 'relevance';
314
- mobileSortSelector.dispatchEvent(new Event('change'));
554
+ mobileDropdown.selectedOption = 'relevance';
555
+ const option = { id: 'relevance' };
556
+ mobileDropdown.dispatchEvent(
557
+ new CustomEvent('optionSelected', { detail: { option } })
558
+ );
315
559
  await el.updateComplete;
316
560
 
317
561
  expect(el.selectedSort).to.equal('relevance');
318
562
  expect(el.selectedCreatorFilter).to.be.null;
319
563
  });
564
+
565
+ it('shows sort selector backdrop when mobile sort open', async () => {
566
+ const el = await fixture<SortFilterBar>(html`
567
+ <sort-filter-bar></sort-filter-bar>
568
+ `);
569
+
570
+ const mobileDropdown = el.shadowRoot?.querySelector(
571
+ '#mobile-dropdown'
572
+ ) as IaDropdown;
573
+ expect(mobileDropdown).to.exist;
574
+
575
+ const caret = mobileDropdown?.shadowRoot?.querySelector(
576
+ '.caret'
577
+ ) as HTMLElement;
578
+ expect(caret).to.exist;
579
+
580
+ caret?.click();
581
+ await el.updateComplete;
582
+
583
+ let backdrop = el.shadowRoot?.querySelector(
584
+ '#sort-selector-backdrop'
585
+ ) as HTMLElement;
586
+ expect(backdrop).to.exist;
587
+
588
+ backdrop?.click();
589
+ await el.updateComplete;
590
+
591
+ backdrop = el.shadowRoot?.querySelector(
592
+ '#sort-selector-backdrop'
593
+ ) as HTMLElement;
594
+ expect(backdrop).not.to.exist;
595
+ });
320
596
  });