@internetarchive/collection-browser 4.3.1-alpha-webdev8165.0 → 4.3.1

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 (42) hide show
  1. package/dist/index.js.map +1 -1
  2. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  3. package/dist/src/manage/manage-bar.js +77 -77
  4. package/dist/src/manage/manage-bar.js.map +1 -1
  5. package/dist/src/models.d.ts +6 -0
  6. package/dist/src/models.js +16 -7
  7. package/dist/src/models.js.map +1 -1
  8. package/dist/src/restoration-state-handler.js +3 -1
  9. package/dist/src/restoration-state-handler.js.map +1 -1
  10. package/dist/src/tiles/base-tile-component.js.map +1 -1
  11. package/dist/src/tiles/grid/item-tile.js +138 -138
  12. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  13. package/dist/src/tiles/models.js.map +1 -1
  14. package/dist/src/tiles/tile-dispatcher.js +216 -216
  15. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  16. package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
  17. package/dist/test/data-source/collection-browser-data-source.test.js +2 -2
  18. package/dist/test/data-source/collection-browser-data-source.test.js.map +1 -1
  19. package/dist/test/manage/manage-bar.test.js +33 -33
  20. package/dist/test/manage/manage-bar.test.js.map +1 -1
  21. package/dist/test/restoration-state-handler.test.js +0 -70
  22. package/dist/test/restoration-state-handler.test.js.map +1 -1
  23. package/dist/test/tiles/list/tile-list-compact-header.test.js +12 -12
  24. package/dist/test/tiles/list/tile-list-compact-header.test.js.map +1 -1
  25. package/dist/test/tiles/list/tile-list.test.js +134 -134
  26. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  27. package/index.ts +28 -28
  28. package/package.json +2 -2
  29. package/src/data-source/collection-browser-data-source.ts +1465 -1465
  30. package/src/manage/manage-bar.ts +276 -276
  31. package/src/models.ts +895 -879
  32. package/src/restoration-state-handler.ts +550 -546
  33. package/src/tiles/base-tile-component.ts +65 -65
  34. package/src/tiles/grid/item-tile.ts +346 -346
  35. package/src/tiles/models.ts +8 -8
  36. package/src/tiles/tile-dispatcher.ts +527 -527
  37. package/src/tiles/tile-display-value-provider.ts +134 -134
  38. package/test/data-source/collection-browser-data-source.test.ts +193 -193
  39. package/test/manage/manage-bar.test.ts +347 -347
  40. package/test/restoration-state-handler.test.ts +480 -569
  41. package/test/tiles/list/tile-list-compact-header.test.ts +43 -43
  42. package/test/tiles/list/tile-list.test.ts +576 -576
@@ -21,8 +21,8 @@ const dataPage = [
21
21
  describe('Collection Browser Data Source', () => {
22
22
  let host;
23
23
  beforeEach(async () => {
24
- host = await fixture(html `
25
- <collection-browser></collection-browser>
24
+ host = await fixture(html `
25
+ <collection-browser></collection-browser>
26
26
  `);
27
27
  });
28
28
  it('can add and retrieve data pages', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"collection-browser-data-source.test.js","sourceRoot":"","sources":["../../../test/data-source/collection-browser-data-source.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\r\nimport { html } from 'lit';\r\nimport sinon from 'sinon';\r\nimport { ItemHit, SearchType } from '@internetarchive/search-service';\r\nimport { CollectionBrowserDataSource } from '../../src/data-source/collection-browser-data-source';\r\nimport { TileModel } from '../../src/models';\r\nimport type { CollectionBrowser } from '../../src/collection-browser';\r\nimport '../../src/collection-browser';\r\nimport { MockSearchService } from '../mocks/mock-search-service';\r\n\r\nconst dataPage: TileModel[] = [\r\n new TileModel(\r\n new ItemHit({\r\n fields: {\r\n identifier: 'foo',\r\n },\r\n }),\r\n ),\r\n new TileModel(\r\n new ItemHit({\r\n fields: {\r\n identifier: 'bar',\r\n },\r\n }),\r\n ),\r\n];\r\n\r\ndescribe('Collection Browser Data Source', () => {\r\n let host: CollectionBrowser;\r\n\r\n beforeEach(async () => {\r\n host = await fixture<CollectionBrowser>(html`\r\n <collection-browser></collection-browser>\r\n `);\r\n });\r\n\r\n it('can add and retrieve data pages', () => {\r\n const dataSource = new CollectionBrowserDataSource(host);\r\n dataSource.addPage(1, dataPage);\r\n\r\n expect(Object.keys(dataSource.getAllPages()).length).to.equal(1);\r\n expect(dataSource.getPage(1).length).to.equal(2);\r\n expect(dataSource.getPage(1)[0].identifier).to.equal('foo');\r\n expect(dataSource.getPage(1)[1].identifier).to.equal('bar');\r\n });\r\n\r\n it('can add data split across multiple pages', () => {\r\n const dataSource = new CollectionBrowserDataSource(host, 3);\r\n const doubledDataPage = [...dataPage, ...dataPage];\r\n dataSource.addMultiplePages(1, doubledDataPage);\r\n\r\n expect(Object.keys(dataSource.getAllPages()).length).to.equal(2);\r\n expect(dataSource.getPage(1).length).to.equal(3);\r\n expect(dataSource.getPage(2).length).to.equal(1);\r\n expect(dataSource.getPage(1)[0].identifier).to.equal('foo');\r\n expect(dataSource.getPage(1)[1].identifier).to.equal('bar');\r\n expect(dataSource.getPage(1)[2].identifier).to.equal('foo');\r\n expect(dataSource.getPage(2)[0].identifier).to.equal('bar');\r\n });\r\n\r\n it('resets data when changing page size', () => {\r\n const dataSource = new CollectionBrowserDataSource(host);\r\n dataSource.addPage(1, dataPage);\r\n\r\n dataSource.setPageSize(100);\r\n expect(Object.keys(dataSource.getAllPages()).length).to.equal(0);\r\n expect(dataSource.getPageSize()).to.equal(100);\r\n });\r\n\r\n it('can be installed on the host', async () => {\r\n const dataSource = new CollectionBrowserDataSource(host);\r\n dataSource.addPage(1, dataPage);\r\n\r\n host.installDataSourceAndQueryState(dataSource, {\r\n searchType: SearchType.METADATA,\r\n sortDirection: null,\r\n selectedTitleFilter: null,\r\n selectedCreatorFilter: null,\r\n baseQuery: 'foobar',\r\n });\r\n\r\n await host.updateComplete;\r\n\r\n expect(host.dataSource).to.equal(dataSource);\r\n expect(host.baseQuery).to.equal('foobar');\r\n\r\n host.removeController(dataSource);\r\n });\r\n\r\n it('can suppress further fetches', async () => {\r\n host.searchService = new MockSearchService();\r\n\r\n const pageFetchSpy = sinon.spy();\r\n const dataSource = new CollectionBrowserDataSource(host);\r\n dataSource.fetchPage = pageFetchSpy;\r\n\r\n dataSource.addPage(1, dataPage);\r\n dataSource.setFetchesSuppressed(true);\r\n dataSource.handleQueryChange();\r\n\r\n expect(pageFetchSpy.callCount).to.equal(0);\r\n });\r\n\r\n it('can set its initial page batch size', async () => {\r\n host.searchService = new MockSearchService();\r\n\r\n const pageFetchSpy = sinon.spy();\r\n const dataSource = new CollectionBrowserDataSource(host);\r\n dataSource.setNumInitialPages(10);\r\n dataSource.fetchPage = pageFetchSpy;\r\n\r\n dataSource.handleQueryChange();\r\n\r\n // Uses specified number of initial pages\r\n expect(pageFetchSpy.args[0][1]).to.equal(10);\r\n });\r\n\r\n it('refreshes prefix filter counts', () => {\r\n const dataSource = new CollectionBrowserDataSource(host);\r\n dataSource.addPage(1, dataPage);\r\n\r\n dataSource.prefixFilterCountMap = {\r\n title: {\r\n X: 10,\r\n },\r\n };\r\n\r\n dataSource.refreshLetterCounts();\r\n expect(dataSource.prefixFilterCountMap).to.deep.equal({});\r\n });\r\n\r\n describe('empty FTS query in collection falls back to metadata search', () => {\r\n it('allows search with empty query and FTS in a collection', async () => {\r\n const searchService = new MockSearchService();\r\n host.searchService = searchService;\r\n host.withinCollection = 'test-collection';\r\n host.searchType = SearchType.FULLTEXT;\r\n host.baseQuery = '';\r\n await host.updateComplete;\r\n\r\n const dataSource = new CollectionBrowserDataSource(host);\r\n host.addController(dataSource);\r\n expect(dataSource.canPerformSearch).to.be.true;\r\n host.removeController(dataSource);\r\n });\r\n\r\n it('uses metadata search type for fetch when FTS query is empty in a collection', async () => {\r\n const searchService = new MockSearchService();\r\n host.searchService = searchService;\r\n host.withinCollection = 'test-collection';\r\n host.searchType = SearchType.FULLTEXT;\r\n host.baseQuery = '';\r\n await host.updateComplete;\r\n\r\n const dataSource = new CollectionBrowserDataSource(host);\r\n host.addController(dataSource);\r\n await dataSource.fetchPage(1);\r\n\r\n expect(searchService.searchType).to.equal(SearchType.METADATA);\r\n host.removeController(dataSource);\r\n });\r\n\r\n it('uses FTS search type for fetch when FTS query is non-empty in a collection', async () => {\r\n const searchService = new MockSearchService();\r\n host.searchService = searchService;\r\n host.withinCollection = 'test-collection';\r\n host.searchType = SearchType.FULLTEXT;\r\n host.baseQuery = 'some query';\r\n await host.updateComplete;\r\n\r\n const dataSource = new CollectionBrowserDataSource(host);\r\n host.addController(dataSource);\r\n await dataSource.fetchPage(1);\r\n\r\n expect(searchService.searchType).to.equal(SearchType.FULLTEXT);\r\n host.removeController(dataSource);\r\n });\r\n\r\n it('does not allow search with empty FTS query outside a collection', async () => {\r\n const searchService = new MockSearchService();\r\n host.searchService = searchService;\r\n host.withinCollection = undefined;\r\n host.searchType = SearchType.FULLTEXT;\r\n host.baseQuery = '';\r\n await host.updateComplete;\r\n\r\n const dataSource = new CollectionBrowserDataSource(host);\r\n host.addController(dataSource);\r\n expect(dataSource.canPerformSearch).to.be.false;\r\n host.removeController(dataSource);\r\n });\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"collection-browser-data-source.test.js","sourceRoot":"","sources":["../../../test/data-source/collection-browser-data-source.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sDAAsD,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,8BAA8B,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,MAAM,QAAQ,GAAgB;IAC5B,IAAI,SAAS,CACX,IAAI,OAAO,CAAC;QACV,MAAM,EAAE;YACN,UAAU,EAAE,KAAK;SAClB;KACF,CAAC,CACH;IACD,IAAI,SAAS,CACX,IAAI,OAAO,CAAC;QACV,MAAM,EAAE;YACN,UAAU,EAAE,KAAK;SAClB;KACF,CAAC,CACH;CACF,CAAC;AAEF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAI,IAAuB,CAAC;IAE5B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,IAAI,GAAG,MAAM,OAAO,CAAoB,IAAI,CAAA;;KAE3C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;QACzD,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEhC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;QACnD,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;QACzD,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEhC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;QACzD,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEhC,IAAI,CAAC,8BAA8B,CAAC,UAAU,EAAE;YAC9C,UAAU,EAAE,UAAU,CAAC,QAAQ;YAC/B,aAAa,EAAE,IAAI;YACnB,mBAAmB,EAAE,IAAI;YACzB,qBAAqB,EAAE,IAAI;YAC3B,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,cAAc,CAAC;QAE1B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAE7C,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;QACzD,UAAU,CAAC,SAAS,GAAG,YAAY,CAAC;QAEpC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAChC,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACtC,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAE/B,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,IAAI,CAAC,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAE7C,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;QACzD,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAClC,UAAU,CAAC,SAAS,GAAG,YAAY,CAAC;QAEpC,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAE/B,yCAAyC;QACzC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;QACzD,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEhC,UAAU,CAAC,oBAAoB,GAAG;YAChC,KAAK,EAAE;gBACL,CAAC,EAAE,EAAE;aACN;SACF,CAAC;QAEF,UAAU,CAAC,mBAAmB,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6DAA6D,EAAE,GAAG,EAAE;QAC3E,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAC9C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YACnC,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;YAC1C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC;YACtC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,cAAc,CAAC;YAE1B,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC/C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;YAC3F,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAC9C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YACnC,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;YAC1C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC;YACtC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,cAAc,CAAC;YAE1B,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAE9B,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/D,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAC9C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YACnC,IAAI,CAAC,gBAAgB,GAAG,iBAAiB,CAAC;YAC1C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC;YACtC,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;YAC9B,MAAM,IAAI,CAAC,cAAc,CAAC;YAE1B,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAE9B,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/D,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAE,CAAC;YAC9C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YACnC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC;YACtC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,cAAc,CAAC;YAE1B,MAAM,UAAU,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC;YACzD,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport sinon from 'sinon';\nimport { ItemHit, SearchType } from '@internetarchive/search-service';\nimport { CollectionBrowserDataSource } from '../../src/data-source/collection-browser-data-source';\nimport { TileModel } from '../../src/models';\nimport type { CollectionBrowser } from '../../src/collection-browser';\nimport '../../src/collection-browser';\nimport { MockSearchService } from '../mocks/mock-search-service';\n\nconst dataPage: TileModel[] = [\n new TileModel(\n new ItemHit({\n fields: {\n identifier: 'foo',\n },\n }),\n ),\n new TileModel(\n new ItemHit({\n fields: {\n identifier: 'bar',\n },\n }),\n ),\n];\n\ndescribe('Collection Browser Data Source', () => {\n let host: CollectionBrowser;\n\n beforeEach(async () => {\n host = await fixture<CollectionBrowser>(html`\n <collection-browser></collection-browser>\n `);\n });\n\n it('can add and retrieve data pages', () => {\n const dataSource = new CollectionBrowserDataSource(host);\n dataSource.addPage(1, dataPage);\n\n expect(Object.keys(dataSource.getAllPages()).length).to.equal(1);\n expect(dataSource.getPage(1).length).to.equal(2);\n expect(dataSource.getPage(1)[0].identifier).to.equal('foo');\n expect(dataSource.getPage(1)[1].identifier).to.equal('bar');\n });\n\n it('can add data split across multiple pages', () => {\n const dataSource = new CollectionBrowserDataSource(host, 3);\n const doubledDataPage = [...dataPage, ...dataPage];\n dataSource.addMultiplePages(1, doubledDataPage);\n\n expect(Object.keys(dataSource.getAllPages()).length).to.equal(2);\n expect(dataSource.getPage(1).length).to.equal(3);\n expect(dataSource.getPage(2).length).to.equal(1);\n expect(dataSource.getPage(1)[0].identifier).to.equal('foo');\n expect(dataSource.getPage(1)[1].identifier).to.equal('bar');\n expect(dataSource.getPage(1)[2].identifier).to.equal('foo');\n expect(dataSource.getPage(2)[0].identifier).to.equal('bar');\n });\n\n it('resets data when changing page size', () => {\n const dataSource = new CollectionBrowserDataSource(host);\n dataSource.addPage(1, dataPage);\n\n dataSource.setPageSize(100);\n expect(Object.keys(dataSource.getAllPages()).length).to.equal(0);\n expect(dataSource.getPageSize()).to.equal(100);\n });\n\n it('can be installed on the host', async () => {\n const dataSource = new CollectionBrowserDataSource(host);\n dataSource.addPage(1, dataPage);\n\n host.installDataSourceAndQueryState(dataSource, {\n searchType: SearchType.METADATA,\n sortDirection: null,\n selectedTitleFilter: null,\n selectedCreatorFilter: null,\n baseQuery: 'foobar',\n });\n\n await host.updateComplete;\n\n expect(host.dataSource).to.equal(dataSource);\n expect(host.baseQuery).to.equal('foobar');\n\n host.removeController(dataSource);\n });\n\n it('can suppress further fetches', async () => {\n host.searchService = new MockSearchService();\n\n const pageFetchSpy = sinon.spy();\n const dataSource = new CollectionBrowserDataSource(host);\n dataSource.fetchPage = pageFetchSpy;\n\n dataSource.addPage(1, dataPage);\n dataSource.setFetchesSuppressed(true);\n dataSource.handleQueryChange();\n\n expect(pageFetchSpy.callCount).to.equal(0);\n });\n\n it('can set its initial page batch size', async () => {\n host.searchService = new MockSearchService();\n\n const pageFetchSpy = sinon.spy();\n const dataSource = new CollectionBrowserDataSource(host);\n dataSource.setNumInitialPages(10);\n dataSource.fetchPage = pageFetchSpy;\n\n dataSource.handleQueryChange();\n\n // Uses specified number of initial pages\n expect(pageFetchSpy.args[0][1]).to.equal(10);\n });\n\n it('refreshes prefix filter counts', () => {\n const dataSource = new CollectionBrowserDataSource(host);\n dataSource.addPage(1, dataPage);\n\n dataSource.prefixFilterCountMap = {\n title: {\n X: 10,\n },\n };\n\n dataSource.refreshLetterCounts();\n expect(dataSource.prefixFilterCountMap).to.deep.equal({});\n });\n\n describe('empty FTS query in collection falls back to metadata search', () => {\n it('allows search with empty query and FTS in a collection', async () => {\n const searchService = new MockSearchService();\n host.searchService = searchService;\n host.withinCollection = 'test-collection';\n host.searchType = SearchType.FULLTEXT;\n host.baseQuery = '';\n await host.updateComplete;\n\n const dataSource = new CollectionBrowserDataSource(host);\n host.addController(dataSource);\n expect(dataSource.canPerformSearch).to.be.true;\n host.removeController(dataSource);\n });\n\n it('uses metadata search type for fetch when FTS query is empty in a collection', async () => {\n const searchService = new MockSearchService();\n host.searchService = searchService;\n host.withinCollection = 'test-collection';\n host.searchType = SearchType.FULLTEXT;\n host.baseQuery = '';\n await host.updateComplete;\n\n const dataSource = new CollectionBrowserDataSource(host);\n host.addController(dataSource);\n await dataSource.fetchPage(1);\n\n expect(searchService.searchType).to.equal(SearchType.METADATA);\n host.removeController(dataSource);\n });\n\n it('uses FTS search type for fetch when FTS query is non-empty in a collection', async () => {\n const searchService = new MockSearchService();\n host.searchService = searchService;\n host.withinCollection = 'test-collection';\n host.searchType = SearchType.FULLTEXT;\n host.baseQuery = 'some query';\n await host.updateComplete;\n\n const dataSource = new CollectionBrowserDataSource(host);\n host.addController(dataSource);\n await dataSource.fetchPage(1);\n\n expect(searchService.searchType).to.equal(SearchType.FULLTEXT);\n host.removeController(dataSource);\n });\n\n it('does not allow search with empty FTS query outside a collection', async () => {\n const searchService = new MockSearchService();\n host.searchService = searchService;\n host.withinCollection = undefined;\n host.searchType = SearchType.FULLTEXT;\n host.baseQuery = '';\n await host.updateComplete;\n\n const dataSource = new CollectionBrowserDataSource(host);\n host.addController(dataSource);\n expect(dataSource.canPerformSearch).to.be.false;\n host.removeController(dataSource);\n });\n });\n});\n"]}
@@ -72,12 +72,12 @@ describe('Manage bar', () => {
72
72
  });
73
73
  it('opens the remove items modal when showRemoveItemsModal is clicked', async () => {
74
74
  const modalManager = await fixture(html `<modal-manager></modal-manager>`);
75
- const el = await fixture(html `
76
- <manage-bar
77
- .modalManager=${modalManager}
78
- .selectedItems=${[{ identifier: '1', title: 'Item 1' }]}
79
- removeAllowed
80
- ></manage-bar>
75
+ const el = await fixture(html `
76
+ <manage-bar
77
+ .modalManager=${modalManager}
78
+ .selectedItems=${[{ identifier: '1', title: 'Item 1' }]}
79
+ removeAllowed
80
+ ></manage-bar>
81
81
  `);
82
82
  await el.updateComplete;
83
83
  const removeButton = el.shadowRoot?.querySelector('.ia-button.danger');
@@ -91,14 +91,14 @@ describe('Manage bar', () => {
91
91
  expect(showModalSpy.args[0][0].customModalContent).to.exist;
92
92
  });
93
93
  it('shows selected items count in remove button', async () => {
94
- const el = await fixture(html `
95
- <manage-bar
94
+ const el = await fixture(html `
95
+ <manage-bar
96
96
  .selectedItems=${[
97
97
  { identifier: '1', title: 'Item 1' },
98
98
  { identifier: '2', title: 'Item 2' },
99
99
  { identifier: '3', title: 'Item 3' },
100
- ]}
101
- ></manage-bar>
100
+ ]}
101
+ ></manage-bar>
102
102
  `);
103
103
  const removeBtn = el.shadowRoot?.querySelector('.ia-button.danger');
104
104
  expect(removeBtn?.textContent?.trim()).to.include('(3)');
@@ -114,12 +114,12 @@ describe('Manage bar', () => {
114
114
  });
115
115
  it('emits manageItems event when Item Manager button clicked', async () => {
116
116
  const spy = Sinon.spy();
117
- const el = await fixture(html `
118
- <manage-bar
119
- showItemManageButton
120
- removeAllowed
121
- @manageItems=${spy}
122
- ></manage-bar>
117
+ const el = await fixture(html `
118
+ <manage-bar
119
+ showItemManageButton
120
+ removeAllowed
121
+ @manageItems=${spy}
122
+ ></manage-bar>
123
123
  `);
124
124
  const manageBtn = el.shadowRoot?.querySelector('.ia-button.warning');
125
125
  expect(manageBtn).to.exist;
@@ -129,13 +129,13 @@ describe('Manage bar', () => {
129
129
  it('emits removeItems event when modal confirm is clicked', async () => {
130
130
  const modalManager = await fixture(html `<modal-manager></modal-manager>`);
131
131
  const removeItemsSpy = Sinon.spy();
132
- const el = await fixture(html `
133
- <manage-bar
134
- .modalManager=${modalManager}
135
- .selectedItems=${[{ identifier: '1', title: 'Item 1' }]}
136
- removeAllowed
137
- @removeItems=${removeItemsSpy}
138
- ></manage-bar>
132
+ const el = await fixture(html `
133
+ <manage-bar
134
+ .modalManager=${modalManager}
135
+ .selectedItems=${[{ identifier: '1', title: 'Item 1' }]}
136
+ removeAllowed
137
+ @removeItems=${removeItemsSpy}
138
+ ></manage-bar>
139
139
  `);
140
140
  await el.updateComplete;
141
141
  const showModalSpy = Sinon.spy(el.modalManager, 'showModal');
@@ -151,12 +151,12 @@ describe('Manage bar', () => {
151
151
  identifier: String(i + 1),
152
152
  title: `Item ${i + 1}`,
153
153
  }));
154
- const el = await fixture(html `
155
- <manage-bar
156
- .selectedItems=${items}
157
- .profileElement=${profileElement}
158
- removeAllowed
159
- ></manage-bar>
154
+ const el = await fixture(html `
155
+ <manage-bar
156
+ .selectedItems=${items}
157
+ .profileElement=${profileElement}
158
+ removeAllowed
159
+ ></manage-bar>
160
160
  `);
161
161
  el.modalManager = modalManager;
162
162
  await el.updateComplete;
@@ -192,8 +192,8 @@ describe('Manage bar', () => {
192
192
  });
193
193
  it('showRemoveItemsProcessingModal shows processing modal', async () => {
194
194
  const modalManager = await fixture(html `<modal-manager></modal-manager>`);
195
- const el = await fixture(html `
196
- <manage-bar .modalManager=${modalManager}></manage-bar>
195
+ const el = await fixture(html `
196
+ <manage-bar .modalManager=${modalManager}></manage-bar>
197
197
  `);
198
198
  const showModalSpy = Sinon.spy(el.modalManager, 'showModal');
199
199
  el.showRemoveItemsProcessingModal();
@@ -203,8 +203,8 @@ describe('Manage bar', () => {
203
203
  });
204
204
  it('showRemoveItemsErrorModal shows error modal', async () => {
205
205
  const modalManager = await fixture(html `<modal-manager></modal-manager>`);
206
- const el = await fixture(html `
207
- <manage-bar .modalManager=${modalManager}></manage-bar>
206
+ const el = await fixture(html `
207
+ <manage-bar .modalManager=${modalManager}></manage-bar>
208
208
  `);
209
209
  const showModalSpy = Sinon.spy(el.modalManager, 'showModal');
210
210
  el.showRemoveItemsErrorModal();
@@ -1 +1 @@
1
- {"version":3,"file":"manage-bar.test.js","sourceRoot":"","sources":["../../../test/manage/manage-bar.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\r\nimport { html } from 'lit';\r\nimport Sinon from 'sinon';\r\nimport '../../src/manage/manage-bar';\r\nimport '../../src/manage/remove-items-modal-content';\r\nimport {\r\n ModalManager,\r\n ModalManagerInterface,\r\n} from '@internetarchive/modal-manager';\r\nimport '@internetarchive/modal-manager';\r\nimport { msg } from '@lit/localize';\r\nimport type { ManageBar } from '../../src/manage/manage-bar';\r\nimport type { PageElementName } from '@internetarchive/search-service';\r\nimport type { RemoveItemsModalContent } from '../../src/manage/remove-items-modal-content';\r\n\r\ndescribe('Manage bar', () => {\r\n it('renders basic component', async () => {\r\n const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);\r\n\r\n expect(el.shadowRoot?.querySelector('.manage-label')).to.exist;\r\n expect(el.shadowRoot?.querySelector('.manage-buttons')).to.exist;\r\n expect(el.shadowRoot?.querySelector('.ia-button.dark')).to.exist;\r\n expect(el.shadowRoot?.querySelector('.ia-button.danger')).to.exist;\r\n });\r\n\r\n it('can set the label', async () => {\r\n const el = await fixture<ManageBar>(\r\n html`<manage-bar label=\"foo bar\"></manage-bar>`,\r\n );\r\n expect(el.shadowRoot?.querySelector('.manage-label')?.textContent).to.equal(\r\n 'foo bar',\r\n );\r\n });\r\n\r\n it('does not include Select All/Unselect All buttons by default', async () => {\r\n const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);\r\n expect(el.shadowRoot?.querySelector('.select-all-btn')).not.to.exist;\r\n expect(el.shadowRoot?.querySelector('.unselect-all-btn')).not.to.exist;\r\n });\r\n\r\n it('does not render item manager button except /search/ page', async () => {\r\n const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);\r\n expect(el.shadowRoot?.querySelector('.ia-button.warning')).not.to.exist;\r\n });\r\n\r\n it('render item manager button for /search/ page', async () => {\r\n const el = await fixture<ManageBar>(\r\n html`<manage-bar showItemManageButton></manage-bar>`,\r\n );\r\n expect(el.shadowRoot?.querySelector('.ia-button.warning')).to.exist;\r\n });\r\n\r\n it('includes Select All button when requested', async () => {\r\n const el = await fixture<ManageBar>(\r\n html`<manage-bar showSelectAll></manage-bar>`,\r\n );\r\n expect(el.shadowRoot?.querySelector('.select-all-btn')).to.exist;\r\n });\r\n\r\n it('includes Unselect All button when requested', async () => {\r\n const el = await fixture<ManageBar>(\r\n html`<manage-bar showUnselectAll></manage-bar>`,\r\n );\r\n expect(el.shadowRoot?.querySelector('.unselect-all-btn')).to.exist;\r\n });\r\n\r\n it('default and toggle state of remove button', async () => {\r\n const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);\r\n\r\n expect(el.shadowRoot?.querySelector('.ia-button.danger:disabled')).to.exist;\r\n\r\n el.removeAllowed = true;\r\n await el.updateComplete;\r\n\r\n expect(el.shadowRoot?.querySelector('.ia-button.danger:disabled')).to.not\r\n .exist;\r\n });\r\n\r\n it('emits event when Cancel button clicked', async () => {\r\n const spy = Sinon.spy();\r\n const el = await fixture<ManageBar>(\r\n html`<manage-bar @cancel=${spy}></manage-bar>`,\r\n );\r\n\r\n const cancelBtn = el.shadowRoot?.querySelector(\r\n '.ia-button.dark',\r\n ) as HTMLButtonElement;\r\n expect(cancelBtn).to.exist;\r\n\r\n cancelBtn.click();\r\n expect(spy.callCount).to.equal(1);\r\n });\r\n\r\n it('emits event when Select All button clicked', async () => {\r\n const spy = Sinon.spy();\r\n const el = await fixture<ManageBar>(\r\n html`<manage-bar showSelectAll @selectAll=${spy}></manage-bar>`,\r\n );\r\n\r\n const selectAllBtn = el.shadowRoot?.querySelector(\r\n '.select-all-btn',\r\n ) as HTMLButtonElement;\r\n expect(selectAllBtn).to.exist;\r\n\r\n selectAllBtn.click();\r\n expect(spy.callCount).to.equal(1);\r\n });\r\n\r\n it('emits event when Unselect All button clicked', async () => {\r\n const spy = Sinon.spy();\r\n const el = await fixture<ManageBar>(\r\n html`<manage-bar showUnselectAll @unselectAll=${spy}></manage-bar>`,\r\n );\r\n\r\n const unselectAllBtn = el.shadowRoot?.querySelector(\r\n '.unselect-all-btn',\r\n ) as HTMLButtonElement;\r\n expect(unselectAllBtn).to.exist;\r\n\r\n unselectAllBtn.click();\r\n expect(spy.callCount).to.equal(1);\r\n });\r\n\r\n it('opens the remove items modal when showRemoveItemsModal is clicked', async () => {\r\n const modalManager = await fixture<ModalManager>(\r\n html`<modal-manager></modal-manager>`,\r\n );\r\n\r\n const el = await fixture<ManageBar>(html`\r\n <manage-bar\r\n .modalManager=${modalManager}\r\n .selectedItems=${[{ identifier: '1', title: 'Item 1' }]}\r\n removeAllowed\r\n ></manage-bar>\r\n `);\r\n await el.updateComplete;\r\n\r\n const removeButton = el.shadowRoot?.querySelector(\r\n '.ia-button.danger',\r\n ) as HTMLButtonElement;\r\n expect(removeButton).to.exist;\r\n\r\n const showModalSpy = Sinon.spy(\r\n el.modalManager as ModalManagerInterface,\r\n 'showModal',\r\n );\r\n\r\n await el.updateComplete;\r\n removeButton?.click();\r\n\r\n expect(showModalSpy.callCount).to.equal(1);\r\n expect(el.modalManager?.classList.contains('remove-items')).to.be;\r\n expect(showModalSpy.args[0][0].config.title?.values[0]).to.equal(\r\n msg('Are you sure you want to remove these items?'),\r\n );\r\n expect(showModalSpy.args[0][0].customModalContent).to.exist;\r\n });\r\n\r\n it('shows selected items count in remove button', async () => {\r\n const el = await fixture<ManageBar>(html`\r\n <manage-bar\r\n .selectedItems=${[\r\n { identifier: '1', title: 'Item 1' },\r\n { identifier: '2', title: 'Item 2' },\r\n { identifier: '3', title: 'Item 3' },\r\n ]}\r\n ></manage-bar>\r\n `);\r\n const removeBtn = el.shadowRoot?.querySelector('.ia-button.danger');\r\n expect(removeBtn?.textContent?.trim()).to.include('(3)');\r\n });\r\n\r\n it('Item Manager button is disabled when removeAllowed is false', async () => {\r\n const el = await fixture<ManageBar>(\r\n html`<manage-bar showItemManageButton></manage-bar>`,\r\n );\r\n expect(el.shadowRoot?.querySelector('.ia-button.warning:disabled')).to\r\n .exist;\r\n\r\n el.removeAllowed = true;\r\n await el.updateComplete;\r\n\r\n expect(el.shadowRoot?.querySelector('.ia-button.warning:disabled')).not.to\r\n .exist;\r\n });\r\n\r\n it('emits manageItems event when Item Manager button clicked', async () => {\r\n const spy = Sinon.spy();\r\n const el = await fixture<ManageBar>(html`\r\n <manage-bar\r\n showItemManageButton\r\n removeAllowed\r\n @manageItems=${spy}\r\n ></manage-bar>\r\n `);\r\n const manageBtn = el.shadowRoot?.querySelector(\r\n '.ia-button.warning',\r\n ) as HTMLButtonElement;\r\n expect(manageBtn).to.exist;\r\n manageBtn.click();\r\n expect(spy.callCount).to.equal(1);\r\n });\r\n\r\n it('emits removeItems event when modal confirm is clicked', async () => {\r\n const modalManager = await fixture<ModalManager>(\r\n html`<modal-manager></modal-manager>`,\r\n );\r\n const removeItemsSpy = Sinon.spy();\r\n const el = await fixture<ManageBar>(html`\r\n <manage-bar\r\n .modalManager=${modalManager}\r\n .selectedItems=${[{ identifier: '1', title: 'Item 1' }]}\r\n removeAllowed\r\n @removeItems=${removeItemsSpy}\r\n ></manage-bar>\r\n `);\r\n await el.updateComplete;\r\n\r\n const showModalSpy = Sinon.spy(\r\n el.modalManager as ModalManagerInterface,\r\n 'showModal',\r\n );\r\n (\r\n el.shadowRoot?.querySelector('.ia-button.danger') as HTMLButtonElement\r\n ).click();\r\n\r\n const contentEl = (await fixture(\r\n showModalSpy.args[0][0].customModalContent!,\r\n )) as RemoveItemsModalContent;\r\n (\r\n contentEl.shadowRoot?.querySelector(\r\n '.remove-items-btn',\r\n ) as HTMLButtonElement\r\n ).click();\r\n\r\n expect(removeItemsSpy.callCount).to.equal(1);\r\n });\r\n\r\n describe('profileElement modal messages', () => {\r\n async function openModalContent(\r\n profileElement: string,\r\n itemCount = 1,\r\n ): Promise<RemoveItemsModalContent> {\r\n const modalManager = await fixture<ModalManager>(\r\n html`<modal-manager></modal-manager>`,\r\n );\r\n const items = Array.from({ length: itemCount }, (_, i) => ({\r\n identifier: String(i + 1),\r\n title: `Item ${i + 1}`,\r\n }));\r\n const el = await fixture<ManageBar>(html`\r\n <manage-bar\r\n .selectedItems=${items}\r\n .profileElement=${profileElement as PageElementName}\r\n removeAllowed\r\n ></manage-bar>\r\n `);\r\n el.modalManager = modalManager as ModalManagerInterface;\r\n await el.updateComplete;\r\n\r\n const showModalSpy = Sinon.spy(\r\n el.modalManager as ModalManagerInterface,\r\n 'showModal',\r\n );\r\n (\r\n el.shadowRoot?.querySelector('.ia-button.danger') as HTMLButtonElement\r\n ).click();\r\n\r\n return (await fixture(\r\n showModalSpy.args[0][0].customModalContent!,\r\n )) as RemoveItemsModalContent;\r\n }\r\n\r\n it('shows uploads-specific message for profileElement=uploads', async () => {\r\n const contentEl = await openModalContent('uploads');\r\n expect(contentEl.message).to.include('uploads list');\r\n });\r\n\r\n it('shows web archives message for profileElement=web_archives', async () => {\r\n const contentEl = await openModalContent('web_archives');\r\n expect(contentEl.message).to.include('web archives list');\r\n });\r\n\r\n it('shows favorites message for profileElement=favorites', async () => {\r\n const contentEl = await openModalContent('favorites');\r\n expect(contentEl.message).to.include('favorites list');\r\n });\r\n\r\n it('shows no message for unmapped profileElement (e.g. reviews)', async () => {\r\n const contentEl = await openModalContent('reviews');\r\n expect(contentEl.message).to.equal('');\r\n expect(contentEl.shadowRoot?.querySelector('.message')).not.to.exist;\r\n });\r\n\r\n it('uses \"this item\" for a single selected item', async () => {\r\n const contentEl = await openModalContent('uploads', 1);\r\n expect(contentEl.message).to.include('this item');\r\n });\r\n\r\n it('uses \"these items\" for multiple selected items', async () => {\r\n const contentEl = await openModalContent('uploads', 2);\r\n expect(contentEl.message).to.include('these items');\r\n });\r\n });\r\n\r\n it('showRemoveItemsProcessingModal shows processing modal', async () => {\r\n const modalManager = await fixture<ModalManager>(\r\n html`<modal-manager></modal-manager>`,\r\n );\r\n const el = await fixture<ManageBar>(html`\r\n <manage-bar .modalManager=${modalManager}></manage-bar>\r\n `);\r\n const showModalSpy = Sinon.spy(\r\n el.modalManager as ModalManagerInterface,\r\n 'showModal',\r\n );\r\n\r\n el.showRemoveItemsProcessingModal();\r\n\r\n expect(showModalSpy.callCount).to.equal(1);\r\n expect(showModalSpy.args[0][0].config.showProcessingIndicator).to.be.true;\r\n expect(showModalSpy.args[0][0].config.title?.values[0]).to.equal(\r\n msg('Removing selected items...'),\r\n );\r\n });\r\n\r\n it('showRemoveItemsErrorModal shows error modal', async () => {\r\n const modalManager = await fixture<ModalManager>(\r\n html`<modal-manager></modal-manager>`,\r\n );\r\n const el = await fixture<ManageBar>(html`\r\n <manage-bar .modalManager=${modalManager}></manage-bar>\r\n `);\r\n const showModalSpy = Sinon.spy(\r\n el.modalManager as ModalManagerInterface,\r\n 'showModal',\r\n );\r\n\r\n el.showRemoveItemsErrorModal();\r\n\r\n expect(showModalSpy.callCount).to.equal(1);\r\n expect(showModalSpy.args[0][0].config.showProcessingIndicator).to.be.false;\r\n expect(showModalSpy.args[0][0].config.title?.values[0]).to.equal(\r\n msg('Error: unable to remove items'),\r\n );\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"manage-bar.test.js","sourceRoot":"","sources":["../../../test/manage/manage-bar.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture } from '@open-wc/testing';\nimport { html } from 'lit';\nimport Sinon from 'sinon';\nimport '../../src/manage/manage-bar';\nimport '../../src/manage/remove-items-modal-content';\nimport {\n ModalManager,\n ModalManagerInterface,\n} from '@internetarchive/modal-manager';\nimport '@internetarchive/modal-manager';\nimport { msg } from '@lit/localize';\nimport type { ManageBar } from '../../src/manage/manage-bar';\nimport type { PageElementName } from '@internetarchive/search-service';\nimport type { RemoveItemsModalContent } from '../../src/manage/remove-items-modal-content';\n\ndescribe('Manage bar', () => {\n it('renders basic component', async () => {\n const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);\n\n expect(el.shadowRoot?.querySelector('.manage-label')).to.exist;\n expect(el.shadowRoot?.querySelector('.manage-buttons')).to.exist;\n expect(el.shadowRoot?.querySelector('.ia-button.dark')).to.exist;\n expect(el.shadowRoot?.querySelector('.ia-button.danger')).to.exist;\n });\n\n it('can set the label', async () => {\n const el = await fixture<ManageBar>(\n html`<manage-bar label=\"foo bar\"></manage-bar>`,\n );\n expect(el.shadowRoot?.querySelector('.manage-label')?.textContent).to.equal(\n 'foo bar',\n );\n });\n\n it('does not include Select All/Unselect All buttons by default', async () => {\n const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);\n expect(el.shadowRoot?.querySelector('.select-all-btn')).not.to.exist;\n expect(el.shadowRoot?.querySelector('.unselect-all-btn')).not.to.exist;\n });\n\n it('does not render item manager button except /search/ page', async () => {\n const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);\n expect(el.shadowRoot?.querySelector('.ia-button.warning')).not.to.exist;\n });\n\n it('render item manager button for /search/ page', async () => {\n const el = await fixture<ManageBar>(\n html`<manage-bar showItemManageButton></manage-bar>`,\n );\n expect(el.shadowRoot?.querySelector('.ia-button.warning')).to.exist;\n });\n\n it('includes Select All button when requested', async () => {\n const el = await fixture<ManageBar>(\n html`<manage-bar showSelectAll></manage-bar>`,\n );\n expect(el.shadowRoot?.querySelector('.select-all-btn')).to.exist;\n });\n\n it('includes Unselect All button when requested', async () => {\n const el = await fixture<ManageBar>(\n html`<manage-bar showUnselectAll></manage-bar>`,\n );\n expect(el.shadowRoot?.querySelector('.unselect-all-btn')).to.exist;\n });\n\n it('default and toggle state of remove button', async () => {\n const el = await fixture<ManageBar>(html`<manage-bar></manage-bar>`);\n\n expect(el.shadowRoot?.querySelector('.ia-button.danger:disabled')).to.exist;\n\n el.removeAllowed = true;\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('.ia-button.danger:disabled')).to.not\n .exist;\n });\n\n it('emits event when Cancel button clicked', async () => {\n const spy = Sinon.spy();\n const el = await fixture<ManageBar>(\n html`<manage-bar @cancel=${spy}></manage-bar>`,\n );\n\n const cancelBtn = el.shadowRoot?.querySelector(\n '.ia-button.dark',\n ) as HTMLButtonElement;\n expect(cancelBtn).to.exist;\n\n cancelBtn.click();\n expect(spy.callCount).to.equal(1);\n });\n\n it('emits event when Select All button clicked', async () => {\n const spy = Sinon.spy();\n const el = await fixture<ManageBar>(\n html`<manage-bar showSelectAll @selectAll=${spy}></manage-bar>`,\n );\n\n const selectAllBtn = el.shadowRoot?.querySelector(\n '.select-all-btn',\n ) as HTMLButtonElement;\n expect(selectAllBtn).to.exist;\n\n selectAllBtn.click();\n expect(spy.callCount).to.equal(1);\n });\n\n it('emits event when Unselect All button clicked', async () => {\n const spy = Sinon.spy();\n const el = await fixture<ManageBar>(\n html`<manage-bar showUnselectAll @unselectAll=${spy}></manage-bar>`,\n );\n\n const unselectAllBtn = el.shadowRoot?.querySelector(\n '.unselect-all-btn',\n ) as HTMLButtonElement;\n expect(unselectAllBtn).to.exist;\n\n unselectAllBtn.click();\n expect(spy.callCount).to.equal(1);\n });\n\n it('opens the remove items modal when showRemoveItemsModal is clicked', async () => {\n const modalManager = await fixture<ModalManager>(\n html`<modal-manager></modal-manager>`,\n );\n\n const el = await fixture<ManageBar>(html`\n <manage-bar\n .modalManager=${modalManager}\n .selectedItems=${[{ identifier: '1', title: 'Item 1' }]}\n removeAllowed\n ></manage-bar>\n `);\n await el.updateComplete;\n\n const removeButton = el.shadowRoot?.querySelector(\n '.ia-button.danger',\n ) as HTMLButtonElement;\n expect(removeButton).to.exist;\n\n const showModalSpy = Sinon.spy(\n el.modalManager as ModalManagerInterface,\n 'showModal',\n );\n\n await el.updateComplete;\n removeButton?.click();\n\n expect(showModalSpy.callCount).to.equal(1);\n expect(el.modalManager?.classList.contains('remove-items')).to.be;\n expect(showModalSpy.args[0][0].config.title?.values[0]).to.equal(\n msg('Are you sure you want to remove these items?'),\n );\n expect(showModalSpy.args[0][0].customModalContent).to.exist;\n });\n\n it('shows selected items count in remove button', async () => {\n const el = await fixture<ManageBar>(html`\n <manage-bar\n .selectedItems=${[\n { identifier: '1', title: 'Item 1' },\n { identifier: '2', title: 'Item 2' },\n { identifier: '3', title: 'Item 3' },\n ]}\n ></manage-bar>\n `);\n const removeBtn = el.shadowRoot?.querySelector('.ia-button.danger');\n expect(removeBtn?.textContent?.trim()).to.include('(3)');\n });\n\n it('Item Manager button is disabled when removeAllowed is false', async () => {\n const el = await fixture<ManageBar>(\n html`<manage-bar showItemManageButton></manage-bar>`,\n );\n expect(el.shadowRoot?.querySelector('.ia-button.warning:disabled')).to\n .exist;\n\n el.removeAllowed = true;\n await el.updateComplete;\n\n expect(el.shadowRoot?.querySelector('.ia-button.warning:disabled')).not.to\n .exist;\n });\n\n it('emits manageItems event when Item Manager button clicked', async () => {\n const spy = Sinon.spy();\n const el = await fixture<ManageBar>(html`\n <manage-bar\n showItemManageButton\n removeAllowed\n @manageItems=${spy}\n ></manage-bar>\n `);\n const manageBtn = el.shadowRoot?.querySelector(\n '.ia-button.warning',\n ) as HTMLButtonElement;\n expect(manageBtn).to.exist;\n manageBtn.click();\n expect(spy.callCount).to.equal(1);\n });\n\n it('emits removeItems event when modal confirm is clicked', async () => {\n const modalManager = await fixture<ModalManager>(\n html`<modal-manager></modal-manager>`,\n );\n const removeItemsSpy = Sinon.spy();\n const el = await fixture<ManageBar>(html`\n <manage-bar\n .modalManager=${modalManager}\n .selectedItems=${[{ identifier: '1', title: 'Item 1' }]}\n removeAllowed\n @removeItems=${removeItemsSpy}\n ></manage-bar>\n `);\n await el.updateComplete;\n\n const showModalSpy = Sinon.spy(\n el.modalManager as ModalManagerInterface,\n 'showModal',\n );\n (\n el.shadowRoot?.querySelector('.ia-button.danger') as HTMLButtonElement\n ).click();\n\n const contentEl = (await fixture(\n showModalSpy.args[0][0].customModalContent!,\n )) as RemoveItemsModalContent;\n (\n contentEl.shadowRoot?.querySelector(\n '.remove-items-btn',\n ) as HTMLButtonElement\n ).click();\n\n expect(removeItemsSpy.callCount).to.equal(1);\n });\n\n describe('profileElement modal messages', () => {\n async function openModalContent(\n profileElement: string,\n itemCount = 1,\n ): Promise<RemoveItemsModalContent> {\n const modalManager = await fixture<ModalManager>(\n html`<modal-manager></modal-manager>`,\n );\n const items = Array.from({ length: itemCount }, (_, i) => ({\n identifier: String(i + 1),\n title: `Item ${i + 1}`,\n }));\n const el = await fixture<ManageBar>(html`\n <manage-bar\n .selectedItems=${items}\n .profileElement=${profileElement as PageElementName}\n removeAllowed\n ></manage-bar>\n `);\n el.modalManager = modalManager as ModalManagerInterface;\n await el.updateComplete;\n\n const showModalSpy = Sinon.spy(\n el.modalManager as ModalManagerInterface,\n 'showModal',\n );\n (\n el.shadowRoot?.querySelector('.ia-button.danger') as HTMLButtonElement\n ).click();\n\n return (await fixture(\n showModalSpy.args[0][0].customModalContent!,\n )) as RemoveItemsModalContent;\n }\n\n it('shows uploads-specific message for profileElement=uploads', async () => {\n const contentEl = await openModalContent('uploads');\n expect(contentEl.message).to.include('uploads list');\n });\n\n it('shows web archives message for profileElement=web_archives', async () => {\n const contentEl = await openModalContent('web_archives');\n expect(contentEl.message).to.include('web archives list');\n });\n\n it('shows favorites message for profileElement=favorites', async () => {\n const contentEl = await openModalContent('favorites');\n expect(contentEl.message).to.include('favorites list');\n });\n\n it('shows no message for unmapped profileElement (e.g. reviews)', async () => {\n const contentEl = await openModalContent('reviews');\n expect(contentEl.message).to.equal('');\n expect(contentEl.shadowRoot?.querySelector('.message')).not.to.exist;\n });\n\n it('uses \"this item\" for a single selected item', async () => {\n const contentEl = await openModalContent('uploads', 1);\n expect(contentEl.message).to.include('this item');\n });\n\n it('uses \"these items\" for multiple selected items', async () => {\n const contentEl = await openModalContent('uploads', 2);\n expect(contentEl.message).to.include('these items');\n });\n });\n\n it('showRemoveItemsProcessingModal shows processing modal', async () => {\n const modalManager = await fixture<ModalManager>(\n html`<modal-manager></modal-manager>`,\n );\n const el = await fixture<ManageBar>(html`\n <manage-bar .modalManager=${modalManager}></manage-bar>\n `);\n const showModalSpy = Sinon.spy(\n el.modalManager as ModalManagerInterface,\n 'showModal',\n );\n\n el.showRemoveItemsProcessingModal();\n\n expect(showModalSpy.callCount).to.equal(1);\n expect(showModalSpy.args[0][0].config.showProcessingIndicator).to.be.true;\n expect(showModalSpy.args[0][0].config.title?.values[0]).to.equal(\n msg('Removing selected items...'),\n );\n });\n\n it('showRemoveItemsErrorModal shows error modal', async () => {\n const modalManager = await fixture<ModalManager>(\n html`<modal-manager></modal-manager>`,\n );\n const el = await fixture<ManageBar>(html`\n <manage-bar .modalManager=${modalManager}></manage-bar>\n `);\n const showModalSpy = Sinon.spy(\n el.modalManager as ModalManagerInterface,\n 'showModal',\n );\n\n el.showRemoveItemsErrorModal();\n\n expect(showModalSpy.callCount).to.equal(1);\n expect(showModalSpy.args[0][0].config.showProcessingIndicator).to.be.false;\n expect(showModalSpy.args[0][0].config.title?.values[0]).to.equal(\n msg('Error: unable to remove items'),\n );\n });\n});\n"]}
@@ -319,76 +319,6 @@ describe('Restoration state handler', () => {
319
319
  }, { persistMetadataSearchType: true });
320
320
  expect(window.location.search).to.equal('?sin=MD');
321
321
  });
322
- it('should write relevance sort to URL when explicitly selected', async () => {
323
- const url = new URL(window.location.href);
324
- url.search = '';
325
- window.history.replaceState({ path: url.href }, '', url.href);
326
- const handler = new RestorationStateHandler({ context: 'search' });
327
- handler.persistState({
328
- selectedSort: SortField.relevance,
329
- selectedFacets: getDefaultSelectedFacets(),
330
- });
331
- expect(window.location.search).to.equal('?sort=relevance');
332
- });
333
- it('should write relevance sort to URL for TV search', async () => {
334
- const url = new URL(window.location.href);
335
- url.search = '';
336
- window.history.replaceState({ path: url.href }, '', url.href);
337
- const handler = new RestorationStateHandler({ context: 'search' });
338
- handler.persistState({
339
- searchType: SearchType.TV,
340
- selectedSort: SortField.relevance,
341
- selectedFacets: getDefaultSelectedFacets(),
342
- });
343
- expect(window.location.search).to.include('sort=relevance');
344
- });
345
- it('should not write sort param for SortField.default', async () => {
346
- const url = new URL(window.location.href);
347
- url.search = '';
348
- window.history.replaceState({ path: url.href }, '', url.href);
349
- const handler = new RestorationStateHandler({ context: 'search' });
350
- handler.persistState({
351
- selectedSort: SortField.default,
352
- selectedFacets: getDefaultSelectedFacets(),
353
- });
354
- expect(window.location.search).to.not.include('sort');
355
- });
356
- it('should write datefavorited sort to URL when explicitly selected', async () => {
357
- const url = new URL(window.location.href);
358
- url.search = '';
359
- window.history.replaceState({ path: url.href }, '', url.href);
360
- const handler = new RestorationStateHandler({ context: 'search' });
361
- handler.persistState({
362
- selectedSort: SortField.datefavorited,
363
- sortDirection: 'desc',
364
- selectedFacets: getDefaultSelectedFacets(),
365
- });
366
- expect(window.location.search).to.equal('?sort=-favoritedate');
367
- });
368
- it('should round-trip relevance sort via URL', async () => {
369
- // 1. Set the URL to include the new canonical relevance sort param
370
- const url = new URL(window.location.href);
371
- url.search = '?sort=relevance';
372
- window.history.replaceState({ path: url.href }, '', url.href);
373
- const handler = new RestorationStateHandler({ context: 'search' });
374
- // 2. Load state from the URL and verify it resolves to relevance sort
375
- const restorationState = handler.getRestorationState();
376
- expect(restorationState.selectedSort).to.equal(SortField.relevance);
377
- // 3. Persist the state back and verify the sort param is preserved
378
- handler.persistState(restorationState);
379
- expect(window.location.search).to.include('sort=relevance');
380
- });
381
- it('should still resolve legacy _score URL param to relevance sort', async () => {
382
- const url = new URL(window.location.href);
383
- url.search = '?sort=_score';
384
- window.history.replaceState({ path: url.href }, '', url.href);
385
- const handler = new RestorationStateHandler({ context: 'search' });
386
- const restorationState = handler.getRestorationState();
387
- expect(restorationState.selectedSort).to.equal(SortField.relevance);
388
- // Re-persisting upgrades the URL to the canonical form
389
- handler.persistState(restorationState);
390
- expect(window.location.search).to.include('sort=relevance');
391
- });
392
322
  it('round trip load/persist should erase numbers in square brackets', async () => {
393
323
  const handler = new RestorationStateHandler({ context: 'search' });
394
324
  const url = new URL(window.location.href);
@@ -1 +1 @@
1
- {"version":3,"file":"restoration-state-handler.test.js","sourceRoot":"","sources":["../../test/restoration-state-handler.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { SearchType } from '@internetarchive/search-service';\r\nimport { expect } from '@open-wc/testing';\r\nimport { SortField, getDefaultSelectedFacets } from '../src/models';\r\nimport { RestorationStateHandler } from '../src/restoration-state-handler';\r\n\r\ndescribe('Restoration state handler', () => {\r\n it('should restore query from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?query=boop';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.baseQuery).to.equal('boop');\r\n });\r\n\r\n it('should restore default search type from URL without valid sin', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=foo';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.DEFAULT);\r\n });\r\n\r\n it('should restore default search type if sin explicitly empty in URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.DEFAULT);\r\n });\r\n\r\n it('should restore full text search type from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=TXT';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);\r\n });\r\n\r\n it('should restore radio search type from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=RADIO';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.RADIO);\r\n });\r\n\r\n it('should restore TV search type from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=TV';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.TV);\r\n });\r\n\r\n it('should restore metadata search type from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=MD';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.searchType).to.equal(SearchType.METADATA);\r\n });\r\n\r\n it('should restore page number from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?page=42';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.currentPage).to.equal(42);\r\n });\r\n\r\n it('should restore selected year facets from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=year:\"2018\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(\r\n 'selected',\r\n );\r\n });\r\n\r\n it('should ignore unrecognized facet types in URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=foo:\"bar\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets).to.deep.equal(\r\n getDefaultSelectedFacets(),\r\n );\r\n });\r\n\r\n it('should restore selected date range facets from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=year:\"2018+TO+2021\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.minSelectedDate).to.equal('2018');\r\n expect(restorationState.maxSelectedDate).to.equal('2021');\r\n });\r\n\r\n it('should restore creator filter from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=firstCreator:F';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedCreatorFilter).to.equal('F');\r\n });\r\n\r\n it('should restore title filter from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=firstTitle:F';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedTitleFilter).to.equal('F');\r\n });\r\n\r\n it('should restore other selected facets from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=subject:\"foo\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.subject?.foo.state).to.equal(\r\n 'selected',\r\n );\r\n });\r\n\r\n it('should restore negative facets from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?not[]=year:2018';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(\r\n 'hidden',\r\n );\r\n });\r\n\r\n it('should restore multiple selected/negative facets from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search =\r\n '?and[]=collection:\"foo\"&and[]=collection:\"bar\"&not[]=collection:\"baz\"&not[]=collection:\"boop\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n\r\n expect(restorationState.selectedFacets.collection?.foo.state).to.equal(\r\n 'selected',\r\n );\r\n expect(restorationState.selectedFacets.collection?.bar.state).to.equal(\r\n 'selected',\r\n );\r\n\r\n expect(restorationState.selectedFacets.collection?.baz.state).to.equal(\r\n 'hidden',\r\n );\r\n expect(restorationState.selectedFacets.collection?.boop.state).to.equal(\r\n 'hidden',\r\n );\r\n });\r\n\r\n it('negative facets take precedence if both present in URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[]=collection:\"foo\"&not[]=collection:\"foo\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.collection?.foo.state).to.equal(\r\n 'hidden',\r\n );\r\n });\r\n\r\n it('should restore selected facets with numbers in the square brackets', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[12]=subject:\"foo\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.subject?.foo.state).to.equal(\r\n 'selected',\r\n );\r\n });\r\n\r\n it('should restore negative facets with numbers in the square brackets', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?not[12]=year:2018';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(\r\n 'hidden',\r\n );\r\n });\r\n\r\n it('should restore any TV clip filters from URL', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n const url = new URL(window.location.href);\r\n\r\n // Commercials\r\n url.search = '?only_commercials=1';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n const commercialsRestorationState = handler.getRestorationState();\r\n expect(\r\n commercialsRestorationState.selectedFacets.clip_type?.commercial.state,\r\n ).to.equal('selected');\r\n\r\n // Fact checks\r\n url.search = '?only_factchecks=1';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n const factchecksRestorationState = handler.getRestorationState();\r\n expect(\r\n factchecksRestorationState.selectedFacets.clip_type?.['fact check'].state,\r\n ).to.equal('selected');\r\n\r\n // Quotes\r\n url.search = '?only_quotes=1';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n const quotesRestorationState = handler.getRestorationState();\r\n expect(\r\n quotesRestorationState.selectedFacets.clip_type?.quote.state,\r\n ).to.equal('selected');\r\n\r\n // No filter param\r\n url.search = '';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n const unfilteredRestorationState = handler.getRestorationState();\r\n expect(unfilteredRestorationState.selectedFacets.clip_type).to.deep.equal(\r\n {},\r\n );\r\n });\r\n\r\n it('should restore sort from URL (space format)', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=date+desc';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal('date');\r\n expect(restorationState.sortDirection).to.equal('desc');\r\n });\r\n\r\n it('should restore sort from URL (prefix format, desc)', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=-date';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal('date');\r\n expect(restorationState.sortDirection).to.equal('desc');\r\n });\r\n\r\n it('should restore sort from URL (prefix format, asc)', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=date';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal('date');\r\n expect(restorationState.sortDirection).to.equal('asc');\r\n });\r\n\r\n it('should restore sort from URL (space format)', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=foo+desc';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal('unrecognized');\r\n expect(restorationState.sortDirection).to.equal('desc');\r\n });\r\n\r\n it('should restore unrecognized sort from URL (prefix format)', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=-foo';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal('unrecognized');\r\n expect(restorationState.sortDirection).to.equal('desc');\r\n });\r\n\r\n it('should save direction to URL even for unrecognized sort fields', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=foo';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n selectedSort: SortField.unrecognized,\r\n sortDirection: 'desc',\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.equal('?sort=-foo');\r\n });\r\n\r\n it('should keep existing direction for unrecognized sort fields when unspecified in state', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=foo+desc';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n selectedSort: SortField.unrecognized,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.equal('?sort=-foo');\r\n });\r\n\r\n it('should just ignore unrecognized sort fields w/ unknown formats', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=+foo';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n selectedSort: SortField.unrecognized,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.equal('?sort=+foo');\r\n });\r\n\r\n it('should not save current page state to the URL for page 1', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n currentPage: 1,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.be.empty;\r\n });\r\n\r\n it('should save current page state to the URL when page > 1', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n currentPage: 2,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.equal('?page=2');\r\n });\r\n\r\n it('should upgrade legacy search params to new ones', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?q=foo';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.baseQuery).to.equal('foo');\r\n\r\n handler.persistState(restorationState);\r\n expect(window.location.search).to.equal('?query=foo');\r\n });\r\n\r\n it('should remove empty sin param', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n handler.persistState({ selectedFacets: getDefaultSelectedFacets() });\r\n expect(window.location.search).to.equal('');\r\n });\r\n\r\n it('should persist metadata search type only when option is true', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sin=';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n handler.persistState(\r\n {\r\n selectedFacets: getDefaultSelectedFacets(),\r\n searchType: SearchType.METADATA,\r\n },\r\n { persistMetadataSearchType: false },\r\n );\r\n expect(window.location.search).to.equal('');\r\n\r\n handler.persistState(\r\n {\r\n selectedFacets: getDefaultSelectedFacets(),\r\n searchType: SearchType.METADATA,\r\n },\r\n { persistMetadataSearchType: true },\r\n );\r\n expect(window.location.search).to.equal('?sin=MD');\r\n });\r\n\r\n it('should write relevance sort to URL when explicitly selected', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n selectedSort: SortField.relevance,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.equal('?sort=relevance');\r\n });\r\n\r\n it('should write relevance sort to URL for TV search', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n searchType: SearchType.TV,\r\n selectedSort: SortField.relevance,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.include('sort=relevance');\r\n });\r\n\r\n it('should not write sort param for SortField.default', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n selectedSort: SortField.default,\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.not.include('sort');\r\n });\r\n\r\n it('should write datefavorited sort to URL when explicitly selected', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n handler.persistState({\r\n selectedSort: SortField.datefavorited,\r\n sortDirection: 'desc',\r\n selectedFacets: getDefaultSelectedFacets(),\r\n });\r\n\r\n expect(window.location.search).to.equal('?sort=-favoritedate');\r\n });\r\n\r\n it('should round-trip relevance sort via URL', async () => {\r\n // 1. Set the URL to include the new canonical relevance sort param\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=relevance';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n // 2. Load state from the URL and verify it resolves to relevance sort\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal(SortField.relevance);\r\n\r\n // 3. Persist the state back and verify the sort param is preserved\r\n handler.persistState(restorationState);\r\n expect(window.location.search).to.include('sort=relevance');\r\n });\r\n\r\n it('should still resolve legacy _score URL param to relevance sort', async () => {\r\n const url = new URL(window.location.href);\r\n url.search = '?sort=_score';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n const restorationState = handler.getRestorationState();\r\n expect(restorationState.selectedSort).to.equal(SortField.relevance);\r\n\r\n // Re-persisting upgrades the URL to the canonical form\r\n handler.persistState(restorationState);\r\n expect(window.location.search).to.include('sort=relevance');\r\n });\r\n\r\n it('round trip load/persist should erase numbers in square brackets', async () => {\r\n const handler = new RestorationStateHandler({ context: 'search' });\r\n\r\n const url = new URL(window.location.href);\r\n url.search = '?and[0]=subject:\"foo\"';\r\n window.history.replaceState({ path: url.href }, '', url.href);\r\n\r\n // Load state from the URL and immediately persist it back to the URL\r\n const restorationState = handler.getRestorationState();\r\n handler.persistState(restorationState);\r\n\r\n // Ensure the new URL includes the \"normalized\" facet parameter and not the numbered one\r\n expect(decodeURIComponent(window.location.search)).to.include(\r\n 'and[]=subject:\"foo\"',\r\n );\r\n expect(new URL(window.location.href).searchParams.get('and[0]')).to.be.null;\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"restoration-state-handler.test.js","sourceRoot":"","sources":["../../test/restoration-state-handler.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { SearchType } from '@internetarchive/search-service';\nimport { expect } from '@open-wc/testing';\nimport { SortField, getDefaultSelectedFacets } from '../src/models';\nimport { RestorationStateHandler } from '../src/restoration-state-handler';\n\ndescribe('Restoration state handler', () => {\n it('should restore query from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?query=boop';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.baseQuery).to.equal('boop');\n });\n\n it('should restore default search type from URL without valid sin', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.DEFAULT);\n });\n\n it('should restore default search type if sin explicitly empty in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.DEFAULT);\n });\n\n it('should restore full text search type from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=TXT';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);\n });\n\n it('should restore radio search type from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=RADIO';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.RADIO);\n });\n\n it('should restore TV search type from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=TV';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.TV);\n });\n\n it('should restore metadata search type from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sin=MD';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.searchType).to.equal(SearchType.METADATA);\n });\n\n it('should restore page number from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?page=42';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.currentPage).to.equal(42);\n });\n\n it('should restore selected year facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=year:\"2018\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(\n 'selected',\n );\n });\n\n it('should ignore unrecognized facet types in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=foo:\"bar\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets).to.deep.equal(\n getDefaultSelectedFacets(),\n );\n });\n\n it('should restore selected date range facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=year:\"2018+TO+2021\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.minSelectedDate).to.equal('2018');\n expect(restorationState.maxSelectedDate).to.equal('2021');\n });\n\n it('should restore creator filter from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=firstCreator:F';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedCreatorFilter).to.equal('F');\n });\n\n it('should restore title filter from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=firstTitle:F';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedTitleFilter).to.equal('F');\n });\n\n it('should restore other selected facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=subject:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.subject?.foo.state).to.equal(\n 'selected',\n );\n });\n\n it('should restore negative facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?not[]=year:2018';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(\n 'hidden',\n );\n });\n\n it('should restore multiple selected/negative facets from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search =\n '?and[]=collection:\"foo\"&and[]=collection:\"bar\"&not[]=collection:\"baz\"&not[]=collection:\"boop\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n\n expect(restorationState.selectedFacets.collection?.foo.state).to.equal(\n 'selected',\n );\n expect(restorationState.selectedFacets.collection?.bar.state).to.equal(\n 'selected',\n );\n\n expect(restorationState.selectedFacets.collection?.baz.state).to.equal(\n 'hidden',\n );\n expect(restorationState.selectedFacets.collection?.boop.state).to.equal(\n 'hidden',\n );\n });\n\n it('negative facets take precedence if both present in URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[]=collection:\"foo\"&not[]=collection:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.collection?.foo.state).to.equal(\n 'hidden',\n );\n });\n\n it('should restore selected facets with numbers in the square brackets', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[12]=subject:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.subject?.foo.state).to.equal(\n 'selected',\n );\n });\n\n it('should restore negative facets with numbers in the square brackets', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?not[12]=year:2018';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedFacets.year?.['2018'].state).to.equal(\n 'hidden',\n );\n });\n\n it('should restore any TV clip filters from URL', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n const url = new URL(window.location.href);\n\n // Commercials\n url.search = '?only_commercials=1';\n window.history.replaceState({ path: url.href }, '', url.href);\n const commercialsRestorationState = handler.getRestorationState();\n expect(\n commercialsRestorationState.selectedFacets.clip_type?.commercial.state,\n ).to.equal('selected');\n\n // Fact checks\n url.search = '?only_factchecks=1';\n window.history.replaceState({ path: url.href }, '', url.href);\n const factchecksRestorationState = handler.getRestorationState();\n expect(\n factchecksRestorationState.selectedFacets.clip_type?.['fact check'].state,\n ).to.equal('selected');\n\n // Quotes\n url.search = '?only_quotes=1';\n window.history.replaceState({ path: url.href }, '', url.href);\n const quotesRestorationState = handler.getRestorationState();\n expect(\n quotesRestorationState.selectedFacets.clip_type?.quote.state,\n ).to.equal('selected');\n\n // No filter param\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n const unfilteredRestorationState = handler.getRestorationState();\n expect(unfilteredRestorationState.selectedFacets.clip_type).to.deep.equal(\n {},\n );\n });\n\n it('should restore sort from URL (space format)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=date+desc';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore sort from URL (prefix format, desc)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=-date';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore sort from URL (prefix format, asc)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=date';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('date');\n expect(restorationState.sortDirection).to.equal('asc');\n });\n\n it('should restore sort from URL (space format)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=foo+desc';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('unrecognized');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should restore unrecognized sort from URL (prefix format)', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?sort=-foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const restorationState = handler.getRestorationState();\n expect(restorationState.selectedSort).to.equal('unrecognized');\n expect(restorationState.sortDirection).to.equal('desc');\n });\n\n it('should save direction to URL even for unrecognized sort fields', async () => {\n const url = new URL(window.location.href);\n url.search = '?sort=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n selectedSort: SortField.unrecognized,\n sortDirection: 'desc',\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?sort=-foo');\n });\n\n it('should keep existing direction for unrecognized sort fields when unspecified in state', async () => {\n const url = new URL(window.location.href);\n url.search = '?sort=foo+desc';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n selectedSort: SortField.unrecognized,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?sort=-foo');\n });\n\n it('should just ignore unrecognized sort fields w/ unknown formats', async () => {\n const url = new URL(window.location.href);\n url.search = '?sort=+foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n selectedSort: SortField.unrecognized,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?sort=+foo');\n });\n\n it('should not save current page state to the URL for page 1', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n currentPage: 1,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.be.empty;\n });\n\n it('should save current page state to the URL when page > 1', async () => {\n const url = new URL(window.location.href);\n url.search = '';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n handler.persistState({\n currentPage: 2,\n selectedFacets: getDefaultSelectedFacets(),\n });\n\n expect(window.location.search).to.equal('?page=2');\n });\n\n it('should upgrade legacy search params to new ones', async () => {\n const url = new URL(window.location.href);\n url.search = '?q=foo';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n const restorationState = handler.getRestorationState();\n expect(restorationState.baseQuery).to.equal('foo');\n\n handler.persistState(restorationState);\n expect(window.location.search).to.equal('?query=foo');\n });\n\n it('should remove empty sin param', async () => {\n const url = new URL(window.location.href);\n url.search = '?sin=';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n\n handler.persistState({ selectedFacets: getDefaultSelectedFacets() });\n expect(window.location.search).to.equal('');\n });\n\n it('should persist metadata search type only when option is true', async () => {\n const url = new URL(window.location.href);\n url.search = '?sin=';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n const handler = new RestorationStateHandler({ context: 'search' });\n\n handler.persistState(\n {\n selectedFacets: getDefaultSelectedFacets(),\n searchType: SearchType.METADATA,\n },\n { persistMetadataSearchType: false },\n );\n expect(window.location.search).to.equal('');\n\n handler.persistState(\n {\n selectedFacets: getDefaultSelectedFacets(),\n searchType: SearchType.METADATA,\n },\n { persistMetadataSearchType: true },\n );\n expect(window.location.search).to.equal('?sin=MD');\n });\n\n it('round trip load/persist should erase numbers in square brackets', async () => {\n const handler = new RestorationStateHandler({ context: 'search' });\n\n const url = new URL(window.location.href);\n url.search = '?and[0]=subject:\"foo\"';\n window.history.replaceState({ path: url.href }, '', url.href);\n\n // Load state from the URL and immediately persist it back to the URL\n const restorationState = handler.getRestorationState();\n handler.persistState(restorationState);\n\n // Ensure the new URL includes the \"normalized\" facet parameter and not the numbered one\n expect(decodeURIComponent(window.location.search)).to.include(\n 'and[]=subject:\"foo\"',\n );\n expect(new URL(window.location.href).searchParams.get('and[0]')).to.be.null;\n });\n});\n"]}