@searchcraft/javascript-sdk 0.4.0 → 0.4.2

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 (183) hide show
  1. package/README.md +3 -4
  2. package/dist/cjs/{index-c8a8e492.js → index-6916cc47.js} +2 -1
  3. package/dist/cjs/index-6916cc47.js.map +1 -0
  4. package/dist/cjs/index.cjs.js +2 -2
  5. package/dist/cjs/loader.cjs.js +2 -2
  6. package/dist/cjs/{package-ccc7e307.js → package-2005293c.js} +2 -2
  7. package/dist/cjs/package-2005293c.js.map +1 -0
  8. package/dist/cjs/searchcraft-auto-search-form.cjs.entry.js +27 -44
  9. package/dist/cjs/searchcraft-auto-search-form.cjs.entry.js.map +1 -1
  10. package/dist/cjs/searchcraft-base-search-form.cjs.entry.js +3 -3
  11. package/dist/cjs/searchcraft-base-search-result.cjs.entry.js +2 -2
  12. package/dist/cjs/searchcraft-base-search-results.cjs.entry.js +10 -30
  13. package/dist/cjs/searchcraft-base-search-results.cjs.entry.js.map +1 -1
  14. package/dist/cjs/searchcraft-button-icon.cjs.entry.js +1 -1
  15. package/dist/cjs/searchcraft-button.cjs.entry.js +1 -1
  16. package/dist/cjs/searchcraft-check-icon_2.cjs.entry.js +1 -1
  17. package/dist/cjs/searchcraft-clear-icon-set.cjs.entry.js +1 -1
  18. package/dist/cjs/searchcraft-error-message_3.cjs.entry.js +2 -2
  19. package/dist/cjs/searchcraft-facet-list_3.cjs.entry.js +91 -38
  20. package/dist/cjs/searchcraft-facet-list_3.cjs.entry.js.map +1 -1
  21. package/dist/cjs/searchcraft-filter-panel.cjs.entry.js +7 -26
  22. package/dist/cjs/searchcraft-filter-panel.cjs.entry.js.map +1 -1
  23. package/dist/cjs/searchcraft-javascript-sdk.cjs.js +2 -2
  24. package/dist/cjs/searchcraft-results-info.cjs.entry.js +3 -3
  25. package/dist/cjs/searchcraft-search-icon-set.cjs.entry.js +1 -1
  26. package/dist/cjs/searchcraft-spinner-dark.cjs.entry.js +1 -1
  27. package/dist/cjs/searchcraft-spinner-light.cjs.entry.js +1 -1
  28. package/dist/cjs/{store-72205332.js → store-afa727af.js} +11 -5
  29. package/dist/cjs/{store-72205332.js.map → store-afa727af.js.map} +1 -1
  30. package/dist/cjs/{utils-4ee2b88d.js → utils-a17279a2.js} +81 -24
  31. package/dist/cjs/utils-a17279a2.js.map +1 -0
  32. package/dist/collection/components/searchcraft-auto-search-form/searchcraft-auto-search-form.js +35 -50
  33. package/dist/collection/components/searchcraft-auto-search-form/searchcraft-auto-search-form.js.map +1 -1
  34. package/dist/collection/components/searchcraft-base-search-results/searchcraft-base-search-results.js +19 -39
  35. package/dist/collection/components/searchcraft-base-search-results/searchcraft-base-search-results.js.map +1 -1
  36. package/dist/collection/components/searchcraft-facet-list/searchcraft-facet-list.js +51 -20
  37. package/dist/collection/components/searchcraft-facet-list/searchcraft-facet-list.js.map +1 -1
  38. package/dist/collection/components/searchcraft-filter-panel/searchcraft-filter-panel.js +16 -34
  39. package/dist/collection/components/searchcraft-filter-panel/searchcraft-filter-panel.js.map +1 -1
  40. package/dist/collection/components/searchcraft-slider/searchcraft-slider.js +23 -15
  41. package/dist/collection/components/searchcraft-slider/searchcraft-slider.js.map +1 -1
  42. package/dist/collection/components/searchcraft-slider/searchcraft-slider.module.css +11 -11
  43. package/dist/collection/components/searchcraft-toggle-button/searchcraft-toggle-button.js +21 -3
  44. package/dist/collection/components/searchcraft-toggle-button/searchcraft-toggle-button.js.map +1 -1
  45. package/dist/collection/provider/store.js +10 -4
  46. package/dist/collection/provider/store.js.map +1 -1
  47. package/dist/collection/types/searchcraft-base-search-results.types.js.map +1 -1
  48. package/dist/collection/utils/utils.js +80 -23
  49. package/dist/collection/utils/utils.js.map +1 -1
  50. package/dist/components/index.js +2 -2
  51. package/dist/components/{p-8062f0ea.js → p-0468a9eb.js} +2 -2
  52. package/dist/components/{p-8062f0ea.js.map → p-0468a9eb.js.map} +1 -1
  53. package/dist/components/{p-be63dcac.js → p-3c181808.js} +11 -5
  54. package/dist/components/{p-be63dcac.js.map → p-3c181808.js.map} +1 -1
  55. package/dist/components/{p-e3c8b1ef.js → p-3e8d3586.js} +26 -18
  56. package/dist/components/p-3e8d3586.js.map +1 -0
  57. package/dist/components/{p-b1a59f07.js → p-415f7b11.js} +2 -2
  58. package/dist/components/{p-b1a59f07.js.map → p-415f7b11.js.map} +1 -1
  59. package/dist/components/{p-68897c11.js → p-7bb734f3.js} +54 -23
  60. package/dist/components/p-7bb734f3.js.map +1 -0
  61. package/dist/components/{p-ebf021b5.js → p-9b9df0ca.js} +22 -4
  62. package/dist/components/p-9b9df0ca.js.map +1 -0
  63. package/dist/components/{p-69eed21e.js → p-c994d722.js} +2 -2
  64. package/dist/components/p-c994d722.js.map +1 -0
  65. package/dist/components/{p-0deddac7.js → p-f308d05d.js} +81 -24
  66. package/dist/components/p-f308d05d.js.map +1 -0
  67. package/dist/components/searchcraft-auto-search-form.js +29 -47
  68. package/dist/components/searchcraft-auto-search-form.js.map +1 -1
  69. package/dist/components/searchcraft-base-search-form.js +3 -3
  70. package/dist/components/searchcraft-base-search-result.js +1 -1
  71. package/dist/components/searchcraft-base-search-results.js +12 -35
  72. package/dist/components/searchcraft-base-search-results.js.map +1 -1
  73. package/dist/components/searchcraft-facet-list.js +1 -1
  74. package/dist/components/searchcraft-filter-panel.js +11 -33
  75. package/dist/components/searchcraft-filter-panel.js.map +1 -1
  76. package/dist/components/searchcraft-input.js +1 -1
  77. package/dist/components/searchcraft-results-info.js +2 -2
  78. package/dist/components/searchcraft-slider.js +1 -1
  79. package/dist/components/searchcraft-toggle-button.js +1 -1
  80. package/dist/esm/{index-88dc5f88.js → index-921fe029.js} +2 -2
  81. package/dist/esm/index-921fe029.js.map +1 -0
  82. package/dist/esm/index.js +2 -2
  83. package/dist/esm/loader.js +3 -3
  84. package/dist/esm/{package-ee16f835.js → package-07f53086.js} +2 -2
  85. package/dist/esm/package-07f53086.js.map +1 -0
  86. package/dist/esm/searchcraft-auto-search-form.entry.js +27 -44
  87. package/dist/esm/searchcraft-auto-search-form.entry.js.map +1 -1
  88. package/dist/esm/searchcraft-base-search-form.entry.js +3 -3
  89. package/dist/esm/searchcraft-base-search-result.entry.js +2 -2
  90. package/dist/esm/searchcraft-base-search-results.entry.js +10 -30
  91. package/dist/esm/searchcraft-base-search-results.entry.js.map +1 -1
  92. package/dist/esm/searchcraft-button-icon.entry.js +1 -1
  93. package/dist/esm/searchcraft-button.entry.js +1 -1
  94. package/dist/esm/searchcraft-check-icon_2.entry.js +1 -1
  95. package/dist/esm/searchcraft-clear-icon-set.entry.js +1 -1
  96. package/dist/esm/searchcraft-error-message_3.entry.js +2 -2
  97. package/dist/esm/searchcraft-facet-list_3.entry.js +91 -38
  98. package/dist/esm/searchcraft-facet-list_3.entry.js.map +1 -1
  99. package/dist/esm/searchcraft-filter-panel.entry.js +7 -26
  100. package/dist/esm/searchcraft-filter-panel.entry.js.map +1 -1
  101. package/dist/esm/searchcraft-javascript-sdk.js +3 -3
  102. package/dist/esm/searchcraft-results-info.entry.js +3 -3
  103. package/dist/esm/searchcraft-search-icon-set.entry.js +1 -1
  104. package/dist/esm/searchcraft-spinner-dark.entry.js +1 -1
  105. package/dist/esm/searchcraft-spinner-light.entry.js +1 -1
  106. package/dist/esm/{store-52436995.js → store-8d82e948.js} +11 -5
  107. package/dist/esm/{store-52436995.js.map → store-8d82e948.js.map} +1 -1
  108. package/dist/esm/{utils-89a02921.js → utils-c2ce411f.js} +81 -24
  109. package/dist/esm/utils-c2ce411f.js.map +1 -0
  110. package/dist/searchcraft-javascript-sdk/index.esm.js +1 -1
  111. package/dist/searchcraft-javascript-sdk/{p-9647ae41.entry.js → p-1720b612.entry.js} +2 -2
  112. package/dist/searchcraft-javascript-sdk/{p-f4612b94.entry.js → p-3292e706.entry.js} +2 -2
  113. package/dist/searchcraft-javascript-sdk/p-491ae071.entry.js +2 -0
  114. package/dist/searchcraft-javascript-sdk/p-491ae071.entry.js.map +1 -0
  115. package/dist/searchcraft-javascript-sdk/{p-bf80bbee.entry.js → p-4a2d1f44.entry.js} +2 -2
  116. package/dist/searchcraft-javascript-sdk/p-676e2eef.entry.js +2 -0
  117. package/dist/searchcraft-javascript-sdk/p-676e2eef.entry.js.map +1 -0
  118. package/dist/searchcraft-javascript-sdk/{p-4c32c87d.js → p-80e3f29f.js} +2 -2
  119. package/dist/searchcraft-javascript-sdk/{p-4c32c87d.js.map → p-80e3f29f.js.map} +1 -1
  120. package/dist/searchcraft-javascript-sdk/{p-93e9de71.entry.js → p-83a074b6.entry.js} +2 -2
  121. package/dist/searchcraft-javascript-sdk/p-8a9b0762.entry.js +2 -0
  122. package/dist/searchcraft-javascript-sdk/{p-acc645c7.entry.js.map → p-8a9b0762.entry.js.map} +1 -1
  123. package/dist/searchcraft-javascript-sdk/{p-bb03e946.js → p-a2801518.js} +2 -2
  124. package/dist/searchcraft-javascript-sdk/p-a2801518.js.map +1 -0
  125. package/dist/searchcraft-javascript-sdk/{p-343adbe3.entry.js → p-a56af0b0.entry.js} +2 -2
  126. package/dist/searchcraft-javascript-sdk/p-a56af0b0.entry.js.map +1 -0
  127. package/dist/searchcraft-javascript-sdk/{p-4278ff89.entry.js → p-bcc68b15.entry.js} +2 -2
  128. package/dist/searchcraft-javascript-sdk/{p-7c59b3cd.entry.js → p-c70b31ae.entry.js} +2 -2
  129. package/dist/searchcraft-javascript-sdk/{p-69eed21e.js → p-c994d722.js} +2 -2
  130. package/dist/searchcraft-javascript-sdk/p-d08d0b15.entry.js +2 -0
  131. package/dist/searchcraft-javascript-sdk/p-d08d0b15.entry.js.map +1 -0
  132. package/dist/searchcraft-javascript-sdk/{p-3a2d9be9.entry.js → p-d4a7d8bd.entry.js} +2 -2
  133. package/dist/searchcraft-javascript-sdk/{p-69f64bdd.entry.js → p-e8a96dca.entry.js} +2 -2
  134. package/dist/searchcraft-javascript-sdk/{p-08bd95f1.entry.js → p-efb41d6d.entry.js} +2 -2
  135. package/dist/searchcraft-javascript-sdk/p-f308d05d.js +2 -0
  136. package/dist/searchcraft-javascript-sdk/p-f308d05d.js.map +1 -0
  137. package/dist/searchcraft-javascript-sdk/{p-a613a6ba.entry.js → p-fb239507.entry.js} +2 -2
  138. package/dist/searchcraft-javascript-sdk/searchcraft-javascript-sdk.esm.js +1 -1
  139. package/dist/searchcraft-javascript-sdk/searchcraft-javascript-sdk.esm.js.map +1 -1
  140. package/dist/types/components/searchcraft-auto-search-form/searchcraft-auto-search-form.d.ts +5 -5
  141. package/dist/types/components/searchcraft-base-search-results/searchcraft-base-search-results.d.ts +1 -6
  142. package/dist/types/components/searchcraft-facet-list/searchcraft-facet-list.d.ts +4 -1
  143. package/dist/types/components/searchcraft-filter-panel/searchcraft-filter-panel.d.ts +3 -6
  144. package/dist/types/components/searchcraft-slider/searchcraft-slider.d.ts +4 -6
  145. package/dist/types/components/searchcraft-toggle-button/searchcraft-toggle-button.d.ts +4 -0
  146. package/dist/types/components.d.ts +10 -6
  147. package/dist/types/provider/store.d.ts +0 -5
  148. package/dist/types/types/searchcraft-base-search-results.types.d.ts +1 -1
  149. package/dist/types/utils/utils.d.ts +1 -1
  150. package/package.json +1 -1
  151. package/dist/cjs/index-c8a8e492.js.map +0 -1
  152. package/dist/cjs/package-ccc7e307.js.map +0 -1
  153. package/dist/cjs/utils-4ee2b88d.js.map +0 -1
  154. package/dist/components/p-0deddac7.js.map +0 -1
  155. package/dist/components/p-68897c11.js.map +0 -1
  156. package/dist/components/p-69eed21e.js.map +0 -1
  157. package/dist/components/p-e3c8b1ef.js.map +0 -1
  158. package/dist/components/p-ebf021b5.js.map +0 -1
  159. package/dist/esm/index-88dc5f88.js.map +0 -1
  160. package/dist/esm/package-ee16f835.js.map +0 -1
  161. package/dist/esm/utils-89a02921.js.map +0 -1
  162. package/dist/searchcraft-javascript-sdk/p-0deddac7.js +0 -2
  163. package/dist/searchcraft-javascript-sdk/p-0deddac7.js.map +0 -1
  164. package/dist/searchcraft-javascript-sdk/p-15f9891d.entry.js +0 -2
  165. package/dist/searchcraft-javascript-sdk/p-15f9891d.entry.js.map +0 -1
  166. package/dist/searchcraft-javascript-sdk/p-2419a8c5.entry.js +0 -2
  167. package/dist/searchcraft-javascript-sdk/p-2419a8c5.entry.js.map +0 -1
  168. package/dist/searchcraft-javascript-sdk/p-343adbe3.entry.js.map +0 -1
  169. package/dist/searchcraft-javascript-sdk/p-56413bef.entry.js +0 -2
  170. package/dist/searchcraft-javascript-sdk/p-56413bef.entry.js.map +0 -1
  171. package/dist/searchcraft-javascript-sdk/p-acc645c7.entry.js +0 -2
  172. package/dist/searchcraft-javascript-sdk/p-bb03e946.js.map +0 -1
  173. /package/dist/searchcraft-javascript-sdk/{p-9647ae41.entry.js.map → p-1720b612.entry.js.map} +0 -0
  174. /package/dist/searchcraft-javascript-sdk/{p-f4612b94.entry.js.map → p-3292e706.entry.js.map} +0 -0
  175. /package/dist/searchcraft-javascript-sdk/{p-bf80bbee.entry.js.map → p-4a2d1f44.entry.js.map} +0 -0
  176. /package/dist/searchcraft-javascript-sdk/{p-93e9de71.entry.js.map → p-83a074b6.entry.js.map} +0 -0
  177. /package/dist/searchcraft-javascript-sdk/{p-4278ff89.entry.js.map → p-bcc68b15.entry.js.map} +0 -0
  178. /package/dist/searchcraft-javascript-sdk/{p-7c59b3cd.entry.js.map → p-c70b31ae.entry.js.map} +0 -0
  179. /package/dist/searchcraft-javascript-sdk/{p-69eed21e.js.map → p-c994d722.js.map} +0 -0
  180. /package/dist/searchcraft-javascript-sdk/{p-3a2d9be9.entry.js.map → p-d4a7d8bd.entry.js.map} +0 -0
  181. /package/dist/searchcraft-javascript-sdk/{p-69f64bdd.entry.js.map → p-e8a96dca.entry.js.map} +0 -0
  182. /package/dist/searchcraft-javascript-sdk/{p-08bd95f1.entry.js.map → p-efb41d6d.entry.js.map} +0 -0
  183. /package/dist/searchcraft-javascript-sdk/{p-a613a6ba.entry.js.map → p-fb239507.entry.js.map} +0 -0
@@ -17,37 +17,45 @@ export class SearchcraftFiltersList {
17
17
  return `${label.replace(/-/g, ' ').replace(/\b\w/g, (char) => char.toUpperCase())} (${count})`;
18
18
  };
19
19
  this.fieldName = undefined;
20
+ this.baseFacetRoot = undefined;
20
21
  this.facetRoot = undefined;
21
22
  this.selectedPaths = {};
22
23
  this.lastQuery = undefined;
24
+ this.lastTimeTaken = undefined;
25
+ this.hasNewSearchTerm = false;
23
26
  this.unsubscribe = undefined;
24
27
  }
25
- initFacetRootFromState(state) {
26
- var _a;
28
+ handleStateUpdate(state) {
29
+ var _a, _b;
27
30
  const facetPrime = (_a = state.searchResults) === null || _a === void 0 ? void 0 : _a.data.facets;
28
- if (facetPrime) {
29
- const facetRoot = facetPrime.find((facet) => this.fieldName === Object.keys(facet)[0]);
30
- if (this.facetRoot) {
31
- this.facetRoot = mergeFacetRoots(this.fieldName, this.facetRoot, facetRoot);
32
- }
33
- else {
34
- this.facetRoot = facetRoot;
31
+ const timeTaken = (_b = state.searchResults) === null || _b === void 0 ? void 0 : _b.data.time_taken;
32
+ /** Things to do when the state's search term has changed, but before the response received */
33
+ if (state.query !== this.lastQuery) {
34
+ this.selectedPaths = {};
35
+ this.hasNewSearchTerm = true;
36
+ }
37
+ /** Things to do when a new response with a new facet prime has been received */
38
+ if (timeTaken !== this.lastTimeTaken && facetPrime) {
39
+ this.facetRoot = undefined;
40
+ const incomingFacetRoot = facetPrime.find((facet) => this.fieldName === Object.keys(facet)[0]);
41
+ /** Data is from a new search term: completely override our facets */
42
+ if (this.hasNewSearchTerm) {
43
+ this.baseFacetRoot = incomingFacetRoot;
44
+ this.facetRoot = incomingFacetRoot;
45
+ this.hasNewSearchTerm = false;
35
46
  }
36
- // Clear the selected paths if the query changed
37
- if (state.query !== this.lastQuery) {
38
- this.selectedPaths = {};
39
- // Remove the facet root if the query is empty
40
- if (state.query.trim().length === 0) {
41
- this.facetRoot = undefined;
42
- }
47
+ else if (this.baseFacetRoot) {
48
+ /** Data is from an existing search term, merge the facets together */
49
+ this.facetRoot = mergeFacetRoots(this.fieldName, this.baseFacetRoot, incomingFacetRoot);
43
50
  }
44
51
  }
45
52
  this.lastQuery = state.query;
53
+ this.lastTimeTaken = timeTaken;
46
54
  }
47
55
  connectedCallback() {
48
- this.initFacetRootFromState(this.searchStore);
56
+ this.handleStateUpdate(this.searchStore);
49
57
  this.unsubscribe = useSearchcraftStore.subscribe((state) => {
50
- this.initFacetRootFromState(state);
58
+ this.handleStateUpdate(state);
51
59
  });
52
60
  }
53
61
  disconnectedCallback() {
@@ -55,7 +63,27 @@ export class SearchcraftFiltersList {
55
63
  (_a = this.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(this);
56
64
  }
57
65
  handleCheckboxChange(path) {
58
- this.selectedPaths = Object.assign(Object.assign({}, this.selectedPaths), { [path]: !this.selectedPaths[path] });
66
+ const isCheckboxChecked = !this.selectedPaths[path];
67
+ if (isCheckboxChecked) {
68
+ /**
69
+ * Checkbox Checked: Add to the selectedPaths record
70
+ * Uses spread operator here so UI updates.
71
+ */
72
+ this.selectedPaths = Object.assign(Object.assign({}, this.selectedPaths), { [path]: true });
73
+ }
74
+ else {
75
+ /**
76
+ * Checkbox Uncheck: Remove any paths and sub-paths
77
+ */
78
+ const updatedPaths = Object.keys(this.selectedPaths).filter((testPath) => !testPath.includes(path));
79
+ this.selectedPaths = updatedPaths.reduce((acc, str) => {
80
+ acc[str] = true;
81
+ return acc;
82
+ }, {});
83
+ }
84
+ /**
85
+ * Emit the paths array, with parent paths removed.
86
+ */
59
87
  const paths = Object.keys(this.selectedPaths).filter((path) => this.selectedPaths[path]);
60
88
  const pathsWithParentPathsRemoved = removeSubstringMatches(paths);
61
89
  this.facetSelectionUpdated.emit({ paths: pathsWithParentPathsRemoved });
@@ -63,7 +91,7 @@ export class SearchcraftFiltersList {
63
91
  render() {
64
92
  var _a;
65
93
  const firstFacet = (_a = this.facetRoot) === null || _a === void 0 ? void 0 : _a[this.fieldName];
66
- return (h("div", { key: '3f7daaa4d9efdd5cfef6c254bd56aad457eceb47', class: classNames('filtersListContainer', 'searchcraft-filters-list-container') }, !firstFacet && (h("p", { key: '3f9fc14961209475b88cd4726014035dfcf62a20', class: 'searchcraft-facet-message' }, "Enter a search to view facets.")), firstFacet === null || firstFacet === void 0 ? void 0 :
94
+ return (h("div", { key: '3dbfa6515c9628e8eea3cddcd108403a9d51f7c1', class: classNames('filtersListContainer', 'searchcraft-filters-list-container') }, !firstFacet && (h("p", { key: 'c7c519a6a4b6d27343a0ba953d428ec892dbdc93', class: 'searchcraft-facet-message' }, "Enter a search to view facets.")), firstFacet === null || firstFacet === void 0 ? void 0 :
67
95
  firstFacet.map((facetChild) => {
68
96
  var _a;
69
97
  const isChildSelected = facetChild.children
@@ -112,9 +140,12 @@ export class SearchcraftFiltersList {
112
140
  }
113
141
  static get states() {
114
142
  return {
143
+ "baseFacetRoot": {},
115
144
  "facetRoot": {},
116
145
  "selectedPaths": {},
117
146
  "lastQuery": {},
147
+ "lastTimeTaken": {},
148
+ "hasNewSearchTerm": {},
118
149
  "unsubscribe": {}
119
150
  };
120
151
  }
@@ -1 +1 @@
1
- {"version":3,"file":"searchcraft-facet-list.js","sourceRoot":"","sources":["../../../../src/components/searchcraft-facet-list/searchcraft-facet-list.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n h,\n State,\n Prop,\n Event,\n type EventEmitter,\n Fragment,\n} from '@stencil/core';\nimport classNames from 'classnames';\n\nimport type { FacetChild, FacetRoot } from '@searchcraft/core';\n\nimport { useSearchcraftStore, type SearchcraftState } from '@provider/store';\nimport { mergeFacetRoots, removeSubstringMatches } from '@utils/utils';\n\n@Component({\n tag: 'searchcraft-facet-list',\n styleUrl: 'searchcraft-facet-list.module.scss',\n shadow: false,\n})\nexport class SearchcraftFiltersList {\n @Prop() fieldName: string;\n\n @Event() facetSelectionUpdated: EventEmitter<{ paths: string[] }>;\n\n @State() facetRoot: FacetRoot | undefined;\n @State() selectedPaths: Record<string, boolean> = {};\n @State() lastQuery: string | undefined;\n\n @State() unsubscribe: (() => void) | undefined;\n\n private searchStore = useSearchcraftStore.getState();\n\n initFacetRootFromState(state: SearchcraftState) {\n const facetPrime = state.searchResults?.data.facets;\n\n if (facetPrime) {\n const facetRoot: FacetRoot = facetPrime.find(\n (facet) => this.fieldName === Object.keys(facet)[0],\n );\n\n if (this.facetRoot) {\n this.facetRoot = mergeFacetRoots(\n this.fieldName,\n this.facetRoot,\n facetRoot,\n );\n } else {\n this.facetRoot = facetRoot;\n }\n\n // Clear the selected paths if the query changed\n if (state.query !== this.lastQuery) {\n this.selectedPaths = {};\n\n // Remove the facet root if the query is empty\n if (state.query.trim().length === 0) {\n this.facetRoot = undefined;\n }\n }\n }\n\n this.lastQuery = state.query;\n }\n\n connectedCallback() {\n this.initFacetRootFromState(this.searchStore);\n\n this.unsubscribe = useSearchcraftStore.subscribe((state) => {\n this.initFacetRootFromState(state);\n });\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n }\n\n handleCheckboxChange(path: string) {\n this.selectedPaths = {\n ...this.selectedPaths,\n [path]: !this.selectedPaths[path],\n };\n\n const paths = Object.keys(this.selectedPaths).filter(\n (path) => this.selectedPaths[path],\n );\n\n const pathsWithParentPathsRemoved = removeSubstringMatches(paths);\n\n this.facetSelectionUpdated.emit({ paths: pathsWithParentPathsRemoved });\n }\n\n formatLabel = (facetChild: FacetChild): string => {\n const label = facetChild.path.replace(/^\\//, '');\n const count = facetChild.count;\n return `${label.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())} (${count})`;\n };\n\n formatSubLabel = (\n facetChild: FacetChild,\n facetChildAncestor: FacetChild,\n ): string => {\n const facetChildPath = facetChild.path.substring(\n facetChildAncestor.path.length,\n );\n const label = facetChildPath.replace(/^\\//, '');\n const count = facetChild.count;\n return `${label.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())} (${count})`;\n };\n\n render() {\n const firstFacet = this.facetRoot?.[this.fieldName];\n\n return (\n <div\n class={classNames(\n 'filtersListContainer',\n 'searchcraft-filters-list-container',\n )}\n >\n {!firstFacet && (\n <p class='searchcraft-facet-message'>\n Enter a search to view facets.\n </p>\n )}\n {firstFacet?.map((facetChild: FacetChild) => {\n const isChildSelected = facetChild.children\n ? facetChild.children?.some(\n (child) => this.selectedPaths[child.path],\n )\n : false;\n\n return (\n <div\n key={facetChild.path}\n class={classNames('searchcraft-filters-list-item')}\n >\n <label\n class={classNames(\n 'filterCheckboxLabel',\n 'searchcraft-filters-list-checkbox-label',\n )}\n >\n <input\n checked={this.selectedPaths[facetChild.path]}\n onChange={(_event: Event) =>\n this.handleCheckboxChange(facetChild.path)\n }\n type='checkbox'\n />\n {isChildSelected ? (\n <div\n class={classNames(\n 'dashContainer',\n 'searchcraft-filter-list-dash-container',\n )}\n >\n <searchcraft-dash-icon />\n </div>\n ) : (\n <div\n class={classNames(\n 'checkContainer',\n 'searchcraft-filter-list-check-container',\n )}\n >\n <searchcraft-check-icon />\n </div>\n )}\n {this.formatLabel(facetChild)}\n </label>\n {facetChild.children && facetChild.children.length > 0 && (\n <Fragment>\n {facetChild.children.map((grandchild) => (\n <label\n key={grandchild.path}\n class={classNames(\n 'childFilterCheckboxLabel',\n 'searchcraft-child-filter-checkbox-label',\n )}\n style={{\n display: this.selectedPaths[facetChild.path]\n ? 'flex'\n : 'none',\n }}\n >\n <input\n checked={this.selectedPaths[grandchild.path]}\n onChange={(_event: Event) => {\n this.handleCheckboxChange(grandchild.path);\n }}\n type='checkbox'\n />\n <div\n class={classNames(\n 'checkContainer',\n 'searchcraft-filter-list-check-container',\n )}\n >\n <searchcraft-check-icon />\n </div>\n {this.formatSubLabel(grandchild, facetChild)}\n </label>\n ))}\n </Fragment>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"searchcraft-facet-list.js","sourceRoot":"","sources":["../../../../src/components/searchcraft-facet-list/searchcraft-facet-list.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n h,\n State,\n Prop,\n Event,\n type EventEmitter,\n Fragment,\n} from '@stencil/core';\nimport classNames from 'classnames';\n\nimport type { FacetChild, FacetRoot } from '@searchcraft/core';\n\nimport { useSearchcraftStore, type SearchcraftState } from '@provider/store';\nimport { mergeFacetRoots, removeSubstringMatches } from '@utils/utils';\n\n@Component({\n tag: 'searchcraft-facet-list',\n styleUrl: 'searchcraft-facet-list.module.scss',\n shadow: false,\n})\nexport class SearchcraftFiltersList {\n @Prop() fieldName: string;\n\n @Event() facetSelectionUpdated: EventEmitter<{ paths: string[] }>;\n\n @State() baseFacetRoot: FacetRoot | undefined;\n @State() facetRoot: FacetRoot | undefined;\n @State() selectedPaths: Record<string, boolean> = {};\n @State() lastQuery: string | undefined;\n @State() lastTimeTaken: number | undefined;\n @State() hasNewSearchTerm = false;\n\n @State() unsubscribe: (() => void) | undefined;\n\n private searchStore = useSearchcraftStore.getState();\n\n handleStateUpdate(state: SearchcraftState) {\n const facetPrime = state.searchResults?.data.facets;\n const timeTaken = state.searchResults?.data.time_taken;\n\n /** Things to do when the state's search term has changed, but before the response received */\n if (state.query !== this.lastQuery) {\n this.selectedPaths = {};\n this.hasNewSearchTerm = true;\n }\n\n /** Things to do when a new response with a new facet prime has been received */\n if (timeTaken !== this.lastTimeTaken && facetPrime) {\n this.facetRoot = undefined;\n const incomingFacetRoot: FacetRoot = facetPrime.find(\n (facet) => this.fieldName === Object.keys(facet)[0],\n );\n\n /** Data is from a new search term: completely override our facets */\n if (this.hasNewSearchTerm) {\n this.baseFacetRoot = incomingFacetRoot;\n this.facetRoot = incomingFacetRoot;\n this.hasNewSearchTerm = false;\n } else if (this.baseFacetRoot) {\n /** Data is from an existing search term, merge the facets together */\n this.facetRoot = mergeFacetRoots(\n this.fieldName,\n this.baseFacetRoot,\n incomingFacetRoot,\n );\n }\n }\n\n this.lastQuery = state.query;\n this.lastTimeTaken = timeTaken;\n }\n\n connectedCallback() {\n this.handleStateUpdate(this.searchStore);\n\n this.unsubscribe = useSearchcraftStore.subscribe((state) => {\n this.handleStateUpdate(state);\n });\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n }\n\n handleCheckboxChange(path: string) {\n const isCheckboxChecked = !this.selectedPaths[path];\n\n if (isCheckboxChecked) {\n /**\n * Checkbox Checked: Add to the selectedPaths record\n * Uses spread operator here so UI updates.\n */\n this.selectedPaths = {\n ...this.selectedPaths,\n [path]: true,\n };\n } else {\n /**\n * Checkbox Uncheck: Remove any paths and sub-paths\n */\n const updatedPaths = Object.keys(this.selectedPaths).filter(\n (testPath) => !testPath.includes(path),\n );\n\n this.selectedPaths = updatedPaths.reduce(\n (acc, str) => {\n acc[str] = true;\n return acc;\n },\n {} as Record<string, boolean>,\n );\n }\n\n /**\n * Emit the paths array, with parent paths removed.\n */\n const paths = Object.keys(this.selectedPaths).filter(\n (path) => this.selectedPaths[path],\n );\n const pathsWithParentPathsRemoved = removeSubstringMatches(paths);\n\n this.facetSelectionUpdated.emit({ paths: pathsWithParentPathsRemoved });\n }\n\n formatLabel = (facetChild: FacetChild): string => {\n const label = facetChild.path.replace(/^\\//, '');\n const count = facetChild.count;\n return `${label.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())} (${count})`;\n };\n\n formatSubLabel = (\n facetChild: FacetChild,\n facetChildAncestor: FacetChild,\n ): string => {\n const facetChildPath = facetChild.path.substring(\n facetChildAncestor.path.length,\n );\n const label = facetChildPath.replace(/^\\//, '');\n const count = facetChild.count;\n return `${label.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())} (${count})`;\n };\n\n render() {\n const firstFacet = this.facetRoot?.[this.fieldName];\n\n return (\n <div\n class={classNames(\n 'filtersListContainer',\n 'searchcraft-filters-list-container',\n )}\n >\n {!firstFacet && (\n <p class='searchcraft-facet-message'>\n Enter a search to view facets.\n </p>\n )}\n {firstFacet?.map((facetChild: FacetChild) => {\n const isChildSelected = facetChild.children\n ? facetChild.children?.some(\n (child) => this.selectedPaths[child.path],\n )\n : false;\n\n return (\n <div\n key={facetChild.path}\n class={classNames('searchcraft-filters-list-item')}\n >\n <label\n class={classNames(\n 'filterCheckboxLabel',\n 'searchcraft-filters-list-checkbox-label',\n )}\n >\n <input\n checked={this.selectedPaths[facetChild.path]}\n onChange={(_event: Event) =>\n this.handleCheckboxChange(facetChild.path)\n }\n type='checkbox'\n />\n {isChildSelected ? (\n <div\n class={classNames(\n 'dashContainer',\n 'searchcraft-filter-list-dash-container',\n )}\n >\n <searchcraft-dash-icon />\n </div>\n ) : (\n <div\n class={classNames(\n 'checkContainer',\n 'searchcraft-filter-list-check-container',\n )}\n >\n <searchcraft-check-icon />\n </div>\n )}\n {this.formatLabel(facetChild)}\n </label>\n {facetChild.children && facetChild.children.length > 0 && (\n <Fragment>\n {facetChild.children.map((grandchild) => (\n <label\n key={grandchild.path}\n class={classNames(\n 'childFilterCheckboxLabel',\n 'searchcraft-child-filter-checkbox-label',\n )}\n style={{\n display: this.selectedPaths[facetChild.path]\n ? 'flex'\n : 'none',\n }}\n >\n <input\n checked={this.selectedPaths[grandchild.path]}\n onChange={(_event: Event) => {\n this.handleCheckboxChange(grandchild.path);\n }}\n type='checkbox'\n />\n <div\n class={classNames(\n 'checkContainer',\n 'searchcraft-filter-list-check-container',\n )}\n >\n <searchcraft-check-icon />\n </div>\n {this.formatSubLabel(grandchild, facetChild)}\n </label>\n ))}\n </Fragment>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n}\n"]}
@@ -4,27 +4,11 @@ import { getMillis } from "../../utils/utils";
4
4
  export class SearchcraftFilterPanel {
5
5
  constructor() {
6
6
  this.searchStore = useSearchcraftStore.getState();
7
- this.setFilterItemsFromString = (itemsString) => {
8
- if (itemsString) {
9
- try {
10
- const parsedItems = JSON.parse(this.items);
11
- this.filterItems = parsedItems;
12
- }
13
- catch (_a) {
14
- console.error('Error: Invalid items passed to searchcraft-filter-panel.');
15
- }
16
- }
17
- };
18
- this.items = undefined;
7
+ this.items = [];
19
8
  this.unsubscribe = undefined;
20
9
  this.lastQuery = undefined;
21
- this.filterItems = [];
22
- }
23
- onItemsChange(itemsString) {
24
- this.setFilterItemsFromString(itemsString);
25
10
  }
26
- connectedCallback() {
27
- this.setFilterItemsFromString(this.items);
11
+ componentDidLoad() {
28
12
  this.unsubscribe = useSearchcraftStore.subscribe((state) => {
29
13
  if (this.lastQuery !== state.query) {
30
14
  // A place to put actions to do when the query changes
@@ -73,10 +57,10 @@ export class SearchcraftFilterPanel {
73
57
  this.searchStore.search();
74
58
  }
75
59
  /**
76
- * Iterate through filterItems and render them based on `type`
60
+ * Iterate through `items` and render them based on `type`
77
61
  */
78
62
  render() {
79
- return (h("div", { key: 'ca5f6078a1c724e08118a2650adc933e788aee34', class: 'searchcraft-filter-panel' }, this.filterItems.map((filterItem) => {
63
+ return (h("div", { key: '786ebd847aa48e29d4a5c18c7a5d3313bef3904e', class: 'searchcraft-filter-panel' }, this.items.map((filterItem) => {
80
64
  switch (filterItem.type) {
81
65
  case 'dateRange': {
82
66
  const item = filterItem;
@@ -131,12 +115,18 @@ export class SearchcraftFilterPanel {
131
115
  static get properties() {
132
116
  return {
133
117
  "items": {
134
- "type": "string",
118
+ "type": "unknown",
135
119
  "mutable": false,
136
120
  "complexType": {
137
- "original": "string | undefined",
138
- "resolved": "string",
139
- "references": {}
121
+ "original": "FilterItem[]",
122
+ "resolved": "FilterItem[]",
123
+ "references": {
124
+ "FilterItem": {
125
+ "location": "import",
126
+ "path": "../../types/searchcraft-filter-panel.types",
127
+ "id": "src/types/searchcraft-filter-panel.types.ts::FilterItem"
128
+ }
129
+ }
140
130
  },
141
131
  "required": false,
142
132
  "optional": false,
@@ -144,23 +134,15 @@ export class SearchcraftFilterPanel {
144
134
  "tags": [],
145
135
  "text": ""
146
136
  },
147
- "attribute": "items",
148
- "reflect": false
137
+ "defaultValue": "[]"
149
138
  }
150
139
  };
151
140
  }
152
141
  static get states() {
153
142
  return {
154
143
  "unsubscribe": {},
155
- "lastQuery": {},
156
- "filterItems": {}
144
+ "lastQuery": {}
157
145
  };
158
146
  }
159
- static get watchers() {
160
- return [{
161
- "propName": "items",
162
- "methodName": "onItemsChange"
163
- }];
164
- }
165
147
  }
166
148
  //# sourceMappingURL=searchcraft-filter-panel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"searchcraft-filter-panel.js","sourceRoot":"","sources":["../../../../src/components/searchcraft-filter-panel/searchcraft-filter-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Prop, State, Watch } from '@stencil/core';\nimport type {\n FilterItem,\n DateRangeFilterItem,\n NumericFilterItem,\n ExactMatchToggleFilterItem,\n FacetsFilterItem,\n} from '../../types/searchcraft-filter-panel.types';\nimport { useSearchcraftStore } from '@provider/store';\nimport { getMillis } from '@utils/utils';\n\nexport interface ScInputCustomEvent<T> extends CustomEvent<T> {\n detail: T;\n target: HTMLSearchcraftInputElement;\n}\n\n@Component({\n tag: 'searchcraft-filter-panel',\n styleUrl: 'searchcraft-filter-panel.module.scss',\n shadow: false,\n})\nexport class SearchcraftFilterPanel {\n @Prop() items: string | undefined;\n\n @State() unsubscribe: (() => void) | undefined;\n @State() lastQuery: string | undefined;\n @State() filterItems: FilterItem[] = [];\n\n private searchStore = useSearchcraftStore.getState();\n private setFilterItemsFromString = (itemsString: string) => {\n if (itemsString) {\n try {\n const parsedItems = JSON.parse(this.items) as FilterItem[];\n this.filterItems = parsedItems;\n } catch {\n console.error(\n 'Error: Invalid items passed to searchcraft-filter-panel.',\n );\n }\n }\n };\n\n @Watch('items')\n onItemsChange(itemsString: string) {\n this.setFilterItemsFromString(itemsString);\n }\n\n connectedCallback() {\n this.setFilterItemsFromString(this.items);\n\n this.unsubscribe = useSearchcraftStore.subscribe((state) => {\n if (this.lastQuery !== state.query) {\n // A place to put actions to do when the query changes\n }\n this.lastQuery = state.query || '';\n });\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n }\n\n handleDateRangeChanged(fieldName: string, min: number, max: number) {\n const start = new Date(min);\n const end = new Date(max);\n this.searchStore.addRangeValueForIndexField({\n fieldName,\n value: `${fieldName}:[${start.toISOString()} TO ${end.toISOString()}]`,\n });\n\n this.searchStore.search();\n }\n\n handleNumericRangeChanged(fieldName: string, min: number, max: number) {\n this.searchStore.addRangeValueForIndexField({\n fieldName,\n value: `${fieldName}:[${min} TO ${max}]`,\n });\n this.searchStore.search();\n }\n\n handleFacetSelectionUpdated(fieldName: string, paths: string[]) {\n if (paths.length > 0) {\n this.searchStore.addFacetPathsForIndexField({\n fieldName,\n value: `${fieldName}: IN [${paths.join(' ')}]`,\n });\n } else {\n this.searchStore.removeFacetPathsForIndexField(fieldName);\n }\n this.searchStore.search();\n }\n\n handleExactMatchToggleUpdated(isActive: boolean) {\n this.searchStore.setSearchMode(isActive ? 'normal' : 'fuzzy');\n this.searchStore.search();\n }\n\n handleMostRecentToggleUpdated(isActive: boolean) {\n this.searchStore.setSortType(isActive ? 'desc' : 'asc');\n this.searchStore.search();\n }\n\n /**\n * Iterate through filterItems and render them based on `type`\n */\n render() {\n return (\n <div class='searchcraft-filter-panel'>\n {this.filterItems.map((filterItem) => {\n switch (filterItem.type) {\n case 'dateRange': {\n const item = filterItem as DateRangeFilterItem;\n const min = new Date(item.options.minDate).getTime();\n const max = new Date(item.options.maxDate).getTime();\n const granularityValue = getMillis(item.options.granularity);\n // return date range slider\n return (\n <div class='searchcraft-filter-panel-section'>\n <p class='searchcraft-filter-panel-label'>\n {filterItem.label}\n </p>\n <searchcraft-slider\n min={min}\n max={max}\n granularity={granularityValue}\n dataType='date'\n onRangeChanged={(event) => {\n this.handleDateRangeChanged(\n item.fieldName,\n event.detail.startValue,\n event.detail.endValue,\n );\n }}\n />\n </div>\n );\n }\n case 'numericRange': {\n const item = filterItem as NumericFilterItem;\n // return date range slider\n return (\n <div class='searchcraft-filter-panel-section'>\n <p class='searchcraft-filter-panel-label'>\n {filterItem.label}\n </p>\n <searchcraft-slider\n min={item.options.min}\n max={item.options.max}\n granularity={item.options.granularity}\n onRangeChanged={(event) => {\n this.handleNumericRangeChanged(\n item.fieldName,\n event.detail.startValue,\n event.detail.endValue,\n );\n }}\n />\n </div>\n );\n }\n case 'facets': {\n const item = filterItem as FacetsFilterItem;\n // return \"filters-list\"\n return (\n <div class='searchcraft-filter-panel-section'>\n <p class='searchcraft-filter-panel-label'>\n {filterItem.label}\n </p>\n <searchcraft-facet-list\n fieldName={item.fieldName}\n onFacetSelectionUpdated={(event) => {\n this.handleFacetSelectionUpdated(\n item.fieldName,\n event.detail.paths,\n );\n }}\n />\n </div>\n );\n }\n case 'exactMatchToggle': {\n const item = filterItem as ExactMatchToggleFilterItem;\n return (\n <searchcraft-toggle-button\n label={item.label}\n subLabel={item.options.subLabel}\n onToggleUpdated={(event) => {\n this.handleExactMatchToggleUpdated(event.detail);\n }}\n />\n );\n }\n case 'mostRecentToggle': {\n const item = filterItem as ExactMatchToggleFilterItem;\n return (\n <searchcraft-toggle-button\n label={item.label}\n subLabel={item.options.subLabel}\n onToggleUpdated={(event) => {\n this.handleMostRecentToggleUpdated(event.detail);\n }}\n />\n );\n }\n }\n })}\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"searchcraft-filter-panel.js","sourceRoot":"","sources":["../../../../src/components/searchcraft-filter-panel/searchcraft-filter-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Prop, State } from '@stencil/core';\nimport type {\n FilterItem,\n DateRangeFilterItem,\n NumericFilterItem,\n ExactMatchToggleFilterItem,\n FacetsFilterItem,\n} from '../../types/searchcraft-filter-panel.types';\nimport { useSearchcraftStore } from '@provider/store';\nimport { getMillis } from '@utils/utils';\n\nexport interface ScInputCustomEvent<T> extends CustomEvent<T> {\n detail: T;\n target: HTMLSearchcraftInputElement;\n}\n\n@Component({\n tag: 'searchcraft-filter-panel',\n styleUrl: 'searchcraft-filter-panel.module.scss',\n shadow: false,\n})\nexport class SearchcraftFilterPanel {\n @Prop() items: FilterItem[] = [];\n\n @State() unsubscribe: (() => void) | undefined;\n @State() lastQuery: string | undefined;\n\n private searchStore = useSearchcraftStore.getState();\n\n componentDidLoad() {\n this.unsubscribe = useSearchcraftStore.subscribe((state) => {\n if (this.lastQuery !== state.query) {\n // A place to put actions to do when the query changes\n }\n this.lastQuery = state.query || '';\n });\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n }\n\n handleDateRangeChanged(fieldName: string, min: number, max: number) {\n const start = new Date(min);\n const end = new Date(max);\n this.searchStore.addRangeValueForIndexField({\n fieldName,\n value: `${fieldName}:[${start.toISOString()} TO ${end.toISOString()}]`,\n });\n\n this.searchStore.search();\n }\n\n handleNumericRangeChanged(fieldName: string, min: number, max: number) {\n this.searchStore.addRangeValueForIndexField({\n fieldName,\n value: `${fieldName}:[${min} TO ${max}]`,\n });\n this.searchStore.search();\n }\n\n handleFacetSelectionUpdated(fieldName: string, paths: string[]) {\n if (paths.length > 0) {\n this.searchStore.addFacetPathsForIndexField({\n fieldName,\n value: `${fieldName}: IN [${paths.join(' ')}]`,\n });\n } else {\n this.searchStore.removeFacetPathsForIndexField(fieldName);\n }\n this.searchStore.search();\n }\n\n handleExactMatchToggleUpdated(isActive: boolean) {\n this.searchStore.setSearchMode(isActive ? 'normal' : 'fuzzy');\n this.searchStore.search();\n }\n\n handleMostRecentToggleUpdated(isActive: boolean) {\n this.searchStore.setSortType(isActive ? 'desc' : 'asc');\n this.searchStore.search();\n }\n\n /**\n * Iterate through `items` and render them based on `type`\n */\n render() {\n return (\n <div class='searchcraft-filter-panel'>\n {this.items.map((filterItem) => {\n switch (filterItem.type) {\n case 'dateRange': {\n const item = filterItem as DateRangeFilterItem;\n const min = new Date(item.options.minDate).getTime();\n const max = new Date(item.options.maxDate).getTime();\n const granularityValue = getMillis(item.options.granularity);\n // return date range slider\n return (\n <div class='searchcraft-filter-panel-section'>\n <p class='searchcraft-filter-panel-label'>\n {filterItem.label}\n </p>\n <searchcraft-slider\n min={min}\n max={max}\n granularity={granularityValue}\n dataType='date'\n onRangeChanged={(event) => {\n this.handleDateRangeChanged(\n item.fieldName,\n event.detail.startValue,\n event.detail.endValue,\n );\n }}\n />\n </div>\n );\n }\n case 'numericRange': {\n const item = filterItem as NumericFilterItem;\n // return date range slider\n return (\n <div class='searchcraft-filter-panel-section'>\n <p class='searchcraft-filter-panel-label'>\n {filterItem.label}\n </p>\n <searchcraft-slider\n min={item.options.min}\n max={item.options.max}\n granularity={item.options.granularity}\n onRangeChanged={(event) => {\n this.handleNumericRangeChanged(\n item.fieldName,\n event.detail.startValue,\n event.detail.endValue,\n );\n }}\n />\n </div>\n );\n }\n case 'facets': {\n const item = filterItem as FacetsFilterItem;\n // return \"filters-list\"\n return (\n <div class='searchcraft-filter-panel-section'>\n <p class='searchcraft-filter-panel-label'>\n {filterItem.label}\n </p>\n <searchcraft-facet-list\n fieldName={item.fieldName}\n onFacetSelectionUpdated={(event) => {\n this.handleFacetSelectionUpdated(\n item.fieldName,\n event.detail.paths,\n );\n }}\n />\n </div>\n );\n }\n case 'exactMatchToggle': {\n const item = filterItem as ExactMatchToggleFilterItem;\n return (\n <searchcraft-toggle-button\n label={item.label}\n subLabel={item.options.subLabel}\n onToggleUpdated={(event) => {\n this.handleExactMatchToggleUpdated(event.detail);\n }}\n />\n );\n }\n case 'mostRecentToggle': {\n const item = filterItem as ExactMatchToggleFilterItem;\n return (\n <searchcraft-toggle-button\n label={item.label}\n subLabel={item.options.subLabel}\n onToggleUpdated={(event) => {\n this.handleMostRecentToggleUpdated(event.detail);\n }}\n />\n );\n }\n }\n })}\n </div>\n );\n }\n}\n"]}
@@ -3,24 +3,36 @@ import { getMillis } from "../../utils/utils";
3
3
  import classNames from "classnames";
4
4
  export class SearchcraftSlider {
5
5
  constructor() {
6
- this.updateValues = async () => {
6
+ this.emitUpdate = async () => {
7
7
  this.rangeChanged.emit({
8
8
  startValue: this.startValue,
9
9
  endValue: this.endValue,
10
10
  });
11
11
  };
12
- this.handlestartValueChange = (event) => {
13
- const value = Number.parseInt(event.target.value, 10);
12
+ this.handleStartValueChange = (event) => {
13
+ const inputElement = event.target;
14
+ const value = Number.parseInt(inputElement.value, 10);
15
+ this.lastFocusedHandle = 'min';
14
16
  if (value <= this.endValue) {
15
17
  this.startValue = value;
16
- this.updateValues();
18
+ this.emitUpdate();
19
+ }
20
+ else {
21
+ this.startValue = this.endValue;
22
+ inputElement.value = `${this.endValue}`;
17
23
  }
18
24
  };
19
- this.handleendValueChange = (event) => {
20
- const value = Number.parseInt(event.target.value, 10);
25
+ this.handleEndValueChange = (event) => {
26
+ const inputElement = event.target;
27
+ const value = Number.parseInt(inputElement.value, 10);
28
+ this.lastFocusedHandle = 'max';
21
29
  if (value >= this.startValue) {
22
30
  this.endValue = value;
23
- this.updateValues();
31
+ this.emitUpdate();
32
+ }
33
+ else {
34
+ this.endValue = this.startValue;
35
+ inputElement.value = `${this.startValue}`;
24
36
  }
25
37
  };
26
38
  this.max = 100;
@@ -29,9 +41,7 @@ export class SearchcraftSlider {
29
41
  this.dataType = 'number';
30
42
  this.endValue = this.max;
31
43
  this.startValue = this.min;
32
- this.hasSearched = false;
33
- this.query = '';
34
- this.resultsCount = 0;
44
+ this.lastFocusedHandle = 'max';
35
45
  }
36
46
  componentDidLoad() {
37
47
  this.startValue = this.min;
@@ -48,10 +58,10 @@ export class SearchcraftSlider {
48
58
  const endLabel = this.dataType === 'number'
49
59
  ? this.endValue
50
60
  : new Date(this.endValue).getFullYear();
51
- return (h("div", { key: '5b85ed684719fc53cb2c6d4d6b9b25dda95238c4', class: classNames('sliderContainer', 'searchcraft-slider-container') }, h("div", { key: '4222101284dc36c5fc70f033fbdd5080e4c25f41', class: classNames('rangeContainer', 'searchcraft-slider-range-container') }, h("div", { key: '8610d8fbdd7c920e93969d588d75e4b1266d24a9', class: classNames('activeRange', 'searchcraft-slider-active-range'), style: {
61
+ return (h("div", { key: 'f05bc14a425c9e302cd0aad174af7e80a553258e', class: 'searchcraft-slider-container' }, h("div", { key: 'e52983353639e1c5b695772d55148daa25b48845', class: 'searchcraft-slider-range-container' }, h("div", { key: '9f7d5601f056a75bfd8f5ef9053a21a4931c8b1c', class: 'searchcraft-slider-active-range', style: {
52
62
  left: `${startPercent}%`,
53
63
  width: `${endPercent - startPercent}%`,
54
- } }), h("input", { key: 'aafc7ecf347131e8f86bce144d046ca33d3ce7a9', class: classNames('rangeSlider', 'searchcraft-slider-range-slider-start-thumb'), max: this.max, min: this.min, onInput: this.handlestartValueChange, step: this.granularity, type: 'range', value: this.startValue }), h("input", { key: '8247c65541d1fe70ac078d4f3ddf9111919750e7', class: classNames('rangeSlider', 'searchcraft-slider-range-slider-end-thumb'), max: this.max, min: this.min, onInput: this.handleendValueChange, step: this.granularity, type: 'range', value: this.endValue })), h("div", { key: '43f708034b96d7683dea2c60c95b1689bce47ad5', class: classNames('yearLabels', 'searchcraft-slider-year-label-container') }, h("span", { key: '39c5a9f41c9ddc87f81cb7fc488fdc61afd82ae6', class: classNames('yearLabel', 'searchcraft-slider-start-year-label') }, startLabel), h("span", { key: '536fb604734b109318f3b4da38743c00581f369a', class: classNames('yearLabel', 'searchcraft-slider-end-year-label') }, endLabel))));
64
+ } }), h("input", { key: 'c7816c75212e3573ec35171557b79c9de1da60f9', class: classNames('searchcraft-slider-input', 'searchcraft-slider-input-min-handle'), max: this.max, min: this.min, onInput: this.handleStartValueChange.bind(this), step: this.granularity, style: { zIndex: this.lastFocusedHandle === 'min' ? '2' : '1' }, type: 'range', value: this.startValue }), h("input", { key: '0fe6e721448b99899f6875d05789399f862cb82e', class: classNames('searchcraft-slider-input', 'searchcraft-slider-input-max-handle'), max: this.max, min: this.min, onInput: this.handleEndValueChange.bind(this), step: this.granularity, style: { zIndex: this.lastFocusedHandle === 'max' ? '2' : '1' }, type: 'range', value: this.endValue })), h("div", { key: 'fdf17ab7c1322824bbd94de96b223d3e2ceddfc8', class: 'searchcraft-slider-label-container' }, h("span", { key: 'e7ddfd13f5d258a995bb824e9b26a492e5ca4f32', class: 'searchcraft-slider-label' }, startLabel), h("span", { key: '67d6f9ea4e8fa7f651c9e9cafb624996df1676ea', class: 'searchcraft-slider-label' }, endLabel))));
55
65
  }
56
66
  static get is() { return "searchcraft-slider"; }
57
67
  static get originalStyleUrls() {
@@ -144,9 +154,7 @@ export class SearchcraftSlider {
144
154
  return {
145
155
  "endValue": {},
146
156
  "startValue": {},
147
- "hasSearched": {},
148
- "query": {},
149
- "resultsCount": {}
157
+ "lastFocusedHandle": {}
150
158
  };
151
159
  }
152
160
  static get events() {
@@ -1 +1 @@
1
- {"version":3,"file":"searchcraft-slider.js","sourceRoot":"","sources":["../../../../src/components/searchcraft-slider/searchcraft-slider.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Event,\n type EventEmitter,\n h,\n State,\n Prop,\n} from '@stencil/core';\nimport { getMillis } from '@utils/utils';\nimport classNames from 'classnames';\n\n@Component({\n tag: 'searchcraft-slider',\n styleUrl: 'searchcraft-slider.module.scss',\n shadow: false,\n})\nexport class SearchcraftSlider {\n @Prop() max = 100;\n @Prop() min = 0;\n @Prop() granularity: number = getMillis('month');\n @Prop() dataType: 'number' | 'date' = 'number';\n\n @State() endValue = this.max;\n @State() startValue = this.min;\n @State() hasSearched = false;\n @State() query = '';\n @State() resultsCount = 0;\n\n @Event() rangeChanged: EventEmitter<{ startValue: number; endValue: number }>;\n\n componentDidLoad() {\n this.startValue = this.min;\n this.endValue = this.max;\n }\n\n private updateValues = async () => {\n this.rangeChanged.emit({\n startValue: this.startValue,\n endValue: this.endValue,\n });\n };\n\n private handlestartValueChange = (event: InputEvent) => {\n const value = Number.parseInt((event.target as HTMLInputElement).value, 10);\n if (value <= this.endValue) {\n this.startValue = value;\n this.updateValues();\n }\n };\n\n private handleendValueChange = (event: InputEvent) => {\n const value = Number.parseInt((event.target as HTMLInputElement).value, 10);\n if (value >= this.startValue) {\n this.endValue = value;\n this.updateValues();\n }\n };\n\n render() {\n const rangeMin = this.min;\n const rangeMax = this.max;\n const startPercent =\n ((this.startValue - rangeMin) / (rangeMax - rangeMin)) * 100;\n const endPercent =\n ((this.endValue - rangeMin) / (rangeMax - rangeMin)) * 100;\n\n const startLabel =\n this.dataType === 'number'\n ? this.startValue\n : new Date(this.startValue).getFullYear();\n\n const endLabel =\n this.dataType === 'number'\n ? this.endValue\n : new Date(this.endValue).getFullYear();\n\n return (\n <div\n class={classNames('sliderContainer', 'searchcraft-slider-container')}\n >\n <div\n class={classNames(\n 'rangeContainer',\n 'searchcraft-slider-range-container',\n )}\n >\n <div\n class={classNames('activeRange', 'searchcraft-slider-active-range')}\n style={{\n left: `${startPercent}%`,\n width: `${endPercent - startPercent}%`,\n }}\n />\n <input\n class={classNames(\n 'rangeSlider',\n 'searchcraft-slider-range-slider-start-thumb',\n )}\n max={this.max}\n min={this.min}\n onInput={this.handlestartValueChange}\n step={this.granularity}\n type='range'\n value={this.startValue}\n />\n <input\n class={classNames(\n 'rangeSlider',\n 'searchcraft-slider-range-slider-end-thumb',\n )}\n max={this.max}\n min={this.min}\n onInput={this.handleendValueChange}\n step={this.granularity}\n type='range'\n value={this.endValue}\n />\n </div>\n <div\n class={classNames(\n 'yearLabels',\n 'searchcraft-slider-year-label-container',\n )}\n >\n <span\n class={classNames(\n 'yearLabel',\n 'searchcraft-slider-start-year-label',\n )}\n >\n {startLabel}\n </span>\n <span\n class={classNames('yearLabel', 'searchcraft-slider-end-year-label')}\n >\n {endLabel}\n </span>\n </div>\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"searchcraft-slider.js","sourceRoot":"","sources":["../../../../src/components/searchcraft-slider/searchcraft-slider.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Event,\n type EventEmitter,\n h,\n State,\n Prop,\n} from '@stencil/core';\nimport { getMillis } from '@utils/utils';\nimport classNames from 'classnames';\n\n@Component({\n tag: 'searchcraft-slider',\n styleUrl: 'searchcraft-slider.module.scss',\n shadow: false,\n})\nexport class SearchcraftSlider {\n @Prop() max = 100;\n @Prop() min = 0;\n @Prop() granularity: number = getMillis('month');\n @Prop() dataType: 'number' | 'date' = 'number';\n\n @State() endValue = this.max;\n @State() startValue = this.min;\n @State() lastFocusedHandle: 'min' | 'max' = 'max';\n\n @Event() rangeChanged: EventEmitter<{ startValue: number; endValue: number }>;\n\n componentDidLoad() {\n this.startValue = this.min;\n this.endValue = this.max;\n }\n\n private emitUpdate = async () => {\n this.rangeChanged.emit({\n startValue: this.startValue,\n endValue: this.endValue,\n });\n };\n\n private handleStartValueChange = (event: InputEvent) => {\n const inputElement = event.target as HTMLInputElement;\n const value = Number.parseInt(inputElement.value, 10);\n this.lastFocusedHandle = 'min';\n if (value <= this.endValue) {\n this.startValue = value;\n this.emitUpdate();\n } else {\n this.startValue = this.endValue;\n inputElement.value = `${this.endValue}`;\n }\n };\n\n private handleEndValueChange = (event: InputEvent) => {\n const inputElement = event.target as HTMLInputElement;\n const value = Number.parseInt(inputElement.value, 10);\n this.lastFocusedHandle = 'max';\n if (value >= this.startValue) {\n this.endValue = value;\n this.emitUpdate();\n } else {\n this.endValue = this.startValue;\n inputElement.value = `${this.startValue}`;\n }\n };\n\n render() {\n const rangeMin = this.min;\n const rangeMax = this.max;\n const startPercent =\n ((this.startValue - rangeMin) / (rangeMax - rangeMin)) * 100;\n const endPercent =\n ((this.endValue - rangeMin) / (rangeMax - rangeMin)) * 100;\n\n const startLabel =\n this.dataType === 'number'\n ? this.startValue\n : new Date(this.startValue).getFullYear();\n\n const endLabel =\n this.dataType === 'number'\n ? this.endValue\n : new Date(this.endValue).getFullYear();\n\n return (\n <div class='searchcraft-slider-container'>\n <div class='searchcraft-slider-range-container'>\n <div\n class='searchcraft-slider-active-range'\n style={{\n left: `${startPercent}%`,\n width: `${endPercent - startPercent}%`,\n }}\n />\n <input\n class={classNames(\n 'searchcraft-slider-input',\n 'searchcraft-slider-input-min-handle',\n )}\n max={this.max}\n min={this.min}\n onInput={this.handleStartValueChange.bind(this)}\n step={this.granularity}\n style={{ zIndex: this.lastFocusedHandle === 'min' ? '2' : '1' }}\n type='range'\n value={this.startValue}\n />\n <input\n class={classNames(\n 'searchcraft-slider-input',\n 'searchcraft-slider-input-max-handle',\n )}\n max={this.max}\n min={this.min}\n onInput={this.handleEndValueChange.bind(this)}\n step={this.granularity}\n style={{ zIndex: this.lastFocusedHandle === 'max' ? '2' : '1' }}\n type='range'\n value={this.endValue}\n />\n </div>\n <div class='searchcraft-slider-label-container'>\n <span class='searchcraft-slider-label'>{startLabel}</span>\n <span class='searchcraft-slider-label'>{endLabel}</span>\n </div>\n </div>\n );\n }\n}\n"]}
@@ -97,7 +97,7 @@
97
97
  --sc-body-small-font-weight: 400;
98
98
  }
99
99
 
100
- .sliderContainer {
100
+ .searchcraft-slider-container {
101
101
  align-items: center;
102
102
  display: flex;
103
103
  flex-direction: column;
@@ -105,7 +105,7 @@
105
105
  width: 100%;
106
106
  }
107
107
 
108
- .rangeContainer {
108
+ .searchcraft-slider-range-container {
109
109
  align-items: center;
110
110
  background-color: var(--sc-surface-disabled);
111
111
  border-radius: 999px;
@@ -114,10 +114,10 @@
114
114
  height: 4px;
115
115
  width: 100%;
116
116
  }
117
- .rangeContainer::-webkit-slider-runnable-track {
117
+ .searchcraft-slider-range-container::-webkit-slider-runnable-track {
118
118
  pointer-events: none;
119
119
  }
120
- .rangeContainer .activeRange {
120
+ .searchcraft-slider-range-container .searchcraft-slider-active-range {
121
121
  background-color: var(--sc-surface-brand-primary);
122
122
  border-radius: 2px;
123
123
  height: 4px;
@@ -126,13 +126,13 @@
126
126
  transform: translateY(-50%);
127
127
  z-index: 0;
128
128
  }
129
- .rangeContainer .activeRange::-webkit-slider-runnable-track {
129
+ .searchcraft-slider-range-container .searchcraft-slider-active-range::-webkit-slider-runnable-track {
130
130
  pointer-events: none;
131
131
  }
132
- .rangeContainer .activeRange::-moz-range-track {
132
+ .searchcraft-slider-range-container .searchcraft-slider-active-range::-moz-range-track {
133
133
  pointer-events: none;
134
134
  }
135
- .rangeContainer .rangeSlider {
135
+ .searchcraft-slider-range-container .searchcraft-slider-input {
136
136
  appearance: none;
137
137
  background: transparent;
138
138
  border-radius: 2px;
@@ -144,7 +144,7 @@
144
144
  width: 100%;
145
145
  -webkit-appearance: none;
146
146
  }
147
- .rangeContainer .rangeSlider::-webkit-slider-thumb {
147
+ .searchcraft-slider-range-container .searchcraft-slider-input::-webkit-slider-thumb {
148
148
  background-color: var(--sc-surface-neutral-light);
149
149
  border-radius: 50%;
150
150
  border: 2px solid var(--sc-border-neutral);
@@ -154,7 +154,7 @@
154
154
  width: 20px;
155
155
  -webkit-appearance: none;
156
156
  }
157
- .rangeContainer .rangeSlider::-moz-range-thumb {
157
+ .searchcraft-slider-range-container .searchcraft-slider-input::-moz-range-thumb {
158
158
  background-color: var(--sc-surface-neutral-light);
159
159
  border-radius: 50%;
160
160
  border: 2px solid var(--sc-border-neutral);
@@ -164,7 +164,7 @@
164
164
  width: 20px;
165
165
  }
166
166
 
167
- .yearLabels {
167
+ .searchcraft-slider-label-container {
168
168
  color: var(--sc-content-primary);
169
169
  display: flex;
170
170
  font-family: "Source Sans Pro", sans-serif;
@@ -175,7 +175,7 @@
175
175
  width: 100%;
176
176
  }
177
177
 
178
- .yearLabel {
178
+ .searchcraft-slider-label {
179
179
  min-width: 30px;
180
180
  text-align: center;
181
181
  }
@@ -1,3 +1,4 @@
1
+ import { useSearchcraftStore } from "../../provider/store";
1
2
  import { h, } from "@stencil/core";
2
3
  import classNames from "classnames";
3
4
  export class SearchcraftToggleButton {
@@ -9,11 +10,26 @@ export class SearchcraftToggleButton {
9
10
  this.label = 'Toggle';
10
11
  this.subLabel = undefined;
11
12
  this.isActive = false;
13
+ this.unsubscribe = undefined;
14
+ this.lastQuery = undefined;
15
+ }
16
+ connectedCallback() {
17
+ /** When the query changes, sets toggle button state back to inactive. */
18
+ this.unsubscribe = useSearchcraftStore.subscribe((state) => {
19
+ if (state.query !== this.lastQuery) {
20
+ this.isActive = false;
21
+ this.lastQuery = state.query;
22
+ }
23
+ });
24
+ }
25
+ disconnectedCallback() {
26
+ var _a;
27
+ (_a = this.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(this);
12
28
  }
13
29
  render() {
14
- return (h("div", { key: 'd22c50dcf65d66208bd0ee78c88f452ba94c96e1', class: 'searchcraft-toggle-button-container' }, h("div", { key: 'c7309a315b979c1bc68b140f4e3d250fdb208e37' }, h("p", { key: '2a22fc2b52f73a5fe79512c4e3ed105110a514cd', class: 'searchcraft-toggle-button-label' }, this.label), this.subLabel && (h("p", { key: '8c1670c628751c19576ff9f8cf4bad71b974fb4f', class: 'searchcraft-toggle-button-sub-label' }, this.subLabel))), h("button", { key: '10600dd271917d074bf4d1e8dea473b583c79031', class: classNames('searchcraft-toggle-button-background', {
30
+ return (h("div", { key: 'e6d23071452a4a01b95a45748860df7737735c83', class: 'searchcraft-toggle-button-container' }, h("div", { key: '3d87cd576368065c7fe8d3b50daef9c67c04253e' }, h("p", { key: '06d1f349c9132e6a9762d777e3f90c635852e4a1', class: 'searchcraft-toggle-button-label' }, this.label), this.subLabel && (h("p", { key: '9bf361bdb33977a089d9364822c9c11b846b59a5', class: 'searchcraft-toggle-button-sub-label' }, this.subLabel))), h("button", { key: 'bb8f27eecb9fe8d5dde237f81d04c3e79a7ec87b', class: classNames('searchcraft-toggle-button-background', {
15
31
  active: this.isActive,
16
- }), onClick: this.handleToggle, type: 'button' }, h("div", { key: '3cd18a77345001252c700d6b1ca3f34b9e7e849d', class: classNames('searchcraft-toggle-button-handle', {
32
+ }), onClick: this.handleToggle, type: 'button' }, h("div", { key: 'd4be7cc5fbadfc28e97c4dfada15236b7be2fda0', class: classNames('searchcraft-toggle-button-handle', {
17
33
  active: this.isActive,
18
34
  }) }))));
19
35
  }
@@ -69,7 +85,9 @@ export class SearchcraftToggleButton {
69
85
  }
70
86
  static get states() {
71
87
  return {
72
- "isActive": {}
88
+ "isActive": {},
89
+ "unsubscribe": {},
90
+ "lastQuery": {}
73
91
  };
74
92
  }
75
93
  static get events() {
@@ -1 +1 @@
1
- {"version":3,"file":"searchcraft-toggle-button.js","sourceRoot":"","sources":["../../../../src/components/searchcraft-toggle-button/searchcraft-toggle-button.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,EACL,CAAC,EACD,IAAI,EACJ,KAAK,GAEN,MAAM,eAAe,CAAC;AACvB,OAAO,UAAU,MAAM,YAAY,CAAC;AAMpC,MAAM,OAAO,uBAAuB;;QAa1B,iBAAY,GAAG,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC;qBAVc,QAAQ;;wBAKJ,KAAK;;IAOzB,MAAM;QACJ,OAAO,CACL,4DAAK,KAAK,EAAC,qCAAqC;YAC9C;gBACE,0DAAG,KAAK,EAAC,iCAAiC,IAAE,IAAI,CAAC,KAAK,CAAK;gBAC1D,IAAI,CAAC,QAAQ,IAAI,CAChB,0DAAG,KAAK,EAAC,qCAAqC,IAAE,IAAI,CAAC,QAAQ,CAAK,CACnE,CACG;YACN,+DACE,KAAK,EAAE,UAAU,CAAC,sCAAsC,EAAE;oBACxD,MAAM,EAAE,IAAI,CAAC,QAAQ;iBACtB,CAAC,EACF,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,IAAI,EAAC,QAAQ;gBAEb,4DACE,KAAK,EAAE,UAAU,CAAC,kCAAkC,EAAE;wBACpD,MAAM,EAAE,IAAI,CAAC,QAAQ;qBACtB,CAAC,GACF,CACK,CACL,CACP,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import {\n Component,\n Event,\n h,\n Prop,\n State,\n type EventEmitter,\n} from '@stencil/core';\nimport classNames from 'classnames';\n@Component({\n tag: 'searchcraft-toggle-button',\n styleUrl: 'searchcraft-toggle-button.module.scss',\n shadow: false,\n})\nexport class SearchcraftToggleButton {\n /**\n * Type of the toggle - determines what it controls\n * 'mode': toggles between 'fuzzy' and 'normal'\n * 'sort': toggles between 'asc' and 'desc'\n */\n @Prop() label = 'Toggle';\n @Prop() subLabel: string | undefined;\n\n @Event() toggleUpdated: EventEmitter<boolean>;\n\n @State() isActive = false;\n\n private handleToggle = async () => {\n this.isActive = !this.isActive;\n this.toggleUpdated.emit(this.isActive);\n };\n\n render() {\n return (\n <div class='searchcraft-toggle-button-container'>\n <div>\n <p class='searchcraft-toggle-button-label'>{this.label}</p>\n {this.subLabel && (\n <p class='searchcraft-toggle-button-sub-label'>{this.subLabel}</p>\n )}\n </div>\n <button\n class={classNames('searchcraft-toggle-button-background', {\n active: this.isActive,\n })}\n onClick={this.handleToggle}\n type='button'\n >\n <div\n class={classNames('searchcraft-toggle-button-handle', {\n active: this.isActive,\n })}\n />\n </button>\n </div>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"searchcraft-toggle-button.js","sourceRoot":"","sources":["../../../../src/components/searchcraft-toggle-button/searchcraft-toggle-button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EACL,SAAS,EACT,KAAK,EACL,CAAC,EACD,IAAI,EACJ,KAAK,GAEN,MAAM,eAAe,CAAC;AACvB,OAAO,UAAU,MAAM,YAAY,CAAC;AAMpC,MAAM,OAAO,uBAAuB;;QAe1B,iBAAY,GAAG,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC;qBAZc,QAAQ;;wBAKJ,KAAK;;;;IASzB,iBAAiB;QACf,yEAAyE;QACzE,IAAI,CAAC,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YACzD,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;;QAClB,MAAA,IAAI,CAAC,WAAW,oDAAI,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,OAAO,CACL,4DAAK,KAAK,EAAC,qCAAqC;YAC9C;gBACE,0DAAG,KAAK,EAAC,iCAAiC,IAAE,IAAI,CAAC,KAAK,CAAK;gBAC1D,IAAI,CAAC,QAAQ,IAAI,CAChB,0DAAG,KAAK,EAAC,qCAAqC,IAAE,IAAI,CAAC,QAAQ,CAAK,CACnE,CACG;YACN,+DACE,KAAK,EAAE,UAAU,CAAC,sCAAsC,EAAE;oBACxD,MAAM,EAAE,IAAI,CAAC,QAAQ;iBACtB,CAAC,EACF,OAAO,EAAE,IAAI,CAAC,YAAY,EAC1B,IAAI,EAAC,QAAQ;gBAEb,4DACE,KAAK,EAAE,UAAU,CAAC,kCAAkC,EAAE;wBACpD,MAAM,EAAE,IAAI,CAAC,QAAQ;qBACtB,CAAC,GACF,CACK,CACL,CACP,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { useSearchcraftStore } from '@provider/store';\nimport {\n Component,\n Event,\n h,\n Prop,\n State,\n type EventEmitter,\n} from '@stencil/core';\nimport classNames from 'classnames';\n@Component({\n tag: 'searchcraft-toggle-button',\n styleUrl: 'searchcraft-toggle-button.module.scss',\n shadow: false,\n})\nexport class SearchcraftToggleButton {\n /**\n * Type of the toggle - determines what it controls\n * 'mode': toggles between 'fuzzy' and 'normal'\n * 'sort': toggles between 'asc' and 'desc'\n */\n @Prop() label = 'Toggle';\n @Prop() subLabel: string | undefined;\n\n @Event() toggleUpdated: EventEmitter<boolean>;\n\n @State() isActive = false;\n @State() unsubscribe: (() => void) | undefined;\n @State() lastQuery: string | undefined;\n\n private handleToggle = async () => {\n this.isActive = !this.isActive;\n this.toggleUpdated.emit(this.isActive);\n };\n\n connectedCallback() {\n /** When the query changes, sets toggle button state back to inactive. */\n this.unsubscribe = useSearchcraftStore.subscribe((state) => {\n if (state.query !== this.lastQuery) {\n this.isActive = false;\n this.lastQuery = state.query;\n }\n });\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n }\n\n render() {\n return (\n <div class='searchcraft-toggle-button-container'>\n <div>\n <p class='searchcraft-toggle-button-label'>{this.label}</p>\n {this.subLabel && (\n <p class='searchcraft-toggle-button-sub-label'>{this.subLabel}</p>\n )}\n </div>\n <button\n class={classNames('searchcraft-toggle-button-background', {\n active: this.isActive,\n })}\n onClick={this.handleToggle}\n type='button'\n >\n <div\n class={classNames('searchcraft-toggle-button-handle', {\n active: this.isActive,\n })}\n />\n </button>\n </div>\n );\n }\n}\n"]}
@@ -59,11 +59,17 @@ const useSearchcraftStore = create((set, get) => {
59
59
  searchResults: null,
60
60
  facets: null,
61
61
  getSearchcraftInstance: () => searchcraft,
62
- searchParams: {
63
- mode: 'fuzzy',
64
- sort: 'asc',
62
+ setQuery: (query) => {
63
+ /**
64
+ * When a new query is set, also reset the sort type, search mode, and facet paths.
65
+ */
66
+ set({
67
+ query,
68
+ facetPathsForIndexFields: {},
69
+ searchMode: 'fuzzy',
70
+ sortType: 'asc',
71
+ });
65
72
  },
66
- setQuery: (query) => set({ query, facetPathsForIndexFields: {} }),
67
73
  setSearchResults: (results) => set({ searchResults: results }),
68
74
  setFacets: (facets) => set({ facets }),
69
75
  setIsRequesting: (isRequesting) => set({ isRequesting }),