@internetarchive/collection-browser 0.4.9-alpha.1 → 0.4.9
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 +50 -50
- package/dist/src/app-root.js +278 -278
- 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 +281 -281
- package/dist/src/collection-browser.js +1204 -1200
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
- package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
- 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 +77 -77
- package/dist/src/collection-facets/more-facets-content.js +357 -357
- 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 +83 -83
- package/dist/src/collection-facets.js +392 -392
- 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 +115 -114
- package/dist/src/models.js +125 -125
- package/dist/src/models.js.map +1 -1
- package/dist/src/restoration-state-handler.d.ts +45 -45
- package/dist/src/restoration-state-handler.js +230 -230
- package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -0
- package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +61 -0
- package/dist/src/sort-filter-bar/alpha-bar-tooltip.js.map +1 -0
- package/dist/src/sort-filter-bar/alpha-bar.d.ts +20 -12
- package/dist/src/sort-filter-bar/alpha-bar.js +166 -58
- package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
- 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 +108 -108
- package/dist/src/sort-filter-bar/sort-filter-bar.js +438 -438
- 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 +20 -17
- package/dist/src/tiles/grid/account-tile.js +68 -46
- package/dist/src/tiles/grid/account-tile.js.map +1 -1
- package/dist/src/tiles/grid/collection-tile.d.ts +17 -14
- package/dist/src/tiles/grid/collection-tile.js +75 -53
- package/dist/src/tiles/grid/collection-tile.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.d.ts +32 -29
- package/dist/src/tiles/grid/item-tile.js +126 -108
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
- package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +44 -8
- package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js.map +1 -1
- package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
- package/dist/src/tiles/grid/tile-stats.js +40 -40
- package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -197
- package/dist/src/tiles/hover/hover-pane-controller.js +352 -331
- package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -1
- package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -15
- package/dist/src/tiles/hover/tile-hover-pane.js +38 -38
- package/dist/src/tiles/image-block.d.ts +17 -17
- package/dist/src/tiles/image-block.js +72 -72
- package/dist/src/tiles/item-image.d.ts +35 -35
- package/dist/src/tiles/item-image.js +117 -117
- 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 +21 -21
- package/dist/src/tiles/list/tile-list-compact.js +99 -99
- package/dist/src/tiles/list/tile-list.d.ts +55 -55
- package/dist/src/tiles/list/tile-list.js +303 -297
- 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 +10 -10
- package/dist/src/tiles/overlay/icon-overlay.js +40 -40
- package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
- package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
- package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
- package/dist/src/tiles/overlay/text-overlay.js +42 -42
- package/dist/src/tiles/text-snippet-block.d.ts +27 -27
- package/dist/src/tiles/text-snippet-block.js +73 -73
- package/dist/src/tiles/tile-dispatcher.d.ts +58 -55
- package/dist/src/tiles/tile-dispatcher.js +203 -179
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/src/utils/analytics-events.d.ts +22 -22
- package/dist/src/utils/analytics-events.js +24 -24
- 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/src/utils/format-unit-size.d.ts +2 -2
- package/dist/src/utils/format-unit-size.js +33 -33
- package/dist/test/collection-browser.test.d.ts +1 -1
- package/dist/test/collection-browser.test.js +584 -584
- 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 +114 -114
- 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 +508 -508
- 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 -1
- package/dist/test/image-block.test.js +48 -48
- package/dist/test/item-image.test.d.ts +1 -1
- package/dist/test/item-image.test.js +84 -84
- 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 +12 -12
- package/dist/test/mocks/mock-search-responses.js +341 -341
- package/dist/test/mocks/mock-search-service.d.ts +13 -13
- package/dist/test/mocks/mock-search-service.js +40 -40
- package/dist/test/restoration-state-handler.test.d.ts +1 -1
- package/dist/test/restoration-state-handler.test.js +125 -125
- package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -0
- package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +13 -0
- package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js.map +1 -0
- package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
- package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -43
- package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -1
- 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 +197 -197
- package/dist/test/text-overlay.test.d.ts +1 -1
- package/dist/test/text-overlay.test.js +48 -48
- 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/account-tile.test.d.ts +1 -1
- package/dist/test/tiles/grid/account-tile.test.js +81 -60
- package/dist/test/tiles/grid/account-tile.test.js.map +1 -1
- package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
- package/dist/test/tiles/grid/collection-tile.test.js +81 -57
- package/dist/test/tiles/grid/collection-tile.test.js.map +1 -1
- package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
- package/dist/test/tiles/grid/item-tile.test.js +163 -142
- package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
- package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
- package/dist/test/tiles/hover/hover-pane-controller.test.js +257 -257
- package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
- package/dist/test/tiles/hover/tile-hover-pane.test.js +13 -13
- package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
- package/dist/test/tiles/list/tile-list-compact.test.js +92 -92
- package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
- package/dist/test/tiles/list/tile-list.test.js +163 -163
- package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -0
- package/dist/test/tiles/tile-dispatcher.test.js +101 -0
- package/dist/test/tiles/tile-dispatcher.test.js.map +1 -0
- 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/dist/test/utils/format-unit-size.test.d.ts +1 -1
- package/dist/test/utils/format-unit-size.test.js +17 -17
- package/local.archive.org.cert +86 -86
- package/local.archive.org.key +27 -27
- package/package.json +1 -1
- package/renovate.json +6 -6
- package/src/collection-browser.ts +4 -0
- package/src/collection-facets.ts +3 -5
- package/src/models.ts +1 -0
- package/src/sort-filter-bar/alpha-bar-tooltip.ts +54 -0
- package/src/sort-filter-bar/alpha-bar.ts +133 -9
- package/src/tiles/grid/account-tile.ts +23 -1
- package/src/tiles/grid/collection-tile.ts +31 -2
- package/src/tiles/grid/item-tile.ts +22 -2
- package/src/tiles/grid/styles/tile-grid-shared-styles.ts +37 -1
- package/src/tiles/hover/hover-pane-controller.ts +38 -1
- package/src/tiles/list/tile-list.ts +8 -1
- package/src/tiles/tile-dispatcher.ts +29 -2
- package/test/sort-filter-bar/alpha-bar-tooltip.test.ts +17 -0
- package/test/sort-filter-bar/alpha-bar.test.ts +46 -1
- package/test/tiles/grid/account-tile.test.ts +27 -0
- package/test/tiles/grid/collection-tile.test.ts +30 -0
- package/test/tiles/grid/item-tile.test.ts +27 -0
- package/test/tiles/tile-dispatcher.test.ts +122 -0
- package/tsconfig.json +21 -21
- package/web-dev-server.config.mjs +30 -30
- package/web-test-runner.config.mjs +41 -41
|
@@ -1,627 +1,627 @@
|
|
|
1
|
-
/* eslint-disable import/no-duplicates */
|
|
2
|
-
import { expect, fixture } from '@open-wc/testing';
|
|
3
|
-
import { html } from 'lit';
|
|
4
|
-
import sinon from 'sinon';
|
|
5
|
-
import { SearchType } from '@internetarchive/search-service';
|
|
6
|
-
import '../src/collection-browser';
|
|
7
|
-
import { defaultSelectedFacets, SortField, } from '../src/models';
|
|
8
|
-
import { MockSearchService } from './mocks/mock-search-service';
|
|
9
|
-
import { MockCollectionNameCache } from './mocks/mock-collection-name-cache';
|
|
10
|
-
import { MockAnalyticsHandler } from './mocks/mock-analytics-handler';
|
|
11
|
-
import { analyticsCategories } from '../src/utils/analytics-events';
|
|
12
|
-
/**
|
|
13
|
-
* Wait for the next tick of the event loop.
|
|
14
|
-
*
|
|
15
|
-
* This is necessary in some of the tests because certain collection browser
|
|
16
|
-
* updates take more than one tick to render (e.g., date picker & query changes).
|
|
17
|
-
* These delays are non-ideal and should eventually be investigated and fixed,
|
|
18
|
-
* but they are minor enough that waiting for the next tick is a reasonable
|
|
19
|
-
* testing solution for now.
|
|
20
|
-
*/
|
|
21
|
-
const nextTick = () => new Promise(resolve => {
|
|
22
|
-
setTimeout(resolve, 0);
|
|
23
|
-
});
|
|
24
|
-
describe('Collection Browser', () => {
|
|
25
|
-
beforeEach(async () => {
|
|
26
|
-
// Apparently query params set by one test can bleed into other tests.
|
|
27
|
-
// Since collection browser restores its state from certain query params, we need
|
|
28
|
-
// to clear these before each test to ensure they run in isolation from one another.
|
|
29
|
-
const url = new URL(window.location.href);
|
|
30
|
-
const { searchParams } = url;
|
|
31
|
-
searchParams.delete('sin');
|
|
32
|
-
searchParams.delete('sort');
|
|
33
|
-
searchParams.delete('query');
|
|
34
|
-
searchParams.delete('page');
|
|
35
|
-
searchParams.delete('and[]');
|
|
36
|
-
searchParams.delete('not[]');
|
|
37
|
-
window.history.replaceState({}, '', url);
|
|
38
|
-
});
|
|
39
|
-
it('clear existing filter for facets & sort-bar', async () => {
|
|
40
|
-
const el = await fixture(html `<collection-browser></collection-browser>`);
|
|
41
|
-
el.selectedSort = 'title';
|
|
42
|
-
await el.updateComplete;
|
|
43
|
-
el.clearFilters();
|
|
44
|
-
expect(el.selectedFacets).to.equal(defaultSelectedFacets);
|
|
45
|
-
expect(el.selectedSort).to.equal('relevance');
|
|
46
|
-
expect(el.sortDirection).to.null;
|
|
47
|
-
expect(el.sortParam).to.null;
|
|
48
|
-
expect(el.selectedCreatorFilter).to.null;
|
|
49
|
-
expect(el.selectedTitleFilter).to.null;
|
|
50
|
-
});
|
|
51
|
-
it('filterBy creator with analytics', async () => {
|
|
52
|
-
const mockAnalyticsHandler = new MockAnalyticsHandler();
|
|
1
|
+
/* eslint-disable import/no-duplicates */
|
|
2
|
+
import { expect, fixture } from '@open-wc/testing';
|
|
3
|
+
import { html } from 'lit';
|
|
4
|
+
import sinon from 'sinon';
|
|
5
|
+
import { SearchType } from '@internetarchive/search-service';
|
|
6
|
+
import '../src/collection-browser';
|
|
7
|
+
import { defaultSelectedFacets, SortField, } from '../src/models';
|
|
8
|
+
import { MockSearchService } from './mocks/mock-search-service';
|
|
9
|
+
import { MockCollectionNameCache } from './mocks/mock-collection-name-cache';
|
|
10
|
+
import { MockAnalyticsHandler } from './mocks/mock-analytics-handler';
|
|
11
|
+
import { analyticsCategories } from '../src/utils/analytics-events';
|
|
12
|
+
/**
|
|
13
|
+
* Wait for the next tick of the event loop.
|
|
14
|
+
*
|
|
15
|
+
* This is necessary in some of the tests because certain collection browser
|
|
16
|
+
* updates take more than one tick to render (e.g., date picker & query changes).
|
|
17
|
+
* These delays are non-ideal and should eventually be investigated and fixed,
|
|
18
|
+
* but they are minor enough that waiting for the next tick is a reasonable
|
|
19
|
+
* testing solution for now.
|
|
20
|
+
*/
|
|
21
|
+
const nextTick = () => new Promise(resolve => {
|
|
22
|
+
setTimeout(resolve, 0);
|
|
23
|
+
});
|
|
24
|
+
describe('Collection Browser', () => {
|
|
25
|
+
beforeEach(async () => {
|
|
26
|
+
// Apparently query params set by one test can bleed into other tests.
|
|
27
|
+
// Since collection browser restores its state from certain query params, we need
|
|
28
|
+
// to clear these before each test to ensure they run in isolation from one another.
|
|
29
|
+
const url = new URL(window.location.href);
|
|
30
|
+
const { searchParams } = url;
|
|
31
|
+
searchParams.delete('sin');
|
|
32
|
+
searchParams.delete('sort');
|
|
33
|
+
searchParams.delete('query');
|
|
34
|
+
searchParams.delete('page');
|
|
35
|
+
searchParams.delete('and[]');
|
|
36
|
+
searchParams.delete('not[]');
|
|
37
|
+
window.history.replaceState({}, '', url);
|
|
38
|
+
});
|
|
39
|
+
it('clear existing filter for facets & sort-bar', async () => {
|
|
40
|
+
const el = await fixture(html `<collection-browser></collection-browser>`);
|
|
41
|
+
el.selectedSort = 'title';
|
|
42
|
+
await el.updateComplete;
|
|
43
|
+
el.clearFilters();
|
|
44
|
+
expect(el.selectedFacets).to.equal(defaultSelectedFacets);
|
|
45
|
+
expect(el.selectedSort).to.equal('relevance');
|
|
46
|
+
expect(el.sortDirection).to.null;
|
|
47
|
+
expect(el.sortParam).to.null;
|
|
48
|
+
expect(el.selectedCreatorFilter).to.null;
|
|
49
|
+
expect(el.selectedTitleFilter).to.null;
|
|
50
|
+
});
|
|
51
|
+
it('filterBy creator with analytics', async () => {
|
|
52
|
+
const mockAnalyticsHandler = new MockAnalyticsHandler();
|
|
53
53
|
const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
|
|
54
|
-
</collection-browser>`);
|
|
55
|
-
el.searchContext = 'betaSearchService';
|
|
56
|
-
el.selectedSort = 'creator';
|
|
57
|
-
el.sortDirection = 'asc';
|
|
58
|
-
el.selectedCreatorFilter = 'A';
|
|
59
|
-
await el.updateComplete;
|
|
60
|
-
expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
|
|
61
|
-
expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
|
|
62
|
-
expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
|
|
63
|
-
el.clearFilters();
|
|
64
|
-
await el.updateComplete;
|
|
65
|
-
expect(el.selectedTitleFilter).to.null;
|
|
66
|
-
expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
|
|
67
|
-
expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
|
|
68
|
-
expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
|
|
69
|
-
});
|
|
70
|
-
it('filterBy title with analytics', async () => {
|
|
71
|
-
const mockAnalyticsHandler = new MockAnalyticsHandler();
|
|
54
|
+
</collection-browser>`);
|
|
55
|
+
el.searchContext = 'betaSearchService';
|
|
56
|
+
el.selectedSort = 'creator';
|
|
57
|
+
el.sortDirection = 'asc';
|
|
58
|
+
el.selectedCreatorFilter = 'A';
|
|
59
|
+
await el.updateComplete;
|
|
60
|
+
expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
|
|
61
|
+
expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
|
|
62
|
+
expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
|
|
63
|
+
el.clearFilters();
|
|
64
|
+
await el.updateComplete;
|
|
65
|
+
expect(el.selectedTitleFilter).to.null;
|
|
66
|
+
expect(mockAnalyticsHandler.callCategory).to.equal('betaSearchService');
|
|
67
|
+
expect(mockAnalyticsHandler.callAction).to.equal('filterByCreator');
|
|
68
|
+
expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
|
|
69
|
+
});
|
|
70
|
+
it('filterBy title with analytics', async () => {
|
|
71
|
+
const mockAnalyticsHandler = new MockAnalyticsHandler();
|
|
72
72
|
const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
|
|
73
|
-
</collection-browser>`);
|
|
74
|
-
el.searchContext = 'beta-search-service';
|
|
75
|
-
el.selectedSort = 'title';
|
|
76
|
-
el.sortDirection = 'asc';
|
|
77
|
-
el.selectedTitleFilter = 'A';
|
|
78
|
-
await el.updateComplete;
|
|
79
|
-
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
|
|
80
|
-
expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
|
|
81
|
-
expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
|
|
82
|
-
el.clearFilters();
|
|
83
|
-
await el.updateComplete;
|
|
84
|
-
expect(el.selectedTitleFilter).to.null;
|
|
85
|
-
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
|
|
86
|
-
expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
|
|
87
|
-
expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
|
|
88
|
-
});
|
|
89
|
-
it('selected facets with analytics - not negative facets', async () => {
|
|
90
|
-
const mockAnalyticsHandler = new MockAnalyticsHandler();
|
|
91
|
-
const mediaTypeBucket = { count: 123, state: 'selected' };
|
|
92
|
-
const mockedSelectedFacets = {
|
|
93
|
-
subject: {},
|
|
94
|
-
lending: {},
|
|
95
|
-
mediatype: { data: mediaTypeBucket },
|
|
96
|
-
language: {},
|
|
97
|
-
creator: {},
|
|
98
|
-
collection: {},
|
|
99
|
-
year: {},
|
|
100
|
-
};
|
|
73
|
+
</collection-browser>`);
|
|
74
|
+
el.searchContext = 'beta-search-service';
|
|
75
|
+
el.selectedSort = 'title';
|
|
76
|
+
el.sortDirection = 'asc';
|
|
77
|
+
el.selectedTitleFilter = 'A';
|
|
78
|
+
await el.updateComplete;
|
|
79
|
+
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
|
|
80
|
+
expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
|
|
81
|
+
expect(mockAnalyticsHandler.callLabel).to.equal('start-A');
|
|
82
|
+
el.clearFilters();
|
|
83
|
+
await el.updateComplete;
|
|
84
|
+
expect(el.selectedTitleFilter).to.null;
|
|
85
|
+
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
|
|
86
|
+
expect(mockAnalyticsHandler.callAction).to.equal('filterByTitle');
|
|
87
|
+
expect(mockAnalyticsHandler.callLabel).to.equal('clear-A');
|
|
88
|
+
});
|
|
89
|
+
it('selected facets with analytics - not negative facets', async () => {
|
|
90
|
+
const mockAnalyticsHandler = new MockAnalyticsHandler();
|
|
91
|
+
const mediaTypeBucket = { count: 123, state: 'selected' };
|
|
92
|
+
const mockedSelectedFacets = {
|
|
93
|
+
subject: {},
|
|
94
|
+
lending: {},
|
|
95
|
+
mediatype: { data: mediaTypeBucket },
|
|
96
|
+
language: {},
|
|
97
|
+
creator: {},
|
|
98
|
+
collection: {},
|
|
99
|
+
year: {},
|
|
100
|
+
};
|
|
101
101
|
const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
|
|
102
|
-
</collection-browser>`);
|
|
103
|
-
el.searchContext = 'search-service';
|
|
104
|
-
el.selectedFacets = mockedSelectedFacets;
|
|
105
|
-
await el.updateComplete;
|
|
106
|
-
el.facetClickHandler('mediatype', true, false);
|
|
107
|
-
expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
|
|
108
|
-
expect(mockAnalyticsHandler.callAction).to.equal('facetSelected');
|
|
109
|
-
expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
|
|
110
|
-
el.facetClickHandler('mediatype', false, false);
|
|
111
|
-
expect(el.selectedFacets).to.equal(mockedSelectedFacets);
|
|
112
|
-
expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
|
|
113
|
-
expect(mockAnalyticsHandler.callAction).to.equal('facetDeselected');
|
|
114
|
-
expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
|
|
115
|
-
});
|
|
116
|
-
it('selected facets with analytics - negative facets', async () => {
|
|
117
|
-
const mockAnalyticsHandler = new MockAnalyticsHandler();
|
|
118
|
-
const mediaTypeBucket = { count: 123, state: 'selected' };
|
|
119
|
-
const mockedSelectedFacets = {
|
|
120
|
-
subject: {},
|
|
121
|
-
lending: {},
|
|
122
|
-
mediatype: { data: mediaTypeBucket },
|
|
123
|
-
language: {},
|
|
124
|
-
creator: {},
|
|
125
|
-
collection: {},
|
|
126
|
-
year: {},
|
|
127
|
-
};
|
|
102
|
+
</collection-browser>`);
|
|
103
|
+
el.searchContext = 'search-service';
|
|
104
|
+
el.selectedFacets = mockedSelectedFacets;
|
|
105
|
+
await el.updateComplete;
|
|
106
|
+
el.facetClickHandler('mediatype', true, false);
|
|
107
|
+
expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
|
|
108
|
+
expect(mockAnalyticsHandler.callAction).to.equal('facetSelected');
|
|
109
|
+
expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
|
|
110
|
+
el.facetClickHandler('mediatype', false, false);
|
|
111
|
+
expect(el.selectedFacets).to.equal(mockedSelectedFacets);
|
|
112
|
+
expect(mockAnalyticsHandler.callCategory).to.equal('search-service');
|
|
113
|
+
expect(mockAnalyticsHandler.callAction).to.equal('facetDeselected');
|
|
114
|
+
expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
|
|
115
|
+
});
|
|
116
|
+
it('selected facets with analytics - negative facets', async () => {
|
|
117
|
+
const mockAnalyticsHandler = new MockAnalyticsHandler();
|
|
118
|
+
const mediaTypeBucket = { count: 123, state: 'selected' };
|
|
119
|
+
const mockedSelectedFacets = {
|
|
120
|
+
subject: {},
|
|
121
|
+
lending: {},
|
|
122
|
+
mediatype: { data: mediaTypeBucket },
|
|
123
|
+
language: {},
|
|
124
|
+
creator: {},
|
|
125
|
+
collection: {},
|
|
126
|
+
year: {},
|
|
127
|
+
};
|
|
128
128
|
const el = await fixture(html `<collection-browser .analyticsHandler=${mockAnalyticsHandler}>
|
|
129
|
-
</collection-browser>`);
|
|
130
|
-
el.searchContext = 'beta-search-service';
|
|
131
|
-
el.selectedFacets = mockedSelectedFacets;
|
|
132
|
-
await el.updateComplete;
|
|
133
|
-
el.facetClickHandler('mediatype', true, true);
|
|
134
|
-
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
|
|
135
|
-
expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeSelected');
|
|
136
|
-
expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
|
|
137
|
-
el.facetClickHandler('mediatype', false, true);
|
|
138
|
-
expect(el.selectedFacets).to.equal(mockedSelectedFacets);
|
|
139
|
-
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
|
|
140
|
-
expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeDeselected');
|
|
141
|
-
expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
|
|
142
|
-
});
|
|
143
|
-
it('should render with a sort bar, facets, and infinite scroller', async () => {
|
|
144
|
-
var _a, _b, _c;
|
|
145
|
-
const searchService = new MockSearchService();
|
|
129
|
+
</collection-browser>`);
|
|
130
|
+
el.searchContext = 'beta-search-service';
|
|
131
|
+
el.selectedFacets = mockedSelectedFacets;
|
|
132
|
+
await el.updateComplete;
|
|
133
|
+
el.facetClickHandler('mediatype', true, true);
|
|
134
|
+
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
|
|
135
|
+
expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeSelected');
|
|
136
|
+
expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
|
|
137
|
+
el.facetClickHandler('mediatype', false, true);
|
|
138
|
+
expect(el.selectedFacets).to.equal(mockedSelectedFacets);
|
|
139
|
+
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search-service');
|
|
140
|
+
expect(mockAnalyticsHandler.callAction).to.equal('facetNegativeDeselected');
|
|
141
|
+
expect(mockAnalyticsHandler.callLabel).to.equal('mediatype');
|
|
142
|
+
});
|
|
143
|
+
it('should render with a sort bar, facets, and infinite scroller', async () => {
|
|
144
|
+
var _a, _b, _c;
|
|
145
|
+
const searchService = new MockSearchService();
|
|
146
146
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
147
|
-
</collection-browser>`);
|
|
148
|
-
el.baseQuery = 'hello';
|
|
149
|
-
await el.updateComplete;
|
|
150
|
-
const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
|
|
151
|
-
const sortBar = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('sort-filter-bar');
|
|
152
|
-
const infiniteScroller = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('infinite-scroller');
|
|
153
|
-
expect(facets).to.exist;
|
|
154
|
-
expect(sortBar).to.exist;
|
|
155
|
-
expect(infiniteScroller).to.exist;
|
|
156
|
-
});
|
|
157
|
-
it('queries the search service when given a base query', async () => {
|
|
158
|
-
var _a, _b, _c;
|
|
159
|
-
const searchService = new MockSearchService();
|
|
147
|
+
</collection-browser>`);
|
|
148
|
+
el.baseQuery = 'hello';
|
|
149
|
+
await el.updateComplete;
|
|
150
|
+
const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
|
|
151
|
+
const sortBar = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('sort-filter-bar');
|
|
152
|
+
const infiniteScroller = (_c = el.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('infinite-scroller');
|
|
153
|
+
expect(facets).to.exist;
|
|
154
|
+
expect(sortBar).to.exist;
|
|
155
|
+
expect(infiniteScroller).to.exist;
|
|
156
|
+
});
|
|
157
|
+
it('queries the search service when given a base query', async () => {
|
|
158
|
+
var _a, _b, _c;
|
|
159
|
+
const searchService = new MockSearchService();
|
|
160
160
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
161
|
-
</collection-browser>`);
|
|
162
|
-
el.baseQuery = 'collection:foo';
|
|
163
|
-
await el.updateComplete;
|
|
164
|
-
await nextTick();
|
|
165
|
-
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
|
|
166
|
-
expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
|
|
167
|
-
});
|
|
168
|
-
it('queries the search service with a metadata search', async () => {
|
|
169
|
-
var _a, _b, _c;
|
|
170
|
-
const searchService = new MockSearchService();
|
|
161
|
+
</collection-browser>`);
|
|
162
|
+
el.baseQuery = 'collection:foo';
|
|
163
|
+
await el.updateComplete;
|
|
164
|
+
await nextTick();
|
|
165
|
+
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
|
|
166
|
+
expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
|
|
167
|
+
});
|
|
168
|
+
it('queries the search service with a metadata search', async () => {
|
|
169
|
+
var _a, _b, _c;
|
|
170
|
+
const searchService = new MockSearchService();
|
|
171
171
|
const el = await fixture(html ` <collection-browser
|
|
172
172
|
.searchService=${searchService}
|
|
173
173
|
.searchType=${SearchType.METADATA}
|
|
174
174
|
>
|
|
175
|
-
</collection-browser>`);
|
|
176
|
-
el.baseQuery = 'collection:foo';
|
|
177
|
-
await el.updateComplete;
|
|
178
|
-
await nextTick();
|
|
179
|
-
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
|
|
180
|
-
expect(searchService.searchType).to.equal(SearchType.METADATA);
|
|
181
|
-
expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
|
|
182
|
-
});
|
|
183
|
-
it('queries the search service with a fulltext search', async () => {
|
|
184
|
-
var _a, _b, _c;
|
|
185
|
-
const searchService = new MockSearchService();
|
|
175
|
+
</collection-browser>`);
|
|
176
|
+
el.baseQuery = 'collection:foo';
|
|
177
|
+
await el.updateComplete;
|
|
178
|
+
await nextTick();
|
|
179
|
+
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
|
|
180
|
+
expect(searchService.searchType).to.equal(SearchType.METADATA);
|
|
181
|
+
expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
|
|
182
|
+
});
|
|
183
|
+
it('queries the search service with a fulltext search', async () => {
|
|
184
|
+
var _a, _b, _c;
|
|
185
|
+
const searchService = new MockSearchService();
|
|
186
186
|
const el = await fixture(html ` <collection-browser
|
|
187
187
|
.searchService=${searchService}
|
|
188
188
|
.searchType=${SearchType.FULLTEXT}
|
|
189
189
|
>
|
|
190
|
-
</collection-browser>`);
|
|
191
|
-
el.baseQuery = 'collection:foo';
|
|
192
|
-
await el.updateComplete;
|
|
193
|
-
await nextTick();
|
|
194
|
-
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
|
|
195
|
-
expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
|
|
196
|
-
expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
|
|
197
|
-
});
|
|
198
|
-
it('queries the search service with facets selected/negated', async () => {
|
|
199
|
-
var _a, _b;
|
|
200
|
-
const searchService = new MockSearchService();
|
|
201
|
-
const selectedFacets = {
|
|
202
|
-
subject: {
|
|
203
|
-
foo: {
|
|
204
|
-
key: 'foo',
|
|
205
|
-
count: 1,
|
|
206
|
-
state: 'selected',
|
|
207
|
-
},
|
|
208
|
-
bar: {
|
|
209
|
-
key: 'bar',
|
|
210
|
-
count: 2,
|
|
211
|
-
state: 'hidden',
|
|
212
|
-
},
|
|
213
|
-
},
|
|
214
|
-
lending: {},
|
|
215
|
-
mediatype: {},
|
|
216
|
-
language: {
|
|
217
|
-
en: {
|
|
218
|
-
key: 'en',
|
|
219
|
-
count: 1,
|
|
220
|
-
state: 'selected',
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
|
-
creator: {},
|
|
224
|
-
collection: {},
|
|
225
|
-
year: {},
|
|
226
|
-
};
|
|
190
|
+
</collection-browser>`);
|
|
191
|
+
el.baseQuery = 'collection:foo';
|
|
192
|
+
await el.updateComplete;
|
|
193
|
+
await nextTick();
|
|
194
|
+
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
|
|
195
|
+
expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
|
|
196
|
+
expect((_c = (_b = el.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#big-results-label')) === null || _c === void 0 ? void 0 : _c.textContent).to.contains('Results');
|
|
197
|
+
});
|
|
198
|
+
it('queries the search service with facets selected/negated', async () => {
|
|
199
|
+
var _a, _b;
|
|
200
|
+
const searchService = new MockSearchService();
|
|
201
|
+
const selectedFacets = {
|
|
202
|
+
subject: {
|
|
203
|
+
foo: {
|
|
204
|
+
key: 'foo',
|
|
205
|
+
count: 1,
|
|
206
|
+
state: 'selected',
|
|
207
|
+
},
|
|
208
|
+
bar: {
|
|
209
|
+
key: 'bar',
|
|
210
|
+
count: 2,
|
|
211
|
+
state: 'hidden',
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
lending: {},
|
|
215
|
+
mediatype: {},
|
|
216
|
+
language: {
|
|
217
|
+
en: {
|
|
218
|
+
key: 'en',
|
|
219
|
+
count: 1,
|
|
220
|
+
state: 'selected',
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
creator: {},
|
|
224
|
+
collection: {},
|
|
225
|
+
year: {},
|
|
226
|
+
};
|
|
227
227
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
228
|
-
</collection-browser>`);
|
|
229
|
-
el.baseQuery = 'collection:foo';
|
|
230
|
-
el.selectedFacets = selectedFacets;
|
|
231
|
-
await el.updateComplete;
|
|
232
|
-
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
|
|
233
|
-
expect((_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters).to.deep.equal({
|
|
234
|
-
subject: {
|
|
235
|
-
foo: 'inc',
|
|
236
|
-
bar: 'exc',
|
|
237
|
-
},
|
|
238
|
-
language: {
|
|
239
|
-
en: 'inc',
|
|
240
|
-
},
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
it('fails gracefully if no search service provided', async () => {
|
|
244
|
-
var _a;
|
|
245
|
-
const el = await fixture(html `<collection-browser></collection-browser>`);
|
|
246
|
-
el.baseQuery = 'collection:foo';
|
|
247
|
-
await el.updateComplete;
|
|
248
|
-
// This shouldn't throw an error
|
|
249
|
-
expect(el.fetchPage(2)).to.exist;
|
|
250
|
-
// Should continue showing the empty placeholder
|
|
251
|
-
expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('empty-placeholder')).to.exist;
|
|
252
|
-
});
|
|
253
|
-
it('restores search type from URL param', async () => {
|
|
254
|
-
// Add a sin=TXT param to the URL
|
|
255
|
-
const url = new URL(window.location.href);
|
|
256
|
-
url.searchParams.append('sin', 'TXT');
|
|
257
|
-
window.history.replaceState({}, '', url);
|
|
258
|
-
const searchService = new MockSearchService();
|
|
228
|
+
</collection-browser>`);
|
|
229
|
+
el.baseQuery = 'collection:foo';
|
|
230
|
+
el.selectedFacets = selectedFacets;
|
|
231
|
+
await el.updateComplete;
|
|
232
|
+
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('collection:foo');
|
|
233
|
+
expect((_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters).to.deep.equal({
|
|
234
|
+
subject: {
|
|
235
|
+
foo: 'inc',
|
|
236
|
+
bar: 'exc',
|
|
237
|
+
},
|
|
238
|
+
language: {
|
|
239
|
+
en: 'inc',
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
it('fails gracefully if no search service provided', async () => {
|
|
244
|
+
var _a;
|
|
245
|
+
const el = await fixture(html `<collection-browser></collection-browser>`);
|
|
246
|
+
el.baseQuery = 'collection:foo';
|
|
247
|
+
await el.updateComplete;
|
|
248
|
+
// This shouldn't throw an error
|
|
249
|
+
expect(el.fetchPage(2)).to.exist;
|
|
250
|
+
// Should continue showing the empty placeholder
|
|
251
|
+
expect((_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('empty-placeholder')).to.exist;
|
|
252
|
+
});
|
|
253
|
+
it('restores search type from URL param', async () => {
|
|
254
|
+
// Add a sin=TXT param to the URL
|
|
255
|
+
const url = new URL(window.location.href);
|
|
256
|
+
url.searchParams.append('sin', 'TXT');
|
|
257
|
+
window.history.replaceState({}, '', url);
|
|
258
|
+
const searchService = new MockSearchService();
|
|
259
259
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
260
|
-
</collection-browser>`);
|
|
261
|
-
expect(el.searchType).to.equal(SearchType.FULLTEXT);
|
|
262
|
-
});
|
|
263
|
-
it('applies loggedin flag to tile models if needed', async () => {
|
|
264
|
-
var _a;
|
|
265
|
-
const searchService = new MockSearchService();
|
|
260
|
+
</collection-browser>`);
|
|
261
|
+
expect(el.searchType).to.equal(SearchType.FULLTEXT);
|
|
262
|
+
});
|
|
263
|
+
it('applies loggedin flag to tile models if needed', async () => {
|
|
264
|
+
var _a;
|
|
265
|
+
const searchService = new MockSearchService();
|
|
266
266
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
267
|
-
</collection-browser>`);
|
|
268
|
-
el.baseQuery = 'loggedin';
|
|
269
|
-
await el.updateComplete;
|
|
270
|
-
const cellTemplate = el.cellForIndex(0);
|
|
271
|
-
expect(cellTemplate).to.exist;
|
|
272
|
-
const cell = await fixture(cellTemplate);
|
|
273
|
-
expect(cell).to.exist;
|
|
274
|
-
expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
|
|
275
|
-
});
|
|
276
|
-
it('applies no-preview flag to tile models if needed', async () => {
|
|
277
|
-
var _a;
|
|
278
|
-
const searchService = new MockSearchService();
|
|
267
|
+
</collection-browser>`);
|
|
268
|
+
el.baseQuery = 'loggedin';
|
|
269
|
+
await el.updateComplete;
|
|
270
|
+
const cellTemplate = el.cellForIndex(0);
|
|
271
|
+
expect(cellTemplate).to.exist;
|
|
272
|
+
const cell = await fixture(cellTemplate);
|
|
273
|
+
expect(cell).to.exist;
|
|
274
|
+
expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
|
|
275
|
+
});
|
|
276
|
+
it('applies no-preview flag to tile models if needed', async () => {
|
|
277
|
+
var _a;
|
|
278
|
+
const searchService = new MockSearchService();
|
|
279
279
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
280
|
-
</collection-browser>`);
|
|
281
|
-
el.baseQuery = 'no-preview';
|
|
282
|
-
await el.updateComplete;
|
|
283
|
-
const cellTemplate = el.cellForIndex(0);
|
|
284
|
-
expect(cellTemplate).to.exist;
|
|
285
|
-
const cell = await fixture(cellTemplate);
|
|
286
|
-
expect(cell).to.exist;
|
|
287
|
-
expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.contentWarning).to.be.true;
|
|
288
|
-
});
|
|
289
|
-
it('both loggedin and no-preview flags can be set simultaneously', async () => {
|
|
290
|
-
var _a, _b;
|
|
291
|
-
const searchService = new MockSearchService();
|
|
280
|
+
</collection-browser>`);
|
|
281
|
+
el.baseQuery = 'no-preview';
|
|
282
|
+
await el.updateComplete;
|
|
283
|
+
const cellTemplate = el.cellForIndex(0);
|
|
284
|
+
expect(cellTemplate).to.exist;
|
|
285
|
+
const cell = await fixture(cellTemplate);
|
|
286
|
+
expect(cell).to.exist;
|
|
287
|
+
expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.contentWarning).to.be.true;
|
|
288
|
+
});
|
|
289
|
+
it('both loggedin and no-preview flags can be set simultaneously', async () => {
|
|
290
|
+
var _a, _b;
|
|
291
|
+
const searchService = new MockSearchService();
|
|
292
292
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
293
|
-
</collection-browser>`);
|
|
294
|
-
el.baseQuery = 'loggedin-no-preview';
|
|
295
|
-
await el.updateComplete;
|
|
296
|
-
const cellTemplate = el.cellForIndex(0);
|
|
297
|
-
expect(cellTemplate).to.exist;
|
|
298
|
-
const cell = await fixture(cellTemplate);
|
|
299
|
-
expect(cell).to.exist;
|
|
300
|
-
expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
|
|
301
|
-
expect((_b = cell.model) === null || _b === void 0 ? void 0 : _b.contentWarning).to.be.true;
|
|
302
|
-
});
|
|
303
|
-
it('joins full description array into a single string with line breaks', async () => {
|
|
304
|
-
var _a;
|
|
305
|
-
const searchService = new MockSearchService();
|
|
293
|
+
</collection-browser>`);
|
|
294
|
+
el.baseQuery = 'loggedin-no-preview';
|
|
295
|
+
await el.updateComplete;
|
|
296
|
+
const cellTemplate = el.cellForIndex(0);
|
|
297
|
+
expect(cellTemplate).to.exist;
|
|
298
|
+
const cell = await fixture(cellTemplate);
|
|
299
|
+
expect(cell).to.exist;
|
|
300
|
+
expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.loginRequired).to.be.true;
|
|
301
|
+
expect((_b = cell.model) === null || _b === void 0 ? void 0 : _b.contentWarning).to.be.true;
|
|
302
|
+
});
|
|
303
|
+
it('joins full description array into a single string with line breaks', async () => {
|
|
304
|
+
var _a;
|
|
305
|
+
const searchService = new MockSearchService();
|
|
306
306
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
307
|
-
</collection-browser>`);
|
|
308
|
-
// This query receives an array description like ['line1', 'line2']
|
|
309
|
-
el.baseQuery = 'multi-line-description';
|
|
310
|
-
await el.updateComplete;
|
|
311
|
-
const cellTemplate = el.cellForIndex(0);
|
|
312
|
-
expect(cellTemplate).to.exist;
|
|
313
|
-
const cell = await fixture(cellTemplate);
|
|
314
|
-
expect(cell).to.exist;
|
|
315
|
-
// Actual model description should be joined
|
|
316
|
-
expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.description).to.equal('line1\nline2');
|
|
317
|
-
});
|
|
318
|
-
it('can search on demand if only search type has changed', async () => {
|
|
319
|
-
const searchService = new MockSearchService();
|
|
307
|
+
</collection-browser>`);
|
|
308
|
+
// This query receives an array description like ['line1', 'line2']
|
|
309
|
+
el.baseQuery = 'multi-line-description';
|
|
310
|
+
await el.updateComplete;
|
|
311
|
+
const cellTemplate = el.cellForIndex(0);
|
|
312
|
+
expect(cellTemplate).to.exist;
|
|
313
|
+
const cell = await fixture(cellTemplate);
|
|
314
|
+
expect(cell).to.exist;
|
|
315
|
+
// Actual model description should be joined
|
|
316
|
+
expect((_a = cell.model) === null || _a === void 0 ? void 0 : _a.description).to.equal('line1\nline2');
|
|
317
|
+
});
|
|
318
|
+
it('can search on demand if only search type has changed', async () => {
|
|
319
|
+
const searchService = new MockSearchService();
|
|
320
320
|
const el = await fixture(html `<collection-browser
|
|
321
321
|
.searchService=${searchService}
|
|
322
322
|
.searchType=${SearchType.METADATA}
|
|
323
|
-
></collection-browser>`);
|
|
324
|
-
el.baseQuery = 'collection:foo';
|
|
325
|
-
await el.updateComplete;
|
|
326
|
-
el.searchType = SearchType.FULLTEXT;
|
|
327
|
-
await el.updateComplete;
|
|
328
|
-
// Haven't performed the search yet
|
|
329
|
-
expect(searchService.searchType).to.equal(SearchType.METADATA);
|
|
330
|
-
el.requestSearch();
|
|
331
|
-
expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
|
|
332
|
-
});
|
|
333
|
-
it('queries for collection names after a fetch', async () => {
|
|
334
|
-
const searchService = new MockSearchService();
|
|
335
|
-
const collectionNameCache = new MockCollectionNameCache();
|
|
323
|
+
></collection-browser>`);
|
|
324
|
+
el.baseQuery = 'collection:foo';
|
|
325
|
+
await el.updateComplete;
|
|
326
|
+
el.searchType = SearchType.FULLTEXT;
|
|
327
|
+
await el.updateComplete;
|
|
328
|
+
// Haven't performed the search yet
|
|
329
|
+
expect(searchService.searchType).to.equal(SearchType.METADATA);
|
|
330
|
+
el.requestSearch();
|
|
331
|
+
expect(searchService.searchType).to.equal(SearchType.FULLTEXT);
|
|
332
|
+
});
|
|
333
|
+
it('queries for collection names after a fetch', async () => {
|
|
334
|
+
const searchService = new MockSearchService();
|
|
335
|
+
const collectionNameCache = new MockCollectionNameCache();
|
|
336
336
|
const el = await fixture(html `<collection-browser
|
|
337
337
|
.searchService=${searchService}
|
|
338
338
|
.collectionNameCache=${collectionNameCache}
|
|
339
339
|
>
|
|
340
|
-
</collection-browser>`);
|
|
341
|
-
el.baseQuery = 'collection:foo';
|
|
342
|
-
await el.updateComplete;
|
|
343
|
-
expect(collectionNameCache.preloadIdentifiersRequested).to.deep.equal([
|
|
344
|
-
'foo',
|
|
345
|
-
'bar',
|
|
346
|
-
'baz',
|
|
347
|
-
'boop',
|
|
348
|
-
]);
|
|
349
|
-
});
|
|
350
|
-
it('keeps search results from fetch if no change to query or sort param', async () => {
|
|
351
|
-
const resultsSpy = sinon.spy();
|
|
352
|
-
const searchService = new MockSearchService({
|
|
353
|
-
asyncResponse: true,
|
|
354
|
-
resultsSpy,
|
|
355
|
-
});
|
|
340
|
+
</collection-browser>`);
|
|
341
|
+
el.baseQuery = 'collection:foo';
|
|
342
|
+
await el.updateComplete;
|
|
343
|
+
expect(collectionNameCache.preloadIdentifiersRequested).to.deep.equal([
|
|
344
|
+
'foo',
|
|
345
|
+
'bar',
|
|
346
|
+
'baz',
|
|
347
|
+
'boop',
|
|
348
|
+
]);
|
|
349
|
+
});
|
|
350
|
+
it('keeps search results from fetch if no change to query or sort param', async () => {
|
|
351
|
+
const resultsSpy = sinon.spy();
|
|
352
|
+
const searchService = new MockSearchService({
|
|
353
|
+
asyncResponse: true,
|
|
354
|
+
resultsSpy,
|
|
355
|
+
});
|
|
356
356
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
357
|
-
</collection-browser>`);
|
|
358
|
-
el.baseQuery = 'with-sort';
|
|
359
|
-
el.sortParam = { field: 'foo', direction: 'asc' };
|
|
360
|
-
await el.updateComplete;
|
|
361
|
-
await el.fetchPage(2);
|
|
362
|
-
// If there is no change to the query or sort param during the fetch, the results
|
|
363
|
-
// should be read.
|
|
364
|
-
expect(resultsSpy.callCount).to.be.greaterThanOrEqual(1);
|
|
365
|
-
});
|
|
366
|
-
it('discards obsolete search results if sort params changed before arrival', async () => {
|
|
367
|
-
const resultsSpy = sinon.spy();
|
|
368
|
-
const searchService = new MockSearchService({
|
|
369
|
-
asyncResponse: true,
|
|
370
|
-
resultsSpy,
|
|
371
|
-
});
|
|
357
|
+
</collection-browser>`);
|
|
358
|
+
el.baseQuery = 'with-sort';
|
|
359
|
+
el.sortParam = { field: 'foo', direction: 'asc' };
|
|
360
|
+
await el.updateComplete;
|
|
361
|
+
await el.fetchPage(2);
|
|
362
|
+
// If there is no change to the query or sort param during the fetch, the results
|
|
363
|
+
// should be read.
|
|
364
|
+
expect(resultsSpy.callCount).to.be.greaterThanOrEqual(1);
|
|
365
|
+
});
|
|
366
|
+
it('discards obsolete search results if sort params changed before arrival', async () => {
|
|
367
|
+
const resultsSpy = sinon.spy();
|
|
368
|
+
const searchService = new MockSearchService({
|
|
369
|
+
asyncResponse: true,
|
|
370
|
+
resultsSpy,
|
|
371
|
+
});
|
|
372
372
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
373
|
-
</collection-browser>`);
|
|
374
|
-
el.baseQuery = 'with-sort';
|
|
375
|
-
el.sortParam = { field: 'foo', direction: 'asc' };
|
|
376
|
-
await el.updateComplete;
|
|
377
|
-
const fetchPromise = el.fetchPage(2);
|
|
378
|
-
el.sortParam = { field: 'foo', direction: 'desc' };
|
|
379
|
-
await fetchPromise;
|
|
380
|
-
// If the different sort param causes the results to be discarded,
|
|
381
|
-
// the results array should never be read.
|
|
382
|
-
expect(resultsSpy.callCount).to.equal(0);
|
|
383
|
-
});
|
|
384
|
-
it('discards obsolete search results if sort param added before arrival', async () => {
|
|
385
|
-
const resultsSpy = sinon.spy();
|
|
386
|
-
const searchService = new MockSearchService({
|
|
387
|
-
asyncResponse: true,
|
|
388
|
-
resultsSpy,
|
|
389
|
-
});
|
|
373
|
+
</collection-browser>`);
|
|
374
|
+
el.baseQuery = 'with-sort';
|
|
375
|
+
el.sortParam = { field: 'foo', direction: 'asc' };
|
|
376
|
+
await el.updateComplete;
|
|
377
|
+
const fetchPromise = el.fetchPage(2);
|
|
378
|
+
el.sortParam = { field: 'foo', direction: 'desc' };
|
|
379
|
+
await fetchPromise;
|
|
380
|
+
// If the different sort param causes the results to be discarded,
|
|
381
|
+
// the results array should never be read.
|
|
382
|
+
expect(resultsSpy.callCount).to.equal(0);
|
|
383
|
+
});
|
|
384
|
+
it('discards obsolete search results if sort param added before arrival', async () => {
|
|
385
|
+
const resultsSpy = sinon.spy();
|
|
386
|
+
const searchService = new MockSearchService({
|
|
387
|
+
asyncResponse: true,
|
|
388
|
+
resultsSpy,
|
|
389
|
+
});
|
|
390
390
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
391
|
-
</collection-browser>`);
|
|
392
|
-
el.baseQuery = 'single-result';
|
|
393
|
-
await el.updateComplete;
|
|
394
|
-
const fetchPromise = el.fetchPage(2);
|
|
395
|
-
el.sortParam = { field: 'foo', direction: 'asc' };
|
|
396
|
-
await fetchPromise;
|
|
397
|
-
// If the different sort param causes the results to be discarded,
|
|
398
|
-
// the results array should never be read.
|
|
399
|
-
expect(resultsSpy.callCount).to.equal(0);
|
|
400
|
-
});
|
|
401
|
-
it('discards obsolete search results if sort param cleared before arrival', async () => {
|
|
402
|
-
const resultsSpy = sinon.spy();
|
|
403
|
-
const searchService = new MockSearchService({
|
|
404
|
-
asyncResponse: true,
|
|
405
|
-
resultsSpy,
|
|
406
|
-
});
|
|
391
|
+
</collection-browser>`);
|
|
392
|
+
el.baseQuery = 'single-result';
|
|
393
|
+
await el.updateComplete;
|
|
394
|
+
const fetchPromise = el.fetchPage(2);
|
|
395
|
+
el.sortParam = { field: 'foo', direction: 'asc' };
|
|
396
|
+
await fetchPromise;
|
|
397
|
+
// If the different sort param causes the results to be discarded,
|
|
398
|
+
// the results array should never be read.
|
|
399
|
+
expect(resultsSpy.callCount).to.equal(0);
|
|
400
|
+
});
|
|
401
|
+
it('discards obsolete search results if sort param cleared before arrival', async () => {
|
|
402
|
+
const resultsSpy = sinon.spy();
|
|
403
|
+
const searchService = new MockSearchService({
|
|
404
|
+
asyncResponse: true,
|
|
405
|
+
resultsSpy,
|
|
406
|
+
});
|
|
407
407
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
408
|
-
</collection-browser>`);
|
|
409
|
-
el.baseQuery = 'with-sort';
|
|
410
|
-
await el.updateComplete;
|
|
411
|
-
const fetchPromise = el.fetchPage(2);
|
|
412
|
-
el.sortParam = null;
|
|
413
|
-
await fetchPromise;
|
|
414
|
-
// If the different sort param causes the results to be discarded,
|
|
415
|
-
// the results array should never be read.
|
|
416
|
-
expect(resultsSpy.callCount).to.equal(0);
|
|
417
|
-
});
|
|
418
|
-
it('sets sort properties when user changes sort', async () => {
|
|
419
|
-
var _a, _b, _c, _d;
|
|
420
|
-
const searchService = new MockSearchService();
|
|
408
|
+
</collection-browser>`);
|
|
409
|
+
el.baseQuery = 'with-sort';
|
|
410
|
+
await el.updateComplete;
|
|
411
|
+
const fetchPromise = el.fetchPage(2);
|
|
412
|
+
el.sortParam = null;
|
|
413
|
+
await fetchPromise;
|
|
414
|
+
// If the different sort param causes the results to be discarded,
|
|
415
|
+
// the results array should never be read.
|
|
416
|
+
expect(resultsSpy.callCount).to.equal(0);
|
|
417
|
+
});
|
|
418
|
+
it('sets sort properties when user changes sort', async () => {
|
|
419
|
+
var _a, _b, _c, _d;
|
|
420
|
+
const searchService = new MockSearchService();
|
|
421
421
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
422
|
-
</collection-browser>`);
|
|
423
|
-
expect(el.selectedSort).to.equal(SortField.relevance);
|
|
424
|
-
el.baseQuery = 'foo';
|
|
425
|
-
await el.updateComplete;
|
|
426
|
-
const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
|
|
427
|
-
const sortSelector = (_b = sortBar === null || sortBar === void 0 ? void 0 : sortBar.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#desktop-sort-selector');
|
|
428
|
-
expect(sortSelector).to.exist;
|
|
429
|
-
// Click the title sorter
|
|
430
|
-
(_d = (_c = [...sortSelector === null || sortSelector === void 0 ? void 0 : sortSelector.children] // tsc doesn't know children is iterable
|
|
431
|
-
.find(child => { var _a; return ((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === 'Title'; })) === null || _c === void 0 ? void 0 : _c.querySelector('a[href]')) === null || _d === void 0 ? void 0 : _d.click();
|
|
432
|
-
await el.updateComplete;
|
|
433
|
-
expect(el.selectedSort).to.equal(SortField.title);
|
|
434
|
-
});
|
|
435
|
-
it('sets sort filter properties when user selects title filter', async () => {
|
|
436
|
-
var _a;
|
|
437
|
-
const searchService = new MockSearchService();
|
|
422
|
+
</collection-browser>`);
|
|
423
|
+
expect(el.selectedSort).to.equal(SortField.relevance);
|
|
424
|
+
el.baseQuery = 'foo';
|
|
425
|
+
await el.updateComplete;
|
|
426
|
+
const sortBar = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('sort-filter-bar');
|
|
427
|
+
const sortSelector = (_b = sortBar === null || sortBar === void 0 ? void 0 : sortBar.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('#desktop-sort-selector');
|
|
428
|
+
expect(sortSelector).to.exist;
|
|
429
|
+
// Click the title sorter
|
|
430
|
+
(_d = (_c = [...sortSelector === null || sortSelector === void 0 ? void 0 : sortSelector.children] // tsc doesn't know children is iterable
|
|
431
|
+
.find(child => { var _a; return ((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === 'Title'; })) === null || _c === void 0 ? void 0 : _c.querySelector('a[href]')) === null || _d === void 0 ? void 0 : _d.click();
|
|
432
|
+
await el.updateComplete;
|
|
433
|
+
expect(el.selectedSort).to.equal(SortField.title);
|
|
434
|
+
});
|
|
435
|
+
it('sets sort filter properties when user selects title filter', async () => {
|
|
436
|
+
var _a;
|
|
437
|
+
const searchService = new MockSearchService();
|
|
438
438
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
439
|
-
</collection-browser>`);
|
|
440
|
-
el.baseQuery = 'first-title';
|
|
441
|
-
el.selectedSort = 'title';
|
|
442
|
-
el.sortDirection = 'asc';
|
|
443
|
-
el.selectedTitleFilter = 'X';
|
|
444
|
-
await el.updateComplete;
|
|
445
|
-
// Wait an extra tick
|
|
446
|
-
await new Promise(res => {
|
|
447
|
-
setTimeout(res, 0);
|
|
448
|
-
});
|
|
449
|
-
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-title AND firstTitle:X');
|
|
450
|
-
});
|
|
451
|
-
it('sets sort filter properties when user selects creator filter', async () => {
|
|
452
|
-
var _a;
|
|
453
|
-
const searchService = new MockSearchService();
|
|
439
|
+
</collection-browser>`);
|
|
440
|
+
el.baseQuery = 'first-title';
|
|
441
|
+
el.selectedSort = 'title';
|
|
442
|
+
el.sortDirection = 'asc';
|
|
443
|
+
el.selectedTitleFilter = 'X';
|
|
444
|
+
await el.updateComplete;
|
|
445
|
+
// Wait an extra tick
|
|
446
|
+
await new Promise(res => {
|
|
447
|
+
setTimeout(res, 0);
|
|
448
|
+
});
|
|
449
|
+
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-title AND firstTitle:X');
|
|
450
|
+
});
|
|
451
|
+
it('sets sort filter properties when user selects creator filter', async () => {
|
|
452
|
+
var _a;
|
|
453
|
+
const searchService = new MockSearchService();
|
|
454
454
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
455
|
-
</collection-browser>`);
|
|
456
|
-
el.baseQuery = 'first-creator';
|
|
457
|
-
el.selectedSort = 'creator';
|
|
458
|
-
el.sortDirection = 'asc';
|
|
459
|
-
el.selectedCreatorFilter = 'X';
|
|
460
|
-
await el.updateComplete;
|
|
461
|
-
// Wait an extra tick
|
|
462
|
-
await new Promise(res => {
|
|
463
|
-
setTimeout(res, 0);
|
|
464
|
-
});
|
|
465
|
-
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator AND firstCreator:X');
|
|
466
|
-
});
|
|
467
|
-
it('sets sort filter properties simultaneous with facets and date range', async () => {
|
|
468
|
-
var _a, _b;
|
|
469
|
-
const searchService = new MockSearchService();
|
|
470
|
-
const selectedFacets = {
|
|
471
|
-
collection: { foo: { key: 'foo', state: 'selected', count: 1 } },
|
|
472
|
-
creator: {},
|
|
473
|
-
language: {},
|
|
474
|
-
lending: {},
|
|
475
|
-
mediatype: {},
|
|
476
|
-
subject: {},
|
|
477
|
-
year: {},
|
|
478
|
-
};
|
|
455
|
+
</collection-browser>`);
|
|
456
|
+
el.baseQuery = 'first-creator';
|
|
457
|
+
el.selectedSort = 'creator';
|
|
458
|
+
el.sortDirection = 'asc';
|
|
459
|
+
el.selectedCreatorFilter = 'X';
|
|
460
|
+
await el.updateComplete;
|
|
461
|
+
// Wait an extra tick
|
|
462
|
+
await new Promise(res => {
|
|
463
|
+
setTimeout(res, 0);
|
|
464
|
+
});
|
|
465
|
+
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator AND firstCreator:X');
|
|
466
|
+
});
|
|
467
|
+
it('sets sort filter properties simultaneous with facets and date range', async () => {
|
|
468
|
+
var _a, _b;
|
|
469
|
+
const searchService = new MockSearchService();
|
|
470
|
+
const selectedFacets = {
|
|
471
|
+
collection: { foo: { key: 'foo', state: 'selected', count: 1 } },
|
|
472
|
+
creator: {},
|
|
473
|
+
language: {},
|
|
474
|
+
lending: {},
|
|
475
|
+
mediatype: {},
|
|
476
|
+
subject: {},
|
|
477
|
+
year: {},
|
|
478
|
+
};
|
|
479
479
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
480
|
-
</collection-browser>`);
|
|
481
|
-
el.baseQuery = 'first-creator';
|
|
482
|
-
el.selectedSort = 'creator';
|
|
483
|
-
el.selectedFacets = selectedFacets;
|
|
484
|
-
el.minSelectedDate = '1950';
|
|
485
|
-
el.maxSelectedDate = '1970';
|
|
486
|
-
el.sortDirection = 'asc';
|
|
487
|
-
el.selectedCreatorFilter = 'X';
|
|
488
|
-
await el.updateComplete;
|
|
489
|
-
// Wait an extra tick
|
|
490
|
-
await new Promise(res => {
|
|
491
|
-
setTimeout(res, 0);
|
|
492
|
-
});
|
|
493
|
-
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator AND firstCreator:X');
|
|
494
|
-
expect((_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters).to.deep.equal({
|
|
495
|
-
collection: {
|
|
496
|
-
foo: 'inc',
|
|
497
|
-
},
|
|
498
|
-
year: {
|
|
499
|
-
'1950': 'gte',
|
|
500
|
-
'1970': 'lte',
|
|
501
|
-
},
|
|
502
|
-
});
|
|
503
|
-
});
|
|
504
|
-
it('sets date range query when date picker selection changed', async () => {
|
|
505
|
-
var _a, _b, _c;
|
|
506
|
-
const searchService = new MockSearchService();
|
|
480
|
+
</collection-browser>`);
|
|
481
|
+
el.baseQuery = 'first-creator';
|
|
482
|
+
el.selectedSort = 'creator';
|
|
483
|
+
el.selectedFacets = selectedFacets;
|
|
484
|
+
el.minSelectedDate = '1950';
|
|
485
|
+
el.maxSelectedDate = '1970';
|
|
486
|
+
el.sortDirection = 'asc';
|
|
487
|
+
el.selectedCreatorFilter = 'X';
|
|
488
|
+
await el.updateComplete;
|
|
489
|
+
// Wait an extra tick
|
|
490
|
+
await new Promise(res => {
|
|
491
|
+
setTimeout(res, 0);
|
|
492
|
+
});
|
|
493
|
+
expect((_a = searchService.searchParams) === null || _a === void 0 ? void 0 : _a.query).to.equal('first-creator AND firstCreator:X');
|
|
494
|
+
expect((_b = searchService.searchParams) === null || _b === void 0 ? void 0 : _b.filters).to.deep.equal({
|
|
495
|
+
collection: {
|
|
496
|
+
foo: 'inc',
|
|
497
|
+
},
|
|
498
|
+
year: {
|
|
499
|
+
'1950': 'gte',
|
|
500
|
+
'1970': 'lte',
|
|
501
|
+
},
|
|
502
|
+
});
|
|
503
|
+
});
|
|
504
|
+
it('sets date range query when date picker selection changed', async () => {
|
|
505
|
+
var _a, _b, _c;
|
|
506
|
+
const searchService = new MockSearchService();
|
|
507
507
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
508
|
-
</collection-browser>`);
|
|
509
|
-
el.baseQuery = 'years'; // Includes year_histogram aggregation in response
|
|
510
|
-
el.showHistogramDatePicker = true;
|
|
511
|
-
await el.updateComplete;
|
|
512
|
-
const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
|
|
513
|
-
await (facets === null || facets === void 0 ? void 0 : facets.updateComplete);
|
|
514
|
-
// Wait for the date picker to be rendered (which may take until the next tick)
|
|
515
|
-
await new Promise(res => {
|
|
516
|
-
setTimeout(res, 0);
|
|
517
|
-
});
|
|
518
|
-
const histogram = (_b = facets === null || facets === void 0 ? void 0 : facets.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('histogram-date-range');
|
|
519
|
-
expect(histogram).to.exist;
|
|
520
|
-
// Enter a new min date into the date picker
|
|
521
|
-
const minDateInput = (_c = histogram.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('#date-min');
|
|
522
|
-
const pressEnterEvent = new KeyboardEvent('keyup', {
|
|
523
|
-
key: 'Enter',
|
|
524
|
-
});
|
|
525
|
-
minDateInput.value = '1960';
|
|
526
|
-
minDateInput.dispatchEvent(pressEnterEvent);
|
|
527
|
-
// Wait for the histogram's update delay
|
|
528
|
-
await new Promise(res => {
|
|
529
|
-
setTimeout(res, histogram.updateDelay + 50);
|
|
530
|
-
});
|
|
531
|
-
// Ensure that the histogram change propagated to the collection browser's
|
|
532
|
-
// date query correctly.
|
|
533
|
-
await el.updateComplete;
|
|
534
|
-
expect(el.minSelectedDate).to.equal('1960');
|
|
535
|
-
expect(el.maxSelectedDate).to.equal('2000');
|
|
536
|
-
});
|
|
537
|
-
it('scrolls to page', async () => {
|
|
538
|
-
var _a;
|
|
539
|
-
const searchService = new MockSearchService();
|
|
508
|
+
</collection-browser>`);
|
|
509
|
+
el.baseQuery = 'years'; // Includes year_histogram aggregation in response
|
|
510
|
+
el.showHistogramDatePicker = true;
|
|
511
|
+
await el.updateComplete;
|
|
512
|
+
const facets = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('collection-facets');
|
|
513
|
+
await (facets === null || facets === void 0 ? void 0 : facets.updateComplete);
|
|
514
|
+
// Wait for the date picker to be rendered (which may take until the next tick)
|
|
515
|
+
await new Promise(res => {
|
|
516
|
+
setTimeout(res, 0);
|
|
517
|
+
});
|
|
518
|
+
const histogram = (_b = facets === null || facets === void 0 ? void 0 : facets.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('histogram-date-range');
|
|
519
|
+
expect(histogram).to.exist;
|
|
520
|
+
// Enter a new min date into the date picker
|
|
521
|
+
const minDateInput = (_c = histogram.shadowRoot) === null || _c === void 0 ? void 0 : _c.querySelector('#date-min');
|
|
522
|
+
const pressEnterEvent = new KeyboardEvent('keyup', {
|
|
523
|
+
key: 'Enter',
|
|
524
|
+
});
|
|
525
|
+
minDateInput.value = '1960';
|
|
526
|
+
minDateInput.dispatchEvent(pressEnterEvent);
|
|
527
|
+
// Wait for the histogram's update delay
|
|
528
|
+
await new Promise(res => {
|
|
529
|
+
setTimeout(res, histogram.updateDelay + 50);
|
|
530
|
+
});
|
|
531
|
+
// Ensure that the histogram change propagated to the collection browser's
|
|
532
|
+
// date query correctly.
|
|
533
|
+
await el.updateComplete;
|
|
534
|
+
expect(el.minSelectedDate).to.equal('1960');
|
|
535
|
+
expect(el.maxSelectedDate).to.equal('2000');
|
|
536
|
+
});
|
|
537
|
+
it('scrolls to page', async () => {
|
|
538
|
+
var _a;
|
|
539
|
+
const searchService = new MockSearchService();
|
|
540
540
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
541
|
-
</collection-browser>`);
|
|
542
|
-
// Infinite scroller won't exist unless there's a base query.
|
|
543
|
-
// First ensure that we don't throw errors when it doesn't exist.
|
|
544
|
-
await el.goToPage(1);
|
|
545
|
-
// And make sure it correctly calls scrollToCell when the
|
|
546
|
-
// infinite scroller does exist.
|
|
547
|
-
el.baseQuery = 'collection:foo';
|
|
548
|
-
await el.updateComplete;
|
|
549
|
-
const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
|
|
550
|
-
expect(infiniteScroller).to.exist;
|
|
551
|
-
const oldScrollToCell = infiniteScroller.scrollToCell;
|
|
552
|
-
const spy = sinon.spy();
|
|
553
|
-
infiniteScroller.scrollToCell = spy;
|
|
554
|
-
await el.goToPage(1);
|
|
555
|
-
expect(spy.callCount).to.equal(1);
|
|
556
|
-
infiniteScroller.scrollToCell = oldScrollToCell;
|
|
557
|
-
});
|
|
558
|
-
it('refreshes when certain properties change - with some analytics event sampling', async () => {
|
|
559
|
-
var _a;
|
|
560
|
-
const mockAnalyticsHandler = new MockAnalyticsHandler();
|
|
561
|
-
const searchService = new MockSearchService();
|
|
562
|
-
const collectionNameCache = new MockCollectionNameCache();
|
|
541
|
+
</collection-browser>`);
|
|
542
|
+
// Infinite scroller won't exist unless there's a base query.
|
|
543
|
+
// First ensure that we don't throw errors when it doesn't exist.
|
|
544
|
+
await el.goToPage(1);
|
|
545
|
+
// And make sure it correctly calls scrollToCell when the
|
|
546
|
+
// infinite scroller does exist.
|
|
547
|
+
el.baseQuery = 'collection:foo';
|
|
548
|
+
await el.updateComplete;
|
|
549
|
+
const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
|
|
550
|
+
expect(infiniteScroller).to.exist;
|
|
551
|
+
const oldScrollToCell = infiniteScroller.scrollToCell;
|
|
552
|
+
const spy = sinon.spy();
|
|
553
|
+
infiniteScroller.scrollToCell = spy;
|
|
554
|
+
await el.goToPage(1);
|
|
555
|
+
expect(spy.callCount).to.equal(1);
|
|
556
|
+
infiniteScroller.scrollToCell = oldScrollToCell;
|
|
557
|
+
});
|
|
558
|
+
it('refreshes when certain properties change - with some analytics event sampling', async () => {
|
|
559
|
+
var _a;
|
|
560
|
+
const mockAnalyticsHandler = new MockAnalyticsHandler();
|
|
561
|
+
const searchService = new MockSearchService();
|
|
562
|
+
const collectionNameCache = new MockCollectionNameCache();
|
|
563
563
|
const el = await fixture(html `<collection-browser
|
|
564
564
|
.analyticsHandler=${mockAnalyticsHandler}
|
|
565
565
|
.searchService=${searchService}
|
|
566
566
|
.collectionNameCache=${collectionNameCache}
|
|
567
|
-
></collection-browser>`);
|
|
568
|
-
const infiniteScrollerRefreshSpy = sinon.spy();
|
|
569
|
-
// Infinite scroller won't exist unless there's a base query
|
|
570
|
-
el.baseQuery = 'collection:foo';
|
|
571
|
-
await el.updateComplete;
|
|
572
|
-
const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
|
|
573
|
-
infiniteScroller.reload = infiniteScrollerRefreshSpy;
|
|
574
|
-
expect(infiniteScrollerRefreshSpy.called).to.be.false;
|
|
575
|
-
expect(infiniteScrollerRefreshSpy.callCount).to.equal(0);
|
|
576
|
-
// testing: `loggedIn`
|
|
577
|
-
el.loggedIn = true;
|
|
578
|
-
await el.updateComplete;
|
|
579
|
-
expect(infiniteScrollerRefreshSpy.called).to.be.true;
|
|
580
|
-
expect(infiniteScrollerRefreshSpy.callCount).to.equal(1);
|
|
581
|
-
el.loggedIn = false;
|
|
582
|
-
await el.updateComplete;
|
|
583
|
-
expect(infiniteScrollerRefreshSpy.callCount).to.equal(2);
|
|
584
|
-
// testing: `displayMode`
|
|
585
|
-
el.displayMode = 'list-compact';
|
|
586
|
-
el.searchContext = 'beta-search';
|
|
587
|
-
await el.updateComplete;
|
|
588
|
-
expect(infiniteScrollerRefreshSpy.callCount).to.equal(3);
|
|
589
|
-
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
|
|
590
|
-
expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
|
|
591
|
-
expect(mockAnalyticsHandler.callLabel).to.equal('list-compact');
|
|
592
|
-
el.displayMode = 'list-detail';
|
|
593
|
-
await el.updateComplete;
|
|
594
|
-
expect(infiniteScrollerRefreshSpy.callCount).to.equal(4);
|
|
595
|
-
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
|
|
596
|
-
expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
|
|
597
|
-
expect(mockAnalyticsHandler.callLabel).to.equal('list-detail');
|
|
598
|
-
// testing: `baseNavigationUrl`
|
|
599
|
-
el.baseNavigationUrl = 'https://funtestsite.com';
|
|
600
|
-
await el.updateComplete;
|
|
601
|
-
expect(infiniteScrollerRefreshSpy.callCount).to.equal(5);
|
|
602
|
-
// testing: `baseImageUrl`
|
|
603
|
-
el.baseImageUrl = 'https://funtestsiteforimages.com';
|
|
604
|
-
await el.updateComplete;
|
|
605
|
-
expect(infiniteScrollerRefreshSpy.callCount).to.equal(6);
|
|
606
|
-
});
|
|
607
|
-
it('query the search service for single result', async () => {
|
|
608
|
-
var _a, _b;
|
|
609
|
-
const searchService = new MockSearchService();
|
|
567
|
+
></collection-browser>`);
|
|
568
|
+
const infiniteScrollerRefreshSpy = sinon.spy();
|
|
569
|
+
// Infinite scroller won't exist unless there's a base query
|
|
570
|
+
el.baseQuery = 'collection:foo';
|
|
571
|
+
await el.updateComplete;
|
|
572
|
+
const infiniteScroller = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('infinite-scroller');
|
|
573
|
+
infiniteScroller.reload = infiniteScrollerRefreshSpy;
|
|
574
|
+
expect(infiniteScrollerRefreshSpy.called).to.be.false;
|
|
575
|
+
expect(infiniteScrollerRefreshSpy.callCount).to.equal(0);
|
|
576
|
+
// testing: `loggedIn`
|
|
577
|
+
el.loggedIn = true;
|
|
578
|
+
await el.updateComplete;
|
|
579
|
+
expect(infiniteScrollerRefreshSpy.called).to.be.true;
|
|
580
|
+
expect(infiniteScrollerRefreshSpy.callCount).to.equal(1);
|
|
581
|
+
el.loggedIn = false;
|
|
582
|
+
await el.updateComplete;
|
|
583
|
+
expect(infiniteScrollerRefreshSpy.callCount).to.equal(2);
|
|
584
|
+
// testing: `displayMode`
|
|
585
|
+
el.displayMode = 'list-compact';
|
|
586
|
+
el.searchContext = 'beta-search';
|
|
587
|
+
await el.updateComplete;
|
|
588
|
+
expect(infiniteScrollerRefreshSpy.callCount).to.equal(3);
|
|
589
|
+
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
|
|
590
|
+
expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
|
|
591
|
+
expect(mockAnalyticsHandler.callLabel).to.equal('list-compact');
|
|
592
|
+
el.displayMode = 'list-detail';
|
|
593
|
+
await el.updateComplete;
|
|
594
|
+
expect(infiniteScrollerRefreshSpy.callCount).to.equal(4);
|
|
595
|
+
expect(mockAnalyticsHandler.callCategory).to.equal('beta-search');
|
|
596
|
+
expect(mockAnalyticsHandler.callAction).to.equal('displayMode');
|
|
597
|
+
expect(mockAnalyticsHandler.callLabel).to.equal('list-detail');
|
|
598
|
+
// testing: `baseNavigationUrl`
|
|
599
|
+
el.baseNavigationUrl = 'https://funtestsite.com';
|
|
600
|
+
await el.updateComplete;
|
|
601
|
+
expect(infiniteScrollerRefreshSpy.callCount).to.equal(5);
|
|
602
|
+
// testing: `baseImageUrl`
|
|
603
|
+
el.baseImageUrl = 'https://funtestsiteforimages.com';
|
|
604
|
+
await el.updateComplete;
|
|
605
|
+
expect(infiniteScrollerRefreshSpy.callCount).to.equal(6);
|
|
606
|
+
});
|
|
607
|
+
it('query the search service for single result', async () => {
|
|
608
|
+
var _a, _b;
|
|
609
|
+
const searchService = new MockSearchService();
|
|
610
610
|
const el = await fixture(html `<collection-browser .searchService=${searchService}>
|
|
611
|
-
</collection-browser>`);
|
|
612
|
-
el.baseQuery = 'single-result';
|
|
613
|
-
await el.updateComplete;
|
|
614
|
-
await nextTick();
|
|
615
|
-
expect((_b = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#big-results-label')) === null || _b === void 0 ? void 0 : _b.textContent).to.contains('Result');
|
|
616
|
-
});
|
|
617
|
-
it('`searchContext` prop helps describe where component is being used', async () => {
|
|
618
|
-
const el = await fixture(html `<collection-browser></collection-browser>`);
|
|
619
|
-
expect(el.searchContext).to.equal(analyticsCategories.default);
|
|
620
|
-
el.searchContext = 'unicorn-search';
|
|
621
|
-
await el.updateComplete;
|
|
622
|
-
expect(el.searchContext).to.equal('unicorn-search');
|
|
623
|
-
// property is reflected as attribute
|
|
624
|
-
expect(el.getAttribute('searchcontext')).to.equal('unicorn-search');
|
|
625
|
-
});
|
|
626
|
-
});
|
|
611
|
+
</collection-browser>`);
|
|
612
|
+
el.baseQuery = 'single-result';
|
|
613
|
+
await el.updateComplete;
|
|
614
|
+
await nextTick();
|
|
615
|
+
expect((_b = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#big-results-label')) === null || _b === void 0 ? void 0 : _b.textContent).to.contains('Result');
|
|
616
|
+
});
|
|
617
|
+
it('`searchContext` prop helps describe where component is being used', async () => {
|
|
618
|
+
const el = await fixture(html `<collection-browser></collection-browser>`);
|
|
619
|
+
expect(el.searchContext).to.equal(analyticsCategories.default);
|
|
620
|
+
el.searchContext = 'unicorn-search';
|
|
621
|
+
await el.updateComplete;
|
|
622
|
+
expect(el.searchContext).to.equal('unicorn-search');
|
|
623
|
+
// property is reflected as attribute
|
|
624
|
+
expect(el.getAttribute('searchcontext')).to.equal('unicorn-search');
|
|
625
|
+
});
|
|
626
|
+
});
|
|
627
627
|
//# sourceMappingURL=collection-browser.test.js.map
|