@searchcraft/javascript-sdk 0.13.2 → 0.13.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/components/defineCustomElements.js +23 -23
- package/dist/components/html.js +1 -1
- package/dist/components/index.d.ts +109 -0
- package/dist/components/index.js +28 -28
- package/dist/components/index2.js +12 -1
- package/dist/components/index2.js.map +1 -1
- package/dist/components/searchcraft-ad.js +1 -1
- package/dist/components/searchcraft-ad2.js +4 -4
- package/dist/components/searchcraft-button.js +1 -1
- package/dist/components/searchcraft-button2.js +2 -2
- package/dist/components/searchcraft-error-message.js +1 -1
- package/dist/components/searchcraft-error-message2.js +1 -1
- package/dist/components/searchcraft-facet-list.js +1 -1
- package/dist/components/searchcraft-facet-list2.js +59 -4
- package/dist/components/searchcraft-facet-list2.js.map +1 -1
- package/dist/components/searchcraft-filter-panel.js +38 -6
- package/dist/components/searchcraft-filter-panel.js.map +1 -1
- package/dist/components/searchcraft-input-form.js +1 -1
- package/dist/components/searchcraft-input-form2.js +6 -6
- package/dist/components/searchcraft-input-label.js +1 -1
- package/dist/components/searchcraft-input-label2.js +2 -2
- package/dist/components/searchcraft-loading.js +1 -1
- package/dist/components/searchcraft-loading2.js +1 -1
- package/dist/components/searchcraft-pagination.js +49 -4
- package/dist/components/searchcraft-pagination.js.map +1 -1
- package/dist/components/searchcraft-popover-button.js +3 -3
- package/dist/components/searchcraft-popover-footer.js +1 -1
- package/dist/components/searchcraft-popover-footer2.js +3 -3
- package/dist/components/searchcraft-popover-form.js +11 -11
- package/dist/components/searchcraft-popover-list-item.js +1 -1
- package/dist/components/searchcraft-popover-list-item2.js +3 -3
- package/dist/components/searchcraft-popover-list-view.js +1 -1
- package/dist/components/searchcraft-popover-list-view2.js +4 -4
- package/dist/components/searchcraft-results-info.js +4 -4
- package/dist/components/searchcraft-search-result.js +1 -1
- package/dist/components/searchcraft-search-result2.js +3 -3
- package/dist/components/searchcraft-search-results-per-page.js +3 -3
- package/dist/components/searchcraft-search-results.js +5 -5
- package/dist/components/searchcraft-select.js +1 -1
- package/dist/components/searchcraft-select2.js +1 -1
- package/dist/components/searchcraft-slider.js +1 -1
- package/dist/components/searchcraft-slider2.js +3 -3
- package/dist/components/searchcraft-summary-box.js +4 -4
- package/dist/components/searchcraft-theme.js +2 -2
- package/dist/components/searchcraft-theme.js.map +1 -1
- package/dist/components/searchcraft-toggle-button.js +1 -1
- package/dist/components/searchcraft-toggle-button2.js +3 -3
- package/dist/hydrate/index.js +168 -5
- package/dist/hydrate/index.mjs +168 -5
- package/dist/themes/hologram.css +1 -1
- package/dist/themes/hologram.css.map +1 -1
- package/dist/types/components/searchcraft-facet-list/searchcraft-facet-list.d.ts +47 -0
- package/dist/types/components/searchcraft-pagination/searchcraft-pagination.d.ts +9 -0
- package/dist/types/components.d.ts +96 -0
- package/dist/types/types/sdk-types/searchcraft-filter-panel.types.d.ts +13 -0
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SearchcraftPopoverListItemAd, d as defineCustomElement$1 } from './searchcraft-ad2.js?v=0.13.
|
|
1
|
+
import { S as SearchcraftPopoverListItemAd, d as defineCustomElement$1 } from './searchcraft-ad2.js?v=0.13.3';
|
|
2
2
|
|
|
3
3
|
const SearchcraftAd = SearchcraftPopoverListItemAd;
|
|
4
4
|
const defineCustomElement = defineCustomElement$1;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { p as proxyCustomElement, t as transformTag, H, h } from './index2.js?v=0.13.
|
|
2
|
-
import { c as classNames } from './index3.js?v=0.13.
|
|
3
|
-
import { r as registry } from './CoreInstanceRegistry.js?v=0.13.
|
|
4
|
-
import { h as html } from './html.js?v=0.13.
|
|
1
|
+
import { p as proxyCustomElement, t as transformTag, H, h } from './index2.js?v=0.13.3';
|
|
2
|
+
import { c as classNames } from './index3.js?v=0.13.3';
|
|
3
|
+
import { r as registry } from './CoreInstanceRegistry.js?v=0.13.3';
|
|
4
|
+
import { h as html } from './html.js?v=0.13.3';
|
|
5
5
|
|
|
6
6
|
const urlAlphabet =
|
|
7
7
|
'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SearchcraftButton$1, d as defineCustomElement$1 } from './searchcraft-button2.js?v=0.13.
|
|
1
|
+
import { S as SearchcraftButton$1, d as defineCustomElement$1 } from './searchcraft-button2.js?v=0.13.3';
|
|
2
2
|
|
|
3
3
|
const SearchcraftButton = SearchcraftButton$1;
|
|
4
4
|
const defineCustomElement = defineCustomElement$1;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { p as proxyCustomElement, H, c as createEvent, h, F as Fragment, t as transformTag } from './index2.js?v=0.13.
|
|
2
|
-
import { c as classNames } from './index3.js?v=0.13.
|
|
1
|
+
import { p as proxyCustomElement, H, c as createEvent, h, F as Fragment, t as transformTag } from './index2.js?v=0.13.3';
|
|
2
|
+
import { c as classNames } from './index3.js?v=0.13.3';
|
|
3
3
|
|
|
4
4
|
const SearchcraftButton = /*@__PURE__*/ proxyCustomElement(class SearchcraftButton extends H {
|
|
5
5
|
constructor(registerHost) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SearchcraftErrorMessage$1, d as defineCustomElement$1 } from './searchcraft-error-message2.js?v=0.13.
|
|
1
|
+
import { S as SearchcraftErrorMessage$1, d as defineCustomElement$1 } from './searchcraft-error-message2.js?v=0.13.3';
|
|
2
2
|
|
|
3
3
|
const SearchcraftErrorMessage = SearchcraftErrorMessage$1;
|
|
4
4
|
const defineCustomElement = defineCustomElement$1;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?v=0.13.
|
|
1
|
+
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?v=0.13.3';
|
|
2
2
|
|
|
3
3
|
const SearchcraftErrorMessage = /*@__PURE__*/ proxyCustomElement(class SearchcraftErrorMessage extends H {
|
|
4
4
|
constructor(registerHost) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SearchcraftFacetList$1, d as defineCustomElement$1 } from './searchcraft-facet-list2.js?v=0.13.
|
|
1
|
+
import { S as SearchcraftFacetList$1, d as defineCustomElement$1 } from './searchcraft-facet-list2.js?v=0.13.3';
|
|
2
2
|
|
|
3
3
|
const SearchcraftFacetList = SearchcraftFacetList$1;
|
|
4
4
|
const defineCustomElement = defineCustomElement$1;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { p as proxyCustomElement, H, c as createEvent, h, t as transformTag } from './index2.js?v=0.13.
|
|
2
|
-
import { r as registry } from './CoreInstanceRegistry.js?v=0.13.
|
|
1
|
+
import { p as proxyCustomElement, H, c as createEvent, h, t as transformTag } from './index2.js?v=0.13.3';
|
|
2
|
+
import { r as registry } from './CoreInstanceRegistry.js?v=0.13.3';
|
|
3
3
|
import './purify.es.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -168,6 +168,17 @@ const SearchcraftFacetList = /*@__PURE__*/ proxyCustomElement(class SearchcraftF
|
|
|
168
168
|
* Array of facet values to exclude from rendering.
|
|
169
169
|
*/
|
|
170
170
|
exclude;
|
|
171
|
+
/**
|
|
172
|
+
* Initial collapse state of the facet section.
|
|
173
|
+
* @default 'open'
|
|
174
|
+
*/
|
|
175
|
+
initialCollapseState = 'open';
|
|
176
|
+
/**
|
|
177
|
+
* The number of facets to show before displaying a "view more" link.
|
|
178
|
+
* Set to 0 to show all facets without a "view more" link.
|
|
179
|
+
* @default 8
|
|
180
|
+
*/
|
|
181
|
+
viewMoreThreshold = 8;
|
|
171
182
|
/**
|
|
172
183
|
* Emitted when the facets are updated.
|
|
173
184
|
*/
|
|
@@ -202,6 +213,14 @@ const SearchcraftFacetList = /*@__PURE__*/ proxyCustomElement(class SearchcraftF
|
|
|
202
213
|
count: 0,
|
|
203
214
|
children: {},
|
|
204
215
|
};
|
|
216
|
+
/**
|
|
217
|
+
* Tracks whether the facet section is collapsed or expanded.
|
|
218
|
+
*/
|
|
219
|
+
isCollapsed = false;
|
|
220
|
+
/**
|
|
221
|
+
* Tracks whether all facets are shown or limited by the threshold.
|
|
222
|
+
*/
|
|
223
|
+
showAllFacets = false;
|
|
205
224
|
// Internal vars used to track when to perform various facet actions.
|
|
206
225
|
lastTimeTaken;
|
|
207
226
|
lastSearchTerm;
|
|
@@ -387,6 +406,8 @@ const SearchcraftFacetList = /*@__PURE__*/ proxyCustomElement(class SearchcraftF
|
|
|
387
406
|
});
|
|
388
407
|
}
|
|
389
408
|
connectedCallback() {
|
|
409
|
+
// Initialize collapse state based on prop
|
|
410
|
+
this.isCollapsed = this.initialCollapseState === 'closed';
|
|
390
411
|
this.cleanupCore = registry.useCoreInstance(this.searchcraftId, this.onCoreAvailable.bind(this));
|
|
391
412
|
}
|
|
392
413
|
disconnectedCallback() {
|
|
@@ -426,6 +447,23 @@ const SearchcraftFacetList = /*@__PURE__*/ proxyCustomElement(class SearchcraftF
|
|
|
426
447
|
const label = name.replace(/^\//, '');
|
|
427
448
|
return `${label.replace(/-/g, ' ').replace(/\b\w/g, (char) => char.toUpperCase())}`;
|
|
428
449
|
};
|
|
450
|
+
/**
|
|
451
|
+
* Toggles the collapsed state of the facet section.
|
|
452
|
+
* @returns A promise that resolves when the toggle is complete.
|
|
453
|
+
*/
|
|
454
|
+
async handleCollapseToggle() {
|
|
455
|
+
this.isCollapsed = !this.isCollapsed;
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Returns whether the facet section is currently collapsed.
|
|
459
|
+
* @returns A promise that resolves to true if collapsed, false if expanded.
|
|
460
|
+
*/
|
|
461
|
+
async getIsCollapsed() {
|
|
462
|
+
return this.isCollapsed;
|
|
463
|
+
}
|
|
464
|
+
handleViewMoreToggle = () => {
|
|
465
|
+
this.showAllFacets = !this.showAllFacets;
|
|
466
|
+
};
|
|
429
467
|
renderFacet(keyName, facet) {
|
|
430
468
|
let isChildSelected = false;
|
|
431
469
|
for (const path of Object.keys(this.selectedPaths)) {
|
|
@@ -464,15 +502,32 @@ const SearchcraftFacetList = /*@__PURE__*/ proxyCustomElement(class SearchcraftF
|
|
|
464
502
|
(this.lastSearchTerm || '').trim().length > 0) {
|
|
465
503
|
return (h("p", { class: 'searchcraft-facet-list-message' }, "No facets are available for this search query."));
|
|
466
504
|
}
|
|
467
|
-
|
|
505
|
+
// Get root-level facets for view more functionality
|
|
506
|
+
const rootFacets = Object.keys(this.renderedFacetTree.children);
|
|
507
|
+
const threshold = this.viewMoreThreshold ?? 8;
|
|
508
|
+
const shouldShowViewMore = threshold > 0 && rootFacets.length > threshold;
|
|
509
|
+
const visibleFacets = shouldShowViewMore && !this.showAllFacets
|
|
510
|
+
? rootFacets.slice(0, threshold)
|
|
511
|
+
: rootFacets;
|
|
512
|
+
return (h("div", { class: 'searchcraft-facet-list-wrapper', "data-facet-section-collapsed": this.isCollapsed ? '' : undefined, "data-facet-section-expanded": !this.isCollapsed ? '' : undefined }, !this.isCollapsed && (h("div", { class: 'searchcraft-facet-list-content' }, h("div", { class: 'searchcraft-facet-list' }, visibleFacets.map((key) => {
|
|
513
|
+
if (this.renderedFacetTree.children[key]) {
|
|
514
|
+
return this.renderFacet(key, this.renderedFacetTree.children[key]);
|
|
515
|
+
}
|
|
516
|
+
})), shouldShowViewMore && (h("button", { class: 'searchcraft-facet-list-view-more', onClick: this.handleViewMoreToggle, type: 'button' }, this.showAllFacets ? 'View less' : 'View more...'))))));
|
|
468
517
|
}
|
|
469
518
|
}, [768, "searchcraft-facet-list", {
|
|
470
519
|
"searchcraftId": [1, "searchcraft-id"],
|
|
471
520
|
"fieldName": [1, "field-name"],
|
|
472
521
|
"exclude": [16],
|
|
522
|
+
"initialCollapseState": [1, "initial-collapse-state"],
|
|
523
|
+
"viewMoreThreshold": [2, "view-more-threshold"],
|
|
473
524
|
"selectedPaths": [32],
|
|
474
525
|
"facetTreeCollectedFromSearchResponse": [32],
|
|
475
|
-
"renderedFacetTree": [32]
|
|
526
|
+
"renderedFacetTree": [32],
|
|
527
|
+
"isCollapsed": [32],
|
|
528
|
+
"showAllFacets": [32],
|
|
529
|
+
"handleCollapseToggle": [64],
|
|
530
|
+
"getIsCollapsed": [64]
|
|
476
531
|
}]);
|
|
477
532
|
function defineCustomElement() {
|
|
478
533
|
if (typeof customElements === "undefined") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"searchcraft-facet-list2.js","mappings":"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","names":["__stencil_proxyCustomElement","HTMLElement"],"sources":["src/utils/facets.ts","src/components/searchcraft-facet-list/searchcraft-facet-list.tsx"],"sourcesContent":["import type {\n Facet,\n FacetTree,\n FacetWithChildrenArray,\n FacetWithChildrenObject,\n} from '@types';\n\n/**\n * Helper function for getting a Node (FacetWithChildrenObject)\n * at a given path. Traverses the node tree to get the node.\n */\nexport const getFacetTreeNodeAtPath = (\n tree: FacetTree,\n nodePaths: string[],\n): FacetWithChildrenObject | undefined => {\n let cursor: FacetWithChildrenObject | undefined = tree;\n for (const nodePath of nodePaths) {\n cursor = cursor?.children[nodePath];\n }\n\n return cursor;\n};\n\n/**\n * Helper function to perform a deep merge.\n * Used for merging two branches of a facet tree together.\n */\nexport const deepMergeWithSpread = (obj1, obj2) => {\n const result = { ...obj1 };\n\n for (const key in obj2) {\n // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation>\n if (obj2.hasOwnProperty(key)) {\n if (obj2[key] instanceof Object && obj1[key] instanceof Object) {\n result[key] = deepMergeWithSpread(obj1[key], obj2[key]);\n } else {\n result[key] = obj2[key];\n }\n }\n }\n\n return result;\n};\n\n/**\n * Given an array of facet paths, removes parent facet paths so that only the\n * Leaf facets are sent with the search request.\n */\nexport function removeSubstringMatches(arr: string[]): string[] {\n return arr.filter(\n (entry, index, array) =>\n !array.some(\n (otherEntry, otherIndex) =>\n otherIndex !== index && otherEntry.includes(entry),\n ),\n );\n}\n\n/**\n * Merges a current facet tree with an incoming facet tree.\n *\n * At each branch, the incoming facet tree's facets override current facet tree\n *\n * @param currentTree\n * @param incomingTree\n */\nexport const mergeFacetTrees = (\n currentTree: FacetTree,\n incomingTree: FacetTree,\n): FacetTree => {\n const mergedTree: FacetTree = structuredClone(currentTree);\n\n const merge = (\n currentBranch: FacetWithChildrenObject,\n nodePath: string[],\n ): FacetWithChildrenObject => {\n const mergedBranch = structuredClone(currentBranch);\n const incomingBranch = getFacetTreeNodeAtPath(incomingTree, nodePath);\n\n if (!incomingBranch) {\n return mergedBranch;\n }\n\n for (const nodeName of Object.keys(currentBranch.children)) {\n if (incomingBranch.children[nodeName]) {\n mergedBranch.children[nodeName] = {\n ...deepMergeWithSpread(\n currentBranch.children[nodeName],\n incomingBranch.children[nodeName],\n ),\n count: mergedBranch.children[nodeName]?.count || 0,\n };\n } else if (mergedBranch.children[nodeName]) {\n mergedBranch.children[nodeName] = merge(\n mergedBranch.children[nodeName],\n [...nodePath, nodeName],\n );\n }\n }\n\n return mergedBranch;\n };\n\n return merge(mergedTree, []);\n};\n\n/**\n * A function that converts a FacetWithChidrenArray to a complete FacetTree object.\n *\n * It uses the `path` of each Facet to build the tree.\n *\n * @param facetWithChildArray\n * @param exclude - Optional array of facet values or paths to exclude from the tree.\n * - Values starting with \"/\" are treated as full paths and exclude the path and all children\n * (e.g., \"/news\" excludes \"/news\", \"/news/local\", \"/news/national\", etc.)\n * - Values without \"/\" are treated as segment names (e.g., \"local\" excludes all paths containing \"local\")\n */\nexport const facetWithChildrenArrayToCompleteFacetTree = (\n rootArray: FacetWithChildrenArray,\n exclude?: string[],\n): FacetTree => {\n // 1) Start with an empty tree at root \"/\"\n const tree: FacetTree = {\n path: '/',\n count: 0,\n children: {},\n };\n\n // 2) Recursively collect all nodes except the implicit \"/\" itself\n const allFacets: Facet[] = [];\n const collect = (node: FacetWithChildrenArray) => {\n if (node.path !== '/') {\n allFacets.push({ path: node.path, count: node.count });\n }\n if (node.children) {\n for (const child of node.children) {\n collect(child);\n }\n }\n };\n collect(rootArray);\n\n // 3) Insert each flat node into our tree, creating missing ancestors\n for (const { path, count } of allFacets) {\n const segments = path.split('/').filter(Boolean); // \"/sports/outdoors\" -> [\"sports\",\"outdoors\"]\n\n // Skip this facet if it matches any excluded value\n if (exclude && exclude.length > 0) {\n let shouldExclude = false;\n\n for (const excludeValue of exclude) {\n if (excludeValue.startsWith('/')) {\n // Full path exclusion: prefix match (excludes the path and all children)\n if (path === excludeValue || path.startsWith(`${excludeValue}/`)) {\n shouldExclude = true;\n break;\n }\n } else {\n // Segment exclusion: check if any segment matches\n if (segments.includes(excludeValue)) {\n shouldExclude = true;\n break;\n }\n }\n }\n\n if (shouldExclude) {\n continue;\n }\n }\n\n let cursor: FacetWithChildrenObject = tree; // start at the root\n for (const segment of segments) {\n // Build the full path of this level\n const prefixPath =\n cursor.path === '/' ? `/${segment}` : `${cursor.path}/${segment}`;\n\n // If this segment doesn't exist yet, create it\n if (!cursor.children[segment]) {\n cursor.children[segment] = {\n path: prefixPath,\n count: count,\n children: {},\n };\n }\n\n // Descend to the next level deeper\n cursor = cursor.children[segment];\n }\n\n // 4) Now `cursor` is the node matching `path` assign its real count\n cursor.count = count;\n }\n\n return tree;\n};\n","import {\n Component,\n Event,\n type EventEmitter,\n Prop,\n State,\n h,\n} from '@stencil/core';\n\nimport type {\n FacetRoot,\n FacetWithChildrenArray,\n FacetWithChildrenObject,\n SearchClientQuery,\n} from '@types';\n\nimport type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport type { SearchcraftState } from '@store';\nimport {\n deepMergeWithSpread,\n facetWithChildrenArrayToCompleteFacetTree,\n getFacetTreeNodeAtPath,\n mergeFacetTrees,\n removeSubstringMatches,\n} from '@utils';\n\ntype HandlerActionType =\n | 'SEARCH_TERM_EMPTY'\n | 'NEW_SEARCH_TERM'\n | 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE'\n | 'RANGE_VALUE_UPDATE'\n | 'EXACT_MATCH_UPDATE'\n | 'SORT_ORDER_UPDATE'\n | 'FACET_UPDATE'\n | 'UNKNOWN';\n\n/**\n * This web component is designed to display facets in a search interface, allowing users to refine their search results by applying filters based on various attributes.\n * It is consumed within the `searchcraft-filter-panel`.\n *\n * @js-example\n * ```html\n * <!-- index.html -->\n * <searchcraft-facet-list field-name=\"title\" />\n * ```\n *\n * ```js\n * // index.js\n * const facetList = document.querySelector('searchcraft-facet-list');\n *\n * facetList.addEventListener('facetSelectionUpdated', () => {\n * console.log('Facet selection updated');\n * });\n * ```\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-facet-list',\n shadow: false,\n})\nexport class SearchcraftFacetList {\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n /**\n * The name of the field where facets are applied.\n */\n @Prop() fieldName = '';\n /**\n * Array of facet values to exclude from rendering.\n */\n @Prop() exclude?: string[];\n\n /**\n * Emitted when the facets are updated.\n */\n @Event() facetSelectionUpdated?: EventEmitter<{ paths: string[] }>;\n\n /**\n * The currently selected facet paths.\n */\n @State() selectedPaths: Record<string, boolean> = {};\n\n /**\n * A Tree representing all of the facets collected from search responses.\n */\n @State() facetTreeCollectedFromSearchResponse: FacetWithChildrenObject = {\n path: '/',\n count: 0,\n children: {},\n };\n\n /**\n * A Tree representing the facet paths that are selected, but were not included\n * in any search response.\n */\n facetTreeFromFacetPathsNotInSearchResponse: FacetWithChildrenObject = {\n path: '/',\n count: 0,\n children: {},\n };\n\n /**\n * The facet tree that ultimately gets rendered.\n * This is a mergin of the facetTreeCollectedFromSearchResponse and the facetTreeFromFacetPathsNotInSearchResponse tree\n */\n @State() renderedFacetTree: FacetWithChildrenObject = {\n path: '/',\n count: 0,\n children: {},\n };\n\n // Internal vars used to track when to perform various facet actions.\n private lastTimeTaken?: number;\n private lastSearchTerm?: string;\n private lastSearchMode?: string;\n private lastSortType?: string | null;\n private lastRangeValues?: string;\n private lastFacetValues?: string;\n\n private unsubscribe?: () => void;\n private cleanupCore?: () => void;\n\n get areAnyFacetPathsSelected(): boolean {\n return Object.keys(this.selectedPaths).some(\n (key) => this.selectedPaths[key],\n );\n }\n\n handleIncomingSearchResponse(\n state: SearchcraftState,\n actionType: HandlerActionType,\n ) {\n // Look at the incoming facet root from the search response, and convert it to a FacetTree\n const incomingFacetRoot: FacetRoot | undefined =\n state.searchResponseFacetPrime?.find(\n (facet) => this.fieldName === Object.keys(facet)[0],\n );\n const incomingFacetsWithChildrenArray = incomingFacetRoot?.[this.fieldName];\n const incomingFacetTree = facetWithChildrenArrayToCompleteFacetTree(\n {\n path: '/',\n count: 0,\n children: incomingFacetsWithChildrenArray || [],\n },\n this.exclude,\n );\n\n // Determine what action to take to accumulate items into the `facetTreeCollectedFromSearchResponse`.\n // This facet tree gets accumulated in different ways depending on what action type occured.\n switch (actionType) {\n case 'SEARCH_TERM_EMPTY':\n this.facetTreeCollectedFromSearchResponse = {\n path: '/',\n count: 0,\n children: {},\n };\n break;\n case 'NEW_SEARCH_TERM':\n this.facetTreeCollectedFromSearchResponse = incomingFacetTree;\n break;\n case 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE':\n case 'EXACT_MATCH_UPDATE':\n case 'RANGE_VALUE_UPDATE': {\n if (state.supplementalFacetPrime) {\n const supplementalFacetRoot: FacetRoot | undefined =\n state.supplementalFacetPrime?.find(\n (facet) => this.fieldName === Object.keys(facet)[0],\n );\n const supplementalFacetsWithChildrenArray =\n supplementalFacetRoot?.[this.fieldName];\n const supplementalFacetTree =\n facetWithChildrenArrayToCompleteFacetTree(\n {\n path: '/',\n count: 0,\n children: supplementalFacetsWithChildrenArray || [],\n },\n this.exclude,\n );\n\n this.facetTreeCollectedFromSearchResponse = mergeFacetTrees(\n supplementalFacetTree,\n incomingFacetTree,\n );\n } else {\n this.facetTreeCollectedFromSearchResponse = incomingFacetTree;\n }\n break;\n }\n case 'FACET_UPDATE':\n case 'SORT_ORDER_UPDATE':\n this.facetTreeCollectedFromSearchResponse = mergeFacetTrees(\n this.facetTreeCollectedFromSearchResponse,\n incomingFacetTree,\n );\n break;\n default:\n return;\n }\n\n // Determine if there are any selected facet paths not in the current tree.\n // If there are, we add them to \"facetTreeFromFacetPathsNotInSearchResponse\"\n this.facetTreeFromFacetPathsNotInSearchResponse = {\n path: '/',\n count: 0,\n children: {},\n };\n const collectedFacetArray: FacetWithChildrenArray = {\n path: '/',\n count: 0,\n children: [],\n };\n for (const pathName of Object.keys(this.selectedPaths).filter(\n (path) => this.selectedPaths[path],\n )) {\n const nodePaths = pathName.startsWith('/')\n ? pathName.substring(1).split('/')\n : pathName.split('/');\n\n const wasFoundInFacetTree = !!getFacetTreeNodeAtPath(\n this.facetTreeCollectedFromSearchResponse,\n nodePaths,\n );\n\n const pathKeyName = nodePaths.at(-1);\n if (!wasFoundInFacetTree && pathKeyName) {\n collectedFacetArray.children?.push({\n children: [],\n count: 0,\n path: pathName,\n });\n }\n }\n this.facetTreeFromFacetPathsNotInSearchResponse =\n facetWithChildrenArrayToCompleteFacetTree(\n collectedFacetArray,\n this.exclude,\n );\n\n // Merges facetTreeCollectedFromSearchResponse with selectedFacetPathsNotInCurrentFacetTree.\n // This results in a single, final facet tree that gets rendered in as Checkboxes\n this.renderedFacetTree = deepMergeWithSpread(\n this.facetTreeFromFacetPathsNotInSearchResponse,\n this.facetTreeCollectedFromSearchResponse,\n );\n }\n\n handleStateUpdate(_state: SearchcraftState) {\n const state = { ..._state };\n // Determine what action to take based on the current State\n\n // Check if this is an initialQuery case (string requestProperties with empty searchTerm)\n const isInitialQuery =\n typeof state.searchClientRequestProperties === 'string' &&\n state.searchTerm.trim() === '';\n\n if (state.searchTerm.trim() === '' && !isInitialQuery) {\n this.handleIncomingSearchResponse(state, 'SEARCH_TERM_EMPTY');\n this.lastSearchTerm = '';\n } else if (\n this.lastTimeTaken !== state.searchResponseTimeTaken &&\n state.searchClientRequestProperties\n ) {\n // Handle both object and string requestProperties (string is used for initialQuery)\n if (typeof state.searchClientRequestProperties === 'object') {\n const requestProperties = state.searchClientRequestProperties;\n let actionType: HandlerActionType = 'UNKNOWN';\n\n if (this.lastSearchTerm !== requestProperties.searchTerm) {\n if (this.areAnyFacetPathsSelected) {\n actionType = 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE';\n } else {\n actionType = 'NEW_SEARCH_TERM';\n }\n } else if (\n this.lastRangeValues !==\n JSON.stringify(requestProperties.rangeValueForIndexFields)\n ) {\n actionType = 'RANGE_VALUE_UPDATE';\n } else if (\n this.lastFacetValues !==\n JSON.stringify(requestProperties.facetPathsForIndexFields)\n ) {\n actionType = 'FACET_UPDATE';\n } else if (this.lastSortType !== requestProperties.order_by) {\n actionType = 'SORT_ORDER_UPDATE';\n } else if (this.lastSearchMode !== requestProperties.mode) {\n actionType = 'EXACT_MATCH_UPDATE';\n }\n\n this.lastRangeValues = JSON.stringify(\n requestProperties.rangeValueForIndexFields,\n );\n this.lastFacetValues = JSON.stringify(\n requestProperties.facetPathsForIndexFields,\n );\n this.lastSortType = requestProperties.order_by;\n this.lastSearchMode = requestProperties.mode;\n this.lastSearchTerm = requestProperties.searchTerm;\n this.lastTimeTaken = state.searchResponseTimeTaken;\n // Handle the incoming response, using the action we have determined.\n this.handleIncomingSearchResponse(state, actionType);\n } else if (typeof state.searchClientRequestProperties === 'string') {\n // Handle initialQuery case where requestProperties is a string\n // For initialQuery, searchTerm will be empty but we still want to show facets\n let actionType: HandlerActionType = 'NEW_SEARCH_TERM';\n\n // Parse the request to get facet and range filters from the query array\n const requestObj = JSON.parse(state.searchClientRequestProperties);\n const queryArray = Array.isArray(requestObj.query)\n ? requestObj.query\n : [requestObj.query];\n\n // Extract filter queries (those with occur: 'must')\n const filterQueries = queryArray.filter(\n (q: SearchClientQuery) => q.occur === 'must',\n );\n const currentFilters = JSON.stringify(filterQueries);\n\n // Determine the action type based on what changed\n if (\n this.lastFacetValues !== undefined &&\n this.lastFacetValues !== currentFilters\n ) {\n // Filters have changed (not initial load)\n actionType = 'FACET_UPDATE';\n } else if (\n state.searchTerm.trim() === '' &&\n this.lastSearchTerm === ''\n ) {\n // Initial load or no changes with empty search term\n actionType = 'NEW_SEARCH_TERM';\n } else if (this.lastSearchTerm !== state.searchTerm) {\n // User has typed a new search term after initialQuery\n if (this.areAnyFacetPathsSelected) {\n actionType = 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE';\n } else {\n actionType = 'NEW_SEARCH_TERM';\n }\n }\n\n this.lastFacetValues = currentFilters;\n this.lastSearchTerm = state.searchTerm;\n this.lastTimeTaken = state.searchResponseTimeTaken;\n // Handle the incoming response, using the action we have determined.\n this.handleIncomingSearchResponse(state, actionType);\n }\n }\n }\n\n onCoreAvailable(core: SearchcraftCore) {\n this.handleStateUpdate(core.store.getState());\n\n this.unsubscribe = core.store.subscribe((state) => {\n this.handleStateUpdate(state);\n });\n }\n\n connectedCallback() {\n this.cleanupCore = registry.useCoreInstance(\n this.searchcraftId,\n this.onCoreAvailable.bind(this),\n );\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n this.cleanupCore?.();\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 formatFacetName = (name: string): string => {\n const label = name.replace(/^\\//, '');\n return `${label.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())}`;\n };\n\n renderFacet(keyName: string, facet: FacetWithChildrenObject) {\n let isChildSelected = false;\n for (const path of Object.keys(this.selectedPaths)) {\n if (\n this.selectedPaths[path] &&\n path.startsWith(facet.path) &&\n path.length > facet.path.length\n ) {\n isChildSelected = true;\n }\n }\n\n const isSelected = Object.keys(this.selectedPaths).includes(facet.path);\n\n const shouldRenderChildren =\n (Object.keys(facet.children).length > 0 &&\n (isSelected || isChildSelected)) ||\n keyName === '@@root';\n\n return (\n <div class='searchcraft-facet-list-item'>\n {keyName !== '@@root' && (\n <label class='searchcraft-facet-list-checkbox-label'>\n <div class='searchcraft-facet-list-checkbox-input-wrapper'>\n <input\n class='searchcraft-facet-list-checkbox-input'\n checked={this.selectedPaths[facet.path]}\n onChange={(_event: Event) => {\n this.handleCheckboxChange(facet.path);\n }}\n type='checkbox'\n />\n {isChildSelected ? (\n <div class='searchcraft-facet-list-checkbox-input-dash-icon'>\n <svg viewBox='0 0 14 3' fill='none'>\n <title>Checkbox dash</title>\n <line\n x1='1.5'\n y1='1.5'\n x2='12.5'\n y2='1.5'\n stroke='white'\n stroke-width='3'\n stroke-linecap='round'\n />\n </svg>\n </div>\n ) : (\n <div class='searchcraft-facet-list-checkbox-input-check-icon'>\n <svg width='16' height='16' viewBox='0 0 16 16' fill='none'>\n <title>Checkbox check</title>\n <path\n d='M13.9999 2L5.74988 10L1.99988 6.36364'\n stroke='white'\n stroke-width='3'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </div>\n )}\n </div>\n <span>\n {this.formatFacetName(keyName)} ({facet.count})\n </span>\n </label>\n )}\n {shouldRenderChildren && (\n <div\n class='searchcraft-facet-list'\n style={{\n paddingLeft: keyName !== '@@root' ? '24px' : '0px',\n paddingTop: keyName !== '@@root' ? '6px' : '0px',\n }}\n >\n {Object.keys(facet.children).map((key) => {\n if (facet.children[key]) {\n return this.renderFacet(key, facet.children[key]);\n }\n })}\n </div>\n )}\n </div>\n );\n }\n\n render() {\n if (!this.fieldName) {\n return;\n }\n\n if (\n Object.keys(this.facetTreeCollectedFromSearchResponse.children).length ===\n 0 &&\n (this.lastSearchTerm || '').trim().length === 0\n ) {\n return;\n }\n\n if (\n Object.keys(this.facetTreeCollectedFromSearchResponse.children).length ===\n 0 &&\n (this.lastSearchTerm || '').trim().length > 0\n ) {\n return (\n <p class='searchcraft-facet-list-message'>\n No facets are available for this search query.\n </p>\n );\n }\n\n return (\n <div class='searchcraft-facet-list'>\n {this.renderFacet('@@root', this.renderedFacetTree)}\n </div>\n );\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"searchcraft-facet-list2.js","mappings":";;;;AAOA;;;AAGG;AACI,MAAM,sBAAsB,GAAG,CACpC,IAAe,EACf,SAAmB,KACoB;IACvC,IAAI,MAAM,GAAwC,IAAI;AACtD,IAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;AAChC,QAAA,MAAM,GAAG,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;;AAGrC,IAAA,OAAO,MAAM;AACf,CAAC;AAED;;;AAGG;AACI,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,KAAI;AAChD,IAAA,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE;AAE1B,IAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;;AAEtB,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;AAC5B,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,EAAE;AAC9D,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;;iBAClD;gBACL,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;;;;AAK7B,IAAA,OAAO,MAAM;AACf,CAAC;AAED;;;AAGG;AACG,SAAU,sBAAsB,CAAC,GAAa,EAAA;AAClD,IAAA,OAAO,GAAG,CAAC,MAAM,CACf,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,KAClB,CAAC,KAAK,CAAC,IAAI,CACT,CAAC,UAAU,EAAE,UAAU,KACrB,UAAU,KAAK,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CACrD,CACJ;AACH;AAEA;;;;;;;AAOG;AACI,MAAM,eAAe,GAAG,CAC7B,WAAsB,EACtB,YAAuB,KACV;AACb,IAAA,MAAM,UAAU,GAAc,eAAe,CAAC,WAAW,CAAC;AAE1D,IAAA,MAAM,KAAK,GAAG,CACZ,aAAsC,EACtC,QAAkB,KACS;AAC3B,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,CAAC;QACnD,MAAM,cAAc,GAAG,sBAAsB,CAAC,YAAY,EAAE,QAAQ,CAAC;QAErE,IAAI,CAAC,cAAc,EAAE;AACnB,YAAA,OAAO,YAAY;;AAGrB,QAAA,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;AAC1D,YAAA,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACrC,gBAAA,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG;AAChC,oBAAA,GAAG,mBAAmB,CACpB,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAChC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAClC;oBACD,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC;iBACnD;;AACI,iBAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBAC1C,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,KAAK,CACrC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC/B,CAAC,GAAG,QAAQ,EAAE,QAAQ,CAAC,CACxB;;;AAIL,QAAA,OAAO,YAAY;AACrB,KAAC;AAED,IAAA,OAAO,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;AAUG;AACI,MAAM,yCAAyC,GAAG,CACvD,SAAiC,EACjC,OAAkB,KACL;;AAEb,IAAA,MAAM,IAAI,GAAc;AACtB,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,QAAQ,EAAE,EAAE;KACb;;IAGD,MAAM,SAAS,GAAY,EAAE;AAC7B,IAAA,MAAM,OAAO,GAAG,CAAC,IAA4B,KAAI;AAC/C,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE;AACrB,YAAA,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;AAExD,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjC,OAAO,CAAC,KAAK,CAAC;;;AAGpB,KAAC;IACD,OAAO,CAAC,SAAS,CAAC;;IAGlB,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,SAAS,EAAE;AACvC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;;QAGjD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,aAAa,GAAG,KAAK;AAEzB,YAAA,KAAK,MAAM,YAAY,IAAI,OAAO,EAAE;AAClC,gBAAA,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;;AAEhC,oBAAA,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,CAAG,EAAA,YAAY,CAAG,CAAA,CAAA,CAAC,EAAE;wBAChE,aAAa,GAAG,IAAI;wBACpB;;;qBAEG;;AAEL,oBAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;wBACnC,aAAa,GAAG,IAAI;wBACpB;;;;YAKN,IAAI,aAAa,EAAE;gBACjB;;;AAIJ,QAAA,IAAI,MAAM,GAA4B,IAAI,CAAC;AAC3C,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;;YAE9B,MAAM,UAAU,GACd,MAAM,CAAC,IAAI,KAAK,GAAG,GAAG,CAAA,CAAA,EAAI,OAAO,CAAE,CAAA,GAAG,CAAG,EAAA,MAAM,CAAC,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE;;YAGnE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC7B,gBAAA,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG;AACzB,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,KAAK,EAAE,KAAK;AACZ,oBAAA,QAAQ,EAAE,EAAE;iBACb;;;AAIH,YAAA,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;;;AAInC,QAAA,MAAM,CAAC,KAAK,GAAG,KAAK;;AAGtB,IAAA,OAAO,IAAI;AACb,CAAC;;MCnHY,oBAAoB,iBAAAA,kBAAA,CAAA,MAAA,oBAAA,SAAAC,CAAA,CAAA;;;;;;;;AAC/B;;AAEG;AACK,IAAA,aAAa;AACrB;;AAEG;IACK,SAAS,GAAG,EAAE;AACtB;;AAEG;AACK,IAAA,OAAO;AACf;;;AAGG;IACK,oBAAoB,GAAuB,MAAM;AACzD;;;;AAIG;IACK,iBAAiB,GAAY,CAAC;AAEtC;;AAEG;AACM,IAAA,qBAAqB;AAE9B;;AAEG;IACM,aAAa,GAA4B,EAAE;AAEpD;;AAEG;AACM,IAAA,oCAAoC,GAA4B;AACvE,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,QAAQ,EAAE,EAAE;KACb;AAED;;;AAGG;AACH,IAAA,0CAA0C,GAA4B;AACpE,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,QAAQ,EAAE,EAAE;KACb;AAED;;;AAGG;AACM,IAAA,iBAAiB,GAA4B;AACpD,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,QAAQ,EAAE,EAAE;KACb;AAED;;AAEG;IACM,WAAW,GAAG,KAAK;AAE5B;;AAEG;IACM,aAAa,GAAG,KAAK;;AAGtB,IAAA,aAAa;AACb,IAAA,cAAc;AACd,IAAA,cAAc;AACd,IAAA,YAAY;AACZ,IAAA,eAAe;AACf,IAAA,eAAe;AAEf,IAAA,WAAW;AACX,IAAA,WAAW;AAEnB,IAAA,IAAI,wBAAwB,GAAA;QAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CACzC,CAAC,GAAG,KAAK,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CACjC;;IAGH,4BAA4B,CAC1B,KAAuB,EACvB,UAA6B,EAAA;;QAG7B,MAAM,iBAAiB,GACrB,KAAK,CAAC,wBAAwB,EAAE,IAAI,CAClC,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACpD;QACH,MAAM,+BAA+B,GAAG,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3E,MAAM,iBAAiB,GAAG,yCAAyC,CACjE;AACE,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,KAAK,EAAE,CAAC;YACR,QAAQ,EAAE,+BAA+B,IAAI,EAAE;AAChD,SAAA,EACD,IAAI,CAAC,OAAO,CACb;;;QAID,QAAQ,UAAU;AAChB,YAAA,KAAK,mBAAmB;gBACtB,IAAI,CAAC,oCAAoC,GAAG;AAC1C,oBAAA,IAAI,EAAE,GAAG;AACT,oBAAA,KAAK,EAAE,CAAC;AACR,oBAAA,QAAQ,EAAE,EAAE;iBACb;gBACD;AACF,YAAA,KAAK,iBAAiB;AACpB,gBAAA,IAAI,CAAC,oCAAoC,GAAG,iBAAiB;gBAC7D;AACF,YAAA,KAAK,qCAAqC;AAC1C,YAAA,KAAK,oBAAoB;YACzB,KAAK,oBAAoB,EAAE;AACzB,gBAAA,IAAI,KAAK,CAAC,sBAAsB,EAAE;oBAChC,MAAM,qBAAqB,GACzB,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAChC,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACpD;oBACH,MAAM,mCAAmC,GACvC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC;oBACzC,MAAM,qBAAqB,GACzB,yCAAyC,CACvC;AACE,wBAAA,IAAI,EAAE,GAAG;AACT,wBAAA,KAAK,EAAE,CAAC;wBACR,QAAQ,EAAE,mCAAmC,IAAI,EAAE;AACpD,qBAAA,EACD,IAAI,CAAC,OAAO,CACb;oBAEH,IAAI,CAAC,oCAAoC,GAAG,eAAe,CACzD,qBAAqB,EACrB,iBAAiB,CAClB;;qBACI;AACL,oBAAA,IAAI,CAAC,oCAAoC,GAAG,iBAAiB;;gBAE/D;;AAEF,YAAA,KAAK,cAAc;AACnB,YAAA,KAAK,mBAAmB;gBACtB,IAAI,CAAC,oCAAoC,GAAG,eAAe,CACzD,IAAI,CAAC,oCAAoC,EACzC,iBAAiB,CAClB;gBACD;AACF,YAAA;gBACE;;;;QAKJ,IAAI,CAAC,0CAA0C,GAAG;AAChD,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,QAAQ,EAAE,EAAE;SACb;AACD,QAAA,MAAM,mBAAmB,GAA2B;AAClD,YAAA,IAAI,EAAE,GAAG;AACT,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,QAAQ,EAAE,EAAE;SACb;QACD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAC3D,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CACnC,EAAE;AACD,YAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG;kBACrC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;AACjC,kBAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;AAEvB,YAAA,MAAM,mBAAmB,GAAG,CAAC,CAAC,sBAAsB,CAClD,IAAI,CAAC,oCAAoC,EACzC,SAAS,CACV;YAED,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;AACpC,YAAA,IAAI,CAAC,mBAAmB,IAAI,WAAW,EAAE;AACvC,gBAAA,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC;AACjC,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,KAAK,EAAE,CAAC;AACR,oBAAA,IAAI,EAAE,QAAQ;AACf,iBAAA,CAAC;;;AAGN,QAAA,IAAI,CAAC,0CAA0C;AAC7C,YAAA,yCAAyC,CACvC,mBAAmB,EACnB,IAAI,CAAC,OAAO,CACb;;;AAIH,QAAA,IAAI,CAAC,iBAAiB,GAAG,mBAAmB,CAC1C,IAAI,CAAC,0CAA0C,EAC/C,IAAI,CAAC,oCAAoC,CAC1C;;AAGH,IAAA,iBAAiB,CAAC,MAAwB,EAAA;AACxC,QAAA,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,EAAE;;;AAI3B,QAAA,MAAM,cAAc,GAClB,OAAO,KAAK,CAAC,6BAA6B,KAAK,QAAQ;AACvD,YAAA,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;AAEhC,QAAA,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE;AACrD,YAAA,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,mBAAmB,CAAC;AAC7D,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE;;AACnB,aAAA,IACL,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,uBAAuB;YACpD,KAAK,CAAC,6BAA6B,EACnC;;AAEA,YAAA,IAAI,OAAO,KAAK,CAAC,6BAA6B,KAAK,QAAQ,EAAE;AAC3D,gBAAA,MAAM,iBAAiB,GAAG,KAAK,CAAC,6BAA6B;gBAC7D,IAAI,UAAU,GAAsB,SAAS;gBAE7C,IAAI,IAAI,CAAC,cAAc,KAAK,iBAAiB,CAAC,UAAU,EAAE;AACxD,oBAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;wBACjC,UAAU,GAAG,qCAAqC;;yBAC7C;wBACL,UAAU,GAAG,iBAAiB;;;qBAE3B,IACL,IAAI,CAAC,eAAe;oBACpB,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,EAC1D;oBACA,UAAU,GAAG,oBAAoB;;qBAC5B,IACL,IAAI,CAAC,eAAe;oBACpB,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,EAC1D;oBACA,UAAU,GAAG,cAAc;;qBACtB,IAAI,IAAI,CAAC,YAAY,KAAK,iBAAiB,CAAC,QAAQ,EAAE;oBAC3D,UAAU,GAAG,mBAAmB;;qBAC3B,IAAI,IAAI,CAAC,cAAc,KAAK,iBAAiB,CAAC,IAAI,EAAE;oBACzD,UAAU,GAAG,oBAAoB;;gBAGnC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CACnC,iBAAiB,CAAC,wBAAwB,CAC3C;gBACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CACnC,iBAAiB,CAAC,wBAAwB,CAC3C;AACD,gBAAA,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,QAAQ;AAC9C,gBAAA,IAAI,CAAC,cAAc,GAAG,iBAAiB,CAAC,IAAI;AAC5C,gBAAA,IAAI,CAAC,cAAc,GAAG,iBAAiB,CAAC,UAAU;AAClD,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,uBAAuB;;AAElD,gBAAA,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,UAAU,CAAC;;AAC/C,iBAAA,IAAI,OAAO,KAAK,CAAC,6BAA6B,KAAK,QAAQ,EAAE;;;gBAGlE,IAAI,UAAU,GAAsB,iBAAiB;;gBAGrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC;gBAClE,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK;sBAC7C,UAAU,CAAC;AACb,sBAAE,CAAC,UAAU,CAAC,KAAK,CAAC;;AAGtB,gBAAA,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CACrC,CAAC,CAAoB,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,CAC7C;gBACD,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;;AAGpD,gBAAA,IACE,IAAI,CAAC,eAAe,KAAK,SAAS;AAClC,oBAAA,IAAI,CAAC,eAAe,KAAK,cAAc,EACvC;;oBAEA,UAAU,GAAG,cAAc;;AACtB,qBAAA,IACL,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;AAC9B,oBAAA,IAAI,CAAC,cAAc,KAAK,EAAE,EAC1B;;oBAEA,UAAU,GAAG,iBAAiB;;qBACzB,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK,CAAC,UAAU,EAAE;;AAEnD,oBAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE;wBACjC,UAAU,GAAG,qCAAqC;;yBAC7C;wBACL,UAAU,GAAG,iBAAiB;;;AAIlC,gBAAA,IAAI,CAAC,eAAe,GAAG,cAAc;AACrC,gBAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,UAAU;AACtC,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,uBAAuB;;AAElD,gBAAA,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,UAAU,CAAC;;;;AAK1D,IAAA,eAAe,CAAC,IAAqB,EAAA;QACnC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;AAE7C,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAChD,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAC/B,SAAC,CAAC;;IAGJ,iBAAiB,GAAA;;QAEf,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,oBAAoB,KAAK,QAAQ;QAEzD,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,eAAe,CACzC,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAChC;;IAGH,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,WAAW,IAAI;AACpB,QAAA,IAAI,CAAC,WAAW,IAAI;;AAGtB,IAAA,oBAAoB,CAAC,IAAY,EAAA;QAC/B,MAAM,iBAAiB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAEnD,IAAI,iBAAiB,EAAE;AACrB;;;AAGG;YACH,IAAI,CAAC,aAAa,GAAG;gBACnB,GAAG,IAAI,CAAC,aAAa;gBACrB,CAAC,IAAI,GAAG,IAAI;aACb;;aACI;AACL;;AAEG;YACH,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CACzD,CAAC,QAAQ,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CACvC;AAED,YAAA,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC,MAAM,CACtC,CAAC,GAAG,EAAE,GAAG,KAAI;AACX,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI;AACf,gBAAA,OAAO,GAAG;aACX,EACD,EAA6B,CAC9B;;AAGH;;AAEG;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAClD,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CACnC;AACD,QAAA,MAAM,2BAA2B,GAAG,sBAAsB,CAAC,KAAK,CAAC;QAEjE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;;AAG1E,IAAA,eAAe,GAAG,CAAC,IAAY,KAAY;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACrC,OAAO,CAAA,EAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA,CAAE;AACrF,KAAC;AAED;;;AAGG;AAEH,IAAA,MAAM,oBAAoB,GAAA;AACxB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW;;AAGtC;;;AAGG;AAEH,IAAA,MAAM,cAAc,GAAA;QAClB,OAAO,IAAI,CAAC,WAAW;;IAGzB,oBAAoB,GAAG,MAAK;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,aAAa;AAC1C,KAAC;IAED,WAAW,CAAC,OAAe,EAAE,KAA8B,EAAA;QACzD,IAAI,eAAe,GAAG,KAAK;AAC3B,QAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AAClD,YAAA,IACE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACxB,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAC/B;gBACA,eAAe,GAAG,IAAI;;;AAI1B,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;AAEvE,QAAA,MAAM,oBAAoB,GACxB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC;AACrC,aAAC,UAAU,IAAI,eAAe,CAAC;YACjC,OAAO,KAAK,QAAQ;AAEtB,QAAA,QACE,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,6BAA6B,EAAA,EACrC,OAAO,KAAK,QAAQ,KACnB,CAAO,CAAA,OAAA,EAAA,EAAA,KAAK,EAAC,uCAAuC,EAAA,EAClD,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,+CAA+C,EAAA,EACxD,CACE,CAAA,OAAA,EAAA,EAAA,KAAK,EAAC,uCAAuC,EAC7C,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EACvC,QAAQ,EAAE,CAAC,MAAa,KAAI;AAC1B,gBAAA,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC;aACtC,EACD,IAAI,EAAC,UAAU,EACf,CAAA,EACD,eAAe,IACd,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,iDAAiD,EAAA,EAC1D,CAAA,CAAA,KAAA,EAAA,EAAK,OAAO,EAAC,UAAU,EAAC,IAAI,EAAC,MAAM,EAAA,EACjC,CAA4B,CAAA,OAAA,EAAA,IAAA,EAAA,eAAA,CAAA,EAC5B,CAAA,CAAA,MAAA,EAAA,EACE,EAAE,EAAC,KAAK,EACR,EAAE,EAAC,KAAK,EACR,EAAE,EAAC,MAAM,EACT,EAAE,EAAC,KAAK,EACR,MAAM,EAAC,OAAO,EACD,cAAA,EAAA,GAAG,EACD,gBAAA,EAAA,OAAO,GACtB,CACE,CACF,KAEN,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,kDAAkD,EAAA,EAC3D,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAA,EACzD,CAA6B,CAAA,OAAA,EAAA,IAAA,EAAA,gBAAA,CAAA,EAC7B,CAAA,CAAA,MAAA,EAAA,EACE,CAAC,EAAC,uCAAuC,EACzC,MAAM,EAAC,OAAO,EAAA,cAAA,EACD,GAAG,EAAA,gBAAA,EACD,OAAO,EACN,iBAAA,EAAA,OAAO,GACvB,CACE,CACF,CACP,CACG,EACN,CAAA,CAAA,MAAA,EAAA,IAAA,EACG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAI,KAAK,CAAC,KAAK,EACxC,GAAA,CAAA,CACD,CACT,EACA,oBAAoB,KACnB,CACE,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,wBAAwB,EAC9B,KAAK,EAAE;gBACL,WAAW,EAAE,OAAO,KAAK,QAAQ,GAAG,MAAM,GAAG,KAAK;gBAClD,UAAU,EAAE,OAAO,KAAK,QAAQ,GAAG,KAAK,GAAG,KAAK;AACjD,aAAA,EAAA,EAEA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AACvC,YAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACvB,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;;AAErD,SAAC,CAAC,CACE,CACP,CACG;;IAIV,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;;QAGF,IACE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,oCAAoC,CAAC,QAAQ,CAAC,CAAC,MAAM;YACpE,CAAC;AACH,YAAA,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAC/C;YACA;;QAGF,IACE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,oCAAoC,CAAC,QAAQ,CAAC,CAAC,MAAM;YACpE,CAAC;AACH,YAAA,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAC7C;AACA,YAAA,QACE,CAAG,CAAA,GAAA,EAAA,EAAA,KAAK,EAAC,gCAAgC,EAAA,EAAA,gDAAA,CAErC;;;AAKR,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;AAC/D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC;QAC7C,MAAM,kBAAkB,GAAG,SAAS,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,SAAS;AACzE,QAAA,MAAM,aAAa,GAAG,kBAAkB,IAAI,CAAC,IAAI,CAAC;cAC9C,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS;cAC7B,UAAU;AAEd,QAAA,QACE,CACE,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,gCAAgC,EAAA,8BAAA,EACR,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,SAAS,iCAClC,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,SAAS,EAAA,EAE9D,CAAC,IAAI,CAAC,WAAW,KAChB,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,gCAAgC,EAAA,EACzC,CAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAC,wBAAwB,EAChC,EAAA,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;YACzB,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxC,gBAAA,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;;AAEtE,SAAC,CAAC,CACE,EACL,kBAAkB,KACjB,CACE,CAAA,QAAA,EAAA,EAAA,KAAK,EAAC,kCAAkC,EACxC,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAClC,IAAI,EAAC,QAAQ,EAAA,EAEZ,IAAI,CAAC,aAAa,GAAG,WAAW,GAAG,cAAc,CAC3C,CACV,CACG,CACP,CACG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["__stencil_proxyCustomElement","HTMLElement"],"sources":["src/utils/facets.ts","src/components/searchcraft-facet-list/searchcraft-facet-list.tsx"],"sourcesContent":["import type {\n Facet,\n FacetTree,\n FacetWithChildrenArray,\n FacetWithChildrenObject,\n} from '@types';\n\n/**\n * Helper function for getting a Node (FacetWithChildrenObject)\n * at a given path. Traverses the node tree to get the node.\n */\nexport const getFacetTreeNodeAtPath = (\n tree: FacetTree,\n nodePaths: string[],\n): FacetWithChildrenObject | undefined => {\n let cursor: FacetWithChildrenObject | undefined = tree;\n for (const nodePath of nodePaths) {\n cursor = cursor?.children[nodePath];\n }\n\n return cursor;\n};\n\n/**\n * Helper function to perform a deep merge.\n * Used for merging two branches of a facet tree together.\n */\nexport const deepMergeWithSpread = (obj1, obj2) => {\n const result = { ...obj1 };\n\n for (const key in obj2) {\n // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation>\n if (obj2.hasOwnProperty(key)) {\n if (obj2[key] instanceof Object && obj1[key] instanceof Object) {\n result[key] = deepMergeWithSpread(obj1[key], obj2[key]);\n } else {\n result[key] = obj2[key];\n }\n }\n }\n\n return result;\n};\n\n/**\n * Given an array of facet paths, removes parent facet paths so that only the\n * Leaf facets are sent with the search request.\n */\nexport function removeSubstringMatches(arr: string[]): string[] {\n return arr.filter(\n (entry, index, array) =>\n !array.some(\n (otherEntry, otherIndex) =>\n otherIndex !== index && otherEntry.includes(entry),\n ),\n );\n}\n\n/**\n * Merges a current facet tree with an incoming facet tree.\n *\n * At each branch, the incoming facet tree's facets override current facet tree\n *\n * @param currentTree\n * @param incomingTree\n */\nexport const mergeFacetTrees = (\n currentTree: FacetTree,\n incomingTree: FacetTree,\n): FacetTree => {\n const mergedTree: FacetTree = structuredClone(currentTree);\n\n const merge = (\n currentBranch: FacetWithChildrenObject,\n nodePath: string[],\n ): FacetWithChildrenObject => {\n const mergedBranch = structuredClone(currentBranch);\n const incomingBranch = getFacetTreeNodeAtPath(incomingTree, nodePath);\n\n if (!incomingBranch) {\n return mergedBranch;\n }\n\n for (const nodeName of Object.keys(currentBranch.children)) {\n if (incomingBranch.children[nodeName]) {\n mergedBranch.children[nodeName] = {\n ...deepMergeWithSpread(\n currentBranch.children[nodeName],\n incomingBranch.children[nodeName],\n ),\n count: mergedBranch.children[nodeName]?.count || 0,\n };\n } else if (mergedBranch.children[nodeName]) {\n mergedBranch.children[nodeName] = merge(\n mergedBranch.children[nodeName],\n [...nodePath, nodeName],\n );\n }\n }\n\n return mergedBranch;\n };\n\n return merge(mergedTree, []);\n};\n\n/**\n * A function that converts a FacetWithChidrenArray to a complete FacetTree object.\n *\n * It uses the `path` of each Facet to build the tree.\n *\n * @param facetWithChildArray\n * @param exclude - Optional array of facet values or paths to exclude from the tree.\n * - Values starting with \"/\" are treated as full paths and exclude the path and all children\n * (e.g., \"/news\" excludes \"/news\", \"/news/local\", \"/news/national\", etc.)\n * - Values without \"/\" are treated as segment names (e.g., \"local\" excludes all paths containing \"local\")\n */\nexport const facetWithChildrenArrayToCompleteFacetTree = (\n rootArray: FacetWithChildrenArray,\n exclude?: string[],\n): FacetTree => {\n // 1) Start with an empty tree at root \"/\"\n const tree: FacetTree = {\n path: '/',\n count: 0,\n children: {},\n };\n\n // 2) Recursively collect all nodes except the implicit \"/\" itself\n const allFacets: Facet[] = [];\n const collect = (node: FacetWithChildrenArray) => {\n if (node.path !== '/') {\n allFacets.push({ path: node.path, count: node.count });\n }\n if (node.children) {\n for (const child of node.children) {\n collect(child);\n }\n }\n };\n collect(rootArray);\n\n // 3) Insert each flat node into our tree, creating missing ancestors\n for (const { path, count } of allFacets) {\n const segments = path.split('/').filter(Boolean); // \"/sports/outdoors\" -> [\"sports\",\"outdoors\"]\n\n // Skip this facet if it matches any excluded value\n if (exclude && exclude.length > 0) {\n let shouldExclude = false;\n\n for (const excludeValue of exclude) {\n if (excludeValue.startsWith('/')) {\n // Full path exclusion: prefix match (excludes the path and all children)\n if (path === excludeValue || path.startsWith(`${excludeValue}/`)) {\n shouldExclude = true;\n break;\n }\n } else {\n // Segment exclusion: check if any segment matches\n if (segments.includes(excludeValue)) {\n shouldExclude = true;\n break;\n }\n }\n }\n\n if (shouldExclude) {\n continue;\n }\n }\n\n let cursor: FacetWithChildrenObject = tree; // start at the root\n for (const segment of segments) {\n // Build the full path of this level\n const prefixPath =\n cursor.path === '/' ? `/${segment}` : `${cursor.path}/${segment}`;\n\n // If this segment doesn't exist yet, create it\n if (!cursor.children[segment]) {\n cursor.children[segment] = {\n path: prefixPath,\n count: count,\n children: {},\n };\n }\n\n // Descend to the next level deeper\n cursor = cursor.children[segment];\n }\n\n // 4) Now `cursor` is the node matching `path` assign its real count\n cursor.count = count;\n }\n\n return tree;\n};\n","import {\n Component,\n Event,\n type EventEmitter,\n Method,\n Prop,\n State,\n h,\n} from '@stencil/core';\n\nimport type {\n FacetRoot,\n FacetWithChildrenArray,\n FacetWithChildrenObject,\n SearchClientQuery,\n} from '@types';\n\nimport type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport type { SearchcraftState } from '@store';\nimport {\n deepMergeWithSpread,\n facetWithChildrenArrayToCompleteFacetTree,\n getFacetTreeNodeAtPath,\n mergeFacetTrees,\n removeSubstringMatches,\n} from '@utils';\n\ntype HandlerActionType =\n | 'SEARCH_TERM_EMPTY'\n | 'NEW_SEARCH_TERM'\n | 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE'\n | 'RANGE_VALUE_UPDATE'\n | 'EXACT_MATCH_UPDATE'\n | 'SORT_ORDER_UPDATE'\n | 'FACET_UPDATE'\n | 'UNKNOWN';\n\n/**\n * This web component is designed to display facets in a search interface, allowing users to refine their search results by applying filters based on various attributes.\n * It is consumed within the `searchcraft-filter-panel`.\n *\n * @js-example\n * ```html\n * <!-- index.html -->\n * <!-- Basic usage -->\n * <searchcraft-facet-list field-name=\"title\" />\n *\n * <!-- With collapsible section (initially closed) and view more threshold -->\n * <searchcraft-facet-list\n * field-name=\"category\"\n * initial-collapse-state=\"closed\"\n * view-more-threshold=\"5\"\n * />\n *\n * <!-- Show all facets without \"view more\" link -->\n * <searchcraft-facet-list\n * field-name=\"brand\"\n * view-more-threshold=\"0\"\n * />\n * ```\n *\n * ```js\n * // index.js\n * const facetList = document.querySelector('searchcraft-facet-list');\n *\n * facetList.addEventListener('facetSelectionUpdated', () => {\n * console.log('Facet selection updated');\n * });\n *\n * // Programmatically toggle collapse state\n * await facetList.handleCollapseToggle();\n * ```\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-facet-list',\n shadow: false,\n})\nexport class SearchcraftFacetList {\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n /**\n * The name of the field where facets are applied.\n */\n @Prop() fieldName = '';\n /**\n * Array of facet values to exclude from rendering.\n */\n @Prop() exclude?: string[];\n /**\n * Initial collapse state of the facet section.\n * @default 'open'\n */\n @Prop() initialCollapseState?: 'open' | 'closed' = 'open';\n /**\n * The number of facets to show before displaying a \"view more\" link.\n * Set to 0 to show all facets without a \"view more\" link.\n * @default 8\n */\n @Prop() viewMoreThreshold?: number = 8;\n\n /**\n * Emitted when the facets are updated.\n */\n @Event() facetSelectionUpdated?: EventEmitter<{ paths: string[] }>;\n\n /**\n * The currently selected facet paths.\n */\n @State() selectedPaths: Record<string, boolean> = {};\n\n /**\n * A Tree representing all of the facets collected from search responses.\n */\n @State() facetTreeCollectedFromSearchResponse: FacetWithChildrenObject = {\n path: '/',\n count: 0,\n children: {},\n };\n\n /**\n * A Tree representing the facet paths that are selected, but were not included\n * in any search response.\n */\n facetTreeFromFacetPathsNotInSearchResponse: FacetWithChildrenObject = {\n path: '/',\n count: 0,\n children: {},\n };\n\n /**\n * The facet tree that ultimately gets rendered.\n * This is a mergin of the facetTreeCollectedFromSearchResponse and the facetTreeFromFacetPathsNotInSearchResponse tree\n */\n @State() renderedFacetTree: FacetWithChildrenObject = {\n path: '/',\n count: 0,\n children: {},\n };\n\n /**\n * Tracks whether the facet section is collapsed or expanded.\n */\n @State() isCollapsed = false;\n\n /**\n * Tracks whether all facets are shown or limited by the threshold.\n */\n @State() showAllFacets = false;\n\n // Internal vars used to track when to perform various facet actions.\n private lastTimeTaken?: number;\n private lastSearchTerm?: string;\n private lastSearchMode?: string;\n private lastSortType?: string | null;\n private lastRangeValues?: string;\n private lastFacetValues?: string;\n\n private unsubscribe?: () => void;\n private cleanupCore?: () => void;\n\n get areAnyFacetPathsSelected(): boolean {\n return Object.keys(this.selectedPaths).some(\n (key) => this.selectedPaths[key],\n );\n }\n\n handleIncomingSearchResponse(\n state: SearchcraftState,\n actionType: HandlerActionType,\n ) {\n // Look at the incoming facet root from the search response, and convert it to a FacetTree\n const incomingFacetRoot: FacetRoot | undefined =\n state.searchResponseFacetPrime?.find(\n (facet) => this.fieldName === Object.keys(facet)[0],\n );\n const incomingFacetsWithChildrenArray = incomingFacetRoot?.[this.fieldName];\n const incomingFacetTree = facetWithChildrenArrayToCompleteFacetTree(\n {\n path: '/',\n count: 0,\n children: incomingFacetsWithChildrenArray || [],\n },\n this.exclude,\n );\n\n // Determine what action to take to accumulate items into the `facetTreeCollectedFromSearchResponse`.\n // This facet tree gets accumulated in different ways depending on what action type occured.\n switch (actionType) {\n case 'SEARCH_TERM_EMPTY':\n this.facetTreeCollectedFromSearchResponse = {\n path: '/',\n count: 0,\n children: {},\n };\n break;\n case 'NEW_SEARCH_TERM':\n this.facetTreeCollectedFromSearchResponse = incomingFacetTree;\n break;\n case 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE':\n case 'EXACT_MATCH_UPDATE':\n case 'RANGE_VALUE_UPDATE': {\n if (state.supplementalFacetPrime) {\n const supplementalFacetRoot: FacetRoot | undefined =\n state.supplementalFacetPrime?.find(\n (facet) => this.fieldName === Object.keys(facet)[0],\n );\n const supplementalFacetsWithChildrenArray =\n supplementalFacetRoot?.[this.fieldName];\n const supplementalFacetTree =\n facetWithChildrenArrayToCompleteFacetTree(\n {\n path: '/',\n count: 0,\n children: supplementalFacetsWithChildrenArray || [],\n },\n this.exclude,\n );\n\n this.facetTreeCollectedFromSearchResponse = mergeFacetTrees(\n supplementalFacetTree,\n incomingFacetTree,\n );\n } else {\n this.facetTreeCollectedFromSearchResponse = incomingFacetTree;\n }\n break;\n }\n case 'FACET_UPDATE':\n case 'SORT_ORDER_UPDATE':\n this.facetTreeCollectedFromSearchResponse = mergeFacetTrees(\n this.facetTreeCollectedFromSearchResponse,\n incomingFacetTree,\n );\n break;\n default:\n return;\n }\n\n // Determine if there are any selected facet paths not in the current tree.\n // If there are, we add them to \"facetTreeFromFacetPathsNotInSearchResponse\"\n this.facetTreeFromFacetPathsNotInSearchResponse = {\n path: '/',\n count: 0,\n children: {},\n };\n const collectedFacetArray: FacetWithChildrenArray = {\n path: '/',\n count: 0,\n children: [],\n };\n for (const pathName of Object.keys(this.selectedPaths).filter(\n (path) => this.selectedPaths[path],\n )) {\n const nodePaths = pathName.startsWith('/')\n ? pathName.substring(1).split('/')\n : pathName.split('/');\n\n const wasFoundInFacetTree = !!getFacetTreeNodeAtPath(\n this.facetTreeCollectedFromSearchResponse,\n nodePaths,\n );\n\n const pathKeyName = nodePaths.at(-1);\n if (!wasFoundInFacetTree && pathKeyName) {\n collectedFacetArray.children?.push({\n children: [],\n count: 0,\n path: pathName,\n });\n }\n }\n this.facetTreeFromFacetPathsNotInSearchResponse =\n facetWithChildrenArrayToCompleteFacetTree(\n collectedFacetArray,\n this.exclude,\n );\n\n // Merges facetTreeCollectedFromSearchResponse with selectedFacetPathsNotInCurrentFacetTree.\n // This results in a single, final facet tree that gets rendered in as Checkboxes\n this.renderedFacetTree = deepMergeWithSpread(\n this.facetTreeFromFacetPathsNotInSearchResponse,\n this.facetTreeCollectedFromSearchResponse,\n );\n }\n\n handleStateUpdate(_state: SearchcraftState) {\n const state = { ..._state };\n // Determine what action to take based on the current State\n\n // Check if this is an initialQuery case (string requestProperties with empty searchTerm)\n const isInitialQuery =\n typeof state.searchClientRequestProperties === 'string' &&\n state.searchTerm.trim() === '';\n\n if (state.searchTerm.trim() === '' && !isInitialQuery) {\n this.handleIncomingSearchResponse(state, 'SEARCH_TERM_EMPTY');\n this.lastSearchTerm = '';\n } else if (\n this.lastTimeTaken !== state.searchResponseTimeTaken &&\n state.searchClientRequestProperties\n ) {\n // Handle both object and string requestProperties (string is used for initialQuery)\n if (typeof state.searchClientRequestProperties === 'object') {\n const requestProperties = state.searchClientRequestProperties;\n let actionType: HandlerActionType = 'UNKNOWN';\n\n if (this.lastSearchTerm !== requestProperties.searchTerm) {\n if (this.areAnyFacetPathsSelected) {\n actionType = 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE';\n } else {\n actionType = 'NEW_SEARCH_TERM';\n }\n } else if (\n this.lastRangeValues !==\n JSON.stringify(requestProperties.rangeValueForIndexFields)\n ) {\n actionType = 'RANGE_VALUE_UPDATE';\n } else if (\n this.lastFacetValues !==\n JSON.stringify(requestProperties.facetPathsForIndexFields)\n ) {\n actionType = 'FACET_UPDATE';\n } else if (this.lastSortType !== requestProperties.order_by) {\n actionType = 'SORT_ORDER_UPDATE';\n } else if (this.lastSearchMode !== requestProperties.mode) {\n actionType = 'EXACT_MATCH_UPDATE';\n }\n\n this.lastRangeValues = JSON.stringify(\n requestProperties.rangeValueForIndexFields,\n );\n this.lastFacetValues = JSON.stringify(\n requestProperties.facetPathsForIndexFields,\n );\n this.lastSortType = requestProperties.order_by;\n this.lastSearchMode = requestProperties.mode;\n this.lastSearchTerm = requestProperties.searchTerm;\n this.lastTimeTaken = state.searchResponseTimeTaken;\n // Handle the incoming response, using the action we have determined.\n this.handleIncomingSearchResponse(state, actionType);\n } else if (typeof state.searchClientRequestProperties === 'string') {\n // Handle initialQuery case where requestProperties is a string\n // For initialQuery, searchTerm will be empty but we still want to show facets\n let actionType: HandlerActionType = 'NEW_SEARCH_TERM';\n\n // Parse the request to get facet and range filters from the query array\n const requestObj = JSON.parse(state.searchClientRequestProperties);\n const queryArray = Array.isArray(requestObj.query)\n ? requestObj.query\n : [requestObj.query];\n\n // Extract filter queries (those with occur: 'must')\n const filterQueries = queryArray.filter(\n (q: SearchClientQuery) => q.occur === 'must',\n );\n const currentFilters = JSON.stringify(filterQueries);\n\n // Determine the action type based on what changed\n if (\n this.lastFacetValues !== undefined &&\n this.lastFacetValues !== currentFilters\n ) {\n // Filters have changed (not initial load)\n actionType = 'FACET_UPDATE';\n } else if (\n state.searchTerm.trim() === '' &&\n this.lastSearchTerm === ''\n ) {\n // Initial load or no changes with empty search term\n actionType = 'NEW_SEARCH_TERM';\n } else if (this.lastSearchTerm !== state.searchTerm) {\n // User has typed a new search term after initialQuery\n if (this.areAnyFacetPathsSelected) {\n actionType = 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE';\n } else {\n actionType = 'NEW_SEARCH_TERM';\n }\n }\n\n this.lastFacetValues = currentFilters;\n this.lastSearchTerm = state.searchTerm;\n this.lastTimeTaken = state.searchResponseTimeTaken;\n // Handle the incoming response, using the action we have determined.\n this.handleIncomingSearchResponse(state, actionType);\n }\n }\n }\n\n onCoreAvailable(core: SearchcraftCore) {\n this.handleStateUpdate(core.store.getState());\n\n this.unsubscribe = core.store.subscribe((state) => {\n this.handleStateUpdate(state);\n });\n }\n\n connectedCallback() {\n // Initialize collapse state based on prop\n this.isCollapsed = this.initialCollapseState === 'closed';\n\n this.cleanupCore = registry.useCoreInstance(\n this.searchcraftId,\n this.onCoreAvailable.bind(this),\n );\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n this.cleanupCore?.();\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 formatFacetName = (name: string): string => {\n const label = name.replace(/^\\//, '');\n return `${label.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())}`;\n };\n\n /**\n * Toggles the collapsed state of the facet section.\n * @returns A promise that resolves when the toggle is complete.\n */\n @Method()\n async handleCollapseToggle() {\n this.isCollapsed = !this.isCollapsed;\n }\n\n /**\n * Returns whether the facet section is currently collapsed.\n * @returns A promise that resolves to true if collapsed, false if expanded.\n */\n @Method()\n async getIsCollapsed() {\n return this.isCollapsed;\n }\n\n handleViewMoreToggle = () => {\n this.showAllFacets = !this.showAllFacets;\n };\n\n renderFacet(keyName: string, facet: FacetWithChildrenObject) {\n let isChildSelected = false;\n for (const path of Object.keys(this.selectedPaths)) {\n if (\n this.selectedPaths[path] &&\n path.startsWith(facet.path) &&\n path.length > facet.path.length\n ) {\n isChildSelected = true;\n }\n }\n\n const isSelected = Object.keys(this.selectedPaths).includes(facet.path);\n\n const shouldRenderChildren =\n (Object.keys(facet.children).length > 0 &&\n (isSelected || isChildSelected)) ||\n keyName === '@@root';\n\n return (\n <div class='searchcraft-facet-list-item'>\n {keyName !== '@@root' && (\n <label class='searchcraft-facet-list-checkbox-label'>\n <div class='searchcraft-facet-list-checkbox-input-wrapper'>\n <input\n class='searchcraft-facet-list-checkbox-input'\n checked={this.selectedPaths[facet.path]}\n onChange={(_event: Event) => {\n this.handleCheckboxChange(facet.path);\n }}\n type='checkbox'\n />\n {isChildSelected ? (\n <div class='searchcraft-facet-list-checkbox-input-dash-icon'>\n <svg viewBox='0 0 14 3' fill='none'>\n <title>Checkbox dash</title>\n <line\n x1='1.5'\n y1='1.5'\n x2='12.5'\n y2='1.5'\n stroke='white'\n stroke-width='3'\n stroke-linecap='round'\n />\n </svg>\n </div>\n ) : (\n <div class='searchcraft-facet-list-checkbox-input-check-icon'>\n <svg width='16' height='16' viewBox='0 0 16 16' fill='none'>\n <title>Checkbox check</title>\n <path\n d='M13.9999 2L5.74988 10L1.99988 6.36364'\n stroke='white'\n stroke-width='3'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </div>\n )}\n </div>\n <span>\n {this.formatFacetName(keyName)} ({facet.count})\n </span>\n </label>\n )}\n {shouldRenderChildren && (\n <div\n class='searchcraft-facet-list'\n style={{\n paddingLeft: keyName !== '@@root' ? '24px' : '0px',\n paddingTop: keyName !== '@@root' ? '6px' : '0px',\n }}\n >\n {Object.keys(facet.children).map((key) => {\n if (facet.children[key]) {\n return this.renderFacet(key, facet.children[key]);\n }\n })}\n </div>\n )}\n </div>\n );\n }\n\n render() {\n if (!this.fieldName) {\n return;\n }\n\n if (\n Object.keys(this.facetTreeCollectedFromSearchResponse.children).length ===\n 0 &&\n (this.lastSearchTerm || '').trim().length === 0\n ) {\n return;\n }\n\n if (\n Object.keys(this.facetTreeCollectedFromSearchResponse.children).length ===\n 0 &&\n (this.lastSearchTerm || '').trim().length > 0\n ) {\n return (\n <p class='searchcraft-facet-list-message'>\n No facets are available for this search query.\n </p>\n );\n }\n\n // Get root-level facets for view more functionality\n const rootFacets = Object.keys(this.renderedFacetTree.children);\n const threshold = this.viewMoreThreshold ?? 8;\n const shouldShowViewMore = threshold > 0 && rootFacets.length > threshold;\n const visibleFacets = shouldShowViewMore && !this.showAllFacets\n ? rootFacets.slice(0, threshold)\n : rootFacets;\n\n return (\n <div\n class='searchcraft-facet-list-wrapper'\n data-facet-section-collapsed={this.isCollapsed ? '' : undefined}\n data-facet-section-expanded={!this.isCollapsed ? '' : undefined}\n >\n {!this.isCollapsed && (\n <div class='searchcraft-facet-list-content'>\n <div class='searchcraft-facet-list'>\n {visibleFacets.map((key) => {\n if (this.renderedFacetTree.children[key]) {\n return this.renderFacet(key, this.renderedFacetTree.children[key]);\n }\n })}\n </div>\n {shouldShowViewMore && (\n <button\n class='searchcraft-facet-list-view-more'\n onClick={this.handleViewMoreToggle}\n type='button'\n >\n {this.showAllFacets ? 'View less' : 'View more...'}\n </button>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n"],"version":3}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?v=0.13.
|
|
2
|
-
import { r as registry } from './CoreInstanceRegistry.js?v=0.13.
|
|
3
|
-
import { d as defineCustomElement$4 } from './searchcraft-facet-list2.js?v=0.13.
|
|
4
|
-
import { d as defineCustomElement$3 } from './searchcraft-slider2.js?v=0.13.
|
|
5
|
-
import { d as defineCustomElement$2 } from './searchcraft-toggle-button2.js?v=0.13.
|
|
1
|
+
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?v=0.13.3';
|
|
2
|
+
import { r as registry } from './CoreInstanceRegistry.js?v=0.13.3';
|
|
3
|
+
import { d as defineCustomElement$4 } from './searchcraft-facet-list2.js?v=0.13.3';
|
|
4
|
+
import { d as defineCustomElement$3 } from './searchcraft-slider2.js?v=0.13.3';
|
|
5
|
+
import { d as defineCustomElement$2 } from './searchcraft-toggle-button2.js?v=0.13.3';
|
|
6
6
|
|
|
7
7
|
const SearchcraftFilterPanel$1 = /*@__PURE__*/ proxyCustomElement(class SearchcraftFilterPanel extends H {
|
|
8
8
|
constructor(registerHost) {
|
|
@@ -275,8 +275,40 @@ const SearchcraftFilterPanel$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
275
275
|
}
|
|
276
276
|
case 'facets': {
|
|
277
277
|
const item = filterItem;
|
|
278
|
+
let facetListElement = null;
|
|
279
|
+
let labelElement = null;
|
|
280
|
+
const updateLabelAttributes = (isCollapsed) => {
|
|
281
|
+
if (labelElement) {
|
|
282
|
+
if (isCollapsed) {
|
|
283
|
+
labelElement.removeAttribute('data-facet-section-expanded');
|
|
284
|
+
labelElement.setAttribute('data-facet-section-collapsed', '');
|
|
285
|
+
labelElement.setAttribute('aria-expanded', 'false');
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
labelElement.removeAttribute('data-facet-section-collapsed');
|
|
289
|
+
labelElement.setAttribute('data-facet-section-expanded', '');
|
|
290
|
+
labelElement.setAttribute('aria-expanded', 'true');
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
const handleToggle = async () => {
|
|
295
|
+
if (facetListElement && 'handleCollapseToggle' in facetListElement && 'getIsCollapsed' in facetListElement) {
|
|
296
|
+
await facetListElement.handleCollapseToggle();
|
|
297
|
+
const isCollapsed = await facetListElement.getIsCollapsed();
|
|
298
|
+
updateLabelAttributes(isCollapsed);
|
|
299
|
+
}
|
|
300
|
+
};
|
|
278
301
|
// return "filters-list"
|
|
279
|
-
return (h("div", { class: 'searchcraft-filter-panel-section' }, h("p", {
|
|
302
|
+
return (h("div", { class: 'searchcraft-filter-panel-section' }, h("p", { ref: (el) => {
|
|
303
|
+
labelElement = el || null;
|
|
304
|
+
}, class: 'searchcraft-filter-panel-label', "data-toggle-facet-section": true, "data-facet-section-expanded": item.options.initialCollapseState !== 'closed' ? '' : undefined, "data-facet-section-collapsed": item.options.initialCollapseState === 'closed' ? '' : undefined, onClick: handleToggle, onKeyDown: async (event) => {
|
|
305
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
306
|
+
event.preventDefault();
|
|
307
|
+
await handleToggle();
|
|
308
|
+
}
|
|
309
|
+
}, tabIndex: 0, role: 'button', "aria-expanded": item.options.initialCollapseState !== 'closed' }, filterItem.label), h("searchcraft-facet-list", { ref: (el) => {
|
|
310
|
+
facetListElement = el || null;
|
|
311
|
+
}, fieldName: item.fieldName, exclude: item.options.exclude, initialCollapseState: item.options.initialCollapseState, viewMoreThreshold: item.options.viewMoreThreshold, onFacetSelectionUpdated: (event) => {
|
|
280
312
|
this.handleFacetSelectionUpdated(item.fieldName, event.detail.paths);
|
|
281
313
|
} })));
|
|
282
314
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"searchcraft-filter-panel.js","mappings":"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","names":["SearchcraftFilterPanel","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/searchcraft-filter-panel/searchcraft-filter-panel.tsx"],"sourcesContent":["import type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport { Component, Element, Prop, State, h } from '@stencil/core';\nimport type {\n DateRangeFilterItem,\n ExactMatchToggleFilterItem,\n FacetsFilterItem,\n FilterItem,\n MostRecentToggleFilterItem,\n NumericFilterItem,\n} from '@types';\n\n/**\n * This web component represents a series of filters that allows users to refine and control their search queries by applying various filter criteria.\n *\n * @react-import\n * ```jsx\n * import { SearchcraftFilterPanel } from \"@searchcraft/react-sdk\";\n * ```\n *\n * @vue-import\n * ```jsx\n * import { SearchcraftFilterPanel } from \"@searchcraft/vue-sdk\";\n * ```\n *\n * @js-example\n * ```html\n * <!-- index.html -->\n * <searchcraft-filter-panel />\n * ```\n *\n * ```js\n * // index.js\n * const filterPanel = document.querySelector('searchcraft-filter-panel');\n *\n * if (filterPanel) {\n * filterPanel.items = [];\n * }\n * ```\n *\n * @react-example\n * ```jsx\n * <SearchcraftFilterPanel items={[]} />\n * ```\n *\n * @vue-example\n * ```jsx\n * <SearchcraftFilterPanel :items=\"[]\" />\n * ```\n */\n@Component({\n tag: 'searchcraft-filter-panel',\n shadow: false,\n})\nexport class SearchcraftFilterPanel {\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n /**\n * The items to filter.\n */\n @Prop() items: FilterItem[] = [];\n /**\n * The breakpoint (in pixels) below which the filter panel will be hidden.\n * Defaults to 768px (--sc-breakpoint-md).\n */\n @Prop() responsiveBreakpoint?: number = 768;\n /**\n * Controls whether the filter panel automatically hides/shows based on window size.\n * - 'auto': Automatically hide/show based on window width\n * - 'manual': User controls visibility manually\n */\n @Prop() responsiveBehavior?: 'auto' | 'manual' = 'auto';\n\n @State() lastSearchTerm: string | undefined;\n @State() isFilterPanelVisible = true;\n\n @Element() hostElement!: HTMLElement;\n\n private core?: SearchcraftCore;\n private unsubscribe?: () => void;\n private cleanupCore?: () => void;\n private resizeObserver?: ResizeObserver;\n private manuallyToggled = false; // Track if user manually toggled visibility\n private toggleClickHandler?: (event: Event) => void;\n\n onCoreAvailable(core: SearchcraftCore) {\n this.core = core;\n this.setInitialDateRanges();\n\n // Initialize visibility based on current window size if in auto mode\n if (this.responsiveBehavior === 'auto') {\n this.updateVisibilityBasedOnWindowSize();\n }\n\n this.unsubscribe = core.store.subscribe((state, prevState) => {\n if (this.lastSearchTerm !== state.searchTerm) {\n // A place to put actions to do when the query changes\n }\n this.lastSearchTerm = state.searchTerm || '';\n\n // Check if visibility was manually changed (not by auto-resize)\n if (prevState.isFilterPanelVisible !== state.isFilterPanelVisible) {\n const windowWidth = window.innerWidth;\n const autoVisibility =\n windowWidth >= (this.responsiveBreakpoint || 768);\n\n // If the new state differs from what auto mode would set, it was manual\n if (state.isFilterPanelVisible !== autoVisibility) {\n this.manuallyToggled = true;\n }\n\n // Update toggle element attributes when visibility changes\n this.updateToggleElementAttributes(state.isFilterPanelVisible);\n }\n\n this.isFilterPanelVisible = state.isFilterPanelVisible;\n });\n }\n\n componentDidLoad() {\n this.cleanupCore = registry.useCoreInstance(\n this.searchcraftId,\n this.onCoreAvailable.bind(this),\n );\n\n // Set up resize observer if in auto mode\n if (this.responsiveBehavior === 'auto' && typeof window !== 'undefined') {\n this.setupResizeObserver();\n }\n\n // Set up click handlers for elements with data-toggle-filter-panel attribute\n this.setupToggleClickHandlers();\n\n // Set initial toggle element state immediately\n // Use setTimeout to ensure this runs after the store is initialized\n setTimeout(() => {\n if (this.core) {\n const currentVisibility =\n this.core.store.getState().isFilterPanelVisible;\n this.updateToggleElementAttributes(currentVisibility);\n }\n }, 0);\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n this.cleanupCore?.();\n this.resizeObserver?.disconnect();\n\n // Clean up window resize listener if it was used as fallback\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this.handleWindowResize);\n }\n\n // Clean up toggle click handlers\n this.cleanupToggleClickHandlers();\n }\n\n /**\n * Sets up a ResizeObserver to watch for window size changes\n */\n setupResizeObserver() {\n if (typeof ResizeObserver === 'undefined') {\n // Fallback to window resize event if ResizeObserver is not available\n window.addEventListener('resize', this.handleWindowResize);\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.handleWindowResize();\n });\n\n // Observe the document body for size changes\n this.resizeObserver.observe(document.body);\n }\n\n /**\n * Handles window resize events\n */\n handleWindowResize = () => {\n if (this.responsiveBehavior === 'auto') {\n this.updateVisibilityBasedOnWindowSize();\n }\n };\n\n /**\n * Updates filter panel visibility based on current window width\n */\n updateVisibilityBasedOnWindowSize() {\n if (typeof window === 'undefined') return;\n\n // Don't auto-hide/show if user manually toggled it\n if (this.manuallyToggled) return;\n\n const windowWidth = window.innerWidth;\n const shouldBeVisible = windowWidth >= (this.responsiveBreakpoint || 768);\n\n if (this.core && this.isFilterPanelVisible !== shouldBeVisible) {\n this.core.store.getState().setFilterPanelVisibility(shouldBeVisible);\n }\n }\n\n /**\n * Sets up click handlers for elements with data-toggle-filter-panel attribute\n */\n setupToggleClickHandlers() {\n if (typeof document === 'undefined') return;\n\n this.toggleClickHandler = (event: Event) => {\n // Only allow toggle on mobile (below breakpoint)\n const windowWidth = window.innerWidth;\n if (windowWidth >= (this.responsiveBreakpoint || 768)) {\n return; // Don't toggle on desktop\n }\n\n event.preventDefault();\n if (this.core) {\n const currentVisibility =\n this.core.store.getState().isFilterPanelVisible;\n this.core.store.getState().setFilterPanelVisibility(!currentVisibility);\n }\n };\n\n // Find all elements with the data attribute\n const toggleElements = document.querySelectorAll(\n '[data-toggle-filter-panel]',\n );\n toggleElements.forEach((element) => {\n if (this.toggleClickHandler) {\n element.addEventListener('click', this.toggleClickHandler);\n }\n });\n }\n\n /**\n * Updates data attributes on toggle elements to reflect panel visibility state\n */\n updateToggleElementAttributes(isVisible: boolean) {\n if (typeof document === 'undefined') return;\n\n const toggleElements = document.querySelectorAll(\n '[data-toggle-filter-panel]',\n );\n toggleElements.forEach((element) => {\n if (isVisible) {\n element.removeAttribute('data-filter-panel-collapsed');\n element.setAttribute('data-filter-panel-expanded', '');\n } else {\n element.removeAttribute('data-filter-panel-expanded');\n element.setAttribute('data-filter-panel-collapsed', '');\n }\n });\n }\n\n /**\n * Cleans up click handlers for toggle elements\n */\n cleanupToggleClickHandlers() {\n if (typeof document === 'undefined' || !this.toggleClickHandler) return;\n\n const toggleElements = document.querySelectorAll(\n '[data-toggle-filter-panel]',\n );\n toggleElements.forEach((element) => {\n if (this.toggleClickHandler) {\n element.removeEventListener('click', this.toggleClickHandler);\n }\n });\n }\n\n /**\n * Sets the initial min/max date range values for search queries based on the filter items provided.\n */\n setInitialDateRanges() {\n for (const item of this.items) {\n if (item.type === 'dateRange') {\n const dateItem = item as DateRangeFilterItem;\n\n const startingMinDate = dateItem.options.minDate;\n const startingMaxDate = dateItem.options.maxDate || new Date();\n\n this.core?.store.getState()?.addRangeValueForIndexField({\n fieldName: dateItem.fieldName,\n value: `${dateItem.fieldName}:[${startingMinDate.toISOString()} TO ${startingMaxDate.toISOString()}]`,\n });\n }\n }\n }\n\n handleDateRangeChanged(item: DateRangeFilterItem, min: number, max: number) {\n const start = new Date(min);\n const end = new Date(max);\n this.core?.store.getState()?.addRangeValueForIndexField({\n fieldName: item.fieldName,\n value: `${item.fieldName}:[${start.toISOString()} TO ${end.toISOString()}]`,\n });\n\n this.core?.store.getState()?.search();\n }\n\n handleNumericRangeChanged(fieldName: string, min: number, max: number) {\n this.core?.store.getState()?.addRangeValueForIndexField({\n fieldName,\n value: `${fieldName}:[${min} TO ${max}]`,\n });\n this.core?.store.getState()?.search();\n }\n\n handleFacetSelectionUpdated(fieldName: string, paths: string[]) {\n if (paths.length > 0) {\n this.core?.store.getState()?.addFacetPathsForIndexField({\n fieldName,\n value: `${fieldName}: IN [${paths.join(' ')}]`,\n });\n } else {\n this.core?.store.getState()?.removeFacetPathsForIndexField(fieldName);\n }\n this.core?.store.getState()?.search();\n }\n\n handleExactMatchToggleUpdated(isActive: boolean) {\n this.core?.store.getState()?.setSearchMode(isActive ? 'exact' : 'fuzzy');\n this.core?.store.getState()?.search();\n }\n\n handleMostRecentToggleUpdated(fieldName: string, isActive: boolean) {\n if (isActive) {\n this.core?.store.getState()?.setSortOrder({\n orderByField: fieldName,\n sortType: 'desc',\n });\n } else {\n this.core?.store.getState()?.setSortOrder({\n orderByField: null,\n sortType: null,\n });\n }\n this.core?.store.getState()?.search();\n }\n\n /**\n * Iterate through `items` and render them based on `type`\n */\n render() {\n // Don't render if not visible\n if (!this.isFilterPanelVisible) {\n return null;\n }\n\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 maxDate = item.options.maxDate || new Date();\n\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.minDate.getTime()}\n max={maxDate.getTime()}\n dataType='date'\n step={1}\n dateGranularity={item.options.granularity}\n onRangeChanged={(event) => {\n this.handleDateRangeChanged(\n item,\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 step={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 exclude={item.options.exclude}\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 MostRecentToggleFilterItem;\n return (\n <searchcraft-toggle-button\n label={item.label}\n subLabel={item.options.subLabel}\n onToggleUpdated={(event) => {\n this.handleMostRecentToggleUpdated(\n item.fieldName,\n event.detail,\n );\n }}\n />\n );\n }\n }\n })}\n </div>\n );\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"searchcraft-filter-panel.js","mappings":"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","names":["SearchcraftFilterPanel","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/searchcraft-filter-panel/searchcraft-filter-panel.tsx"],"sourcesContent":["import type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport { Component, Element, Prop, State, h } from '@stencil/core';\nimport type {\n DateRangeFilterItem,\n ExactMatchToggleFilterItem,\n FacetsFilterItem,\n FilterItem,\n MostRecentToggleFilterItem,\n NumericFilterItem,\n} from '@types';\n\n/**\n * This web component represents a series of filters that allows users to refine and control their search queries by applying various filter criteria.\n *\n * @react-import\n * ```jsx\n * import { SearchcraftFilterPanel } from \"@searchcraft/react-sdk\";\n * ```\n *\n * @vue-import\n * ```jsx\n * import { SearchcraftFilterPanel } from \"@searchcraft/vue-sdk\";\n * ```\n *\n * @js-example\n * ```html\n * <!-- index.html -->\n * <searchcraft-filter-panel />\n * ```\n *\n * ```js\n * // index.js\n * const filterPanel = document.querySelector('searchcraft-filter-panel');\n *\n * if (filterPanel) {\n * filterPanel.items = [];\n * }\n * ```\n *\n * @react-example\n * ```jsx\n * <SearchcraftFilterPanel items={[]} />\n * ```\n *\n * @vue-example\n * ```jsx\n * <SearchcraftFilterPanel :items=\"[]\" />\n * ```\n */\n@Component({\n tag: 'searchcraft-filter-panel',\n shadow: false,\n})\nexport class SearchcraftFilterPanel {\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n /**\n * The items to filter.\n */\n @Prop() items: FilterItem[] = [];\n /**\n * The breakpoint (in pixels) below which the filter panel will be hidden.\n * Defaults to 768px (--sc-breakpoint-md).\n */\n @Prop() responsiveBreakpoint?: number = 768;\n /**\n * Controls whether the filter panel automatically hides/shows based on window size.\n * - 'auto': Automatically hide/show based on window width\n * - 'manual': User controls visibility manually\n */\n @Prop() responsiveBehavior?: 'auto' | 'manual' = 'auto';\n\n @State() lastSearchTerm: string | undefined;\n @State() isFilterPanelVisible = true;\n\n @Element() hostElement!: HTMLElement;\n\n private core?: SearchcraftCore;\n private unsubscribe?: () => void;\n private cleanupCore?: () => void;\n private resizeObserver?: ResizeObserver;\n private manuallyToggled = false; // Track if user manually toggled visibility\n private toggleClickHandler?: (event: Event) => void;\n\n onCoreAvailable(core: SearchcraftCore) {\n this.core = core;\n this.setInitialDateRanges();\n\n // Initialize visibility based on current window size if in auto mode\n if (this.responsiveBehavior === 'auto') {\n this.updateVisibilityBasedOnWindowSize();\n }\n\n this.unsubscribe = core.store.subscribe((state, prevState) => {\n if (this.lastSearchTerm !== state.searchTerm) {\n // A place to put actions to do when the query changes\n }\n this.lastSearchTerm = state.searchTerm || '';\n\n // Check if visibility was manually changed (not by auto-resize)\n if (prevState.isFilterPanelVisible !== state.isFilterPanelVisible) {\n const windowWidth = window.innerWidth;\n const autoVisibility =\n windowWidth >= (this.responsiveBreakpoint || 768);\n\n // If the new state differs from what auto mode would set, it was manual\n if (state.isFilterPanelVisible !== autoVisibility) {\n this.manuallyToggled = true;\n }\n\n // Update toggle element attributes when visibility changes\n this.updateToggleElementAttributes(state.isFilterPanelVisible);\n }\n\n this.isFilterPanelVisible = state.isFilterPanelVisible;\n });\n }\n\n componentDidLoad() {\n this.cleanupCore = registry.useCoreInstance(\n this.searchcraftId,\n this.onCoreAvailable.bind(this),\n );\n\n // Set up resize observer if in auto mode\n if (this.responsiveBehavior === 'auto' && typeof window !== 'undefined') {\n this.setupResizeObserver();\n }\n\n // Set up click handlers for elements with data-toggle-filter-panel attribute\n this.setupToggleClickHandlers();\n\n // Set initial toggle element state immediately\n // Use setTimeout to ensure this runs after the store is initialized\n setTimeout(() => {\n if (this.core) {\n const currentVisibility =\n this.core.store.getState().isFilterPanelVisible;\n this.updateToggleElementAttributes(currentVisibility);\n }\n }, 0);\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n this.cleanupCore?.();\n this.resizeObserver?.disconnect();\n\n // Clean up window resize listener if it was used as fallback\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', this.handleWindowResize);\n }\n\n // Clean up toggle click handlers\n this.cleanupToggleClickHandlers();\n }\n\n /**\n * Sets up a ResizeObserver to watch for window size changes\n */\n setupResizeObserver() {\n if (typeof ResizeObserver === 'undefined') {\n // Fallback to window resize event if ResizeObserver is not available\n window.addEventListener('resize', this.handleWindowResize);\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.handleWindowResize();\n });\n\n // Observe the document body for size changes\n this.resizeObserver.observe(document.body);\n }\n\n /**\n * Handles window resize events\n */\n handleWindowResize = () => {\n if (this.responsiveBehavior === 'auto') {\n this.updateVisibilityBasedOnWindowSize();\n }\n };\n\n /**\n * Updates filter panel visibility based on current window width\n */\n updateVisibilityBasedOnWindowSize() {\n if (typeof window === 'undefined') return;\n\n // Don't auto-hide/show if user manually toggled it\n if (this.manuallyToggled) return;\n\n const windowWidth = window.innerWidth;\n const shouldBeVisible = windowWidth >= (this.responsiveBreakpoint || 768);\n\n if (this.core && this.isFilterPanelVisible !== shouldBeVisible) {\n this.core.store.getState().setFilterPanelVisibility(shouldBeVisible);\n }\n }\n\n /**\n * Sets up click handlers for elements with data-toggle-filter-panel attribute\n */\n setupToggleClickHandlers() {\n if (typeof document === 'undefined') return;\n\n this.toggleClickHandler = (event: Event) => {\n // Only allow toggle on mobile (below breakpoint)\n const windowWidth = window.innerWidth;\n if (windowWidth >= (this.responsiveBreakpoint || 768)) {\n return; // Don't toggle on desktop\n }\n\n event.preventDefault();\n if (this.core) {\n const currentVisibility =\n this.core.store.getState().isFilterPanelVisible;\n this.core.store.getState().setFilterPanelVisibility(!currentVisibility);\n }\n };\n\n // Find all elements with the data attribute\n const toggleElements = document.querySelectorAll(\n '[data-toggle-filter-panel]',\n );\n toggleElements.forEach((element) => {\n if (this.toggleClickHandler) {\n element.addEventListener('click', this.toggleClickHandler);\n }\n });\n }\n\n /**\n * Updates data attributes on toggle elements to reflect panel visibility state\n */\n updateToggleElementAttributes(isVisible: boolean) {\n if (typeof document === 'undefined') return;\n\n const toggleElements = document.querySelectorAll(\n '[data-toggle-filter-panel]',\n );\n toggleElements.forEach((element) => {\n if (isVisible) {\n element.removeAttribute('data-filter-panel-collapsed');\n element.setAttribute('data-filter-panel-expanded', '');\n } else {\n element.removeAttribute('data-filter-panel-expanded');\n element.setAttribute('data-filter-panel-collapsed', '');\n }\n });\n }\n\n /**\n * Cleans up click handlers for toggle elements\n */\n cleanupToggleClickHandlers() {\n if (typeof document === 'undefined' || !this.toggleClickHandler) return;\n\n const toggleElements = document.querySelectorAll(\n '[data-toggle-filter-panel]',\n );\n toggleElements.forEach((element) => {\n if (this.toggleClickHandler) {\n element.removeEventListener('click', this.toggleClickHandler);\n }\n });\n }\n\n /**\n * Sets the initial min/max date range values for search queries based on the filter items provided.\n */\n setInitialDateRanges() {\n for (const item of this.items) {\n if (item.type === 'dateRange') {\n const dateItem = item as DateRangeFilterItem;\n\n const startingMinDate = dateItem.options.minDate;\n const startingMaxDate = dateItem.options.maxDate || new Date();\n\n this.core?.store.getState()?.addRangeValueForIndexField({\n fieldName: dateItem.fieldName,\n value: `${dateItem.fieldName}:[${startingMinDate.toISOString()} TO ${startingMaxDate.toISOString()}]`,\n });\n }\n }\n }\n\n handleDateRangeChanged(item: DateRangeFilterItem, min: number, max: number) {\n const start = new Date(min);\n const end = new Date(max);\n this.core?.store.getState()?.addRangeValueForIndexField({\n fieldName: item.fieldName,\n value: `${item.fieldName}:[${start.toISOString()} TO ${end.toISOString()}]`,\n });\n\n this.core?.store.getState()?.search();\n }\n\n handleNumericRangeChanged(fieldName: string, min: number, max: number) {\n this.core?.store.getState()?.addRangeValueForIndexField({\n fieldName,\n value: `${fieldName}:[${min} TO ${max}]`,\n });\n this.core?.store.getState()?.search();\n }\n\n handleFacetSelectionUpdated(fieldName: string, paths: string[]) {\n if (paths.length > 0) {\n this.core?.store.getState()?.addFacetPathsForIndexField({\n fieldName,\n value: `${fieldName}: IN [${paths.join(' ')}]`,\n });\n } else {\n this.core?.store.getState()?.removeFacetPathsForIndexField(fieldName);\n }\n this.core?.store.getState()?.search();\n }\n\n handleExactMatchToggleUpdated(isActive: boolean) {\n this.core?.store.getState()?.setSearchMode(isActive ? 'exact' : 'fuzzy');\n this.core?.store.getState()?.search();\n }\n\n handleMostRecentToggleUpdated(fieldName: string, isActive: boolean) {\n if (isActive) {\n this.core?.store.getState()?.setSortOrder({\n orderByField: fieldName,\n sortType: 'desc',\n });\n } else {\n this.core?.store.getState()?.setSortOrder({\n orderByField: null,\n sortType: null,\n });\n }\n this.core?.store.getState()?.search();\n }\n\n /**\n * Iterate through `items` and render them based on `type`\n */\n render() {\n // Don't render if not visible\n if (!this.isFilterPanelVisible) {\n return null;\n }\n\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 maxDate = item.options.maxDate || new Date();\n\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.minDate.getTime()}\n max={maxDate.getTime()}\n dataType='date'\n step={1}\n dateGranularity={item.options.granularity}\n onRangeChanged={(event) => {\n this.handleDateRangeChanged(\n item,\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 step={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 let facetListElement: HTMLElement | null = null;\n let labelElement: HTMLElement | null = null;\n\n const updateLabelAttributes = (isCollapsed: boolean) => {\n if (labelElement) {\n if (isCollapsed) {\n labelElement.removeAttribute('data-facet-section-expanded');\n labelElement.setAttribute('data-facet-section-collapsed', '');\n labelElement.setAttribute('aria-expanded', 'false');\n } else {\n labelElement.removeAttribute('data-facet-section-collapsed');\n labelElement.setAttribute('data-facet-section-expanded', '');\n labelElement.setAttribute('aria-expanded', 'true');\n }\n }\n };\n\n const handleToggle = async () => {\n if (facetListElement && 'handleCollapseToggle' in facetListElement && 'getIsCollapsed' in facetListElement) {\n await (facetListElement as { handleCollapseToggle: () => Promise<void>; getIsCollapsed: () => Promise<boolean> }).handleCollapseToggle();\n const isCollapsed = await (facetListElement as { getIsCollapsed: () => Promise<boolean> }).getIsCollapsed();\n updateLabelAttributes(isCollapsed);\n }\n };\n\n // return \"filters-list\"\n return (\n <div class='searchcraft-filter-panel-section'>\n <p\n ref={(el) => {\n labelElement = el || null;\n }}\n class='searchcraft-filter-panel-label'\n data-toggle-facet-section\n data-facet-section-expanded={item.options.initialCollapseState !== 'closed' ? '' : undefined}\n data-facet-section-collapsed={item.options.initialCollapseState === 'closed' ? '' : undefined}\n onClick={handleToggle}\n onKeyDown={async (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n await handleToggle();\n }\n }}\n tabIndex={0}\n role='button'\n aria-expanded={item.options.initialCollapseState !== 'closed'}\n >\n {filterItem.label}\n </p>\n <searchcraft-facet-list\n ref={(el) => {\n facetListElement = el || null;\n }}\n fieldName={item.fieldName}\n exclude={item.options.exclude}\n initialCollapseState={item.options.initialCollapseState}\n viewMoreThreshold={item.options.viewMoreThreshold}\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 MostRecentToggleFilterItem;\n return (\n <searchcraft-toggle-button\n label={item.label}\n subLabel={item.options.subLabel}\n onToggleUpdated={(event) => {\n this.handleMostRecentToggleUpdated(\n item.fieldName,\n event.detail,\n );\n }}\n />\n );\n }\n }\n })}\n </div>\n );\n }\n}\n"],"version":3}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SearchcraftInputForm$1, d as defineCustomElement$1 } from './searchcraft-input-form2.js?v=0.13.
|
|
1
|
+
import { S as SearchcraftInputForm$1, d as defineCustomElement$1 } from './searchcraft-input-form2.js?v=0.13.3';
|
|
2
2
|
|
|
3
3
|
const SearchcraftInputForm = SearchcraftInputForm$1;
|
|
4
4
|
const defineCustomElement = defineCustomElement$1;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { p as proxyCustomElement, H, c as createEvent, h, t as transformTag } from './index2.js?v=0.13.
|
|
2
|
-
import { c as classNames } from './index3.js?v=0.13.
|
|
3
|
-
import { r as registry } from './CoreInstanceRegistry.js?v=0.13.
|
|
4
|
-
import { d as defineCustomElement$3 } from './searchcraft-button2.js?v=0.13.
|
|
5
|
-
import { d as defineCustomElement$2 } from './searchcraft-error-message2.js?v=0.13.
|
|
6
|
-
import { d as defineCustomElement$1 } from './searchcraft-input-label2.js?v=0.13.
|
|
1
|
+
import { p as proxyCustomElement, H, c as createEvent, h, t as transformTag } from './index2.js?v=0.13.3';
|
|
2
|
+
import { c as classNames } from './index3.js?v=0.13.3';
|
|
3
|
+
import { r as registry } from './CoreInstanceRegistry.js?v=0.13.3';
|
|
4
|
+
import { d as defineCustomElement$3 } from './searchcraft-button2.js?v=0.13.3';
|
|
5
|
+
import { d as defineCustomElement$2 } from './searchcraft-error-message2.js?v=0.13.3';
|
|
6
|
+
import { d as defineCustomElement$1 } from './searchcraft-input-label2.js?v=0.13.3';
|
|
7
7
|
|
|
8
8
|
const SearchcraftInputForm = /*@__PURE__*/ proxyCustomElement(class SearchcraftInputForm extends H {
|
|
9
9
|
constructor(registerHost) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SearchcraftInputLabel$1, d as defineCustomElement$1 } from './searchcraft-input-label2.js?v=0.13.
|
|
1
|
+
import { S as SearchcraftInputLabel$1, d as defineCustomElement$1 } from './searchcraft-input-label2.js?v=0.13.3';
|
|
2
2
|
|
|
3
3
|
const SearchcraftInputLabel = SearchcraftInputLabel$1;
|
|
4
4
|
const defineCustomElement = defineCustomElement$1;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?v=0.13.
|
|
2
|
-
import { c as classNames } from './index3.js?v=0.13.
|
|
1
|
+
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?v=0.13.3';
|
|
2
|
+
import { c as classNames } from './index3.js?v=0.13.3';
|
|
3
3
|
|
|
4
4
|
const SearchcraftInputLabel = /*@__PURE__*/ proxyCustomElement(class SearchcraftInputLabel extends H {
|
|
5
5
|
constructor(registerHost) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SearchcraftInputLabel, d as defineCustomElement$1 } from './searchcraft-loading2.js?v=0.13.
|
|
1
|
+
import { S as SearchcraftInputLabel, d as defineCustomElement$1 } from './searchcraft-loading2.js?v=0.13.3';
|
|
2
2
|
|
|
3
3
|
const SearchcraftLoading = SearchcraftInputLabel;
|
|
4
4
|
const defineCustomElement = defineCustomElement$1;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?v=0.13.
|
|
1
|
+
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?v=0.13.3';
|
|
2
2
|
|
|
3
3
|
const SearchcraftInputLabel = /*@__PURE__*/ proxyCustomElement(class SearchcraftInputLabel extends H {
|
|
4
4
|
constructor(registerHost) {
|