@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.
- package/dist/src/collection-browser.js +3 -0
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets.js +1 -10
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/models.d.ts +5 -1
- package/dist/src/models.js +19 -8
- package/dist/src/models.js.map +1 -1
- package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +1 -2
- package/dist/src/sort-filter-bar/alpha-bar-tooltip.js.map +1 -1
- package/dist/src/sort-filter-bar/img/list.js +1 -1
- package/dist/src/sort-filter-bar/img/list.js.map +1 -1
- package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -0
- package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +15 -0
- package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js.map +1 -0
- package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -0
- package/dist/src/sort-filter-bar/img/sort-toggle-down.js +17 -0
- package/dist/src/sort-filter-bar/img/sort-toggle-down.js.map +1 -0
- package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -0
- package/dist/src/sort-filter-bar/img/sort-toggle-up.js +17 -0
- package/dist/src/sort-filter-bar/img/sort-toggle-up.js.map +1 -0
- package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +95 -14
- package/dist/src/sort-filter-bar/sort-filter-bar.js +386 -292
- package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.js +9 -5
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/grid/tile-stats.d.ts +1 -0
- package/dist/src/tiles/grid/tile-stats.js +5 -1
- package/dist/src/tiles/grid/tile-stats.js.map +1 -1
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js +241 -68
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -1
- package/package.json +2 -1
- package/src/collection-browser.ts +3 -0
- package/src/collection-facets.ts +1 -10
- package/src/models.ts +23 -8
- package/src/sort-filter-bar/alpha-bar-tooltip.ts +1 -2
- package/src/sort-filter-bar/img/list.ts +1 -1
- package/src/sort-filter-bar/img/sort-toggle-disabled.ts +15 -0
- package/src/sort-filter-bar/img/sort-toggle-down.ts +17 -0
- package/src/sort-filter-bar/img/sort-toggle-up.ts +17 -0
- package/src/sort-filter-bar/sort-filter-bar.ts +433 -303
- package/src/tiles/grid/item-tile.ts +6 -1
- package/src/tiles/grid/tile-stats.ts +3 -1
- 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=${
|
|
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
|
-
|
|
52
|
-
|
|
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 =
|
|
58
|
-
.
|
|
59
|
-
|
|
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 =
|
|
66
|
-
.item(
|
|
67
|
-
?.querySelector('
|
|
68
|
-
expect(defaultSortSelector?.textContent).to.
|
|
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
|
-
|
|
77
|
-
|
|
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 =
|
|
82
|
-
.item(
|
|
70
|
+
const defaultSortSelector = desktopSortSelector?.children
|
|
71
|
+
.item(2)
|
|
83
72
|
?.querySelector('a');
|
|
84
|
-
expect(defaultSortSelector?.textContent).to.
|
|
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 =
|
|
89
|
-
.item(
|
|
90
|
-
?.querySelector('
|
|
91
|
-
expect(defaultSortSelector?.textContent).to.
|
|
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
|
-
|
|
100
|
-
|
|
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 =
|
|
105
|
-
.item(
|
|
94
|
+
const defaultSortSelector = desktopSortSelector?.children
|
|
95
|
+
.item(4)
|
|
106
96
|
?.querySelector('a');
|
|
107
|
-
expect(defaultSortSelector?.textContent).to.
|
|
97
|
+
expect(defaultSortSelector?.textContent?.trim()).to.equal('Creator');
|
|
108
98
|
});
|
|
109
99
|
|
|
110
|
-
it('click event on view-sort selector', async () => {
|
|
111
|
-
const defaultSortSelector =
|
|
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
|
-
|
|
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('
|
|
120
|
-
const defaultSortSelector =
|
|
153
|
+
it('handles return/space key event on date-sort selector', async () => {
|
|
154
|
+
const defaultSortSelector = desktopSortSelector?.children
|
|
121
155
|
.item(3)
|
|
122
|
-
?.querySelector('
|
|
156
|
+
?.querySelector('.dropdown-label') as HTMLElement;
|
|
123
157
|
|
|
124
|
-
|
|
125
|
-
|
|
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
|
|
129
|
-
const defaultSortSelector =
|
|
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
|
-
|
|
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('
|
|
138
|
-
const defaultSortSelector =
|
|
139
|
-
.item(
|
|
140
|
-
?.querySelector('
|
|
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
|
-
|
|
143
|
-
|
|
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
|
|
250
|
-
'#mobile-sort-
|
|
484
|
+
const mobileSortContainer = el.shadowRoot?.querySelector(
|
|
485
|
+
'#mobile-sort-container'
|
|
251
486
|
);
|
|
252
|
-
const
|
|
253
|
-
'#desktop-sort-
|
|
487
|
+
const desktopSortContainer = el.shadowRoot?.querySelector(
|
|
488
|
+
'#desktop-sort-container'
|
|
254
489
|
);
|
|
255
490
|
|
|
256
|
-
expect(
|
|
257
|
-
expect(
|
|
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
|
|
266
|
-
'#mobile-
|
|
267
|
-
) as
|
|
268
|
-
expect(
|
|
500
|
+
const mobileDropdown = el.shadowRoot?.querySelector(
|
|
501
|
+
'#mobile-dropdown'
|
|
502
|
+
) as IaDropdown;
|
|
503
|
+
expect(mobileDropdown).to.exist;
|
|
269
504
|
|
|
270
|
-
|
|
271
|
-
|
|
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
|
|
287
|
-
'#mobile-
|
|
288
|
-
) as
|
|
289
|
-
expect(
|
|
524
|
+
const mobileDropdown = el.shadowRoot?.querySelector(
|
|
525
|
+
'#mobile-dropdown'
|
|
526
|
+
) as IaDropdown;
|
|
527
|
+
expect(mobileDropdown).to.exist;
|
|
290
528
|
|
|
291
|
-
|
|
292
|
-
|
|
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
|
|
309
|
-
'#mobile-
|
|
310
|
-
) as
|
|
311
|
-
expect(
|
|
549
|
+
const mobileDropdown = el.shadowRoot?.querySelector(
|
|
550
|
+
'#mobile-dropdown'
|
|
551
|
+
) as IaDropdown;
|
|
552
|
+
expect(mobileDropdown).to.exist;
|
|
312
553
|
|
|
313
|
-
|
|
314
|
-
|
|
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
|
});
|