@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.
Files changed (44) hide show
  1. package/dist/src/assets/img/icons/close-circle-dark.d.ts +2 -0
  2. package/dist/src/assets/img/icons/close-circle-dark.js +5 -0
  3. package/dist/src/assets/img/icons/close-circle-dark.js.map +1 -0
  4. package/dist/src/collection-browser.d.ts +8 -0
  5. package/dist/src/collection-browser.js +33 -7
  6. package/dist/src/collection-browser.js.map +1 -1
  7. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js +1 -1
  8. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js.map +1 -1
  9. package/dist/src/collection-facets/smart-facets/smart-facet-bar.d.ts +3 -2
  10. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +36 -13
  11. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -1
  12. package/dist/src/collection-facets/smart-facets/smart-facet-button.js +26 -10
  13. package/dist/src/collection-facets/smart-facets/smart-facet-button.js.map +1 -1
  14. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js +19 -9
  15. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js.map +1 -1
  16. package/dist/src/data-source/collection-browser-data-source.js +4 -5
  17. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  18. package/dist/src/tiles/grid/tile-stats.js +2 -2
  19. package/dist/src/tiles/grid/tile-stats.js.map +1 -1
  20. package/dist/test/collection-browser.test.js +55 -1
  21. package/dist/test/collection-browser.test.js.map +1 -1
  22. package/dist/test/mocks/mock-search-responses.d.ts +1 -0
  23. package/dist/test/mocks/mock-search-responses.js +46 -0
  24. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  25. package/dist/test/mocks/mock-search-service.js +2 -1
  26. package/dist/test/mocks/mock-search-service.js.map +1 -1
  27. package/dist/test/restoration-state-handler.test.js +40 -0
  28. package/dist/test/restoration-state-handler.test.js.map +1 -1
  29. package/dist/test/tile-stats.test.js +39 -13
  30. package/dist/test/tile-stats.test.js.map +1 -1
  31. package/package.json +2 -2
  32. package/src/assets/img/icons/close-circle-dark.ts +5 -0
  33. package/src/collection-browser.ts +35 -7
  34. package/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.ts +4 -1
  35. package/src/collection-facets/smart-facets/smart-facet-bar.ts +38 -16
  36. package/src/collection-facets/smart-facets/smart-facet-button.ts +27 -10
  37. package/src/collection-facets/smart-facets/smart-facet-dropdown.ts +21 -10
  38. package/src/data-source/collection-browser-data-source.ts +8 -5
  39. package/src/tiles/grid/tile-stats.ts +2 -2
  40. package/test/collection-browser.test.ts +81 -1
  41. package/test/mocks/mock-search-responses.ts +50 -0
  42. package/test/mocks/mock-search-service.ts +2 -0
  43. package/test/restoration-state-handler.test.ts +59 -0
  44. 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 value', async () => {
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(/Uploads:\s+1/);
36
- expect(favoritesStatCount).to.match(/Favorites:\s+2/);
37
- expect(reviewsStatCount).to.match(/Reviews:\s+3/);
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(/Views:\s+4/);
60
- expect(favoritesStatCount).to.match(/Favorites:\s+5/);
61
- expect(reviewsStatCount).to.match(/Reviews:\s+6/);
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(/Views:\s+0/);
79
- expect(favoritesStatCount).to.match(/Favorites:\s+5/);
80
- expect(reviewsStatCount).to.match(/Reviews:\s+6/);
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(/Uploads:\s+0/);
98
- expect(favoritesStatCount).to.match(/Favorites:\s+5/);
99
- expect(reviewsStatCount).to.match(/Reviews:\s+6/);
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.10.1-alpha-webdev7479.10",
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.1-alpha-webdev7479.4",
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` <smart-facet-bar
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('__QUERY', query),
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
- facets.push(
210
- [this.toSmartFacet(facetType, [unusedBuckets[0]])],
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 10px;
331
- border-radius: 15px;
332
- background: #194880;
333
- color: white;
334
- font-size: 1.6rem;
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: #09294d;
343
- box-shadow: -1px -1px rgba(0, 0, 0, 0.1);
355
+ background: #194880;
356
+ color: white;
344
357
  }
345
358
 
346
359
  #filters-toggle > svg {
347
- width: 15px;
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
- vertical-align: text-bottom;
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 style="margin-left: 5px;">×</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
- padding: 5px 10px;
105
- border-radius: 15px;
106
- background: #194880;
107
- color: white;
108
- font-size: 1.6rem;
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: #4c76aa;
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: 15px;
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 ?? firstFacet.displayText ?? firstFacet.bucketKey,
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 8px;
135
+ padding: 5px 5px;
131
136
  border-radius: 5px;
132
- background: #194880;
133
- color: white;
134
- font-size: 1.6rem;
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.6rem;
145
+ font-size: 1.4rem;
141
146
  font-family: inherit;
142
147
  }
143
148
 
144
149
  .dropdown {
145
- --dropdownBorderWidth: 5px;
146
- --dropdownBorderColor: transparent;
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
- (isDefaultedSearch || isMetadataSearch || isTvSearch)) ||
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`