@internetarchive/collection-browser 1.0.0 → 1.1.1-alpha.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 (124) hide show
  1. package/dist/src/app-root.js +11 -0
  2. package/dist/src/app-root.js.map +1 -1
  3. package/dist/src/assets/img/icons/expand.d.ts +2 -0
  4. package/dist/src/assets/img/icons/expand.js +9 -0
  5. package/dist/src/assets/img/icons/expand.js.map +1 -0
  6. package/dist/src/collection-browser.d.ts +35 -4
  7. package/dist/src/collection-browser.js +118 -44
  8. package/dist/src/collection-browser.js.map +1 -1
  9. package/dist/src/collection-facets/facets-template.d.ts +1 -1
  10. package/dist/src/collection-facets/facets-template.js +3 -3
  11. package/dist/src/collection-facets/facets-template.js.map +1 -1
  12. package/dist/src/collection-facets/more-facets-content.d.ts +1 -1
  13. package/dist/src/collection-facets/more-facets-content.js +3 -3
  14. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  15. package/dist/src/collection-facets/more-facets-pagination.js +3 -3
  16. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -1
  17. package/dist/src/collection-facets/toggle-switch.js +1 -1
  18. package/dist/src/collection-facets/toggle-switch.js.map +1 -1
  19. package/dist/src/collection-facets.d.ts +19 -2
  20. package/dist/src/collection-facets.js +118 -15
  21. package/dist/src/collection-facets.js.map +1 -1
  22. package/dist/src/empty-placeholder.js +2 -2
  23. package/dist/src/empty-placeholder.js.map +1 -1
  24. package/dist/src/expanded-date-picker.d.ts +41 -0
  25. package/dist/src/expanded-date-picker.js +146 -0
  26. package/dist/src/expanded-date-picker.js.map +1 -0
  27. package/dist/src/language-code-handler/language-code-handler.js +1 -1
  28. package/dist/src/language-code-handler/language-code-handler.js.map +1 -1
  29. package/dist/src/mediatype/mediatype-config.js +13 -13
  30. package/dist/src/mediatype/mediatype-config.js.map +1 -1
  31. package/dist/src/restoration-state-handler.d.ts +1 -1
  32. package/dist/src/restoration-state-handler.js +18 -2
  33. package/dist/src/restoration-state-handler.js.map +1 -1
  34. package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -1
  35. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  36. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +1 -1
  37. package/dist/src/sort-filter-bar/sort-filter-bar.js +8 -8
  38. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  39. package/dist/src/tiles/grid/account-tile.d.ts +1 -1
  40. package/dist/src/tiles/grid/account-tile.js +1 -1
  41. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  42. package/dist/src/tiles/grid/collection-tile.d.ts +1 -1
  43. package/dist/src/tiles/grid/collection-tile.js +3 -3
  44. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  45. package/dist/src/tiles/grid/item-tile.d.ts +1 -1
  46. package/dist/src/tiles/grid/item-tile.js +3 -3
  47. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  48. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +1 -1
  49. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js.map +1 -1
  50. package/dist/src/tiles/grid/tile-stats.js +6 -6
  51. package/dist/src/tiles/grid/tile-stats.js.map +1 -1
  52. package/dist/src/tiles/hover/hover-pane-controller.d.ts +1 -1
  53. package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -1
  54. package/dist/src/tiles/hover/tile-hover-pane.d.ts +1 -1
  55. package/dist/src/tiles/hover/tile-hover-pane.js.map +1 -1
  56. package/dist/src/tiles/image-block.d.ts +1 -1
  57. package/dist/src/tiles/image-block.js.map +1 -1
  58. package/dist/src/tiles/item-image.d.ts +1 -1
  59. package/dist/src/tiles/item-image.js +1 -1
  60. package/dist/src/tiles/item-image.js.map +1 -1
  61. package/dist/src/tiles/list/tile-list-compact-header.d.ts +1 -1
  62. package/dist/src/tiles/list/tile-list-compact-header.js +1 -1
  63. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -1
  64. package/dist/src/tiles/list/tile-list-compact.d.ts +1 -1
  65. package/dist/src/tiles/list/tile-list-compact.js +4 -4
  66. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  67. package/dist/src/tiles/list/tile-list.d.ts +1 -1
  68. package/dist/src/tiles/list/tile-list.js +6 -6
  69. package/dist/src/tiles/list/tile-list.js.map +1 -1
  70. package/dist/src/tiles/mediatype-icon.js +1 -1
  71. package/dist/src/tiles/mediatype-icon.js.map +1 -1
  72. package/dist/src/tiles/overlay/icon-overlay.js +2 -2
  73. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -1
  74. package/dist/src/tiles/overlay/icon-text-overlay.js +2 -2
  75. package/dist/src/tiles/overlay/icon-text-overlay.js.map +1 -1
  76. package/dist/src/tiles/overlay/text-overlay.js +2 -2
  77. package/dist/src/tiles/overlay/text-overlay.js.map +1 -1
  78. package/dist/src/tiles/tile-dispatcher.d.ts +4 -3
  79. package/dist/src/tiles/tile-dispatcher.js +7 -1
  80. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  81. package/dist/test/collection-facets.test.js +54 -0
  82. package/dist/test/collection-facets.test.js.map +1 -1
  83. package/dist/test/expanded-date-picker.test.d.ts +1 -0
  84. package/dist/test/expanded-date-picker.test.js +93 -0
  85. package/dist/test/expanded-date-picker.test.js.map +1 -0
  86. package/dist/test/restoration-state-handler.test.js +28 -0
  87. package/dist/test/restoration-state-handler.test.js.map +1 -1
  88. package/index.html +3 -2
  89. package/package.json +14 -13
  90. package/src/app-root.ts +12 -1
  91. package/src/assets/img/icons/expand.ts +9 -0
  92. package/src/collection-browser.ts +119 -44
  93. package/src/collection-facets/facets-template.ts +3 -3
  94. package/src/collection-facets/more-facets-content.ts +3 -3
  95. package/src/collection-facets/more-facets-pagination.ts +3 -3
  96. package/src/collection-facets/toggle-switch.ts +1 -1
  97. package/src/collection-facets.ts +113 -10
  98. package/src/empty-placeholder.ts +2 -2
  99. package/src/expanded-date-picker.ts +144 -0
  100. package/src/language-code-handler/language-code-handler.ts +1 -1
  101. package/src/mediatype/mediatype-config.ts +13 -13
  102. package/src/restoration-state-handler.ts +19 -2
  103. package/src/sort-filter-bar/alpha-bar.ts +2 -2
  104. package/src/sort-filter-bar/sort-filter-bar.ts +8 -8
  105. package/src/tiles/grid/account-tile.ts +2 -2
  106. package/src/tiles/grid/collection-tile.ts +4 -4
  107. package/src/tiles/grid/item-tile.ts +4 -4
  108. package/src/tiles/grid/styles/tile-grid-shared-styles.ts +1 -1
  109. package/src/tiles/grid/tile-stats.ts +6 -6
  110. package/src/tiles/hover/hover-pane-controller.ts +1 -1
  111. package/src/tiles/hover/tile-hover-pane.ts +1 -1
  112. package/src/tiles/image-block.ts +1 -1
  113. package/src/tiles/item-image.ts +2 -2
  114. package/src/tiles/list/tile-list-compact-header.ts +2 -2
  115. package/src/tiles/list/tile-list-compact.ts +5 -5
  116. package/src/tiles/list/tile-list.ts +6 -6
  117. package/src/tiles/mediatype-icon.ts +1 -1
  118. package/src/tiles/overlay/icon-overlay.ts +2 -2
  119. package/src/tiles/overlay/icon-text-overlay.ts +2 -2
  120. package/src/tiles/overlay/text-overlay.ts +2 -2
  121. package/src/tiles/tile-dispatcher.ts +6 -3
  122. package/test/collection-facets.test.ts +74 -0
  123. package/test/expanded-date-picker.test.ts +137 -0
  124. package/test/restoration-state-handler.test.ts +44 -0
@@ -0,0 +1,137 @@
1
+ /* eslint-disable import/no-duplicates */
2
+ import type { HistogramDateRange } from '@internetarchive/histogram-date-range';
3
+ import {
4
+ ModalManager,
5
+ ModalManagerInterface,
6
+ ModalManagerMode,
7
+ } from '@internetarchive/modal-manager';
8
+ import { expect, fixture } from '@open-wc/testing';
9
+ import { html } from 'lit';
10
+ import sinon from 'sinon';
11
+ import '../src/expanded-date-picker';
12
+
13
+ import type { ExpandedDatePicker } from '../src/expanded-date-picker';
14
+
15
+ describe('Expanded Date Picker', () => {
16
+ it('should render with a date picker and Apply button', async () => {
17
+ const el = await fixture<ExpandedDatePicker>(
18
+ html`<expanded-date-picker></expanded-date-picker>`
19
+ );
20
+
21
+ expect(el.shadowRoot?.querySelector('#date-picker')).to.exist;
22
+ expect(el.shadowRoot?.querySelector('#apply-btn')).to.exist;
23
+ });
24
+
25
+ it('should update its min/max selected date when date picker changes', async () => {
26
+ const el = await fixture<ExpandedDatePicker>(
27
+ html`<expanded-date-picker
28
+ .buckets=${[1, 2, 3, 4, 5]}
29
+ .minDate=${'1'}
30
+ .maxDate=${'5'}
31
+ .minSelectedDate=${'1'}
32
+ .maxSelectedDate=${'5'}
33
+ ></expanded-date-picker>`
34
+ );
35
+
36
+ const datePicker = el.shadowRoot?.querySelector(
37
+ '#date-picker'
38
+ ) as HistogramDateRange;
39
+ expect(datePicker).to.exist;
40
+
41
+ datePicker.minSelectedDate = '2';
42
+ datePicker.maxSelectedDate = '4';
43
+ datePicker.dispatchEvent(
44
+ new CustomEvent('histogramDateRangeUpdated', {
45
+ detail: {
46
+ minDate: datePicker.minSelectedDate,
47
+ maxDate: datePicker.maxSelectedDate,
48
+ },
49
+ })
50
+ );
51
+ await el.updateComplete;
52
+
53
+ expect(el.minSelectedDate).to.equal('2');
54
+ expect(el.maxSelectedDate).to.equal('4');
55
+ });
56
+
57
+ it('should emit an event when a date range is applied', async () => {
58
+ const applySpy = sinon.spy();
59
+ const el = await fixture<ExpandedDatePicker>(
60
+ html`<expanded-date-picker
61
+ .buckets=${[1, 2, 3, 4, 5]}
62
+ .minDate=${'1'}
63
+ .maxDate=${'5'}
64
+ .minSelectedDate=${'1'}
65
+ .maxSelectedDate=${'5'}
66
+ @histogramDateRangeApplied=${applySpy}
67
+ ></expanded-date-picker>`
68
+ );
69
+
70
+ const applyBtn = el.shadowRoot?.querySelector(
71
+ '#apply-btn'
72
+ ) as HTMLButtonElement;
73
+ expect(applyBtn).to.exist;
74
+
75
+ applyBtn.click();
76
+ await el.updateComplete;
77
+
78
+ expect(applySpy.callCount).to.equal(1);
79
+ expect(
80
+ applySpy.calledWithMatch({ detail: { minDate: '1', maxDate: '5' } })
81
+ );
82
+ });
83
+
84
+ it('should close and unstyle its modal when date range applied', async () => {
85
+ const modalManager = new ModalManager();
86
+ modalManager.mode = ModalManagerMode.Open;
87
+ modalManager.classList.add('expanded-date-picker');
88
+
89
+ const el = await fixture<ExpandedDatePicker>(
90
+ html`<expanded-date-picker
91
+ .buckets=${[1, 2, 3, 4, 5]}
92
+ .minDate=${'1'}
93
+ .maxDate=${'5'}
94
+ .minSelectedDate=${'1'}
95
+ .maxSelectedDate=${'5'}
96
+ .modalManager=${modalManager}
97
+ ></expanded-date-picker>`
98
+ );
99
+
100
+ const applyBtn = el.shadowRoot?.querySelector(
101
+ '#apply-btn'
102
+ ) as HTMLButtonElement;
103
+ expect(applyBtn).to.exist;
104
+
105
+ applyBtn.click();
106
+ await el.updateComplete;
107
+
108
+ expect(modalManager.getMode()).to.equal(ModalManagerMode.Closed);
109
+ expect(modalManager.classList.contains('expanded-date-picker')).to.be.false;
110
+ });
111
+
112
+ it('closes the modal when Esc key is pressed', async () => {
113
+ const el = await fixture<ExpandedDatePicker>(
114
+ html`<expanded-date-picker
115
+ .buckets=${[1, 2, 3, 4, 5]}
116
+ .minDate=${'1'}
117
+ .maxDate=${'5'}
118
+ .minSelectedDate=${'1'}
119
+ .maxSelectedDate=${'5'}
120
+ .modalManager=${new ModalManager()}
121
+ ></expanded-date-picker>`
122
+ );
123
+
124
+ const closeModalSpy = sinon.spy(
125
+ el.modalManager as ModalManagerInterface,
126
+ 'closeModal'
127
+ );
128
+
129
+ // Dispatch an Esc keydown event
130
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
131
+ await el.updateComplete;
132
+
133
+ expect(closeModalSpy.callCount).to.equal(1);
134
+ expect(el.modalManager?.classList.contains('expanded-date-picker')).to.be
135
+ .false;
136
+ });
137
+ });
@@ -183,6 +183,32 @@ describe('Restoration state handler', () => {
183
183
  );
184
184
  });
185
185
 
186
+ it('should restore selected facets with numbers in the square brackets', async () => {
187
+ const handler = new RestorationStateHandler({ context: 'search' });
188
+
189
+ const url = new URL(window.location.href);
190
+ url.search = '?and[12]=subject:"foo"';
191
+ window.history.replaceState({ path: url.href }, '', url.href);
192
+
193
+ const restorationState = handler.getRestorationState();
194
+ expect(restorationState.selectedFacets.subject.foo.state).to.equal(
195
+ 'selected'
196
+ );
197
+ });
198
+
199
+ it('should restore negative facets with numbers in the square brackets', async () => {
200
+ const handler = new RestorationStateHandler({ context: 'search' });
201
+
202
+ const url = new URL(window.location.href);
203
+ url.search = '?not[12]=year:2018';
204
+ window.history.replaceState({ path: url.href }, '', url.href);
205
+
206
+ const restorationState = handler.getRestorationState();
207
+ expect(restorationState.selectedFacets.year['2018'].state).to.equal(
208
+ 'hidden'
209
+ );
210
+ });
211
+
186
212
  it('should restore sort from URL (space format)', async () => {
187
213
  const handler = new RestorationStateHandler({ context: 'search' });
188
214
 
@@ -270,4 +296,22 @@ describe('Restoration state handler', () => {
270
296
  handler.persistState({ selectedFacets: getDefaultSelectedFacets() });
271
297
  expect(window.location.search).to.equal('');
272
298
  });
299
+
300
+ it('round trip load/persist should erase numbers in square brackets', async () => {
301
+ const handler = new RestorationStateHandler({ context: 'search' });
302
+
303
+ const url = new URL(window.location.href);
304
+ url.search = '?and[0]=subject:"foo"';
305
+ window.history.replaceState({ path: url.href }, '', url.href);
306
+
307
+ // Load state from the URL and immediately persist it back to the URL
308
+ const restorationState = handler.getRestorationState();
309
+ handler.persistState(restorationState);
310
+
311
+ // Ensure the new URL includes the "normalized" facet parameter and not the numbered one
312
+ expect(decodeURIComponent(window.location.search)).to.include(
313
+ 'and[]=subject:"foo"'
314
+ );
315
+ expect(new URL(window.location.href).searchParams.get('and[0]')).to.be.null;
316
+ });
273
317
  });