@internetarchive/collection-browser 0.3.2-alpha.4 → 0.3.2
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/.editorconfig +29 -29
- package/.github/workflows/ci.yml +26 -26
- package/.github/workflows/gh-pages-main.yml +39 -39
- package/.github/workflows/npm-publish.yml +39 -39
- package/.github/workflows/pr-preview.yml +38 -38
- package/.husky/pre-commit +4 -4
- package/LICENSE +661 -661
- package/README.md +83 -83
- package/dist/index.d.ts +9 -9
- package/dist/index.js +9 -9
- package/dist/src/app-root.d.ts +43 -43
- package/dist/src/app-root.js +233 -233
- package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
- package/dist/src/assets/img/icons/arrow-left.js +2 -2
- package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
- package/dist/src/assets/img/icons/arrow-right.js +2 -2
- package/dist/src/assets/img/icons/chevron.d.ts +2 -2
- package/dist/src/assets/img/icons/chevron.js +2 -2
- package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
- package/dist/src/assets/img/icons/empty-query.js +2 -2
- package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
- package/dist/src/assets/img/icons/eye-closed.js +2 -2
- package/dist/src/assets/img/icons/eye.d.ts +2 -2
- package/dist/src/assets/img/icons/eye.js +2 -2
- package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
- package/dist/src/assets/img/icons/favorite-filled.js +2 -2
- package/dist/src/assets/img/icons/login-required.d.ts +1 -1
- package/dist/src/assets/img/icons/login-required.js +2 -2
- package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/account.js +2 -2
- package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
- package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
- package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/data.js +2 -2
- package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
- package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/film.js +2 -2
- package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/images.js +2 -2
- package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
- package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/software.js +2 -2
- package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
- package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
- package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/video.js +2 -2
- package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
- package/dist/src/assets/img/icons/mediatype/web.js +2 -2
- package/dist/src/assets/img/icons/null-result.d.ts +2 -2
- package/dist/src/assets/img/icons/null-result.js +2 -2
- package/dist/src/assets/img/icons/restricted.d.ts +1 -1
- package/dist/src/assets/img/icons/restricted.js +2 -2
- package/dist/src/assets/img/icons/reviews.d.ts +1 -1
- package/dist/src/assets/img/icons/reviews.js +2 -2
- package/dist/src/assets/img/icons/upload.d.ts +1 -1
- package/dist/src/assets/img/icons/upload.js +2 -2
- package/dist/src/assets/img/icons/views.d.ts +1 -1
- package/dist/src/assets/img/icons/views.js +2 -2
- package/dist/src/circular-activity-indicator.d.ts +5 -5
- package/dist/src/circular-activity-indicator.js +17 -17
- package/dist/src/collection-browser.d.ts +247 -247
- package/dist/src/collection-browser.js +1419 -1418
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/facets-template.d.ts +16 -16
- package/dist/src/collection-facets/facets-template.js +125 -125
- package/dist/src/collection-facets/more-facets-content.d.ts +74 -74
- package/dist/src/collection-facets/more-facets-content.js +330 -330
- package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
- package/dist/src/collection-facets/more-facets-pagination.js +192 -192
- package/dist/src/collection-facets.d.ts +73 -73
- package/dist/src/collection-facets.js +507 -507
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/empty-placeholder.d.ts +11 -11
- package/dist/src/empty-placeholder.js +42 -42
- package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
- package/dist/src/language-code-handler/language-code-handler.js +26 -26
- package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
- package/dist/src/language-code-handler/language-code-mapping.js +562 -562
- package/dist/src/mediatype/mediatype-config.d.ts +3 -3
- package/dist/src/mediatype/mediatype-config.js +85 -85
- package/dist/src/models.d.ts +97 -97
- package/dist/src/models.js +100 -100
- package/dist/src/restoration-state-handler.d.ts +45 -45
- package/dist/src/restoration-state-handler.js +220 -220
- package/dist/src/sort-filter-bar/alpha-bar.d.ts +9 -9
- package/dist/src/sort-filter-bar/alpha-bar.js +41 -41
- package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
- package/dist/src/sort-filter-bar/img/compact.js +2 -2
- package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
- package/dist/src/sort-filter-bar/img/list.js +2 -2
- package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
- package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
- package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
- package/dist/src/sort-filter-bar/img/tile.js +2 -2
- package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +107 -107
- package/dist/src/sort-filter-bar/sort-filter-bar.js +423 -423
- package/dist/src/styles/item-image-styles.d.ts +8 -8
- package/dist/src/styles/item-image-styles.js +9 -9
- package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
- package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
- package/dist/src/tiles/grid/account-tile.d.ts +8 -8
- package/dist/src/tiles/grid/account-tile.js +20 -20
- package/dist/src/tiles/grid/collection-tile.d.ts +7 -7
- package/dist/src/tiles/grid/collection-tile.js +23 -23
- package/dist/src/tiles/grid/item-tile.d.ts +24 -24
- package/dist/src/tiles/grid/item-tile.js +87 -87
- package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
- package/dist/src/tiles/grid/tile-stats.js +35 -35
- package/dist/src/tiles/image-block.d.ts +17 -17
- package/dist/src/tiles/image-block.js +69 -73
- package/dist/src/tiles/image-block.js.map +1 -1
- package/dist/src/tiles/item-image.d.ts +31 -31
- package/dist/src/tiles/item-image.js +103 -103
- package/dist/src/tiles/list/account-label.d.ts +1 -1
- package/dist/src/tiles/list/account-label.js +6 -6
- package/dist/src/tiles/list/date-label.d.ts +1 -1
- package/dist/src/tiles/list/date-label.js +12 -12
- package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -12
- package/dist/src/tiles/list/tile-list-compact-header.js +41 -41
- package/dist/src/tiles/list/tile-list-compact.d.ts +20 -20
- package/dist/src/tiles/list/tile-list-compact.js +88 -87
- package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
- package/dist/src/tiles/list/tile-list.d.ts +50 -50
- package/dist/src/tiles/list/tile-list.js +265 -264
- package/dist/src/tiles/list/tile-list.js.map +1 -1
- package/dist/src/tiles/mediatype-icon.d.ts +9 -9
- package/dist/src/tiles/mediatype-icon.js +47 -47
- package/dist/src/tiles/overlay/icon-overlay.d.ts +7 -7
- package/dist/src/tiles/overlay/icon-overlay.js +30 -31
- package/dist/src/tiles/overlay/icon-overlay.js.map +1 -1
- package/dist/src/tiles/overlay/text-overlay.d.ts +8 -8
- package/dist/src/tiles/overlay/text-overlay.js +31 -31
- package/dist/src/tiles/text-snippet-block.d.ts +29 -29
- package/dist/src/tiles/text-snippet-block.js +81 -81
- package/dist/src/tiles/tile-dispatcher.d.ts +36 -36
- package/dist/src/tiles/tile-dispatcher.js +128 -128
- package/dist/src/utils/analytics-events.d.ts +18 -18
- package/dist/src/utils/analytics-events.js +20 -20
- package/dist/src/utils/format-count.d.ts +7 -7
- package/dist/src/utils/format-count.js +76 -76
- package/dist/src/utils/format-date.d.ts +2 -2
- package/dist/src/utils/format-date.js +23 -23
- package/dist/test/collection-browser.test.d.ts +1 -1
- package/dist/test/collection-browser.test.js +333 -318
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
- package/dist/test/collection-facets/facets-template.test.js +62 -62
- package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
- package/dist/test/collection-facets/more-facets-content.test.js +91 -91
- package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
- package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
- package/dist/test/collection-facets.test.d.ts +2 -2
- package/dist/test/collection-facets.test.js +423 -423
- package/dist/test/collection-facets.test.js.map +1 -1
- package/dist/test/empty-placeholder.test.d.ts +1 -1
- package/dist/test/empty-placeholder.test.js +33 -33
- package/dist/test/icon-overlay.test.d.ts +1 -1
- package/dist/test/icon-overlay.test.js +24 -24
- package/dist/test/image-block.test.d.ts +1 -0
- package/dist/test/image-block.test.js +79 -0
- package/dist/test/image-block.test.js.map +1 -0
- package/dist/test/item-image.test.d.ts +1 -1
- package/dist/test/item-image.test.js +56 -56
- package/dist/test/mediatype-config.test.d.ts +1 -1
- package/dist/test/mediatype-config.test.js +16 -16
- package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
- package/dist/test/mocks/mock-analytics-handler.js +15 -15
- package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -7
- package/dist/test/mocks/mock-collection-name-cache.js +13 -13
- package/dist/test/mocks/mock-search-responses.d.ts +5 -5
- package/dist/test/mocks/mock-search-responses.js +103 -103
- package/dist/test/mocks/mock-search-service.d.ts +13 -13
- package/dist/test/mocks/mock-search-service.js +25 -25
- package/dist/test/restoration-state-handler.test.d.ts +1 -1
- package/dist/test/restoration-state-handler.test.js +117 -117
- package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
- package/dist/test/sort-filter-bar/sort-filter-bar.test.js +113 -113
- package/dist/test/text-overlay.test.d.ts +1 -1
- package/dist/test/text-overlay.test.js +41 -41
- package/dist/test/text-snippet-block.test.d.ts +1 -1
- package/dist/test/text-snippet-block.test.js +57 -57
- package/dist/test/tile-stats.test.d.ts +1 -1
- package/dist/test/tile-stats.test.js +33 -33
- package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
- package/dist/test/tiles/grid/item-tile.test.js +107 -107
- package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -0
- package/dist/test/tiles/list/tile-list-compact.test.js +31 -0
- package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -0
- package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
- package/dist/test/tiles/list/tile-list.test.js +36 -36
- package/dist/test/utils/format-count.test.d.ts +1 -1
- package/dist/test/utils/format-count.test.js +23 -23
- package/dist/test/utils/format-date.test.d.ts +1 -1
- package/dist/test/utils/format-date.test.js +17 -17
- package/index.html +24 -24
- package/local.archive.org.cert +86 -86
- package/local.archive.org.key +27 -27
- package/package.json +115 -115
- package/renovate.json +6 -6
- package/src/collection-browser.ts +1547 -1547
- package/src/collection-facets.ts +582 -582
- package/src/tiles/image-block.ts +7 -10
- package/src/tiles/list/tile-list-compact.ts +1 -0
- package/src/tiles/list/tile-list.ts +1 -0
- package/src/tiles/overlay/icon-overlay.ts +3 -4
- package/test/collection-browser.test.ts +24 -1
- package/test/collection-facets.test.ts +556 -556
- package/test/image-block.test.ts +86 -0
- package/test/tiles/list/tile-list-compact.test.ts +38 -0
- package/tsconfig.json +21 -21
- package/web-dev-server.config.mjs +30 -30
- package/web-test-runner.config.mjs +41 -41
|
@@ -1,556 +1,556 @@
|
|
|
1
|
-
/* eslint-disable import/no-duplicates */
|
|
2
|
-
import { expect, fixture } from '@open-wc/testing';
|
|
3
|
-
import sinon from 'sinon';
|
|
4
|
-
import { html } from 'lit';
|
|
5
|
-
import { Aggregation } from '@internetarchive/search-service';
|
|
6
|
-
import {
|
|
7
|
-
ModalManager,
|
|
8
|
-
ModalManagerInterface,
|
|
9
|
-
} from '@internetarchive/modal-manager';
|
|
10
|
-
import type { CollectionFacets } from '../src/collection-facets';
|
|
11
|
-
import '@internetarchive/modal-manager';
|
|
12
|
-
import '../src/collection-facets';
|
|
13
|
-
import type { FacetOption, SelectedFacets } from '../src/models';
|
|
14
|
-
import {
|
|
15
|
-
LanguageCodeHandler,
|
|
16
|
-
LanguageCodeHandlerInterface,
|
|
17
|
-
} from '../src/language-code-handler/language-code-handler';
|
|
18
|
-
|
|
19
|
-
describe('Collection Facets', () => {
|
|
20
|
-
it('has loader', async () => {
|
|
21
|
-
const el = await fixture<CollectionFacets>(
|
|
22
|
-
html`<collection-facets ?facetsLoading=${true}></collection-facets>`
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
expect(
|
|
26
|
-
el.shadowRoot?.querySelector('#container')?.classList.contains('loading')
|
|
27
|
-
).to.be.true;
|
|
28
|
-
|
|
29
|
-
el.facetsLoading = false;
|
|
30
|
-
await el.updateComplete;
|
|
31
|
-
|
|
32
|
-
expect(
|
|
33
|
-
el.shadowRoot?.querySelector('#container')?.classList.contains('loading')
|
|
34
|
-
).to.be.false;
|
|
35
|
-
});
|
|
36
|
-
it('renders aggregations as facets', async () => {
|
|
37
|
-
const el = await fixture<CollectionFacets>(
|
|
38
|
-
html`<collection-facets></collection-facets>`
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
const aggs: Record<string, Aggregation> = {
|
|
42
|
-
subject: new Aggregation({
|
|
43
|
-
buckets: [
|
|
44
|
-
{
|
|
45
|
-
key: 'foo',
|
|
46
|
-
doc_count: 5,
|
|
47
|
-
},
|
|
48
|
-
],
|
|
49
|
-
}),
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
el.aggregations = aggs;
|
|
53
|
-
await el.updateComplete;
|
|
54
|
-
const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');
|
|
55
|
-
expect(facetGroups?.length).to.equal(1);
|
|
56
|
-
|
|
57
|
-
const titleFacetGroup = facetGroups?.[0];
|
|
58
|
-
const facetGroupHeader = titleFacetGroup?.querySelector('h1');
|
|
59
|
-
expect(facetGroupHeader?.textContent?.trim()).to.equal('Subject');
|
|
60
|
-
const titleFacetRow = titleFacetGroup
|
|
61
|
-
?.querySelector('facets-template')
|
|
62
|
-
?.shadowRoot?.querySelector('.facet-row');
|
|
63
|
-
console.log(titleFacetGroup?.querySelector('facets-template'));
|
|
64
|
-
expect(titleFacetRow?.textContent?.trim()).to.satisfy((text: string) =>
|
|
65
|
-
/^foo\s*5$/.test(text)
|
|
66
|
-
);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('renders multiple aggregation types', async () => {
|
|
70
|
-
const el = await fixture<CollectionFacets>(
|
|
71
|
-
html`<collection-facets></collection-facets>`
|
|
72
|
-
);
|
|
73
|
-
|
|
74
|
-
const aggs: Record<string, Aggregation> = {
|
|
75
|
-
subject: new Aggregation({
|
|
76
|
-
buckets: [
|
|
77
|
-
{
|
|
78
|
-
key: 'foo',
|
|
79
|
-
doc_count: 5,
|
|
80
|
-
},
|
|
81
|
-
],
|
|
82
|
-
}),
|
|
83
|
-
mediatype: new Aggregation({
|
|
84
|
-
buckets: [
|
|
85
|
-
{
|
|
86
|
-
key: 'bar',
|
|
87
|
-
doc_count: 10,
|
|
88
|
-
},
|
|
89
|
-
],
|
|
90
|
-
}),
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
el.aggregations = aggs;
|
|
94
|
-
await el.updateComplete;
|
|
95
|
-
|
|
96
|
-
const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');
|
|
97
|
-
expect(facetGroups?.length).to.equal(2);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('renders collection facets as links', async () => {
|
|
101
|
-
const el = await fixture<CollectionFacets>(
|
|
102
|
-
html`<collection-facets></collection-facets>`
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
const aggs: Record<string, Aggregation> = {
|
|
106
|
-
collection: new Aggregation({
|
|
107
|
-
buckets: [
|
|
108
|
-
{
|
|
109
|
-
key: 'foo',
|
|
110
|
-
doc_count: 5,
|
|
111
|
-
},
|
|
112
|
-
],
|
|
113
|
-
}),
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
el.aggregations = aggs;
|
|
117
|
-
await el.updateComplete;
|
|
118
|
-
|
|
119
|
-
const collectionName = el.shadowRoot
|
|
120
|
-
?.querySelector('facets-template')
|
|
121
|
-
?.shadowRoot?.querySelector('async-collection-name');
|
|
122
|
-
expect(collectionName?.parentElement).to.be.instanceOf(HTMLAnchorElement);
|
|
123
|
-
expect(collectionName?.parentElement?.getAttribute('href')).to.equal(
|
|
124
|
-
'/details/foo'
|
|
125
|
-
);
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it('renders non-collection facets without links', async () => {
|
|
129
|
-
const el = await fixture<CollectionFacets>(
|
|
130
|
-
html`<collection-facets></collection-facets>`
|
|
131
|
-
);
|
|
132
|
-
|
|
133
|
-
const aggs: Record<string, Aggregation> = {
|
|
134
|
-
subject: new Aggregation({
|
|
135
|
-
buckets: [
|
|
136
|
-
{
|
|
137
|
-
key: 'foo',
|
|
138
|
-
doc_count: 5,
|
|
139
|
-
},
|
|
140
|
-
],
|
|
141
|
-
}),
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
el.aggregations = aggs;
|
|
145
|
-
await el.updateComplete;
|
|
146
|
-
|
|
147
|
-
const collectionName = el.shadowRoot
|
|
148
|
-
?.querySelector('facets-template')
|
|
149
|
-
?.shadowRoot?.querySelector('async-collection-name');
|
|
150
|
-
expect(collectionName?.parentElement).to.not.be.instanceOf(
|
|
151
|
-
HTMLAnchorElement
|
|
152
|
-
);
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it('renders language facets with their human-readable names', async () => {
|
|
156
|
-
const el = await fixture<CollectionFacets>(
|
|
157
|
-
html`<collection-facets></collection-facets>`
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
const languageCodeHandler: LanguageCodeHandlerInterface =
|
|
161
|
-
new LanguageCodeHandler();
|
|
162
|
-
|
|
163
|
-
const aggs: Record<string, Aggregation> = {
|
|
164
|
-
language: new Aggregation({
|
|
165
|
-
buckets: [
|
|
166
|
-
{
|
|
167
|
-
key: 'English',
|
|
168
|
-
doc_count: 3,
|
|
169
|
-
},
|
|
170
|
-
],
|
|
171
|
-
}),
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
el.languageCodeHandler = languageCodeHandler;
|
|
175
|
-
el.aggregations = aggs;
|
|
176
|
-
await el.updateComplete;
|
|
177
|
-
|
|
178
|
-
const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
|
|
179
|
-
const languageTitle =
|
|
180
|
-
facetsTemplate?.shadowRoot?.querySelector('.facet-title');
|
|
181
|
-
expect(languageTitle?.textContent?.trim()).to.equal('English');
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it('renders selected/negative language facets with human-readable names', async () => {
|
|
185
|
-
const el = await fixture<CollectionFacets>(
|
|
186
|
-
html`<collection-facets></collection-facets>`
|
|
187
|
-
);
|
|
188
|
-
|
|
189
|
-
const languageCodeHandler: LanguageCodeHandlerInterface =
|
|
190
|
-
new LanguageCodeHandler();
|
|
191
|
-
|
|
192
|
-
const selectedFacets: SelectedFacets = {
|
|
193
|
-
subject: {},
|
|
194
|
-
lending: {},
|
|
195
|
-
mediatype: {},
|
|
196
|
-
language: {
|
|
197
|
-
en: {
|
|
198
|
-
key: 'en',
|
|
199
|
-
count: 5,
|
|
200
|
-
state: 'selected',
|
|
201
|
-
},
|
|
202
|
-
},
|
|
203
|
-
creator: {},
|
|
204
|
-
collection: {},
|
|
205
|
-
year: {},
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
el.languageCodeHandler = languageCodeHandler;
|
|
209
|
-
el.selectedFacets = selectedFacets;
|
|
210
|
-
await el.updateComplete;
|
|
211
|
-
|
|
212
|
-
const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
|
|
213
|
-
const languageTitle =
|
|
214
|
-
facetsTemplate?.shadowRoot?.querySelector('.facet-title');
|
|
215
|
-
expect(languageTitle?.textContent?.trim()).to.equal('English');
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it('renders lending facets with human-readable names', async () => {
|
|
219
|
-
const el = await fixture<CollectionFacets>(
|
|
220
|
-
html`<collection-facets></collection-facets>`
|
|
221
|
-
);
|
|
222
|
-
|
|
223
|
-
const aggs: Record<string, Aggregation> = {
|
|
224
|
-
lending: new Aggregation({
|
|
225
|
-
buckets: [
|
|
226
|
-
{
|
|
227
|
-
key: 'is_lendable',
|
|
228
|
-
doc_count: 3,
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
key: 'available_to_borrow',
|
|
232
|
-
doc_count: 2,
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
key: 'is_readable',
|
|
236
|
-
doc_count: 1,
|
|
237
|
-
},
|
|
238
|
-
],
|
|
239
|
-
}),
|
|
240
|
-
};
|
|
241
|
-
|
|
242
|
-
el.aggregations = aggs;
|
|
243
|
-
await el.updateComplete;
|
|
244
|
-
|
|
245
|
-
const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
|
|
246
|
-
const lendingTitles =
|
|
247
|
-
facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
|
|
248
|
-
expect(lendingTitles?.length).to.equal(3);
|
|
249
|
-
expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
|
|
250
|
-
'Lending Library'
|
|
251
|
-
);
|
|
252
|
-
expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
|
|
253
|
-
'Borrow 14 Days'
|
|
254
|
-
);
|
|
255
|
-
expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
|
|
256
|
-
'Always Available'
|
|
257
|
-
);
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
it('renders selected/negative lending facets with human-readable names', async () => {
|
|
261
|
-
const el = await fixture<CollectionFacets>(
|
|
262
|
-
html`<collection-facets></collection-facets>`
|
|
263
|
-
);
|
|
264
|
-
|
|
265
|
-
const selectedFacets: SelectedFacets = {
|
|
266
|
-
subject: {},
|
|
267
|
-
lending: {
|
|
268
|
-
is_lendable: {
|
|
269
|
-
key: 'is_lendable',
|
|
270
|
-
count: 5,
|
|
271
|
-
state: 'selected',
|
|
272
|
-
},
|
|
273
|
-
available_to_borrow: {
|
|
274
|
-
key: 'available_to_borrow',
|
|
275
|
-
count: 4,
|
|
276
|
-
state: 'selected',
|
|
277
|
-
},
|
|
278
|
-
is_readable: {
|
|
279
|
-
key: 'is_readable',
|
|
280
|
-
count: 3,
|
|
281
|
-
state: 'hidden',
|
|
282
|
-
},
|
|
283
|
-
},
|
|
284
|
-
mediatype: {},
|
|
285
|
-
language: {},
|
|
286
|
-
creator: {},
|
|
287
|
-
collection: {},
|
|
288
|
-
year: {},
|
|
289
|
-
};
|
|
290
|
-
|
|
291
|
-
el.selectedFacets = selectedFacets;
|
|
292
|
-
await el.updateComplete;
|
|
293
|
-
|
|
294
|
-
const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
|
|
295
|
-
const lendingTitles =
|
|
296
|
-
facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
|
|
297
|
-
expect(lendingTitles?.length).to.equal(3);
|
|
298
|
-
expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
|
|
299
|
-
'Lending Library'
|
|
300
|
-
);
|
|
301
|
-
expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
|
|
302
|
-
'Borrow 14 Days'
|
|
303
|
-
);
|
|
304
|
-
expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
|
|
305
|
-
'Always Available'
|
|
306
|
-
);
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
it('only renders lending facets for is_lendable, available_to_borrow, and is_readable', async () => {
|
|
310
|
-
const el = await fixture<CollectionFacets>(
|
|
311
|
-
html`<collection-facets></collection-facets>`
|
|
312
|
-
);
|
|
313
|
-
|
|
314
|
-
const aggs: Record<string, Aggregation> = {
|
|
315
|
-
lending: new Aggregation({
|
|
316
|
-
buckets: [
|
|
317
|
-
{
|
|
318
|
-
key: 'is_lendable',
|
|
319
|
-
doc_count: 5,
|
|
320
|
-
},
|
|
321
|
-
{
|
|
322
|
-
key: 'is_borrowable',
|
|
323
|
-
doc_count: 4,
|
|
324
|
-
},
|
|
325
|
-
{
|
|
326
|
-
key: 'available_to_borrow',
|
|
327
|
-
doc_count: 5,
|
|
328
|
-
},
|
|
329
|
-
{
|
|
330
|
-
key: 'is_browsable',
|
|
331
|
-
doc_count: 4,
|
|
332
|
-
},
|
|
333
|
-
{
|
|
334
|
-
key: 'available_to_browse',
|
|
335
|
-
doc_count: 5,
|
|
336
|
-
},
|
|
337
|
-
{
|
|
338
|
-
key: 'is_readable',
|
|
339
|
-
doc_count: 4,
|
|
340
|
-
},
|
|
341
|
-
{
|
|
342
|
-
key: 'available_to_waitlist',
|
|
343
|
-
doc_count: 5,
|
|
344
|
-
},
|
|
345
|
-
],
|
|
346
|
-
}),
|
|
347
|
-
};
|
|
348
|
-
|
|
349
|
-
el.aggregations = aggs;
|
|
350
|
-
await el.updateComplete;
|
|
351
|
-
|
|
352
|
-
const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
|
|
353
|
-
const lendingTitles =
|
|
354
|
-
facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
|
|
355
|
-
expect(lendingTitles?.length).to.equal(3);
|
|
356
|
-
expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
|
|
357
|
-
'Lending Library'
|
|
358
|
-
);
|
|
359
|
-
expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
|
|
360
|
-
'Borrow 14 Days'
|
|
361
|
-
);
|
|
362
|
-
expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
|
|
363
|
-
'Always Available'
|
|
364
|
-
);
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
it('does not render a More... link for lending facets', async () => {
|
|
368
|
-
const el = await fixture<CollectionFacets>(
|
|
369
|
-
html`<collection-facets></collection-facets>`
|
|
370
|
-
);
|
|
371
|
-
|
|
372
|
-
const aggs: Record<string, Aggregation> = {
|
|
373
|
-
lending: new Aggregation({
|
|
374
|
-
buckets: [
|
|
375
|
-
{
|
|
376
|
-
key: 'is_lendable',
|
|
377
|
-
doc_count: 5,
|
|
378
|
-
},
|
|
379
|
-
{
|
|
380
|
-
key: 'is_borrowable',
|
|
381
|
-
doc_count: 4,
|
|
382
|
-
},
|
|
383
|
-
{
|
|
384
|
-
key: 'available_to_borrow',
|
|
385
|
-
doc_count: 5,
|
|
386
|
-
},
|
|
387
|
-
{
|
|
388
|
-
key: 'is_browsable',
|
|
389
|
-
doc_count: 4,
|
|
390
|
-
},
|
|
391
|
-
{
|
|
392
|
-
key: 'available_to_browse',
|
|
393
|
-
doc_count: 5,
|
|
394
|
-
},
|
|
395
|
-
{
|
|
396
|
-
key: 'is_readable',
|
|
397
|
-
doc_count: 4,
|
|
398
|
-
},
|
|
399
|
-
{
|
|
400
|
-
key: 'available_to_waitlist',
|
|
401
|
-
doc_count: 5,
|
|
402
|
-
},
|
|
403
|
-
],
|
|
404
|
-
}),
|
|
405
|
-
};
|
|
406
|
-
|
|
407
|
-
el.aggregations = aggs;
|
|
408
|
-
await el.updateComplete;
|
|
409
|
-
|
|
410
|
-
const moreLink = el.shadowRoot?.querySelector('.more-link');
|
|
411
|
-
expect(moreLink).not.to.exist;
|
|
412
|
-
});
|
|
413
|
-
|
|
414
|
-
describe('More Facets', () => {
|
|
415
|
-
it('Does not render < allowedFacetCount', async () => {
|
|
416
|
-
const el = await fixture<CollectionFacets>(
|
|
417
|
-
html`<collection-facets></collection-facets>`
|
|
418
|
-
);
|
|
419
|
-
|
|
420
|
-
const aggs: Record<string, Aggregation> = {
|
|
421
|
-
subject: new Aggregation({
|
|
422
|
-
buckets: [
|
|
423
|
-
{
|
|
424
|
-
key: 'foo',
|
|
425
|
-
doc_count: 5,
|
|
426
|
-
},
|
|
427
|
-
],
|
|
428
|
-
}),
|
|
429
|
-
};
|
|
430
|
-
|
|
431
|
-
el.aggregations = aggs;
|
|
432
|
-
await el.updateComplete;
|
|
433
|
-
|
|
434
|
-
const moreLink = el.shadowRoot?.querySelector('.more-link');
|
|
435
|
-
expect(moreLink).to.be.null;
|
|
436
|
-
});
|
|
437
|
-
|
|
438
|
-
it('renders sorting icons', async () => {
|
|
439
|
-
const el = await fixture<CollectionFacets>(
|
|
440
|
-
html`<collection-facets></collection-facets>`
|
|
441
|
-
);
|
|
442
|
-
|
|
443
|
-
const aggs: Record<string, Aggregation> = {
|
|
444
|
-
subject: new Aggregation({
|
|
445
|
-
buckets: [
|
|
446
|
-
{
|
|
447
|
-
key: 'foo',
|
|
448
|
-
doc_count: 5,
|
|
449
|
-
},
|
|
450
|
-
],
|
|
451
|
-
}),
|
|
452
|
-
};
|
|
453
|
-
|
|
454
|
-
el.aggregations = aggs;
|
|
455
|
-
await el.updateComplete;
|
|
456
|
-
|
|
457
|
-
const sortingIcon = el.shadowRoot?.querySelector('.sorting-icon');
|
|
458
|
-
expect(sortingIcon).to.exist;
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
it('does not render sorting icon for lending facets', async () => {
|
|
462
|
-
const el = await fixture<CollectionFacets>(
|
|
463
|
-
html`<collection-facets></collection-facets>`
|
|
464
|
-
);
|
|
465
|
-
|
|
466
|
-
const aggs: Record<string, Aggregation> = {
|
|
467
|
-
lending: new Aggregation({
|
|
468
|
-
buckets: [
|
|
469
|
-
{
|
|
470
|
-
key: 'is_readable',
|
|
471
|
-
doc_count: 5,
|
|
472
|
-
},
|
|
473
|
-
],
|
|
474
|
-
}),
|
|
475
|
-
};
|
|
476
|
-
|
|
477
|
-
el.aggregations = aggs;
|
|
478
|
-
await el.updateComplete;
|
|
479
|
-
|
|
480
|
-
const sortingIcon = el.shadowRoot?.querySelector('.sorting-icon');
|
|
481
|
-
expect(sortingIcon).not.to.exist;
|
|
482
|
-
});
|
|
483
|
-
|
|
484
|
-
it('Render More Facets', async () => {
|
|
485
|
-
const el = await fixture<CollectionFacets>(
|
|
486
|
-
html`<collection-facets
|
|
487
|
-
.modalManager=${new ModalManager()}
|
|
488
|
-
></collection-facets>`
|
|
489
|
-
);
|
|
490
|
-
|
|
491
|
-
const aggs: Record<string, Aggregation> = {
|
|
492
|
-
subject: new Aggregation({
|
|
493
|
-
buckets: [
|
|
494
|
-
{
|
|
495
|
-
key: 'foo',
|
|
496
|
-
doc_count: 5,
|
|
497
|
-
},
|
|
498
|
-
{
|
|
499
|
-
key: 'fi',
|
|
500
|
-
doc_count: 5,
|
|
501
|
-
},
|
|
502
|
-
{
|
|
503
|
-
key: 'fum',
|
|
504
|
-
doc_count: 5,
|
|
505
|
-
},
|
|
506
|
-
{
|
|
507
|
-
key: 'flee',
|
|
508
|
-
doc_count: 5,
|
|
509
|
-
},
|
|
510
|
-
{
|
|
511
|
-
key: 'wheee',
|
|
512
|
-
doc_count: 5,
|
|
513
|
-
},
|
|
514
|
-
{
|
|
515
|
-
key: 'whooo',
|
|
516
|
-
doc_count: 5,
|
|
517
|
-
},
|
|
518
|
-
{
|
|
519
|
-
key: 'boop',
|
|
520
|
-
doc_count: 5,
|
|
521
|
-
},
|
|
522
|
-
],
|
|
523
|
-
}),
|
|
524
|
-
};
|
|
525
|
-
|
|
526
|
-
el.aggregations = aggs;
|
|
527
|
-
await el.updateComplete;
|
|
528
|
-
|
|
529
|
-
let eventCaught = false;
|
|
530
|
-
let eventFacet = '';
|
|
531
|
-
el.addEventListener('showMoreFacets', e => {
|
|
532
|
-
eventFacet = (e as CustomEvent).detail;
|
|
533
|
-
eventCaught = true;
|
|
534
|
-
});
|
|
535
|
-
|
|
536
|
-
const moreLink = el.shadowRoot?.querySelector(
|
|
537
|
-
'.more-link'
|
|
538
|
-
) as HTMLButtonElement;
|
|
539
|
-
expect(moreLink).to.exist; // has link
|
|
540
|
-
|
|
541
|
-
const showModalSpy = sinon.spy(
|
|
542
|
-
el.modalManager as ModalManagerInterface,
|
|
543
|
-
'showModal'
|
|
544
|
-
);
|
|
545
|
-
// let's pop up modal
|
|
546
|
-
moreLink?.click();
|
|
547
|
-
await el.updateComplete;
|
|
548
|
-
|
|
549
|
-
expect(showModalSpy.callCount).to.equal(1);
|
|
550
|
-
expect(el.modalManager?.classList.contains('more-search-facets')).to.be
|
|
551
|
-
.true;
|
|
552
|
-
expect(eventCaught).to.be.true;
|
|
553
|
-
expect(eventFacet).to.equal('subject' as FacetOption);
|
|
554
|
-
});
|
|
555
|
-
});
|
|
556
|
-
});
|
|
1
|
+
/* eslint-disable import/no-duplicates */
|
|
2
|
+
import { expect, fixture } from '@open-wc/testing';
|
|
3
|
+
import sinon from 'sinon';
|
|
4
|
+
import { html } from 'lit';
|
|
5
|
+
import { Aggregation } from '@internetarchive/search-service';
|
|
6
|
+
import {
|
|
7
|
+
ModalManager,
|
|
8
|
+
ModalManagerInterface,
|
|
9
|
+
} from '@internetarchive/modal-manager';
|
|
10
|
+
import type { CollectionFacets } from '../src/collection-facets';
|
|
11
|
+
import '@internetarchive/modal-manager';
|
|
12
|
+
import '../src/collection-facets';
|
|
13
|
+
import type { FacetOption, SelectedFacets } from '../src/models';
|
|
14
|
+
import {
|
|
15
|
+
LanguageCodeHandler,
|
|
16
|
+
LanguageCodeHandlerInterface,
|
|
17
|
+
} from '../src/language-code-handler/language-code-handler';
|
|
18
|
+
|
|
19
|
+
describe('Collection Facets', () => {
|
|
20
|
+
it('has loader', async () => {
|
|
21
|
+
const el = await fixture<CollectionFacets>(
|
|
22
|
+
html`<collection-facets ?facetsLoading=${true}></collection-facets>`
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
expect(
|
|
26
|
+
el.shadowRoot?.querySelector('#container')?.classList.contains('loading')
|
|
27
|
+
).to.be.true;
|
|
28
|
+
|
|
29
|
+
el.facetsLoading = false;
|
|
30
|
+
await el.updateComplete;
|
|
31
|
+
|
|
32
|
+
expect(
|
|
33
|
+
el.shadowRoot?.querySelector('#container')?.classList.contains('loading')
|
|
34
|
+
).to.be.false;
|
|
35
|
+
});
|
|
36
|
+
it('renders aggregations as facets', async () => {
|
|
37
|
+
const el = await fixture<CollectionFacets>(
|
|
38
|
+
html`<collection-facets></collection-facets>`
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const aggs: Record<string, Aggregation> = {
|
|
42
|
+
subject: new Aggregation({
|
|
43
|
+
buckets: [
|
|
44
|
+
{
|
|
45
|
+
key: 'foo',
|
|
46
|
+
doc_count: 5,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
el.aggregations = aggs;
|
|
53
|
+
await el.updateComplete;
|
|
54
|
+
const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');
|
|
55
|
+
expect(facetGroups?.length).to.equal(1);
|
|
56
|
+
|
|
57
|
+
const titleFacetGroup = facetGroups?.[0];
|
|
58
|
+
const facetGroupHeader = titleFacetGroup?.querySelector('h1');
|
|
59
|
+
expect(facetGroupHeader?.textContent?.trim()).to.equal('Subject');
|
|
60
|
+
const titleFacetRow = titleFacetGroup
|
|
61
|
+
?.querySelector('facets-template')
|
|
62
|
+
?.shadowRoot?.querySelector('.facet-row');
|
|
63
|
+
console.log(titleFacetGroup?.querySelector('facets-template'));
|
|
64
|
+
expect(titleFacetRow?.textContent?.trim()).to.satisfy((text: string) =>
|
|
65
|
+
/^foo\s*5$/.test(text)
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('renders multiple aggregation types', async () => {
|
|
70
|
+
const el = await fixture<CollectionFacets>(
|
|
71
|
+
html`<collection-facets></collection-facets>`
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
const aggs: Record<string, Aggregation> = {
|
|
75
|
+
subject: new Aggregation({
|
|
76
|
+
buckets: [
|
|
77
|
+
{
|
|
78
|
+
key: 'foo',
|
|
79
|
+
doc_count: 5,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
}),
|
|
83
|
+
mediatype: new Aggregation({
|
|
84
|
+
buckets: [
|
|
85
|
+
{
|
|
86
|
+
key: 'bar',
|
|
87
|
+
doc_count: 10,
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
}),
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
el.aggregations = aggs;
|
|
94
|
+
await el.updateComplete;
|
|
95
|
+
|
|
96
|
+
const facetGroups = el.shadowRoot?.querySelectorAll('.facet-group');
|
|
97
|
+
expect(facetGroups?.length).to.equal(2);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('renders collection facets as links', async () => {
|
|
101
|
+
const el = await fixture<CollectionFacets>(
|
|
102
|
+
html`<collection-facets></collection-facets>`
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const aggs: Record<string, Aggregation> = {
|
|
106
|
+
collection: new Aggregation({
|
|
107
|
+
buckets: [
|
|
108
|
+
{
|
|
109
|
+
key: 'foo',
|
|
110
|
+
doc_count: 5,
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
}),
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
el.aggregations = aggs;
|
|
117
|
+
await el.updateComplete;
|
|
118
|
+
|
|
119
|
+
const collectionName = el.shadowRoot
|
|
120
|
+
?.querySelector('facets-template')
|
|
121
|
+
?.shadowRoot?.querySelector('async-collection-name');
|
|
122
|
+
expect(collectionName?.parentElement).to.be.instanceOf(HTMLAnchorElement);
|
|
123
|
+
expect(collectionName?.parentElement?.getAttribute('href')).to.equal(
|
|
124
|
+
'/details/foo'
|
|
125
|
+
);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('renders non-collection facets without links', async () => {
|
|
129
|
+
const el = await fixture<CollectionFacets>(
|
|
130
|
+
html`<collection-facets></collection-facets>`
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
const aggs: Record<string, Aggregation> = {
|
|
134
|
+
subject: new Aggregation({
|
|
135
|
+
buckets: [
|
|
136
|
+
{
|
|
137
|
+
key: 'foo',
|
|
138
|
+
doc_count: 5,
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
}),
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
el.aggregations = aggs;
|
|
145
|
+
await el.updateComplete;
|
|
146
|
+
|
|
147
|
+
const collectionName = el.shadowRoot
|
|
148
|
+
?.querySelector('facets-template')
|
|
149
|
+
?.shadowRoot?.querySelector('async-collection-name');
|
|
150
|
+
expect(collectionName?.parentElement).to.not.be.instanceOf(
|
|
151
|
+
HTMLAnchorElement
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('renders language facets with their human-readable names', async () => {
|
|
156
|
+
const el = await fixture<CollectionFacets>(
|
|
157
|
+
html`<collection-facets></collection-facets>`
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
const languageCodeHandler: LanguageCodeHandlerInterface =
|
|
161
|
+
new LanguageCodeHandler();
|
|
162
|
+
|
|
163
|
+
const aggs: Record<string, Aggregation> = {
|
|
164
|
+
language: new Aggregation({
|
|
165
|
+
buckets: [
|
|
166
|
+
{
|
|
167
|
+
key: 'English',
|
|
168
|
+
doc_count: 3,
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
}),
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
el.languageCodeHandler = languageCodeHandler;
|
|
175
|
+
el.aggregations = aggs;
|
|
176
|
+
await el.updateComplete;
|
|
177
|
+
|
|
178
|
+
const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
|
|
179
|
+
const languageTitle =
|
|
180
|
+
facetsTemplate?.shadowRoot?.querySelector('.facet-title');
|
|
181
|
+
expect(languageTitle?.textContent?.trim()).to.equal('English');
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('renders selected/negative language facets with human-readable names', async () => {
|
|
185
|
+
const el = await fixture<CollectionFacets>(
|
|
186
|
+
html`<collection-facets></collection-facets>`
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
const languageCodeHandler: LanguageCodeHandlerInterface =
|
|
190
|
+
new LanguageCodeHandler();
|
|
191
|
+
|
|
192
|
+
const selectedFacets: SelectedFacets = {
|
|
193
|
+
subject: {},
|
|
194
|
+
lending: {},
|
|
195
|
+
mediatype: {},
|
|
196
|
+
language: {
|
|
197
|
+
en: {
|
|
198
|
+
key: 'en',
|
|
199
|
+
count: 5,
|
|
200
|
+
state: 'selected',
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
creator: {},
|
|
204
|
+
collection: {},
|
|
205
|
+
year: {},
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
el.languageCodeHandler = languageCodeHandler;
|
|
209
|
+
el.selectedFacets = selectedFacets;
|
|
210
|
+
await el.updateComplete;
|
|
211
|
+
|
|
212
|
+
const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
|
|
213
|
+
const languageTitle =
|
|
214
|
+
facetsTemplate?.shadowRoot?.querySelector('.facet-title');
|
|
215
|
+
expect(languageTitle?.textContent?.trim()).to.equal('English');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('renders lending facets with human-readable names', async () => {
|
|
219
|
+
const el = await fixture<CollectionFacets>(
|
|
220
|
+
html`<collection-facets></collection-facets>`
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
const aggs: Record<string, Aggregation> = {
|
|
224
|
+
lending: new Aggregation({
|
|
225
|
+
buckets: [
|
|
226
|
+
{
|
|
227
|
+
key: 'is_lendable',
|
|
228
|
+
doc_count: 3,
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
key: 'available_to_borrow',
|
|
232
|
+
doc_count: 2,
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
key: 'is_readable',
|
|
236
|
+
doc_count: 1,
|
|
237
|
+
},
|
|
238
|
+
],
|
|
239
|
+
}),
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
el.aggregations = aggs;
|
|
243
|
+
await el.updateComplete;
|
|
244
|
+
|
|
245
|
+
const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
|
|
246
|
+
const lendingTitles =
|
|
247
|
+
facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
|
|
248
|
+
expect(lendingTitles?.length).to.equal(3);
|
|
249
|
+
expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
|
|
250
|
+
'Lending Library'
|
|
251
|
+
);
|
|
252
|
+
expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
|
|
253
|
+
'Borrow 14 Days'
|
|
254
|
+
);
|
|
255
|
+
expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
|
|
256
|
+
'Always Available'
|
|
257
|
+
);
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it('renders selected/negative lending facets with human-readable names', async () => {
|
|
261
|
+
const el = await fixture<CollectionFacets>(
|
|
262
|
+
html`<collection-facets></collection-facets>`
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
const selectedFacets: SelectedFacets = {
|
|
266
|
+
subject: {},
|
|
267
|
+
lending: {
|
|
268
|
+
is_lendable: {
|
|
269
|
+
key: 'is_lendable',
|
|
270
|
+
count: 5,
|
|
271
|
+
state: 'selected',
|
|
272
|
+
},
|
|
273
|
+
available_to_borrow: {
|
|
274
|
+
key: 'available_to_borrow',
|
|
275
|
+
count: 4,
|
|
276
|
+
state: 'selected',
|
|
277
|
+
},
|
|
278
|
+
is_readable: {
|
|
279
|
+
key: 'is_readable',
|
|
280
|
+
count: 3,
|
|
281
|
+
state: 'hidden',
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
mediatype: {},
|
|
285
|
+
language: {},
|
|
286
|
+
creator: {},
|
|
287
|
+
collection: {},
|
|
288
|
+
year: {},
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
el.selectedFacets = selectedFacets;
|
|
292
|
+
await el.updateComplete;
|
|
293
|
+
|
|
294
|
+
const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
|
|
295
|
+
const lendingTitles =
|
|
296
|
+
facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
|
|
297
|
+
expect(lendingTitles?.length).to.equal(3);
|
|
298
|
+
expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
|
|
299
|
+
'Lending Library'
|
|
300
|
+
);
|
|
301
|
+
expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
|
|
302
|
+
'Borrow 14 Days'
|
|
303
|
+
);
|
|
304
|
+
expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
|
|
305
|
+
'Always Available'
|
|
306
|
+
);
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
it('only renders lending facets for is_lendable, available_to_borrow, and is_readable', async () => {
|
|
310
|
+
const el = await fixture<CollectionFacets>(
|
|
311
|
+
html`<collection-facets></collection-facets>`
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
const aggs: Record<string, Aggregation> = {
|
|
315
|
+
lending: new Aggregation({
|
|
316
|
+
buckets: [
|
|
317
|
+
{
|
|
318
|
+
key: 'is_lendable',
|
|
319
|
+
doc_count: 5,
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
key: 'is_borrowable',
|
|
323
|
+
doc_count: 4,
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
key: 'available_to_borrow',
|
|
327
|
+
doc_count: 5,
|
|
328
|
+
},
|
|
329
|
+
{
|
|
330
|
+
key: 'is_browsable',
|
|
331
|
+
doc_count: 4,
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
key: 'available_to_browse',
|
|
335
|
+
doc_count: 5,
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
key: 'is_readable',
|
|
339
|
+
doc_count: 4,
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
key: 'available_to_waitlist',
|
|
343
|
+
doc_count: 5,
|
|
344
|
+
},
|
|
345
|
+
],
|
|
346
|
+
}),
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
el.aggregations = aggs;
|
|
350
|
+
await el.updateComplete;
|
|
351
|
+
|
|
352
|
+
const facetsTemplate = el.shadowRoot?.querySelector('facets-template');
|
|
353
|
+
const lendingTitles =
|
|
354
|
+
facetsTemplate?.shadowRoot?.querySelectorAll('.facet-title');
|
|
355
|
+
expect(lendingTitles?.length).to.equal(3);
|
|
356
|
+
expect(lendingTitles?.item(0).textContent?.trim()).to.equal(
|
|
357
|
+
'Lending Library'
|
|
358
|
+
);
|
|
359
|
+
expect(lendingTitles?.item(1).textContent?.trim()).to.equal(
|
|
360
|
+
'Borrow 14 Days'
|
|
361
|
+
);
|
|
362
|
+
expect(lendingTitles?.item(2).textContent?.trim()).to.equal(
|
|
363
|
+
'Always Available'
|
|
364
|
+
);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it('does not render a More... link for lending facets', async () => {
|
|
368
|
+
const el = await fixture<CollectionFacets>(
|
|
369
|
+
html`<collection-facets></collection-facets>`
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
const aggs: Record<string, Aggregation> = {
|
|
373
|
+
lending: new Aggregation({
|
|
374
|
+
buckets: [
|
|
375
|
+
{
|
|
376
|
+
key: 'is_lendable',
|
|
377
|
+
doc_count: 5,
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
key: 'is_borrowable',
|
|
381
|
+
doc_count: 4,
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
key: 'available_to_borrow',
|
|
385
|
+
doc_count: 5,
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
key: 'is_browsable',
|
|
389
|
+
doc_count: 4,
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
key: 'available_to_browse',
|
|
393
|
+
doc_count: 5,
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
key: 'is_readable',
|
|
397
|
+
doc_count: 4,
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
key: 'available_to_waitlist',
|
|
401
|
+
doc_count: 5,
|
|
402
|
+
},
|
|
403
|
+
],
|
|
404
|
+
}),
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
el.aggregations = aggs;
|
|
408
|
+
await el.updateComplete;
|
|
409
|
+
|
|
410
|
+
const moreLink = el.shadowRoot?.querySelector('.more-link');
|
|
411
|
+
expect(moreLink).not.to.exist;
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
describe('More Facets', () => {
|
|
415
|
+
it('Does not render < allowedFacetCount', async () => {
|
|
416
|
+
const el = await fixture<CollectionFacets>(
|
|
417
|
+
html`<collection-facets></collection-facets>`
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
const aggs: Record<string, Aggregation> = {
|
|
421
|
+
subject: new Aggregation({
|
|
422
|
+
buckets: [
|
|
423
|
+
{
|
|
424
|
+
key: 'foo',
|
|
425
|
+
doc_count: 5,
|
|
426
|
+
},
|
|
427
|
+
],
|
|
428
|
+
}),
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
el.aggregations = aggs;
|
|
432
|
+
await el.updateComplete;
|
|
433
|
+
|
|
434
|
+
const moreLink = el.shadowRoot?.querySelector('.more-link');
|
|
435
|
+
expect(moreLink).to.be.null;
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
it('renders sorting icons', async () => {
|
|
439
|
+
const el = await fixture<CollectionFacets>(
|
|
440
|
+
html`<collection-facets></collection-facets>`
|
|
441
|
+
);
|
|
442
|
+
|
|
443
|
+
const aggs: Record<string, Aggregation> = {
|
|
444
|
+
subject: new Aggregation({
|
|
445
|
+
buckets: [
|
|
446
|
+
{
|
|
447
|
+
key: 'foo',
|
|
448
|
+
doc_count: 5,
|
|
449
|
+
},
|
|
450
|
+
],
|
|
451
|
+
}),
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
el.aggregations = aggs;
|
|
455
|
+
await el.updateComplete;
|
|
456
|
+
|
|
457
|
+
const sortingIcon = el.shadowRoot?.querySelector('.sorting-icon');
|
|
458
|
+
expect(sortingIcon).to.exist;
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
it('does not render sorting icon for lending facets', async () => {
|
|
462
|
+
const el = await fixture<CollectionFacets>(
|
|
463
|
+
html`<collection-facets></collection-facets>`
|
|
464
|
+
);
|
|
465
|
+
|
|
466
|
+
const aggs: Record<string, Aggregation> = {
|
|
467
|
+
lending: new Aggregation({
|
|
468
|
+
buckets: [
|
|
469
|
+
{
|
|
470
|
+
key: 'is_readable',
|
|
471
|
+
doc_count: 5,
|
|
472
|
+
},
|
|
473
|
+
],
|
|
474
|
+
}),
|
|
475
|
+
};
|
|
476
|
+
|
|
477
|
+
el.aggregations = aggs;
|
|
478
|
+
await el.updateComplete;
|
|
479
|
+
|
|
480
|
+
const sortingIcon = el.shadowRoot?.querySelector('.sorting-icon');
|
|
481
|
+
expect(sortingIcon).not.to.exist;
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
it('Render More Facets', async () => {
|
|
485
|
+
const el = await fixture<CollectionFacets>(
|
|
486
|
+
html`<collection-facets
|
|
487
|
+
.modalManager=${new ModalManager()}
|
|
488
|
+
></collection-facets>`
|
|
489
|
+
);
|
|
490
|
+
|
|
491
|
+
const aggs: Record<string, Aggregation> = {
|
|
492
|
+
subject: new Aggregation({
|
|
493
|
+
buckets: [
|
|
494
|
+
{
|
|
495
|
+
key: 'foo',
|
|
496
|
+
doc_count: 5,
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
key: 'fi',
|
|
500
|
+
doc_count: 5,
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
key: 'fum',
|
|
504
|
+
doc_count: 5,
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
key: 'flee',
|
|
508
|
+
doc_count: 5,
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
key: 'wheee',
|
|
512
|
+
doc_count: 5,
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
key: 'whooo',
|
|
516
|
+
doc_count: 5,
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
key: 'boop',
|
|
520
|
+
doc_count: 5,
|
|
521
|
+
},
|
|
522
|
+
],
|
|
523
|
+
}),
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
el.aggregations = aggs;
|
|
527
|
+
await el.updateComplete;
|
|
528
|
+
|
|
529
|
+
let eventCaught = false;
|
|
530
|
+
let eventFacet = '';
|
|
531
|
+
el.addEventListener('showMoreFacets', e => {
|
|
532
|
+
eventFacet = (e as CustomEvent).detail;
|
|
533
|
+
eventCaught = true;
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
const moreLink = el.shadowRoot?.querySelector(
|
|
537
|
+
'.more-link'
|
|
538
|
+
) as HTMLButtonElement;
|
|
539
|
+
expect(moreLink).to.exist; // has link
|
|
540
|
+
|
|
541
|
+
const showModalSpy = sinon.spy(
|
|
542
|
+
el.modalManager as ModalManagerInterface,
|
|
543
|
+
'showModal'
|
|
544
|
+
);
|
|
545
|
+
// let's pop up modal
|
|
546
|
+
moreLink?.click();
|
|
547
|
+
await el.updateComplete;
|
|
548
|
+
|
|
549
|
+
expect(showModalSpy.callCount).to.equal(1);
|
|
550
|
+
expect(el.modalManager?.classList.contains('more-search-facets')).to.be
|
|
551
|
+
.true;
|
|
552
|
+
expect(eventCaught).to.be.true;
|
|
553
|
+
expect(eventFacet).to.equal('subject' as FacetOption);
|
|
554
|
+
});
|
|
555
|
+
});
|
|
556
|
+
});
|