@internetarchive/collection-browser 2.10.1-alpha-webdev7479.10 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/assets/img/icons/close-circle-dark.d.ts +2 -0
- package/dist/src/assets/img/icons/close-circle-dark.js +5 -0
- package/dist/src/assets/img/icons/close-circle-dark.js.map +1 -0
- package/dist/src/collection-browser.d.ts +8 -0
- package/dist/src/collection-browser.js +33 -7
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js +1 -1
- package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.d.ts +3 -2
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +36 -13
- package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-button.js +26 -10
- package/dist/src/collection-facets/smart-facets/smart-facet-button.js.map +1 -1
- package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js +19 -9
- package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js.map +1 -1
- package/dist/src/data-source/collection-browser-data-source.js +4 -5
- package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
- package/dist/src/tiles/grid/tile-stats.js +2 -2
- package/dist/src/tiles/grid/tile-stats.js.map +1 -1
- package/dist/test/collection-browser.test.js +55 -1
- package/dist/test/collection-browser.test.js.map +1 -1
- package/dist/test/mocks/mock-search-responses.d.ts +1 -0
- package/dist/test/mocks/mock-search-responses.js +46 -0
- package/dist/test/mocks/mock-search-responses.js.map +1 -1
- package/dist/test/mocks/mock-search-service.js +2 -1
- package/dist/test/mocks/mock-search-service.js.map +1 -1
- package/dist/test/restoration-state-handler.test.js +40 -0
- package/dist/test/restoration-state-handler.test.js.map +1 -1
- package/dist/test/tile-stats.test.js +39 -13
- package/dist/test/tile-stats.test.js.map +1 -1
- package/package.json +2 -2
- package/src/assets/img/icons/close-circle-dark.ts +5 -0
- package/src/collection-browser.ts +35 -7
- package/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.ts +4 -1
- package/src/collection-facets/smart-facets/smart-facet-bar.ts +38 -16
- package/src/collection-facets/smart-facets/smart-facet-button.ts +27 -10
- package/src/collection-facets/smart-facets/smart-facet-dropdown.ts +21 -10
- package/src/data-source/collection-browser-data-source.ts +8 -5
- package/src/tiles/grid/tile-stats.ts +2 -2
- package/test/collection-browser.test.ts +81 -1
- package/test/mocks/mock-search-responses.ts +50 -0
- package/test/mocks/mock-search-service.ts +2 -0
- package/test/restoration-state-handler.test.ts +59 -0
- package/test/tile-stats.test.ts +51 -13
|
@@ -12,7 +12,7 @@ describe('Tile Stats', () => {
|
|
|
12
12
|
expect(statsRow).to.exist;
|
|
13
13
|
expect(statsRowCount).to.equal(4);
|
|
14
14
|
});
|
|
15
|
-
it('should render component with
|
|
15
|
+
it('should render component with values', async () => {
|
|
16
16
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
17
17
|
const el = await fixture(html `
|
|
18
18
|
<tile-stats
|
|
@@ -32,9 +32,35 @@ describe('Tile Stats', () => {
|
|
|
32
32
|
// get fourth column item in stats row
|
|
33
33
|
const reviewsStatCount = (_k = (_j = (_h = statsRow === null || statsRow === void 0 ? void 0 : statsRow.children.item(3)) === null || _h === void 0 ? void 0 : _h.querySelector('.status-text')) === null || _j === void 0 ? void 0 : _j.textContent) === null || _k === void 0 ? void 0 : _k.trim();
|
|
34
34
|
expect(mediatypeStat).to.exist;
|
|
35
|
-
expect(itemStatCount).to.match(/
|
|
36
|
-
expect(favoritesStatCount).to.match(/
|
|
37
|
-
expect(reviewsStatCount).to.match(/
|
|
35
|
+
expect(itemStatCount).to.match(/uploads:\s+1/);
|
|
36
|
+
expect(favoritesStatCount).to.match(/favorites:\s+2/);
|
|
37
|
+
expect(reviewsStatCount).to.match(/reviews:\s+3/);
|
|
38
|
+
});
|
|
39
|
+
it('should render component with tv clips', async () => {
|
|
40
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
41
|
+
const el = await fixture(html `
|
|
42
|
+
<tile-stats
|
|
43
|
+
showTvClips
|
|
44
|
+
.mediatype=${'texts'}
|
|
45
|
+
.viewCount=${1}
|
|
46
|
+
.favCount=${2}
|
|
47
|
+
.commentCount=${3}
|
|
48
|
+
.tvClipCount=${4}
|
|
49
|
+
>
|
|
50
|
+
</tile-stats>
|
|
51
|
+
`);
|
|
52
|
+
const statsRow = (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('#stats-row');
|
|
53
|
+
const mediatypeStat = statsRow === null || statsRow === void 0 ? void 0 : statsRow.children.item(0);
|
|
54
|
+
// get second column item in stats row
|
|
55
|
+
const itemStatCount = (_d = (_c = (_b = statsRow === null || statsRow === void 0 ? void 0 : statsRow.children.item(1)) === null || _b === void 0 ? void 0 : _b.querySelector('.status-text')) === null || _c === void 0 ? void 0 : _c.textContent) === null || _d === void 0 ? void 0 : _d.trim();
|
|
56
|
+
// get third column item in stats row
|
|
57
|
+
const favoritesStatCount = (_g = (_f = (_e = statsRow === null || statsRow === void 0 ? void 0 : statsRow.children.item(2)) === null || _e === void 0 ? void 0 : _e.querySelector('.status-text')) === null || _f === void 0 ? void 0 : _f.textContent) === null || _g === void 0 ? void 0 : _g.trim();
|
|
58
|
+
// get fourth column item in stats row
|
|
59
|
+
const clipsStatCount = (_k = (_j = (_h = statsRow === null || statsRow === void 0 ? void 0 : statsRow.children.item(3)) === null || _h === void 0 ? void 0 : _h.querySelector('.status-text')) === null || _j === void 0 ? void 0 : _j.textContent) === null || _k === void 0 ? void 0 : _k.trim();
|
|
60
|
+
expect(mediatypeStat).to.exist;
|
|
61
|
+
expect(itemStatCount).to.match(/views:\s+1/);
|
|
62
|
+
expect(favoritesStatCount).to.match(/favorites:\s+2/);
|
|
63
|
+
expect(clipsStatCount).to.match(/clips:\s+4/);
|
|
38
64
|
});
|
|
39
65
|
it('should render view count for non-account items', async () => {
|
|
40
66
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
@@ -56,9 +82,9 @@ describe('Tile Stats', () => {
|
|
|
56
82
|
// get fourth column item in stats row
|
|
57
83
|
const reviewsStatCount = (_k = (_j = (_h = statsRow === null || statsRow === void 0 ? void 0 : statsRow.children.item(3)) === null || _h === void 0 ? void 0 : _h.querySelector('.status-text')) === null || _j === void 0 ? void 0 : _j.textContent) === null || _k === void 0 ? void 0 : _k.trim();
|
|
58
84
|
expect(mediatypeStat).to.exist;
|
|
59
|
-
expect(viewStatCount).to.match(/
|
|
60
|
-
expect(favoritesStatCount).to.match(/
|
|
61
|
-
expect(reviewsStatCount).to.match(/
|
|
85
|
+
expect(viewStatCount).to.match(/views:\s+4/);
|
|
86
|
+
expect(favoritesStatCount).to.match(/favorites:\s+5/);
|
|
87
|
+
expect(reviewsStatCount).to.match(/reviews:\s+6/);
|
|
62
88
|
});
|
|
63
89
|
it('handles missing counts gracefully', async () => {
|
|
64
90
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
@@ -75,9 +101,9 @@ describe('Tile Stats', () => {
|
|
|
75
101
|
// get fourth column item in stats row
|
|
76
102
|
const reviewsStatCount = (_k = (_j = (_h = statsRow === null || statsRow === void 0 ? void 0 : statsRow.children.item(3)) === null || _h === void 0 ? void 0 : _h.querySelector('.status-text')) === null || _j === void 0 ? void 0 : _j.textContent) === null || _k === void 0 ? void 0 : _k.trim();
|
|
77
103
|
expect(mediatypeStat).to.exist;
|
|
78
|
-
expect(viewStatCount).to.match(/
|
|
79
|
-
expect(favoritesStatCount).to.match(/
|
|
80
|
-
expect(reviewsStatCount).to.match(/
|
|
104
|
+
expect(viewStatCount).to.match(/views:\s+0/);
|
|
105
|
+
expect(favoritesStatCount).to.match(/favorites:\s+5/);
|
|
106
|
+
expect(reviewsStatCount).to.match(/reviews:\s+6/);
|
|
81
107
|
});
|
|
82
108
|
it('handles missing counts gracefully for accounts', async () => {
|
|
83
109
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
@@ -94,9 +120,9 @@ describe('Tile Stats', () => {
|
|
|
94
120
|
// get fourth column item in stats row
|
|
95
121
|
const reviewsStatCount = (_k = (_j = (_h = statsRow === null || statsRow === void 0 ? void 0 : statsRow.children.item(3)) === null || _h === void 0 ? void 0 : _h.querySelector('.status-text')) === null || _j === void 0 ? void 0 : _j.textContent) === null || _k === void 0 ? void 0 : _k.trim();
|
|
96
122
|
expect(mediatypeStat).to.exist;
|
|
97
|
-
expect(itemStatCount).to.match(/
|
|
98
|
-
expect(favoritesStatCount).to.match(/
|
|
99
|
-
expect(reviewsStatCount).to.match(/
|
|
123
|
+
expect(itemStatCount).to.match(/uploads:\s+0/);
|
|
124
|
+
expect(favoritesStatCount).to.match(/favorites:\s+5/);
|
|
125
|
+
expect(reviewsStatCount).to.match(/reviews:\s+6/);
|
|
100
126
|
});
|
|
101
127
|
});
|
|
102
128
|
//# sourceMappingURL=tile-stats.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-stats.test.js","sourceRoot":"","sources":["../../test/tile-stats.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { TileStats } from '../src/tiles/grid/tile-stats';\n\nimport '../src/tiles/grid/tile-stats';\n\ndescribe('Tile Stats', () => {\n it('should render initial component', async () => {\n const el = await fixture<TileStats>(html`<tile-stats></tile-stats>`);\n\n const itemStats = el.shadowRoot?.querySelector('.item-stats');\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n const statsRowCount = statsRow?.childElementCount;\n\n expect(itemStats).to.exist;\n expect(statsRow).to.exist;\n expect(statsRowCount).to.equal(4);\n });\n\n it('should render component with value', async () => {\n const el = await fixture<TileStats>(html`\n <tile-stats\n .mediatype=${'account'}\n .itemCount=${1}\n .favCount=${2}\n .commentCount=${3}\n >\n </tile-stats>\n `);\n\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n\n const mediatypeStat = statsRow?.children.item(0);\n // get second column item in stats row\n const itemStatCount = statsRow?.children\n .item(1)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get third column item in stats row\n const favoritesStatCount = statsRow?.children\n .item(2)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get fourth column item in stats row\n const reviewsStatCount = statsRow?.children\n .item(3)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n\n expect(mediatypeStat).to.exist;\n expect(itemStatCount).to.match(/Uploads:\\s+1/);\n expect(favoritesStatCount).to.match(/Favorites:\\s+2/);\n expect(reviewsStatCount).to.match(/Reviews:\\s+3/);\n });\n\n it('should render view count for non-account items', async () => {\n const el = await fixture<TileStats>(html`\n <tile-stats\n .mediatype=${'texts'}\n .viewCount=${4}\n .favCount=${5}\n .commentCount=${6}\n >\n </tile-stats>\n `);\n\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n\n const mediatypeStat = statsRow?.children.item(0);\n // get second column item in stats row\n const viewStatCount = statsRow?.children\n .item(1)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get third column item in stats row\n const favoritesStatCount = statsRow?.children\n .item(2)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get fourth column item in stats row\n const reviewsStatCount = statsRow?.children\n .item(3)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n\n expect(mediatypeStat).to.exist;\n expect(viewStatCount).to.match(/Views:\\s+4/);\n expect(favoritesStatCount).to.match(/Favorites:\\s+5/);\n expect(reviewsStatCount).to.match(/Reviews:\\s+6/);\n });\n\n it('handles missing counts gracefully', async () => {\n const el = await fixture<TileStats>(html`\n <tile-stats .mediatype=${'texts'} .favCount=${5} .commentCount=${6}>\n </tile-stats>\n `);\n\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n\n const mediatypeStat = statsRow?.children.item(0);\n // get second column item in stats row\n const viewStatCount = statsRow?.children\n .item(1)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get third column item in stats row\n const favoritesStatCount = statsRow?.children\n .item(2)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get fourth column item in stats row\n const reviewsStatCount = statsRow?.children\n .item(3)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n\n expect(mediatypeStat).to.exist;\n expect(viewStatCount).to.match(/Views:\\s+0/);\n expect(favoritesStatCount).to.match(/Favorites:\\s+5/);\n expect(reviewsStatCount).to.match(/Reviews:\\s+6/);\n });\n\n it('handles missing counts gracefully for accounts', async () => {\n const el = await fixture<TileStats>(html`\n <tile-stats .mediatype=${'account'} .favCount=${5} .commentCount=${6}>\n </tile-stats>\n `);\n\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n\n const mediatypeStat = statsRow?.children.item(0);\n // get second column item in stats row\n const itemStatCount = statsRow?.children\n .item(1)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get third column item in stats row\n const favoritesStatCount = statsRow?.children\n .item(2)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get fourth column item in stats row\n const reviewsStatCount = statsRow?.children\n .item(3)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n\n expect(mediatypeStat).to.exist;\n expect(itemStatCount).to.match(/Uploads:\\s+0/);\n expect(favoritesStatCount).to.match(/Favorites:\\s+5/);\n expect(reviewsStatCount).to.match(/Reviews:\\s+6/);\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"tile-stats.test.js","sourceRoot":"","sources":["../../test/tile-stats.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport type { TileStats } from '../src/tiles/grid/tile-stats';\n\nimport '../src/tiles/grid/tile-stats';\n\ndescribe('Tile Stats', () => {\n it('should render initial component', async () => {\n const el = await fixture<TileStats>(html`<tile-stats></tile-stats>`);\n\n const itemStats = el.shadowRoot?.querySelector('.item-stats');\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n const statsRowCount = statsRow?.childElementCount;\n\n expect(itemStats).to.exist;\n expect(statsRow).to.exist;\n expect(statsRowCount).to.equal(4);\n });\n\n it('should render component with values', async () => {\n const el = await fixture<TileStats>(html`\n <tile-stats\n .mediatype=${'account'}\n .itemCount=${1}\n .favCount=${2}\n .commentCount=${3}\n >\n </tile-stats>\n `);\n\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n\n const mediatypeStat = statsRow?.children.item(0);\n // get second column item in stats row\n const itemStatCount = statsRow?.children\n .item(1)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get third column item in stats row\n const favoritesStatCount = statsRow?.children\n .item(2)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get fourth column item in stats row\n const reviewsStatCount = statsRow?.children\n .item(3)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n\n expect(mediatypeStat).to.exist;\n expect(itemStatCount).to.match(/uploads:\\s+1/);\n expect(favoritesStatCount).to.match(/favorites:\\s+2/);\n expect(reviewsStatCount).to.match(/reviews:\\s+3/);\n });\n\n it('should render component with tv clips', async () => {\n const el = await fixture<TileStats>(html`\n <tile-stats\n showTvClips\n .mediatype=${'texts'}\n .viewCount=${1}\n .favCount=${2}\n .commentCount=${3}\n .tvClipCount=${4}\n >\n </tile-stats>\n `);\n\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n\n const mediatypeStat = statsRow?.children.item(0);\n // get second column item in stats row\n const itemStatCount = statsRow?.children\n .item(1)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get third column item in stats row\n const favoritesStatCount = statsRow?.children\n .item(2)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get fourth column item in stats row\n const clipsStatCount = statsRow?.children\n .item(3)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n\n expect(mediatypeStat).to.exist;\n expect(itemStatCount).to.match(/views:\\s+1/);\n expect(favoritesStatCount).to.match(/favorites:\\s+2/);\n expect(clipsStatCount).to.match(/clips:\\s+4/);\n });\n\n it('should render view count for non-account items', async () => {\n const el = await fixture<TileStats>(html`\n <tile-stats\n .mediatype=${'texts'}\n .viewCount=${4}\n .favCount=${5}\n .commentCount=${6}\n >\n </tile-stats>\n `);\n\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n\n const mediatypeStat = statsRow?.children.item(0);\n // get second column item in stats row\n const viewStatCount = statsRow?.children\n .item(1)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get third column item in stats row\n const favoritesStatCount = statsRow?.children\n .item(2)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get fourth column item in stats row\n const reviewsStatCount = statsRow?.children\n .item(3)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n\n expect(mediatypeStat).to.exist;\n expect(viewStatCount).to.match(/views:\\s+4/);\n expect(favoritesStatCount).to.match(/favorites:\\s+5/);\n expect(reviewsStatCount).to.match(/reviews:\\s+6/);\n });\n\n it('handles missing counts gracefully', async () => {\n const el = await fixture<TileStats>(html`\n <tile-stats .mediatype=${'texts'} .favCount=${5} .commentCount=${6}>\n </tile-stats>\n `);\n\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n\n const mediatypeStat = statsRow?.children.item(0);\n // get second column item in stats row\n const viewStatCount = statsRow?.children\n .item(1)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get third column item in stats row\n const favoritesStatCount = statsRow?.children\n .item(2)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get fourth column item in stats row\n const reviewsStatCount = statsRow?.children\n .item(3)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n\n expect(mediatypeStat).to.exist;\n expect(viewStatCount).to.match(/views:\\s+0/);\n expect(favoritesStatCount).to.match(/favorites:\\s+5/);\n expect(reviewsStatCount).to.match(/reviews:\\s+6/);\n });\n\n it('handles missing counts gracefully for accounts', async () => {\n const el = await fixture<TileStats>(html`\n <tile-stats .mediatype=${'account'} .favCount=${5} .commentCount=${6}>\n </tile-stats>\n `);\n\n const statsRow = el.shadowRoot?.querySelector('#stats-row');\n\n const mediatypeStat = statsRow?.children.item(0);\n // get second column item in stats row\n const itemStatCount = statsRow?.children\n .item(1)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get third column item in stats row\n const favoritesStatCount = statsRow?.children\n .item(2)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n // get fourth column item in stats row\n const reviewsStatCount = statsRow?.children\n .item(3)\n ?.querySelector('.status-text')\n ?.textContent?.trim();\n\n expect(mediatypeStat).to.exist;\n expect(itemStatCount).to.match(/uploads:\\s+0/);\n expect(favoritesStatCount).to.match(/favorites:\\s+5/);\n expect(reviewsStatCount).to.match(/reviews:\\s+6/);\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "The Internet Archive Collection Browser.",
|
|
4
4
|
"license": "AGPL-3.0-only",
|
|
5
5
|
"author": "Internet Archive",
|
|
6
|
-
"version": "2.
|
|
6
|
+
"version": "2.12.0",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"module": "dist/index.js",
|
|
9
9
|
"scripts": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@internetarchive/iaux-item-metadata": "^1.0.4",
|
|
33
33
|
"@internetarchive/infinite-scroller": "^1.0.1",
|
|
34
34
|
"@internetarchive/modal-manager": "^2.0.1",
|
|
35
|
-
"@internetarchive/search-service": "2.0
|
|
35
|
+
"@internetarchive/search-service": "^2.2.0",
|
|
36
36
|
"@internetarchive/shared-resize-observer": "^0.2.0",
|
|
37
37
|
"@lit/localize": "^0.12.2",
|
|
38
38
|
"dompurify": "^3.2.4",
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { svg } from 'lit';
|
|
2
|
+
|
|
3
|
+
export default svg`
|
|
4
|
+
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path d="m50 0c27.6142375 0 50 22.3857625 50 50s-22.3857625 50-50 50-50-22.3857625-50-50 22.3857625-50 50-50zm23.8159475 26.1840525c-1.4033215-1.4033215-3.5816761-1.5592461-5.1572272-.4677738l-.5598841.4677738-18.0988362 18.0989475-18.0988362-18.0989475-.5598841-.4677738c-1.5755511-1.0914723-3.7539057-.9355477-5.1572272.4677738-1.5787367 1.5787367-1.5787367 4.1383746 0 5.7171113l18.0989475 18.0988362-18.0989475 18.0988362c-1.5787367 1.5787367-1.5787367 4.1383746 0 5.7171113 1.4033215 1.4033215 3.5816761 1.5592461 5.1572272.4677738l.5598841-.4677738 18.0988362-18.0989475 18.0988362 18.0989475.5598841.4677738c1.5755511 1.0914723 3.7539057.9355477 5.1572272-.4677738 1.5787367-1.5787367 1.5787367-4.1383746 0-5.7171113l-18.0989475-18.0988362 18.0989475-18.0988362c1.5787367-1.5787367 1.5787367-4.1383746 0-5.7171113z" fill-rule="evenodd"/></svg>
|
|
5
|
+
`;
|
|
@@ -68,6 +68,7 @@ import { sha1 } from './utils/sha1';
|
|
|
68
68
|
import { log } from './utils/log';
|
|
69
69
|
import type { PlaceholderType } from './empty-placeholder';
|
|
70
70
|
import type { ManageBar } from './manage/manage-bar';
|
|
71
|
+
import type { SmartFacetBar } from './collection-facets/smart-facets/smart-facet-bar';
|
|
71
72
|
|
|
72
73
|
import './empty-placeholder';
|
|
73
74
|
import './tiles/tile-dispatcher';
|
|
@@ -256,6 +257,8 @@ export class CollectionBrowser
|
|
|
256
257
|
/** Whether to display a smart results carousel above the full results */
|
|
257
258
|
@property({ type: Boolean, reflect: true }) showSmartResults = false;
|
|
258
259
|
|
|
260
|
+
@property({ type: String }) resultsHeader?: string;
|
|
261
|
+
|
|
259
262
|
/**
|
|
260
263
|
* The maximum number of pages we will load when a privileged user clicks
|
|
261
264
|
* the "Manage" button on the search page. Limited to 15 pages.
|
|
@@ -310,6 +313,8 @@ export class CollectionBrowser
|
|
|
310
313
|
|
|
311
314
|
@query('manage-bar') private manageBar?: ManageBar;
|
|
312
315
|
|
|
316
|
+
@query('smart-facet-bar') private smartFacetBar?: SmartFacetBar;
|
|
317
|
+
|
|
313
318
|
@property({ type: Object, attribute: false })
|
|
314
319
|
analyticsHandler?: AnalyticsManagerInterface;
|
|
315
320
|
|
|
@@ -513,7 +518,7 @@ export class CollectionBrowser
|
|
|
513
518
|
render() {
|
|
514
519
|
return html`
|
|
515
520
|
${this.showSmartFacetBar
|
|
516
|
-
? html
|
|
521
|
+
? html`<smart-facet-bar
|
|
517
522
|
.query=${this.baseQuery}
|
|
518
523
|
.aggregations=${this.dataSource.aggregations}
|
|
519
524
|
.selectedFacets=${this.selectedFacets}
|
|
@@ -522,6 +527,7 @@ export class CollectionBrowser
|
|
|
522
527
|
@facetsChanged=${this.facetsChanged}
|
|
523
528
|
@filtersToggled=${() => {
|
|
524
529
|
this.facetPaneVisible = !this.facetPaneVisible;
|
|
530
|
+
this.emitFacetPaneVisibilityChanged();
|
|
525
531
|
}}
|
|
526
532
|
></smart-facet-bar>`
|
|
527
533
|
: nothing}
|
|
@@ -688,18 +694,21 @@ export class CollectionBrowser
|
|
|
688
694
|
* tiles and sort/filter bar are shown.
|
|
689
695
|
*/
|
|
690
696
|
private get rightColumnTemplate(): TemplateResult {
|
|
697
|
+
const rightColumnClasses = classMap({
|
|
698
|
+
column: true,
|
|
699
|
+
'full-width': this.showSmartFacetBar && !this.facetPaneVisible,
|
|
700
|
+
'smart-results-spacing': !!this.showSmartResults,
|
|
701
|
+
});
|
|
702
|
+
|
|
691
703
|
return html`
|
|
692
|
-
<div
|
|
693
|
-
id="right-column"
|
|
694
|
-
class="column ${this.showSmartResults ? 'smart-results-spacing' : ''}"
|
|
695
|
-
>
|
|
704
|
+
<div id="right-column" class=${rightColumnClasses}>
|
|
696
705
|
${this.showSmartResults
|
|
697
706
|
? html`<slot name="smart-results"></slot>`
|
|
698
707
|
: nothing}
|
|
699
708
|
<section id="results">
|
|
700
709
|
${this.showSmartResults
|
|
701
710
|
? html`<h2 class="results-section-heading">
|
|
702
|
-
${msg('All results')}
|
|
711
|
+
${this.resultsHeader ?? msg('All results')}
|
|
703
712
|
</h2>`
|
|
704
713
|
: nothing}
|
|
705
714
|
<div id="cb-top-view">
|
|
@@ -847,6 +856,10 @@ export class CollectionBrowser
|
|
|
847
856
|
);
|
|
848
857
|
}
|
|
849
858
|
|
|
859
|
+
refreshSmartFacets(): void {
|
|
860
|
+
this.smartFacetBar?.refresh();
|
|
861
|
+
}
|
|
862
|
+
|
|
850
863
|
/**
|
|
851
864
|
* Handler to show processing modal while removing item
|
|
852
865
|
*/
|
|
@@ -1669,6 +1682,18 @@ export class CollectionBrowser
|
|
|
1669
1682
|
);
|
|
1670
1683
|
}
|
|
1671
1684
|
|
|
1685
|
+
/**
|
|
1686
|
+
* Emits a `facetPaneVisibilityChanged` event indicating that the facet pane has
|
|
1687
|
+
* been toggled open or closed.
|
|
1688
|
+
*/
|
|
1689
|
+
private emitFacetPaneVisibilityChanged(): void {
|
|
1690
|
+
this.dispatchEvent(
|
|
1691
|
+
new CustomEvent<boolean>('facetPaneVisibilityChanged', {
|
|
1692
|
+
detail: this.facetPaneVisible,
|
|
1693
|
+
}),
|
|
1694
|
+
);
|
|
1695
|
+
}
|
|
1696
|
+
|
|
1672
1697
|
/**
|
|
1673
1698
|
* Emits a `queryStateChanged` event indicating that one or more of this component's
|
|
1674
1699
|
* properties have changed in a way that could affect the set of search results.
|
|
@@ -2215,13 +2240,16 @@ export class CollectionBrowser
|
|
|
2215
2240
|
flex: 1;
|
|
2216
2241
|
position: relative;
|
|
2217
2242
|
min-height: 90vh;
|
|
2218
|
-
border-left: 1px solid rgb(232, 232, 232);
|
|
2219
2243
|
border-right: 1px solid rgb(232, 232, 232);
|
|
2220
2244
|
margin-top: var(--rightColumnMarginTop, 0);
|
|
2221
2245
|
padding-top: 2rem;
|
|
2222
2246
|
background: #fff;
|
|
2223
2247
|
}
|
|
2224
2248
|
|
|
2249
|
+
#left-column:not([hidden]) + #right-column {
|
|
2250
|
+
border-left: 1px solid rgb(232, 232, 232);
|
|
2251
|
+
}
|
|
2252
|
+
|
|
2225
2253
|
#right-column.smart-results-spacing {
|
|
2226
2254
|
padding-top: 0.5rem;
|
|
2227
2255
|
border-right: none;
|
|
@@ -44,7 +44,10 @@ export class WikidataHeuristic implements SmartQueryHeuristic {
|
|
|
44
44
|
facets: smartFacet.facets.map(facet => {
|
|
45
45
|
const replaced = {
|
|
46
46
|
...facet,
|
|
47
|
-
bucketKey: facet.bucketKey.replace(
|
|
47
|
+
bucketKey: facet.bucketKey.replace(
|
|
48
|
+
'__QUERY',
|
|
49
|
+
query.toLowerCase(),
|
|
50
|
+
),
|
|
48
51
|
};
|
|
49
52
|
|
|
50
53
|
if (facet.displayText) {
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
} from 'lit';
|
|
10
10
|
import { repeat } from 'lit/directives/repeat.js';
|
|
11
11
|
import { customElement, property, state } from 'lit/decorators.js';
|
|
12
|
+
import { msg } from '@lit/localize';
|
|
12
13
|
import type { Aggregation, Bucket } from '@internetarchive/search-service';
|
|
13
14
|
import type { CollectionTitles } from '../../data-source/models';
|
|
14
15
|
import type { FacetOption, SelectedFacets } from '../../models';
|
|
@@ -18,11 +19,11 @@ import type { SmartFacetDropdown } from './smart-facet-dropdown';
|
|
|
18
19
|
import type { SmartFacet, SmartFacetEvent } from './models';
|
|
19
20
|
import { smartFacetEquals } from './smart-facet-equals';
|
|
20
21
|
import { dedupe } from './dedupe';
|
|
22
|
+
import { log } from '../../utils/log';
|
|
21
23
|
import filterIcon from '../../assets/img/icons/filter';
|
|
22
24
|
|
|
23
25
|
import './smart-facet-button';
|
|
24
26
|
import './smart-facet-dropdown';
|
|
25
|
-
import { log } from '../../utils/log';
|
|
26
27
|
|
|
27
28
|
const fieldPrefixes: Partial<Record<FacetOption, string>> = {
|
|
28
29
|
collection: 'Collection: ',
|
|
@@ -59,9 +60,14 @@ export class SmartFacetBar extends LitElement {
|
|
|
59
60
|
//
|
|
60
61
|
|
|
61
62
|
render() {
|
|
63
|
+
if (!this.query) return nothing;
|
|
64
|
+
|
|
62
65
|
return html`
|
|
63
66
|
<div id="smart-facets-container">
|
|
64
67
|
${this.filtersToggleTemplate}
|
|
68
|
+
${this.smartFacets.length > 0
|
|
69
|
+
? html`<p id="filters-label">${msg('Insights:')}</p>`
|
|
70
|
+
: nothing}
|
|
65
71
|
${repeat(
|
|
66
72
|
this.smartFacets,
|
|
67
73
|
f =>
|
|
@@ -98,6 +104,11 @@ export class SmartFacetBar extends LitElement {
|
|
|
98
104
|
}
|
|
99
105
|
}
|
|
100
106
|
|
|
107
|
+
refresh(): void {
|
|
108
|
+
this.lastAggregations = this.aggregations;
|
|
109
|
+
this.updateSmartFacets();
|
|
110
|
+
}
|
|
111
|
+
|
|
101
112
|
private async updateSmartFacets(): Promise<void> {
|
|
102
113
|
log('updating smart facets');
|
|
103
114
|
if (this.query) {
|
|
@@ -164,6 +175,10 @@ export class SmartFacetBar extends LitElement {
|
|
|
164
175
|
|
|
165
176
|
if (this.heuristicRecs.length > 0) {
|
|
166
177
|
for (const rec of this.heuristicRecs) {
|
|
178
|
+
// Suppress mediatype-only facets for now.
|
|
179
|
+
if (rec.facets.length === 1 && rec.facets[0].facetType === 'mediatype')
|
|
180
|
+
continue;
|
|
181
|
+
|
|
167
182
|
facets.push([rec]);
|
|
168
183
|
}
|
|
169
184
|
}
|
|
@@ -206,10 +221,8 @@ export class SmartFacetBar extends LitElement {
|
|
|
206
221
|
});
|
|
207
222
|
|
|
208
223
|
if (facetType === 'mediatype') {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
[this.toSmartFacet(facetType, [unusedBuckets[1]])],
|
|
212
|
-
);
|
|
224
|
+
continue;
|
|
225
|
+
// Don't include mediatype bubbles
|
|
213
226
|
} else if (facetType === 'collection' || facetType === 'subject') {
|
|
214
227
|
const topBuckets = unusedBuckets.slice(0, 5);
|
|
215
228
|
facets.push(topBuckets.map(b => this.toSmartFacet(facetType, [b])));
|
|
@@ -320,33 +333,42 @@ export class SmartFacetBar extends LitElement {
|
|
|
320
333
|
display: flex;
|
|
321
334
|
align-items: center;
|
|
322
335
|
flex-wrap: wrap;
|
|
323
|
-
gap: 5px;
|
|
336
|
+
gap: 5px 10px;
|
|
324
337
|
padding: 10px 0;
|
|
325
338
|
}
|
|
326
339
|
|
|
327
340
|
#filters-toggle {
|
|
328
341
|
margin: 0;
|
|
329
342
|
border: 0;
|
|
330
|
-
padding: 5px
|
|
331
|
-
border-radius:
|
|
332
|
-
background:
|
|
333
|
-
color:
|
|
334
|
-
|
|
343
|
+
padding: 5px 8px;
|
|
344
|
+
border-radius: 50%;
|
|
345
|
+
background: white;
|
|
346
|
+
color: #2c2c2c;
|
|
347
|
+
border: 1px solid #194880;
|
|
348
|
+
font-size: 1.4rem;
|
|
335
349
|
font-family: inherit;
|
|
336
350
|
text-decoration: none;
|
|
337
|
-
box-shadow: 1px 1px rgba(0, 0, 0, 0.4);
|
|
338
351
|
cursor: pointer;
|
|
339
352
|
}
|
|
340
353
|
|
|
341
354
|
#filters-toggle.active {
|
|
342
|
-
background: #
|
|
343
|
-
|
|
355
|
+
background: #194880;
|
|
356
|
+
color: white;
|
|
344
357
|
}
|
|
345
358
|
|
|
346
359
|
#filters-toggle > svg {
|
|
347
|
-
width:
|
|
360
|
+
width: 12px;
|
|
361
|
+
filter: invert(0.16667);
|
|
362
|
+
vertical-align: -1px;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
#filters-toggle.active > svg {
|
|
348
366
|
filter: invert(1);
|
|
349
|
-
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
#filters-label {
|
|
370
|
+
font-weight: bold;
|
|
371
|
+
margin: 0 -5px 0 0;
|
|
350
372
|
}
|
|
351
373
|
`;
|
|
352
374
|
}
|
|
@@ -3,6 +3,8 @@ import { customElement, property } from 'lit/decorators.js';
|
|
|
3
3
|
import { mediatypeConfig } from '../../mediatype/mediatype-config';
|
|
4
4
|
import type { SmartFacet, SmartFacetEvent } from './models';
|
|
5
5
|
|
|
6
|
+
import closeCircleDark from '../../assets/img/icons/close-circle-dark';
|
|
7
|
+
|
|
6
8
|
function capitalize(str?: string): string | undefined {
|
|
7
9
|
if (!str) return str;
|
|
8
10
|
return str.charAt(0).toLocaleUpperCase() + str.slice(1);
|
|
@@ -47,7 +49,7 @@ export class SmartFacetButton extends LitElement {
|
|
|
47
49
|
>
|
|
48
50
|
${icon} ${displayText}
|
|
49
51
|
${this.selected
|
|
50
|
-
? html`<span
|
|
52
|
+
? html`<span class="unselect-button">${closeCircleDark}</span>`
|
|
51
53
|
: nothing}
|
|
52
54
|
</a>
|
|
53
55
|
`;
|
|
@@ -101,24 +103,39 @@ export class SmartFacetButton extends LitElement {
|
|
|
101
103
|
static get styles(): CSSResultGroup {
|
|
102
104
|
return css`
|
|
103
105
|
.smart-facet-button {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
display: inline-flex;
|
|
107
|
+
align-items: center;
|
|
108
|
+
column-gap: 5px;
|
|
109
|
+
padding: 5px 5px;
|
|
110
|
+
border-radius: 5px;
|
|
111
|
+
background: white;
|
|
112
|
+
color: #2c2c2c;
|
|
113
|
+
border: 1px solid #194880;
|
|
114
|
+
font-size: 1.4rem;
|
|
109
115
|
font-family: inherit;
|
|
116
|
+
line-height: normal;
|
|
110
117
|
text-decoration: none;
|
|
111
|
-
box-shadow: 1px 1px rgba(0, 0, 0, 0.4);
|
|
112
118
|
}
|
|
113
119
|
|
|
114
120
|
.smart-facet-button.selected {
|
|
115
|
-
background: #
|
|
121
|
+
background: #194880;
|
|
122
|
+
color: white;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.unselect-button > svg {
|
|
126
|
+
width: 10px;
|
|
127
|
+
height: 10px;
|
|
128
|
+
filter: invert(1);
|
|
116
129
|
}
|
|
117
130
|
|
|
118
131
|
.smart-facet-button > svg {
|
|
119
|
-
width:
|
|
132
|
+
width: 12px;
|
|
133
|
+
height: 12px;
|
|
134
|
+
filter: invert(0.16667);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.smart-facet-button.selected > svg {
|
|
120
138
|
filter: invert(1);
|
|
121
|
-
vertical-align: text-top;
|
|
122
139
|
}
|
|
123
140
|
`;
|
|
124
141
|
}
|
|
@@ -33,6 +33,8 @@ export class SmartFacetDropdown extends LitElement {
|
|
|
33
33
|
displayCaret
|
|
34
34
|
openViaButton
|
|
35
35
|
closeOnSelect
|
|
36
|
+
closeOnEscape
|
|
37
|
+
closeOnBackdropClick
|
|
36
38
|
includeSelectedOption
|
|
37
39
|
.options=${this.dropdownOptions}
|
|
38
40
|
.selectedOption=${this.activeDropdownOption}
|
|
@@ -57,8 +59,11 @@ export class SmartFacetDropdown extends LitElement {
|
|
|
57
59
|
const firstFacet = smartFacet.facets[0];
|
|
58
60
|
return {
|
|
59
61
|
id: firstFacet.bucketKey,
|
|
60
|
-
label:
|
|
61
|
-
smartFacet.label ??
|
|
62
|
+
label: html`<span>
|
|
63
|
+
${smartFacet.label ??
|
|
64
|
+
firstFacet.displayText ??
|
|
65
|
+
firstFacet.bucketKey}
|
|
66
|
+
</span>`,
|
|
62
67
|
};
|
|
63
68
|
}) ?? []
|
|
64
69
|
);
|
|
@@ -127,23 +132,29 @@ export class SmartFacetDropdown extends LitElement {
|
|
|
127
132
|
static get styles(): CSSResultGroup {
|
|
128
133
|
return css`
|
|
129
134
|
.dropdown-container {
|
|
130
|
-
padding: 5px
|
|
135
|
+
padding: 5px 5px;
|
|
131
136
|
border-radius: 5px;
|
|
132
|
-
background:
|
|
133
|
-
color:
|
|
134
|
-
|
|
137
|
+
background: white;
|
|
138
|
+
color: #2c2c2c;
|
|
139
|
+
border: 1px solid #194880;
|
|
140
|
+
font-size: 1.4rem;
|
|
135
141
|
font-family: inherit;
|
|
136
|
-
box-shadow: 1px 1px rgba(0, 0, 0, 0.4);
|
|
137
142
|
}
|
|
138
143
|
|
|
139
144
|
.dropdown-label {
|
|
140
|
-
font-size: 1.
|
|
145
|
+
font-size: 1.4rem;
|
|
141
146
|
font-family: inherit;
|
|
142
147
|
}
|
|
143
148
|
|
|
144
149
|
.dropdown {
|
|
145
|
-
--
|
|
146
|
-
--
|
|
150
|
+
--dropdownBorderColor: #194880;
|
|
151
|
+
--dropdownBorderWidth: 1px;
|
|
152
|
+
--dropdownBgColor: white;
|
|
153
|
+
--dropdownHoverBgColor: #f8f8f8;
|
|
154
|
+
--dropdownTextColor: #2c2c2c;
|
|
155
|
+
--dropdownHoverTextColor: #2c2c2c;
|
|
156
|
+
--dropdownCaretColor: #2c2c2c;
|
|
157
|
+
--dropdownWhiteSpace: nowrap;
|
|
147
158
|
--caretWidth: 14px;
|
|
148
159
|
--caretHeight: 14px;
|
|
149
160
|
}
|
|
@@ -591,15 +591,18 @@ export class CollectionBrowserDataSource
|
|
|
591
591
|
const isTvSearch = this.host.searchType === SearchType.TV;
|
|
592
592
|
|
|
593
593
|
// Metadata/tv searches within a collection are allowed to have no query.
|
|
594
|
+
const isValidForCollectionSearch =
|
|
595
|
+
isDefaultedSearch || isMetadataSearch || isTvSearch;
|
|
596
|
+
|
|
594
597
|
// Searches within a profile page may also be performed without a query, provided the profile element is set.
|
|
598
|
+
const isValidForProfileSearch =
|
|
599
|
+
hasProfileElement && (isDefaultedSearch || isMetadataSearch);
|
|
600
|
+
|
|
595
601
|
// Otherwise, a non-empty query must be set.
|
|
596
602
|
return (
|
|
597
603
|
hasNonEmptyQuery ||
|
|
598
|
-
(isCollectionSearch &&
|
|
599
|
-
|
|
600
|
-
(isProfileSearch &&
|
|
601
|
-
hasProfileElement &&
|
|
602
|
-
(isDefaultedSearch || isMetadataSearch))
|
|
604
|
+
(isCollectionSearch && isValidForCollectionSearch) ||
|
|
605
|
+
(isProfileSearch && isValidForProfileSearch)
|
|
603
606
|
);
|
|
604
607
|
}
|
|
605
608
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { css, CSSResultGroup, html, LitElement, TemplateResult } from 'lit';
|
|
2
2
|
import { customElement, property } from 'lit/decorators.js';
|
|
3
3
|
|
|
4
|
-
import { msg } from '@lit/localize';
|
|
4
|
+
import { msg, str } from '@lit/localize';
|
|
5
5
|
import { favoriteFilledIcon as favIcon } from '../../assets/img/icons/favorite-filled';
|
|
6
6
|
import { reviewsIcon } from '../../assets/img/icons/reviews';
|
|
7
7
|
import { uploadIcon } from '../../assets/img/icons/upload';
|
|
@@ -85,7 +85,7 @@ export class TileStats extends LitElement {
|
|
|
85
85
|
classes: string[] = [],
|
|
86
86
|
): TemplateResult {
|
|
87
87
|
const formattedCount = formatCount(count ?? 0, 'short', 'short');
|
|
88
|
-
const title = `${formattedCount} ${label}
|
|
88
|
+
const title = msg(str`${formattedCount} ${label}`);
|
|
89
89
|
const srLabel = label + ':';
|
|
90
90
|
|
|
91
91
|
return html`
|