@internetarchive/collection-browser 4.0.2 → 4.1.0-alpha-webdev8186.0
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.
- package/dist/index.js.map +1 -1
- package/dist/src/app-root.js +614 -614
- package/dist/src/app-root.js.map +1 -1
- package/dist/src/collection-browser.js +764 -774
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/more-facets-content.js +121 -121
- package/dist/src/collection-facets/more-facets-content.js.map +1 -1
- package/dist/src/data-source/collection-browser-query-state.js.map +1 -1
- package/dist/src/models.js.map +1 -1
- package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +13 -172
- package/dist/src/sort-filter-bar/sort-filter-bar.js +37 -546
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/tiles/grid/collection-tile.js +89 -89
- package/dist/src/tiles/grid/collection-tile.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.js +138 -138
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/hover/hover-pane-controller.js +28 -28
- package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -1
- package/dist/src/tiles/models.js.map +1 -1
- package/dist/src/tiles/tile-dispatcher.js +216 -216
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/test/collection-browser.test.js +197 -202
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js +86 -401
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
- package/index.ts +28 -28
- package/package.json +1 -1
- package/src/app-root.ts +1166 -1166
- package/src/collection-browser.ts +3065 -3075
- package/src/collection-facets/more-facets-content.ts +644 -644
- package/src/data-source/collection-browser-query-state.ts +59 -59
- package/src/models.ts +873 -873
- package/src/sort-filter-bar/sort-filter-bar.ts +42 -603
- package/src/tiles/grid/collection-tile.ts +184 -184
- package/src/tiles/grid/item-tile.ts +346 -346
- package/src/tiles/hover/hover-pane-controller.ts +627 -627
- package/src/tiles/models.ts +8 -8
- package/src/tiles/tile-dispatcher.ts +518 -518
- package/test/collection-browser.test.ts +2402 -2413
- package/test/sort-filter-bar/sort-filter-bar.test.ts +110 -566
|
@@ -1,25 +1,21 @@
|
|
|
1
1
|
import { expect, fixture } from '@open-wc/testing';
|
|
2
2
|
import sinon from 'sinon';
|
|
3
3
|
import { html } from 'lit';
|
|
4
|
-
import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
|
|
5
4
|
import { SortField, defaultSortAvailability } from '../../src/models';
|
|
6
5
|
import '../../src/sort-filter-bar/sort-filter-bar';
|
|
7
|
-
describe('Sort
|
|
6
|
+
describe('Sort dropdown behavior', () => {
|
|
8
7
|
let el;
|
|
9
|
-
let
|
|
10
|
-
let desktopSortSelector;
|
|
8
|
+
let sortDropdown;
|
|
11
9
|
beforeEach(async () => {
|
|
12
10
|
el = await fixture(html `
|
|
13
11
|
<sort-filter-bar></sort-filter-bar>
|
|
14
12
|
`);
|
|
15
|
-
|
|
16
|
-
desktopSortSelector = sortSelectorContainer?.querySelector('#desktop-sort-selector');
|
|
17
|
-
el.resizeObserver = new SharedResizeObserver();
|
|
13
|
+
sortDropdown = el.shadowRoot?.querySelector('#sort-dropdown');
|
|
18
14
|
await el.updateComplete;
|
|
19
15
|
});
|
|
20
16
|
it('should render basic component', async () => {
|
|
17
|
+
const sortSelectorContainer = el.shadowRoot?.querySelector('#sort-selector-container');
|
|
21
18
|
expect(sortSelectorContainer).to.exist;
|
|
22
|
-
expect(desktopSortSelector).to.exist;
|
|
23
19
|
});
|
|
24
20
|
it('should render sort-by label', async () => {
|
|
25
21
|
const sortByLabel = el.shadowRoot?.querySelector('.sort-by-text');
|
|
@@ -31,330 +27,139 @@ describe('Sort selector default buttons', async () => {
|
|
|
31
27
|
expect(sortDirections).to.exist;
|
|
32
28
|
expect(sortDirections?.querySelector('.sort-direction-icon')).to.exist;
|
|
33
29
|
});
|
|
34
|
-
it('renders default set of sort options
|
|
35
|
-
|
|
36
|
-
expect(
|
|
37
|
-
|
|
38
|
-
expect(allSortSelectors[0]?.textContent?.trim()).to.equal('Relevance');
|
|
39
|
-
expect(allSortSelectors[1]?.textContent?.trim()).to.equal('Title');
|
|
40
|
-
expect(allSortSelectors[2]?.textContent?.trim()).to.equal('Creator');
|
|
41
|
-
const allSortDropdowns = desktopSortSelector?.querySelectorAll('ia-dropdown');
|
|
42
|
-
expect(allSortDropdowns).to.exist;
|
|
43
|
-
expect(allSortDropdowns.length).to.equal(2);
|
|
44
|
-
expect(allSortDropdowns[0]?.options.length).to.equal(2);
|
|
45
|
-
expect(allSortDropdowns[0]?.options.map(o => o.id)).to.deep.equal([
|
|
46
|
-
SortField.weeklyview,
|
|
30
|
+
it('renders default set of sort options in dropdown', async () => {
|
|
31
|
+
expect(sortDropdown).to.exist;
|
|
32
|
+
expect(sortDropdown.options.map(o => o.id)).to.deep.equal([
|
|
33
|
+
SortField.relevance,
|
|
47
34
|
SortField.alltimeview,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
expect(allSortDropdowns[1]?.options.length).to.equal(4);
|
|
51
|
-
expect(allSortDropdowns[1]?.options.map(o => o.id)).to.deep.equal([
|
|
35
|
+
SortField.weeklyview,
|
|
36
|
+
SortField.title,
|
|
52
37
|
SortField.date,
|
|
53
38
|
SortField.datearchived,
|
|
54
39
|
SortField.datereviewed,
|
|
55
40
|
SortField.dateadded,
|
|
41
|
+
SortField.creator,
|
|
56
42
|
]);
|
|
57
|
-
expect(allSortDropdowns[1]?.textContent?.trim()).to.equal('Date published');
|
|
58
|
-
// Relevance selected by default
|
|
59
|
-
const defaultSortSelector = desktopSortSelector?.querySelector('button.selected');
|
|
60
|
-
expect(defaultSortSelector?.textContent?.trim()).to.equal('Relevance');
|
|
61
43
|
});
|
|
62
|
-
it('
|
|
44
|
+
it('respects overridden sort field availability', async () => {
|
|
63
45
|
const customSortAvailability = {
|
|
64
46
|
...defaultSortAvailability,
|
|
65
47
|
[SortField.title]: false,
|
|
66
|
-
[SortField.datefavorited]: true,
|
|
67
48
|
[SortField.datearchived]: false,
|
|
68
49
|
[SortField.datereviewed]: false,
|
|
69
50
|
[SortField.creator]: false,
|
|
70
51
|
};
|
|
71
52
|
el.sortFieldAvailability = customSortAvailability;
|
|
72
53
|
await el.updateComplete;
|
|
73
|
-
const
|
|
74
|
-
expect(
|
|
75
|
-
expect(
|
|
76
|
-
|
|
77
|
-
const allSortDropdowns = desktopSortSelector?.querySelectorAll('ia-dropdown');
|
|
78
|
-
expect(allSortDropdowns).to.exist;
|
|
79
|
-
expect(allSortDropdowns.length).to.equal(2);
|
|
80
|
-
expect(allSortDropdowns[0]?.options.length).to.equal(2);
|
|
81
|
-
expect(allSortDropdowns[0]?.options.map(o => o.id)).to.deep.equal([
|
|
82
|
-
SortField.weeklyview,
|
|
54
|
+
const dropdown = el.shadowRoot?.querySelector('#sort-dropdown');
|
|
55
|
+
expect(dropdown.options.length).to.equal(5);
|
|
56
|
+
expect(dropdown.options.map(o => o.id)).to.deep.equal([
|
|
57
|
+
SortField.relevance,
|
|
83
58
|
SortField.alltimeview,
|
|
84
|
-
|
|
85
|
-
expect(allSortDropdowns[1]?.options.length).to.equal(3);
|
|
86
|
-
expect(allSortDropdowns[1]?.options.map(o => o.id)).to.deep.equal([
|
|
87
|
-
SortField.datefavorited,
|
|
59
|
+
SortField.weeklyview,
|
|
88
60
|
SortField.date,
|
|
89
61
|
SortField.dateadded,
|
|
90
62
|
]);
|
|
91
63
|
});
|
|
92
|
-
it('
|
|
93
|
-
|
|
94
|
-
...defaultSortAvailability,
|
|
95
|
-
// Disable weekly views (but keep All-time Views)
|
|
96
|
-
[SortField.weeklyview]: false,
|
|
97
|
-
};
|
|
98
|
-
el.sortFieldAvailability = customSortAvailability;
|
|
99
|
-
await el.updateComplete;
|
|
100
|
-
const allSortSelectors = desktopSortSelector?.querySelectorAll('button');
|
|
101
|
-
expect(allSortSelectors).to.exist;
|
|
102
|
-
expect(allSortSelectors.length).to.equal(4);
|
|
103
|
-
expect(allSortSelectors[0]?.textContent?.trim()).to.equal('Relevance');
|
|
104
|
-
expect(allSortSelectors[1]?.textContent?.trim()).to.equal('All-time views');
|
|
105
|
-
expect(allSortSelectors[2]?.textContent?.trim()).to.equal('Title');
|
|
106
|
-
expect(allSortSelectors[3]?.textContent?.trim()).to.equal('Creator');
|
|
107
|
-
const allSortDropdowns = desktopSortSelector?.querySelectorAll('ia-dropdown');
|
|
108
|
-
expect(allSortDropdowns).to.exist;
|
|
109
|
-
expect(allSortDropdowns.length).to.equal(1);
|
|
110
|
-
});
|
|
111
|
-
it('renders a date button instead of a dropdown if it would only have one option', async () => {
|
|
112
|
-
const customSortAvailability = {
|
|
113
|
-
...defaultSortAvailability,
|
|
114
|
-
// Disable all default dates except Date Added
|
|
115
|
-
[SortField.date]: false,
|
|
116
|
-
[SortField.datearchived]: false,
|
|
117
|
-
[SortField.datereviewed]: false,
|
|
118
|
-
};
|
|
119
|
-
el.sortFieldAvailability = customSortAvailability;
|
|
120
|
-
await el.updateComplete;
|
|
121
|
-
const allSortSelectors = desktopSortSelector?.querySelectorAll('button');
|
|
122
|
-
expect(allSortSelectors).to.exist;
|
|
123
|
-
expect(allSortSelectors.length).to.equal(4);
|
|
124
|
-
expect(allSortSelectors[0]?.textContent?.trim()).to.equal('Relevance');
|
|
125
|
-
expect(allSortSelectors[1]?.textContent?.trim()).to.equal('Title');
|
|
126
|
-
expect(allSortSelectors[2]?.textContent?.trim()).to.equal('Date added');
|
|
127
|
-
expect(allSortSelectors[3]?.textContent?.trim()).to.equal('Creator');
|
|
128
|
-
const allSortDropdowns = desktopSortSelector?.querySelectorAll('ia-dropdown');
|
|
129
|
-
expect(allSortDropdowns).to.exist;
|
|
130
|
-
expect(allSortDropdowns.length).to.equal(1);
|
|
131
|
-
});
|
|
132
|
-
it('does not render a views dropdown that would have zero available options', async () => {
|
|
133
|
-
const customSortAvailability = {
|
|
134
|
-
...defaultSortAvailability,
|
|
135
|
-
// Disable all view sorts
|
|
136
|
-
[SortField.weeklyview]: false,
|
|
137
|
-
[SortField.alltimeview]: false,
|
|
138
|
-
};
|
|
139
|
-
el.sortFieldAvailability = customSortAvailability;
|
|
140
|
-
await el.updateComplete;
|
|
141
|
-
const allSortSelectors = desktopSortSelector?.querySelectorAll('button');
|
|
142
|
-
expect(allSortSelectors).to.exist;
|
|
143
|
-
expect(allSortSelectors.length).to.equal(3);
|
|
144
|
-
const allSortDropdowns = desktopSortSelector?.querySelectorAll('ia-dropdown');
|
|
145
|
-
expect(allSortDropdowns).to.exist;
|
|
146
|
-
expect(allSortDropdowns.length).to.equal(1);
|
|
147
|
-
expect(allSortDropdowns[0].options?.[0]?.id).to.equal(SortField.date);
|
|
148
|
-
});
|
|
149
|
-
it('does not render a date dropdown that would have zero available options', async () => {
|
|
150
|
-
const customSortAvailability = {
|
|
151
|
-
...defaultSortAvailability,
|
|
152
|
-
// Disable all date sorts
|
|
153
|
-
[SortField.date]: false,
|
|
154
|
-
[SortField.dateadded]: false,
|
|
155
|
-
[SortField.datearchived]: false,
|
|
156
|
-
[SortField.datereviewed]: false,
|
|
157
|
-
};
|
|
158
|
-
el.sortFieldAvailability = customSortAvailability;
|
|
159
|
-
await el.updateComplete;
|
|
160
|
-
const allSortSelectors = desktopSortSelector?.querySelectorAll('button');
|
|
161
|
-
expect(allSortSelectors).to.exist;
|
|
162
|
-
expect(allSortSelectors.length).to.equal(3);
|
|
163
|
-
const allSortDropdowns = desktopSortSelector?.querySelectorAll('ia-dropdown');
|
|
164
|
-
expect(allSortDropdowns).to.exist;
|
|
165
|
-
expect(allSortDropdowns.length).to.equal(1);
|
|
166
|
-
expect(allSortDropdowns[0].options?.[0]?.id).to.equal(SortField.weeklyview);
|
|
167
|
-
});
|
|
168
|
-
it('allows changing the default views sort shown', async () => {
|
|
169
|
-
el.defaultViewSort = SortField.alltimeview;
|
|
170
|
-
await el.updateComplete;
|
|
171
|
-
const viewsDropdown = el.shadowRoot?.querySelector('#views-dropdown');
|
|
172
|
-
expect(viewsDropdown).to.exist;
|
|
173
|
-
expect(viewsDropdown.textContent?.trim()).to.equal('All-time views');
|
|
174
|
-
});
|
|
175
|
-
it('allows changing the default date sort shown', async () => {
|
|
176
|
-
el.defaultDateSort = SortField.datereviewed;
|
|
177
|
-
await el.updateComplete;
|
|
178
|
-
const dateDropdown = el.shadowRoot?.querySelector('#date-dropdown');
|
|
179
|
-
expect(dateDropdown).to.exist;
|
|
180
|
-
expect(dateDropdown.textContent?.trim()).to.equal('Date reviewed');
|
|
181
|
-
});
|
|
182
|
-
it('should render default view-sort selector', async () => {
|
|
183
|
-
const defaultSortSelector = desktopSortSelector?.children
|
|
184
|
-
.item(1)
|
|
185
|
-
?.querySelector('ia-dropdown');
|
|
186
|
-
expect(defaultSortSelector?.textContent?.trim()).to.equal('Weekly views');
|
|
187
|
-
});
|
|
188
|
-
it('should render active view-sort selectors', async () => {
|
|
189
|
-
el.selectedSort = 'alltimeview';
|
|
64
|
+
it('shows the display name of the selected sort', async () => {
|
|
65
|
+
el.selectedSort = SortField.alltimeview;
|
|
190
66
|
await el.updateComplete;
|
|
191
|
-
const
|
|
192
|
-
expect(
|
|
67
|
+
const label = sortDropdown?.querySelector('.dropdown-label');
|
|
68
|
+
expect(label?.textContent?.trim()).to.equal('All-time views');
|
|
193
69
|
});
|
|
194
|
-
it('
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
});
|
|
200
|
-
it('should render default date-sort selector', async () => {
|
|
201
|
-
const defaultSortSelector = desktopSortSelector?.children
|
|
202
|
-
.item(3)
|
|
203
|
-
?.querySelector('ia-dropdown');
|
|
204
|
-
expect(defaultSortSelector?.textContent?.trim()).to.equal('Date published');
|
|
205
|
-
});
|
|
206
|
-
it('should render active date-sort selectors', async () => {
|
|
207
|
-
el.selectedSort = 'datereviewed';
|
|
208
|
-
await el.updateComplete;
|
|
209
|
-
const defaultSortSelector = desktopSortSelector?.querySelector('ia-dropdown.selected');
|
|
210
|
-
expect(defaultSortSelector?.textContent?.trim()).to.equal('Date reviewed');
|
|
211
|
-
});
|
|
212
|
-
it('should render default creator-sort selector', async () => {
|
|
213
|
-
const defaultSortSelector = desktopSortSelector?.children
|
|
214
|
-
.item(4)
|
|
215
|
-
?.querySelector('button');
|
|
216
|
-
expect(defaultSortSelector?.textContent?.trim()).to.equal('Creator');
|
|
217
|
-
});
|
|
218
|
-
it('handles click event on view-sort selector', async () => {
|
|
219
|
-
const defaultSortSelector = desktopSortSelector?.children
|
|
220
|
-
.item(1)
|
|
221
|
-
?.querySelector('.dropdown-label');
|
|
222
|
-
defaultSortSelector?.click();
|
|
223
|
-
await el.updateComplete;
|
|
224
|
-
expect(el.selectedSort).to.equal('weeklyview');
|
|
225
|
-
});
|
|
226
|
-
it('handles click event on title selector', async () => {
|
|
227
|
-
const defaultSortSelector = desktopSortSelector?.children
|
|
228
|
-
.item(2)
|
|
229
|
-
?.querySelector('button');
|
|
230
|
-
defaultSortSelector?.click();
|
|
70
|
+
it('changes selected sort when dropdown option selected', async () => {
|
|
71
|
+
expect(sortDropdown).to.exist;
|
|
72
|
+
sortDropdown.selectedOption = 'title';
|
|
73
|
+
const option = { id: 'title' };
|
|
74
|
+
sortDropdown.dispatchEvent(new CustomEvent('optionSelected', { detail: { option } }));
|
|
231
75
|
await el.updateComplete;
|
|
232
76
|
expect(el.selectedSort).to.equal('title');
|
|
233
77
|
});
|
|
234
|
-
it('
|
|
235
|
-
|
|
236
|
-
.item(3)
|
|
237
|
-
?.querySelector('.dropdown-label');
|
|
238
|
-
defaultSortSelector?.click();
|
|
239
|
-
await el.updateComplete;
|
|
240
|
-
expect(el.selectedSort).to.equal('date');
|
|
241
|
-
});
|
|
242
|
-
it('handles click event on creator selector', async () => {
|
|
243
|
-
const defaultSortSelector = desktopSortSelector?.children
|
|
244
|
-
.item(4)
|
|
245
|
-
?.querySelector('button');
|
|
246
|
-
defaultSortSelector?.click();
|
|
247
|
-
await el.updateComplete;
|
|
248
|
-
expect(el.selectedSort).to.equal('creator');
|
|
249
|
-
});
|
|
250
|
-
it('handles click event on relevance selector', async () => {
|
|
251
|
-
el.sortFieldAvailability = {
|
|
252
|
-
...el.sortFieldAvailability,
|
|
253
|
-
[SortField.relevance]: true,
|
|
254
|
-
};
|
|
255
|
-
el.selectedSort = 'title';
|
|
256
|
-
await el.updateComplete;
|
|
257
|
-
const defaultSortSelector = desktopSortSelector?.children
|
|
258
|
-
.item(0)
|
|
259
|
-
?.querySelector('button');
|
|
260
|
-
defaultSortSelector?.click();
|
|
261
|
-
await el.updateComplete;
|
|
262
|
-
expect(el.selectedSort).to.equal('relevance');
|
|
263
|
-
});
|
|
264
|
-
it('handles return/space key event on view-sort selector', async () => {
|
|
265
|
-
const defaultSortSelector = desktopSortSelector?.children
|
|
266
|
-
.item(1)
|
|
267
|
-
?.querySelector('.dropdown-label');
|
|
268
|
-
el.selectedSort = 'relevance';
|
|
269
|
-
const enterEvent = new KeyboardEvent('keydown', { key: 'Enter' });
|
|
270
|
-
defaultSortSelector?.dispatchEvent(enterEvent);
|
|
271
|
-
await el.updateComplete;
|
|
272
|
-
expect(el.selectedSort).to.equal('weeklyview');
|
|
273
|
-
el.selectedSort = 'relevance';
|
|
274
|
-
const spaceEvent = new KeyboardEvent('keydown', { key: ' ' });
|
|
275
|
-
defaultSortSelector?.dispatchEvent(spaceEvent);
|
|
276
|
-
await el.updateComplete;
|
|
277
|
-
expect(el.selectedSort).to.equal('weeklyview');
|
|
278
|
-
});
|
|
279
|
-
it('handles return/space key event on date-sort selector', async () => {
|
|
280
|
-
const defaultSortSelector = desktopSortSelector?.children
|
|
281
|
-
.item(3)
|
|
282
|
-
?.querySelector('.dropdown-label');
|
|
283
|
-
el.selectedSort = 'relevance';
|
|
284
|
-
const enterEvent = new KeyboardEvent('keydown', { key: 'Enter' });
|
|
285
|
-
defaultSortSelector?.dispatchEvent(enterEvent);
|
|
286
|
-
await el.updateComplete;
|
|
287
|
-
expect(el.selectedSort).to.equal('date');
|
|
288
|
-
el.selectedSort = 'relevance';
|
|
289
|
-
const spaceEvent = new KeyboardEvent('keydown', { key: ' ' });
|
|
290
|
-
defaultSortSelector?.dispatchEvent(spaceEvent);
|
|
78
|
+
it('selects a sort option by clicking it in the dropdown', async () => {
|
|
79
|
+
el.selectedSort = SortField.title;
|
|
291
80
|
await el.updateComplete;
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
const defaultSortSelector = desktopSortSelector?.children
|
|
296
|
-
.item(1)
|
|
297
|
-
?.querySelector('ia-dropdown');
|
|
298
|
-
const firstOption = defaultSortSelector?.shadowRoot?.querySelector('li > button');
|
|
81
|
+
const dropdown = el.shadowRoot?.querySelector('#sort-dropdown');
|
|
82
|
+
expect(dropdown).to.exist;
|
|
83
|
+
const firstOption = dropdown?.shadowRoot?.querySelector('li > button');
|
|
299
84
|
expect(firstOption).to.exist;
|
|
300
85
|
firstOption?.click();
|
|
301
86
|
await el.updateComplete;
|
|
302
|
-
|
|
87
|
+
// The first option is relevance by default
|
|
88
|
+
expect(el.selectedSort).to.equal(SortField.relevance);
|
|
303
89
|
});
|
|
304
|
-
it('
|
|
305
|
-
const
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
expect(firstOption).to.exist;
|
|
310
|
-
firstOption?.click();
|
|
90
|
+
it('emits sortChanged event when sort option selected', async () => {
|
|
91
|
+
const sortChangedHandler = sinon.spy();
|
|
92
|
+
el.addEventListener('sortChanged', sortChangedHandler);
|
|
93
|
+
const option = { id: SortField.title };
|
|
94
|
+
sortDropdown.dispatchEvent(new CustomEvent('optionSelected', { detail: { option } }));
|
|
311
95
|
await el.updateComplete;
|
|
312
|
-
expect(
|
|
96
|
+
expect(sortChangedHandler.calledOnce).to.be.true;
|
|
97
|
+
const eventDetail = sortChangedHandler.firstCall.args[0].detail;
|
|
98
|
+
expect(eventDetail.selectedSort).to.equal(SortField.title);
|
|
99
|
+
expect(eventDetail.sortDirection).to.equal('asc');
|
|
313
100
|
});
|
|
314
|
-
it('
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
?.querySelector('ia-dropdown');
|
|
318
|
-
const caret = defaultSortSelector?.shadowRoot?.querySelector('.caret');
|
|
101
|
+
it('renders sort selector backdrop when dropdown is open', async () => {
|
|
102
|
+
expect(sortDropdown).to.exist;
|
|
103
|
+
const caret = sortDropdown?.shadowRoot?.querySelector('.caret');
|
|
319
104
|
expect(caret).to.exist;
|
|
320
|
-
caret
|
|
105
|
+
caret.click();
|
|
321
106
|
await el.updateComplete;
|
|
322
107
|
let backdrop = el.shadowRoot?.querySelector('#sort-selector-backdrop');
|
|
323
108
|
expect(backdrop).to.exist;
|
|
324
|
-
backdrop
|
|
109
|
+
// Clicking the backdrop should close the dropdown
|
|
110
|
+
backdrop.click();
|
|
325
111
|
await el.updateComplete;
|
|
326
112
|
backdrop = el.shadowRoot?.querySelector('#sort-selector-backdrop');
|
|
327
113
|
expect(backdrop).not.to.exist;
|
|
328
114
|
});
|
|
329
|
-
it('
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
?.querySelector('ia-dropdown');
|
|
333
|
-
const caret = defaultSortSelector?.shadowRoot?.querySelector('.caret');
|
|
115
|
+
it('pressing Escape key closes the dropdown', async () => {
|
|
116
|
+
expect(sortDropdown).to.exist;
|
|
117
|
+
const caret = sortDropdown?.shadowRoot?.querySelector('.caret');
|
|
334
118
|
expect(caret).to.exist;
|
|
335
|
-
caret
|
|
119
|
+
caret.click();
|
|
336
120
|
await el.updateComplete;
|
|
337
121
|
let backdrop = el.shadowRoot?.querySelector('#sort-selector-backdrop');
|
|
338
122
|
expect(backdrop).to.exist;
|
|
339
|
-
|
|
123
|
+
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
|
|
340
124
|
await el.updateComplete;
|
|
341
125
|
backdrop = el.shadowRoot?.querySelector('#sort-selector-backdrop');
|
|
342
126
|
expect(backdrop).not.to.exist;
|
|
343
127
|
});
|
|
344
|
-
it('
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
?.querySelector('ia-dropdown');
|
|
348
|
-
const caret = defaultSortSelector?.shadowRoot?.querySelector('.caret');
|
|
349
|
-
expect(caret).to.exist;
|
|
350
|
-
caret?.click();
|
|
128
|
+
it('clears title filter when sort changed from title', async () => {
|
|
129
|
+
el.selectedSort = 'title';
|
|
130
|
+
el.selectedTitleFilter = 'A';
|
|
351
131
|
await el.updateComplete;
|
|
352
|
-
|
|
353
|
-
expect(
|
|
354
|
-
|
|
132
|
+
const dropdown = el.shadowRoot?.querySelector('#sort-dropdown');
|
|
133
|
+
expect(dropdown).to.exist;
|
|
134
|
+
dropdown.selectedOption = 'relevance';
|
|
135
|
+
const option = { id: 'relevance' };
|
|
136
|
+
dropdown.dispatchEvent(new CustomEvent('optionSelected', { detail: { option } }));
|
|
355
137
|
await el.updateComplete;
|
|
356
|
-
|
|
357
|
-
expect(
|
|
138
|
+
expect(el.selectedSort).to.equal('relevance');
|
|
139
|
+
expect(el.selectedTitleFilter).to.be.null;
|
|
140
|
+
});
|
|
141
|
+
it('clears creator filter when sort changed from creator', async () => {
|
|
142
|
+
el.selectedSort = 'creator';
|
|
143
|
+
el.selectedCreatorFilter = 'A';
|
|
144
|
+
await el.updateComplete;
|
|
145
|
+
const dropdown = el.shadowRoot?.querySelector('#sort-dropdown');
|
|
146
|
+
expect(dropdown).to.exist;
|
|
147
|
+
dropdown.selectedOption = 'relevance';
|
|
148
|
+
const option = { id: 'relevance' };
|
|
149
|
+
dropdown.dispatchEvent(new CustomEvent('optionSelected', { detail: { option } }));
|
|
150
|
+
await el.updateComplete;
|
|
151
|
+
expect(el.selectedSort).to.equal('relevance');
|
|
152
|
+
expect(el.selectedCreatorFilter).to.be.null;
|
|
153
|
+
});
|
|
154
|
+
it('contains sort-options slot when enabled', async () => {
|
|
155
|
+
const slotEl = await fixture(html `
|
|
156
|
+
<sort-filter-bar .enableSortOptionsSlot=${true}></sort-filter-bar>
|
|
157
|
+
`);
|
|
158
|
+
await slotEl.updateComplete;
|
|
159
|
+
const sortOptionsSlot = slotEl?.shadowRoot?.querySelector('slot[name="sort-options"]');
|
|
160
|
+
expect(sortOptionsSlot).to.exist;
|
|
161
|
+
expect(slotEl?.shadowRoot?.querySelector('#sort-selector-container')).to.not
|
|
162
|
+
.exist;
|
|
358
163
|
});
|
|
359
164
|
});
|
|
360
165
|
describe('Sort direction button behavior', () => {
|
|
@@ -484,124 +289,4 @@ describe('Sort/filter bar letter behavior', () => {
|
|
|
484
289
|
expect(el.selectedCreatorFilter).to.equal('C');
|
|
485
290
|
});
|
|
486
291
|
});
|
|
487
|
-
describe('Sort/filter bar mobile view', () => {
|
|
488
|
-
let origWindowSize;
|
|
489
|
-
before(() => {
|
|
490
|
-
origWindowSize = { width: window.innerWidth, height: window.innerHeight };
|
|
491
|
-
window.resizeTo(500, 600);
|
|
492
|
-
});
|
|
493
|
-
after(() => {
|
|
494
|
-
window.resizeTo(origWindowSize.width, origWindowSize.height);
|
|
495
|
-
});
|
|
496
|
-
it('renders in mobile view', async () => {
|
|
497
|
-
const el = await fixture(html `
|
|
498
|
-
<sort-filter-bar></sort-filter-bar>
|
|
499
|
-
`);
|
|
500
|
-
const mobileSortContainer = el.shadowRoot?.querySelector('#mobile-sort-container');
|
|
501
|
-
const desktopSortContainer = el.shadowRoot?.querySelector('#desktop-sort-container');
|
|
502
|
-
expect(mobileSortContainer?.classList?.contains('visible')).to.be.true;
|
|
503
|
-
expect(desktopSortContainer?.classList?.contains('hidden')).to.be.true;
|
|
504
|
-
});
|
|
505
|
-
it('changes selected sort in mobile view', async () => {
|
|
506
|
-
const el = await fixture(html `
|
|
507
|
-
<sort-filter-bar></sort-filter-bar>
|
|
508
|
-
`);
|
|
509
|
-
const mobileDropdown = el.shadowRoot?.querySelector('#mobile-dropdown');
|
|
510
|
-
expect(mobileDropdown).to.exist;
|
|
511
|
-
mobileDropdown.selectedOption = 'title';
|
|
512
|
-
const option = { id: 'title' };
|
|
513
|
-
mobileDropdown.dispatchEvent(new CustomEvent('optionSelected', { detail: { option } }));
|
|
514
|
-
await el.updateComplete;
|
|
515
|
-
expect(el.selectedSort).to.equal('title');
|
|
516
|
-
});
|
|
517
|
-
it('clears title filter when sort changed from title in mobile view', async () => {
|
|
518
|
-
const el = await fixture(html `
|
|
519
|
-
<sort-filter-bar></sort-filter-bar>
|
|
520
|
-
`);
|
|
521
|
-
el.selectedSort = 'title';
|
|
522
|
-
el.selectedTitleFilter = 'A';
|
|
523
|
-
await el.updateComplete;
|
|
524
|
-
const mobileDropdown = el.shadowRoot?.querySelector('#mobile-dropdown');
|
|
525
|
-
expect(mobileDropdown).to.exist;
|
|
526
|
-
mobileDropdown.selectedOption = 'relevance';
|
|
527
|
-
const option = { id: 'relevance' };
|
|
528
|
-
mobileDropdown.dispatchEvent(new CustomEvent('optionSelected', { detail: { option } }));
|
|
529
|
-
await el.updateComplete;
|
|
530
|
-
expect(el.selectedSort).to.equal('relevance');
|
|
531
|
-
expect(el.selectedTitleFilter).to.be.null;
|
|
532
|
-
});
|
|
533
|
-
it('clears creator filter when sort changed from creator in mobile view', async () => {
|
|
534
|
-
const el = await fixture(html `
|
|
535
|
-
<sort-filter-bar></sort-filter-bar>
|
|
536
|
-
`);
|
|
537
|
-
el.selectedSort = 'creator';
|
|
538
|
-
el.selectedCreatorFilter = 'A';
|
|
539
|
-
await el.updateComplete;
|
|
540
|
-
const mobileDropdown = el.shadowRoot?.querySelector('#mobile-dropdown');
|
|
541
|
-
expect(mobileDropdown).to.exist;
|
|
542
|
-
mobileDropdown.selectedOption = 'relevance';
|
|
543
|
-
const option = { id: 'relevance' };
|
|
544
|
-
mobileDropdown.dispatchEvent(new CustomEvent('optionSelected', { detail: { option } }));
|
|
545
|
-
await el.updateComplete;
|
|
546
|
-
expect(el.selectedSort).to.equal('relevance');
|
|
547
|
-
expect(el.selectedCreatorFilter).to.be.null;
|
|
548
|
-
});
|
|
549
|
-
it('shows sort selector backdrop when mobile sort open', async () => {
|
|
550
|
-
const el = await fixture(html `
|
|
551
|
-
<sort-filter-bar></sort-filter-bar>
|
|
552
|
-
`);
|
|
553
|
-
const mobileDropdown = el.shadowRoot?.querySelector('#mobile-dropdown');
|
|
554
|
-
expect(mobileDropdown).to.exist;
|
|
555
|
-
const caret = mobileDropdown?.shadowRoot?.querySelector('.caret');
|
|
556
|
-
expect(caret).to.exist;
|
|
557
|
-
caret?.click();
|
|
558
|
-
await el.updateComplete;
|
|
559
|
-
let backdrop = el.shadowRoot?.querySelector('#sort-selector-backdrop');
|
|
560
|
-
expect(backdrop).to.exist;
|
|
561
|
-
backdrop?.click();
|
|
562
|
-
await el.updateComplete;
|
|
563
|
-
backdrop = el.shadowRoot?.querySelector('#sort-selector-backdrop');
|
|
564
|
-
expect(backdrop).not.to.exist;
|
|
565
|
-
});
|
|
566
|
-
it('shows loansTab top-bar slot Default View', async () => {
|
|
567
|
-
const resizeStub = new SharedResizeObserver();
|
|
568
|
-
const addSpy = sinon.spy(resizeStub, 'addObserver');
|
|
569
|
-
const removeSpy = sinon.spy(resizeStub, 'removeObserver');
|
|
570
|
-
const el = await fixture(html `
|
|
571
|
-
<sort-filter-bar .resizeObserver=${resizeStub}></sort-filter-bar>
|
|
572
|
-
`);
|
|
573
|
-
// this element exists
|
|
574
|
-
expect(el?.shadowRoot?.querySelector('#sort-selector-container')).to.exist;
|
|
575
|
-
// loads & unloads twice when [re]setting ResizeObserver
|
|
576
|
-
expect(addSpy.callCount).to.equal(2);
|
|
577
|
-
const resizeStub2 = new SharedResizeObserver();
|
|
578
|
-
el.resizeObserver = resizeStub2;
|
|
579
|
-
await el.updateComplete;
|
|
580
|
-
expect(removeSpy.callCount).to.equal(2);
|
|
581
|
-
});
|
|
582
|
-
it('contains sort-options slot when enabled', async () => {
|
|
583
|
-
const resizeStub = new SharedResizeObserver();
|
|
584
|
-
const addSpy = sinon.spy(resizeStub, 'addObserver');
|
|
585
|
-
const removeSpy = sinon.spy(resizeStub, 'removeObserver');
|
|
586
|
-
const el = await fixture(html `
|
|
587
|
-
<sort-filter-bar
|
|
588
|
-
.resizeObserver=${resizeStub}
|
|
589
|
-
.enableSortOptionsSlot=${true}
|
|
590
|
-
></sort-filter-bar>
|
|
591
|
-
`);
|
|
592
|
-
await el.updateComplete;
|
|
593
|
-
// slot exists
|
|
594
|
-
const sortOptionsSlot = el?.shadowRoot?.querySelector('slot[name="sort-options"]');
|
|
595
|
-
expect(sortOptionsSlot).to.exist;
|
|
596
|
-
// sort bar does not exist
|
|
597
|
-
expect(el?.shadowRoot?.querySelector('#sort-selector-container')).to.not
|
|
598
|
-
.exist;
|
|
599
|
-
const resizeStub2 = new SharedResizeObserver();
|
|
600
|
-
el.resizeObserver = resizeStub2;
|
|
601
|
-
await el.updateComplete;
|
|
602
|
-
// there's no need for resize observer
|
|
603
|
-
expect(addSpy.callCount).to.equal(0);
|
|
604
|
-
expect(removeSpy.callCount).to.equal(0);
|
|
605
|
-
});
|
|
606
|
-
});
|
|
607
292
|
//# sourceMappingURL=sort-filter-bar.test.js.map
|