@searchcraft/javascript-sdk 0.12.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/components/index.d.ts +13 -0
  2. package/dist/components/index.js +136 -17
  3. package/dist/components/index.js.map +1 -1
  4. package/dist/components/{p-b7e99386.js → p-870f81fd.js} +38 -6
  5. package/dist/components/p-870f81fd.js.map +1 -0
  6. package/dist/components/{p-0c495408.js → p-c8566920.js} +74 -33
  7. package/dist/components/p-c8566920.js.map +1 -0
  8. package/dist/components/searchcraft-facet-list.js +1 -1
  9. package/dist/components/searchcraft-filter-panel.js +2 -2
  10. package/dist/components/searchcraft-filter-panel.js.map +1 -1
  11. package/dist/components/searchcraft-input-form.js +1 -1
  12. package/dist/components/searchcraft-pagination.js +8 -2
  13. package/dist/components/searchcraft-pagination.js.map +1 -1
  14. package/dist/components/searchcraft-popover-form.js +1 -1
  15. package/dist/components/searchcraft-results-info.js +9 -1
  16. package/dist/components/searchcraft-results-info.js.map +1 -1
  17. package/dist/components/searchcraft-search-results-per-page.js +8 -2
  18. package/dist/components/searchcraft-search-results-per-page.js.map +1 -1
  19. package/dist/hydrate/index.js +192 -100
  20. package/dist/hydrate/index.mjs +192 -100
  21. package/dist/types/classes/SearchcraftCore.d.ts +1 -1
  22. package/dist/types/components/searchcraft-facet-list/searchcraft-facet-list.d.ts +1 -1
  23. package/dist/types/components/searchcraft-filter-panel/searchcraft-filter-panel.d.ts +1 -1
  24. package/dist/types/components/searchcraft-input-form/searchcraft-input-form.d.ts +5 -0
  25. package/dist/types/components/searchcraft-pagination/searchcraft-pagination.d.ts +1 -0
  26. package/dist/types/components/searchcraft-results-info/searchcraft-results-info.d.ts +1 -0
  27. package/dist/types/components/searchcraft-search-results-per-page/searchcraft-search-results-per-page.d.ts +1 -0
  28. package/dist/types/components.d.ts +8 -0
  29. package/dist/types/store/SearchcraftStore.types.d.ts +6 -1
  30. package/package.json +4 -3
  31. package/dist/components/p-0c495408.js.map +0 -1
  32. package/dist/components/p-b7e99386.js.map +0 -1
@@ -43,6 +43,10 @@ const SearchcraftInputForm = /*@__PURE__*/ proxyCustomElement(class SearchcraftI
43
43
  * 'hide-on-text-entered' - Only hide the placeholder when the input form has text entered into it.
44
44
  */
45
45
  placeholderBehavior;
46
+ /**
47
+ * The value to display in the input field.
48
+ */
49
+ value;
46
50
  /**
47
51
  * When the input becomes focused.
48
52
  */
@@ -63,18 +67,41 @@ const SearchcraftInputForm = /*@__PURE__*/ proxyCustomElement(class SearchcraftI
63
67
  cleanupCore;
64
68
  init() {
65
69
  if (this.core) {
70
+ // Initialize inputValue from prop if provided
71
+ if (this.value !== undefined && this.value.trim().length > 0) {
72
+ this.inputValue = this.value;
73
+ this.core.store.getState().setSearchTerm(this.value);
74
+ // Trigger search if autoSearch is enabled
75
+ if (this.autoSearch) {
76
+ this.core.store.getState().search();
77
+ }
78
+ }
66
79
  this.inputInit?.emit();
67
80
  }
68
81
  }
69
82
  onCoreChange() {
70
83
  this.init();
71
84
  }
85
+ onValueChange(newValue) {
86
+ if (newValue !== undefined && newValue !== this.inputValue) {
87
+ this.inputValue = newValue;
88
+ this.core?.store.getState().setSearchTerm(newValue);
89
+ // Trigger search if autoSearch is enabled and value is not empty
90
+ if (this.autoSearch && newValue.trim().length > 0) {
91
+ this.core?.store.getState().search();
92
+ }
93
+ }
94
+ }
72
95
  onCoreAvailable(core) {
73
96
  this.core = core;
74
97
  this.init();
75
98
  this.unsubscribe = core.store.subscribe((state) => {
76
99
  this.searchTerm = state.searchTerm;
77
- this.inputValue = state.searchTerm;
100
+ // Only update inputValue from store if value prop is not set
101
+ // OR if the store was cleared (empty string)
102
+ if (this.value === undefined || state.searchTerm === '') {
103
+ this.inputValue = state.searchTerm;
104
+ }
78
105
  });
79
106
  }
80
107
  connectedCallback() {
@@ -103,6 +130,8 @@ const SearchcraftInputForm = /*@__PURE__*/ proxyCustomElement(class SearchcraftI
103
130
  }
104
131
  };
105
132
  handleClearInput = () => {
133
+ // Clear the input value even if controlled by prop
134
+ this.inputValue = '';
106
135
  this.core?.store.getState().resetSearchValues();
107
136
  this.error = false;
108
137
  };
@@ -121,14 +150,15 @@ const SearchcraftInputForm = /*@__PURE__*/ proxyCustomElement(class SearchcraftI
121
150
  const inputGridStyles = {
122
151
  gap: shouldHaveVerticalGap ? '4px 8px' : '0px 8px',
123
152
  };
124
- return (h("form", { key: 'c1eea324038f640a9075d5714378d5c4b97168e0', class: 'searchcraft-input-form', onSubmit: this.handleFormSubmit }, h("div", { key: 'f157c00510e5c3e75dd703996be24de5e97bbcd9', class: inputGridClassNames, style: inputGridStyles }, h("div", { key: 'c97f3e5ef9ed6aee103dedc76b3ee1620b69ebba', class: 'searchcraft-input-form-button' }, h("searchcraft-button", { key: '4bb5dfea8b9f8f2f0a7e5fc5c1b199ef9d209278', onButtonClick: this.handleFormSubmit, label: this.buttonLabel })), this.inputLabel && (h("div", { key: 'aa8beca21ce414d645687ee73b7ca29c740438a2', class: 'searchcraft-input-form-label' }, h("searchcraft-input-label", { key: '8c15364abcf2e43354b445be6c7ceb9387ea4a67', label: this.inputLabel }))), this.error && (h("div", { key: '5987b6da22a25da50613ceb277bfe44b31ba8f37', class: 'searchcraft-input-form-error-message' }, h("searchcraft-error-message", { key: 'f2a230f0cf3cf0bbaddbb37ef2f38afdf73b28f6' }, "Something went wrong."))), h("div", { key: 'a0862217135ac6f9a96d9e64e6fca5f772eb8f51', class: 'searchcraft-input-form-input-wrapper' }, h("input", { key: '7071be386f0c73a0230e0815640b134ee5139262', autoComplete: 'off', class: classNames('searchcraft-input-form-input', {
153
+ return (h("form", { key: 'd214ace44e9209154d215e803de088aefa58a285', class: 'searchcraft-input-form', onSubmit: this.handleFormSubmit }, h("div", { key: '5699f5dca28caf5e9584401f1883d2e08d26e3ec', class: inputGridClassNames, style: inputGridStyles }, h("div", { key: 'ef792a946414a680e9c99c145246d00b9b8f2ffb', class: 'searchcraft-input-form-button' }, h("searchcraft-button", { key: 'ba5a8cb98889bb486781af4915a21c94a0b1498a', onButtonClick: this.handleFormSubmit, label: this.buttonLabel })), this.inputLabel && (h("div", { key: 'a9e770ef967f7ab1c6ddf8f87f23cea509894536', class: 'searchcraft-input-form-label' }, h("searchcraft-input-label", { key: '93b29e630e71a3c7724921aa9586aab76e592f4f', label: this.inputLabel }))), this.error && (h("div", { key: '641ef4f468d527c24a1635d49dcbbba03030686f', class: 'searchcraft-input-form-error-message' }, h("searchcraft-error-message", { key: '2d839d17b702fe1b41d7e49aacfc52fb53315766' }, "Something went wrong."))), h("div", { key: 'af0c73478de21447c992bd0037ba007d54f53a86', class: 'searchcraft-input-form-input-wrapper' }, h("input", { key: '3de1be1aa71c143b58cd6080d422410bd400e4e5', autoComplete: 'off', class: classNames('searchcraft-input-form-input', {
125
154
  'searchcraft-placeholder-hide-on-focus': this.placeholderBehavior === 'hide-on-focus',
126
155
  }), onFocus: () => this.inputFocus?.emit(), onBlur: () => this.inputBlur?.emit(), onInput: (event) => {
127
156
  this.handleInput(event);
128
- }, placeholder: this.placeholderValue, type: 'text', value: this.inputValue }), h("div", { key: '178a7a21a84f012662312dc2b9145fff0aec6a44', class: 'searchcraft-input-form-input-icon' }, h("svg", { key: '7fb86586c155f7075fb65280482eb2ab5ff8a9db', class: 'searchcraft-input-form-input-search-icon', viewBox: '0 0 20 20', fill: 'none', xmlns: 'http://www.w3.org/2000/svg', "aria-labelledby": 'searchcraft-title' }, h("title", { key: '0a48667010f2c998917271f941877c5ec826329f' }, "Search icon"), h("path", { key: '94c54dfa1406bdc6c2f87f3b31e1b01862b58e08', d: 'M17.5 17.5L13.875 13.875M15.8333 9.16667C15.8333 12.8486 12.8486 15.8333 9.16667 15.8333C5.48477 15.8333 2.5 12.8486 2.5 9.16667C2.5 5.48477 5.48477 2.5 9.16667 2.5C12.8486 2.5 15.8333 5.48477 15.8333 9.16667Z', stroke: 'currentColor', "stroke-width": '1.5', "stroke-linecap": 'round', "stroke-linejoin": 'round' }))), isShowingClearButton && (h("button", { key: '931fc5e8842de1e8f3bab3fa163261c54c24148c', type: 'button', class: 'searchcraft-input-form-clear-button', onClick: this.handleClearInput }, h("svg", { key: '0676b050222eb9a7bf2f7c7c112ae40c0644ecf7', class: 'searchcraft-input-form-clear-icon', viewBox: '0 0 22 22', fill: 'none', xmlns: 'http://www.w3.org/2000/svg', "aria-labelledby": 'icon-title' }, h("title", { key: '002b23596bc977b5a942776e4f7b513db4584361' }, "Clear icon"), h("path", { key: '05346b8f1ede39b9e1924760f400df10d8b0aa49', d: 'M14 8L8 14M8 8L14 14M21 11C21 16.5228 16.5228 21 11 21C5.47715 21 1 16.5228 1 11C1 5.47715 5.47715 1 11 1C16.5228 1 21 5.47715 21 11Z', stroke: 'currentColor', "stroke-width": '1.5', "stroke-linecap": 'round', "stroke-linejoin": 'round' }))))))));
157
+ }, placeholder: this.placeholderValue, type: 'text', value: this.inputValue }), h("div", { key: 'fe9043c046e3b1b91129299f0860919ba8a8416b', class: 'searchcraft-input-form-input-icon' }, h("svg", { key: '31ae1553cd214d5e2f97c9e3699862dff51a0916', class: 'searchcraft-input-form-input-search-icon', viewBox: '0 0 20 20', fill: 'none', xmlns: 'http://www.w3.org/2000/svg', "aria-labelledby": 'searchcraft-title' }, h("title", { key: '9db677da65283ff15b0d4e79b5d9daf89637b33f' }, "Search icon"), h("path", { key: '2a002eae6ed3725a432e7c3e4649c0bd2ffff7a0', d: 'M17.5 17.5L13.875 13.875M15.8333 9.16667C15.8333 12.8486 12.8486 15.8333 9.16667 15.8333C5.48477 15.8333 2.5 12.8486 2.5 9.16667C2.5 5.48477 5.48477 2.5 9.16667 2.5C12.8486 2.5 15.8333 5.48477 15.8333 9.16667Z', stroke: 'currentColor', "stroke-width": '1.5', "stroke-linecap": 'round', "stroke-linejoin": 'round' }))), isShowingClearButton && (h("button", { key: 'b7e92b22c3234eb31d85b0aa98d7c682b2fc0021', type: 'button', class: 'searchcraft-input-form-clear-button', onClick: this.handleClearInput }, h("svg", { key: 'bfbeb742f197da0cac6dd5df2627db9df5349207', class: 'searchcraft-input-form-clear-icon', viewBox: '0 0 22 22', fill: 'none', xmlns: 'http://www.w3.org/2000/svg', "aria-labelledby": 'icon-title' }, h("title", { key: 'c62b9d237b3762609fed72e0520322fb5eabe979' }, "Clear icon"), h("path", { key: '198a13760ce8b076ef8e791dec933b210ff3017a', d: 'M14 8L8 14M8 8L14 14M21 11C21 16.5228 16.5228 21 11 21C5.47715 21 1 16.5228 1 11C1 5.47715 5.47715 1 11 1C16.5228 1 21 5.47715 21 11Z', stroke: 'currentColor', "stroke-width": '1.5', "stroke-linecap": 'round', "stroke-linejoin": 'round' }))))))));
129
158
  }
130
159
  static get watchers() { return {
131
- "core": ["onCoreChange"]
160
+ "core": ["onCoreChange"],
161
+ "value": ["onValueChange"]
132
162
  }; }
133
163
  }, [0, "searchcraft-input-form", {
134
164
  "searchcraftId": [1, "searchcraft-id"],
@@ -138,11 +168,13 @@ const SearchcraftInputForm = /*@__PURE__*/ proxyCustomElement(class SearchcraftI
138
168
  "inputLabel": [1, "input-label"],
139
169
  "placeholderValue": [1, "placeholder-value"],
140
170
  "placeholderBehavior": [1, "placeholder-behavior"],
171
+ "value": [1],
141
172
  "inputValue": [32],
142
173
  "searchTerm": [32],
143
174
  "error": [32]
144
175
  }, undefined, {
145
- "core": ["onCoreChange"]
176
+ "core": ["onCoreChange"],
177
+ "value": ["onValueChange"]
146
178
  }]);
147
179
  function defineCustomElement() {
148
180
  if (typeof customElements === "undefined") {
@@ -175,4 +207,4 @@ function defineCustomElement() {
175
207
 
176
208
  export { SearchcraftInputForm as S, defineCustomElement as d };
177
209
 
178
- //# sourceMappingURL=p-b7e99386.js.map
210
+ //# sourceMappingURL=p-870f81fd.js.map
@@ -0,0 +1 @@
1
+ {"file":"p-870f81fd.js","mappings":"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","names":[],"sources":["src/components/searchcraft-input-form/searchcraft-input-form.tsx"],"sourcesContent":["import {\n Component,\n Event,\n type EventEmitter,\n Prop,\n State,\n Watch,\n h,\n} from '@stencil/core';\nimport classNames from 'classnames';\n\nimport type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport type { SearchcraftState } from '@store';\n\n/**\n * This web component provides a user-friendly interface for querying an indexed dataset, enabling users to easily search large collections of data.\n * It abstracts the complexities of index-based searching, making it accessible to users of all technical levels.\n *\n * @react-import\n * ```jsx\n * import { SearchcraftInputForm } from \"@searchcraft/react-sdk\";\n * ```\n *\n * @vue-import\n * ```jsx\n * import { SearchcraftInputForm } from \"@searchcraft/vue-sdk\";\n * ```\n *\n * @js-example\n * ```html\n * <searchcraft-input-form auto-search />\n * ```\n *\n * @react-example\n * ```jsx\n * <SearchcraftInputForm autoSearch />\n * ```\n *\n * @vue-example\n * ```jsx\n * <SearchcraftInputForm autoSearch />\n * ```\n */\n@Component({\n tag: 'searchcraft-input-form',\n shadow: false,\n})\nexport class SearchcraftInputForm {\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n /**\n * Whether or not to automatically submit the search term when the input changes.\n */\n @Prop() autoSearch?: boolean = true;\n /**\n * Where to place the search button.\n */\n @Prop() buttonPlacement?: 'left' | 'right' | 'none' = 'none';\n /**\n * The label for the submit button.\n */\n @Prop() buttonLabel?: string;\n /**\n * The label rendered above the input.\n */\n @Prop() inputLabel?: string;\n /**\n * The input element's placeholder value.\n */\n @Prop() placeholderValue?: string = 'Enter Search';\n /**\n * The placeholder's render behavior.\n * 'hide-on-focus' - Hide the placeholder text immediately when the input form gains focus.\n * 'hide-on-text-entered' - Only hide the placeholder when the input form has text entered into it.\n */\n @Prop() placeholderBehavior?: 'hide-on-focus' | 'hide-on-text-entered';\n /**\n * The value to display in the input field.\n */\n @Prop() value?: string;\n /**\n * When the input becomes focused.\n */\n @Event() inputFocus?: EventEmitter<void>;\n /**\n * When the input becomes unfocused.\n */\n @Event() inputBlur?: EventEmitter<void>;\n /**\n * Event emitted when input initializes.\n */\n @Event() inputInit?: EventEmitter<void>;\n\n @State() inputValue = '';\n @State() searchTerm = '';\n @State() error = false;\n\n private core?: SearchcraftCore;\n private unsubscribe?: () => void;\n private cleanupCore?: () => void;\n\n init() {\n if (this.core) {\n // Initialize inputValue from prop if provided\n if (this.value !== undefined && this.value.trim().length > 0) {\n this.inputValue = this.value;\n this.core.store.getState().setSearchTerm(this.value);\n // Trigger search if autoSearch is enabled\n if (this.autoSearch) {\n this.core.store.getState().search();\n }\n }\n this.inputInit?.emit();\n }\n }\n\n @Watch('core')\n onCoreChange() {\n this.init();\n }\n\n @Watch('value')\n onValueChange(newValue: string | undefined) {\n if (newValue !== undefined && newValue !== this.inputValue) {\n this.inputValue = newValue;\n this.core?.store.getState().setSearchTerm(newValue);\n // Trigger search if autoSearch is enabled and value is not empty\n if (this.autoSearch && newValue.trim().length > 0) {\n this.core?.store.getState().search();\n }\n }\n }\n\n onCoreAvailable(core: SearchcraftCore) {\n this.core = core;\n this.init();\n this.unsubscribe = core.store.subscribe((state: SearchcraftState) => {\n this.searchTerm = state.searchTerm;\n // Only update inputValue from store if value prop is not set\n // OR if the store was cleared (empty string)\n if (this.value === undefined || state.searchTerm === '') {\n this.inputValue = state.searchTerm;\n }\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 handleInput = (event: Event) => {\n const input = event.target as HTMLInputElement;\n this.inputValue = input.value;\n this.core?.store.getState().setSearchTerm(input.value);\n\n if (!this.autoSearch) {\n return;\n }\n\n this.performSearch();\n };\n\n private performSearch = async () => {\n this.error = false;\n\n try {\n await this.core?.store.getState().search();\n } catch (error) {\n this.error = true;\n }\n };\n\n handleClearInput = () => {\n // Clear the input value even if controlled by prop\n this.inputValue = '';\n this.core?.store.getState().resetSearchValues();\n this.error = false;\n };\n\n handleFormSubmit = async (event: Event) => {\n event.preventDefault();\n await this.performSearch();\n };\n\n render() {\n const isShowingClearButton = this.inputValue.length > 0;\n const inputGridClassNames = classNames('searchcraft-input-form-grid', {\n 'searchcraft-input-form-grid-button-left':\n this.buttonPlacement === 'left',\n 'searchcraft-input-form-grid-button-right':\n this.buttonPlacement === 'right',\n 'searchcraft-input-form-grid-button-none':\n this.buttonPlacement === 'none',\n });\n const shouldHaveVerticalGap = this.inputLabel || this.error;\n const inputGridStyles = {\n gap: shouldHaveVerticalGap ? '4px 8px' : '0px 8px',\n };\n return (\n <form class='searchcraft-input-form' onSubmit={this.handleFormSubmit}>\n <div class={inputGridClassNames} style={inputGridStyles}>\n <div class='searchcraft-input-form-button'>\n <searchcraft-button\n onButtonClick={this.handleFormSubmit}\n label={this.buttonLabel}\n />\n </div>\n {this.inputLabel && (\n <div class='searchcraft-input-form-label'>\n <searchcraft-input-label label={this.inputLabel} />\n </div>\n )}\n {this.error && (\n <div class='searchcraft-input-form-error-message'>\n <searchcraft-error-message>\n Something went wrong.\n </searchcraft-error-message>\n </div>\n )}\n <div class='searchcraft-input-form-input-wrapper'>\n <input\n autoComplete='off'\n class={classNames('searchcraft-input-form-input', {\n 'searchcraft-placeholder-hide-on-focus':\n this.placeholderBehavior === 'hide-on-focus',\n })}\n onFocus={() => this.inputFocus?.emit()}\n onBlur={() => this.inputBlur?.emit()}\n onInput={(event) => {\n this.handleInput(event);\n }}\n placeholder={this.placeholderValue}\n type='text'\n value={this.inputValue}\n />\n <div class='searchcraft-input-form-input-icon'>\n <svg\n class='searchcraft-input-form-input-search-icon'\n viewBox='0 0 20 20'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n aria-labelledby='searchcraft-title'\n >\n <title>Search icon</title>\n <path\n d='M17.5 17.5L13.875 13.875M15.8333 9.16667C15.8333 12.8486 12.8486 15.8333 9.16667 15.8333C5.48477 15.8333 2.5 12.8486 2.5 9.16667C2.5 5.48477 5.48477 2.5 9.16667 2.5C12.8486 2.5 15.8333 5.48477 15.8333 9.16667Z'\n stroke='currentColor'\n stroke-width='1.5'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </div>\n {isShowingClearButton && (\n <button\n type='button'\n class='searchcraft-input-form-clear-button'\n onClick={this.handleClearInput}\n >\n <svg\n class='searchcraft-input-form-clear-icon'\n viewBox='0 0 22 22'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n aria-labelledby='icon-title'\n >\n <title>Clear icon</title>\n <path\n d='M14 8L8 14M8 8L14 14M21 11C21 16.5228 16.5228 21 11 21C5.47715 21 1 16.5228 1 11C1 5.47715 5.47715 1 11 1C16.5228 1 21 5.47715 21 11Z'\n stroke='currentColor'\n stroke-width='1.5'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n </form>\n );\n }\n}\n"],"version":3}
@@ -1,6 +1,6 @@
1
1
  import { p as proxyCustomElement, H, c as createEvent, h } from './p-5365011f.js';
2
- import './p-e2a10337.js';
3
2
  import { r as registry } from './p-e30203b1.js';
3
+ import './p-e2a10337.js';
4
4
 
5
5
  /**
6
6
  * Helper function for getting a Node (FacetWithChildrenObject)
@@ -263,45 +263,86 @@ const SearchcraftFacetList = /*@__PURE__*/ proxyCustomElement(class SearchcraftF
263
263
  handleStateUpdate(_state) {
264
264
  const state = { ..._state };
265
265
  // Determine what action to take based on the current State
266
- if (state.searchTerm.trim() === '') {
266
+ // Check if this is an initialQuery case (string requestProperties with empty searchTerm)
267
+ const isInitialQuery = typeof state.searchClientRequestProperties === 'string' &&
268
+ state.searchTerm.trim() === '';
269
+ if (state.searchTerm.trim() === '' && !isInitialQuery) {
267
270
  this.handleIncomingSearchResponse(state, 'SEARCH_TERM_EMPTY');
268
271
  this.lastSearchTerm = '';
269
272
  }
270
273
  else if (this.lastTimeTaken !== state.searchResponseTimeTaken &&
271
- state.searchClientRequestProperties &&
272
- typeof state.searchClientRequestProperties === 'object') {
273
- const requestProperties = state.searchClientRequestProperties;
274
- let actionType = 'UNKNOWN';
275
- if (this.lastSearchTerm !== requestProperties.searchTerm) {
276
- if (this.areAnyFacetPathsSelected) {
277
- actionType = 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE';
274
+ state.searchClientRequestProperties) {
275
+ // Handle both object and string requestProperties (string is used for initialQuery)
276
+ if (typeof state.searchClientRequestProperties === 'object') {
277
+ const requestProperties = state.searchClientRequestProperties;
278
+ let actionType = 'UNKNOWN';
279
+ if (this.lastSearchTerm !== requestProperties.searchTerm) {
280
+ if (this.areAnyFacetPathsSelected) {
281
+ actionType = 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE';
282
+ }
283
+ else {
284
+ actionType = 'NEW_SEARCH_TERM';
285
+ }
278
286
  }
279
- else {
280
- actionType = 'NEW_SEARCH_TERM';
287
+ else if (this.lastRangeValues !==
288
+ JSON.stringify(requestProperties.rangeValueForIndexFields)) {
289
+ actionType = 'RANGE_VALUE_UPDATE';
281
290
  }
291
+ else if (this.lastFacetValues !==
292
+ JSON.stringify(requestProperties.facetPathsForIndexFields)) {
293
+ actionType = 'FACET_UPDATE';
294
+ }
295
+ else if (this.lastSortType !== requestProperties.order_by) {
296
+ actionType = 'SORT_ORDER_UPDATE';
297
+ }
298
+ else if (this.lastSearchMode !== requestProperties.mode) {
299
+ actionType = 'EXACT_MATCH_UPDATE';
300
+ }
301
+ this.lastRangeValues = JSON.stringify(requestProperties.rangeValueForIndexFields);
302
+ this.lastFacetValues = JSON.stringify(requestProperties.facetPathsForIndexFields);
303
+ this.lastSortType = requestProperties.order_by;
304
+ this.lastSearchMode = requestProperties.mode;
305
+ this.lastSearchTerm = requestProperties.searchTerm;
306
+ this.lastTimeTaken = state.searchResponseTimeTaken;
307
+ // Handle the incoming response, using the action we have determined.
308
+ this.handleIncomingSearchResponse(state, actionType);
282
309
  }
283
- else if (this.lastRangeValues !==
284
- JSON.stringify(requestProperties.rangeValueForIndexFields)) {
285
- actionType = 'RANGE_VALUE_UPDATE';
286
- }
287
- else if (this.lastFacetValues !==
288
- JSON.stringify(requestProperties.facetPathsForIndexFields)) {
289
- actionType = 'FACET_UPDATE';
290
- }
291
- else if (this.lastSortType !== requestProperties.order_by) {
292
- actionType = 'SORT_ORDER_UPDATE';
293
- }
294
- else if (this.lastSearchMode !== requestProperties.mode) {
295
- actionType = 'EXACT_MATCH_UPDATE';
310
+ else if (typeof state.searchClientRequestProperties === 'string') {
311
+ // Handle initialQuery case where requestProperties is a string
312
+ // For initialQuery, searchTerm will be empty but we still want to show facets
313
+ let actionType = 'NEW_SEARCH_TERM';
314
+ // Parse the request to get facet and range filters from the query array
315
+ const requestObj = JSON.parse(state.searchClientRequestProperties);
316
+ const queryArray = Array.isArray(requestObj.query)
317
+ ? requestObj.query
318
+ : [requestObj.query];
319
+ // Extract filter queries (those with occur: 'must')
320
+ const filterQueries = queryArray.filter((q) => q.occur === 'must');
321
+ const currentFilters = JSON.stringify(filterQueries);
322
+ // Determine the action type based on what changed
323
+ if (this.lastFacetValues !== undefined && this.lastFacetValues !== currentFilters) {
324
+ // Filters have changed (not initial load)
325
+ actionType = 'FACET_UPDATE';
326
+ }
327
+ else if (state.searchTerm.trim() === '' && this.lastSearchTerm === '') {
328
+ // Initial load or no changes with empty search term
329
+ actionType = 'NEW_SEARCH_TERM';
330
+ }
331
+ else if (this.lastSearchTerm !== state.searchTerm) {
332
+ // User has typed a new search term after initialQuery
333
+ if (this.areAnyFacetPathsSelected) {
334
+ actionType = 'NEW_SEARCH_TERM_WHILE_FACETS_ACTIVE';
335
+ }
336
+ else {
337
+ actionType = 'NEW_SEARCH_TERM';
338
+ }
339
+ }
340
+ this.lastFacetValues = currentFilters;
341
+ this.lastSearchTerm = state.searchTerm;
342
+ this.lastTimeTaken = state.searchResponseTimeTaken;
343
+ // Handle the incoming response, using the action we have determined.
344
+ this.handleIncomingSearchResponse(state, actionType);
296
345
  }
297
- this.lastRangeValues = JSON.stringify(requestProperties.rangeValueForIndexFields);
298
- this.lastFacetValues = JSON.stringify(requestProperties.facetPathsForIndexFields);
299
- this.lastSortType = requestProperties.order_by;
300
- this.lastSearchMode = requestProperties.mode;
301
- this.lastSearchTerm = requestProperties.searchTerm;
302
- this.lastTimeTaken = state.searchResponseTimeTaken;
303
- // Handle the incoming response, using the action we have determined.
304
- this.handleIncomingSearchResponse(state, actionType);
305
346
  }
306
347
  }
307
348
  onCoreAvailable(core) {
@@ -413,4 +454,4 @@ function defineCustomElement() {
413
454
 
414
455
  export { SearchcraftFacetList as S, defineCustomElement as d };
415
456
 
416
- //# sourceMappingURL=p-0c495408.js.map
457
+ //# sourceMappingURL=p-c8566920.js.map
@@ -0,0 +1 @@
1
+ {"file":"p-c8566920.js","mappings":"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","names":[],"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 */\nexport const facetWithChildrenArrayToCompleteFacetTree = (\n rootArray: FacetWithChildrenArray,\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 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} 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 /**\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 path: '/',\n count: 0,\n children: incomingFacetsWithChildrenArray || [],\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 path: '/',\n count: 0,\n children: supplementalFacetsWithChildrenArray || [],\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(collectedFacetArray);\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((q: any) => q.occur === 'must');\n const currentFilters = JSON.stringify(filterQueries);\n\n // Determine the action type based on what changed\n if (this.lastFacetValues !== undefined && this.lastFacetValues !== currentFilters) {\n // Filters have changed (not initial load)\n actionType = 'FACET_UPDATE';\n } else if (state.searchTerm.trim() === '' && this.lastSearchTerm === '') {\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,4 +1,4 @@
1
- import { S as SearchcraftFacetList$1, d as defineCustomElement$1 } from './p-0c495408.js';
1
+ import { S as SearchcraftFacetList$1, d as defineCustomElement$1 } from './p-c8566920.js';
2
2
 
3
3
  const SearchcraftFacetList = SearchcraftFacetList$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,6 +1,6 @@
1
1
  import { p as proxyCustomElement, H, h } from './p-5365011f.js';
2
2
  import { r as registry } from './p-e30203b1.js';
3
- import { d as defineCustomElement$4 } from './p-0c495408.js';
3
+ import { d as defineCustomElement$4 } from './p-c8566920.js';
4
4
  import { d as defineCustomElement$3 } from './p-c9b65e8f.js';
5
5
  import { d as defineCustomElement$2 } from './p-02ad136b.js';
6
6
 
@@ -102,7 +102,7 @@ const SearchcraftFilterPanel$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
102
102
  * Iterate through `items` and render them based on `type`
103
103
  */
104
104
  render() {
105
- return (h("div", { key: 'b18a05516bea8d145d1ca015835d63fafbfc8bd8', class: 'searchcraft-filter-panel' }, this.items.map((filterItem) => {
105
+ return (h("div", { key: 'ee8974e38b296a1ba27111bc2a4244d8915f5839', class: 'searchcraft-filter-panel' }, this.items.map((filterItem) => {
106
106
  switch (filterItem.type) {
107
107
  case 'dateRange': {
108
108
  const item = filterItem;
@@ -1 +1 @@
1
- {"file":"searchcraft-filter-panel.js","mappings":"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","names":["SearchcraftFilterPanel"],"sources":["src/components/searchcraft-filter-panel/searchcraft-filter-panel.tsx"],"sourcesContent":["import type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport { Component, h, Prop, State } from '@stencil/core';\nimport type {\n FilterItem,\n DateRangeFilterItem,\n NumericFilterItem,\n ExactMatchToggleFilterItem,\n FacetsFilterItem,\n MostRecentToggleFilterItem,\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 @State() lastSearchTerm: string | undefined;\n\n private core?: SearchcraftCore;\n private unsubscribe?: () => void;\n private cleanupCore?: () => void;\n\n onCoreAvailable(core: SearchcraftCore) {\n this.core = core;\n this.setInitialDateRanges();\n this.unsubscribe = core.store.subscribe((state) => {\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 }\n\n componentDidLoad() {\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 /**\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 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 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"],"sources":["src/components/searchcraft-filter-panel/searchcraft-filter-panel.tsx"],"sourcesContent":["import type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport { Component, 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 @State() lastSearchTerm: string | undefined;\n\n private core?: SearchcraftCore;\n private unsubscribe?: () => void;\n private cleanupCore?: () => void;\n\n onCoreAvailable(core: SearchcraftCore) {\n this.core = core;\n this.setInitialDateRanges();\n this.unsubscribe = core.store.subscribe((state) => {\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 }\n\n componentDidLoad() {\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 /**\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 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 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 './p-b7e99386.js';
1
+ import { S as SearchcraftInputForm$1, d as defineCustomElement$1 } from './p-870f81fd.js';
2
2
 
3
3
  const SearchcraftInputForm = SearchcraftInputForm$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -17,6 +17,7 @@ const SearchcraftPagination$1 = /*@__PURE__*/ proxyCustomElement(class Searchcra
17
17
  searchResultsPerPage;
18
18
  searchResultsPage;
19
19
  searchResultsCount;
20
+ searchClientRequestProperties;
20
21
  // local vars
21
22
  searchResultsPagesCount = 1;
22
23
  searchResultsRangeMin = 1;
@@ -32,6 +33,7 @@ const SearchcraftPagination$1 = /*@__PURE__*/ proxyCustomElement(class Searchcra
32
33
  this.searchResultsPerPage = state.searchResultsPerPage;
33
34
  this.searchResultsPage = state.searchResultsPage;
34
35
  this.searchResultsCount = state.searchResultsCount;
36
+ this.searchClientRequestProperties = state.searchClientRequestProperties;
35
37
  // local vars
36
38
  this.searchResultsPagesCount = Math.ceil(this.searchResultsCount / this.searchResultsPerPage);
37
39
  this.searchResultsRangeMin =
@@ -91,8 +93,11 @@ const SearchcraftPagination$1 = /*@__PURE__*/ proxyCustomElement(class Searchcra
91
93
  return (h("li", null, h("span", { class: 'searchcraft-pagination-item searchcraft-pagination-item-active' }, this.searchResultsPage)));
92
94
  }
93
95
  render() {
94
- // early return if there isn't a searchTerm or there is 1 or fewer pages of results
95
- if (!this.searchTerm || this.searchResultsPagesCount <= 1) {
96
+ // Check if this is an initialQuery case (string requestProperties with empty searchTerm)
97
+ const isInitialQuery = typeof this.searchClientRequestProperties === 'string' &&
98
+ this.searchTerm.trim() === '';
99
+ // early return if there isn't a searchTerm (unless it's initialQuery) or there is 1 or fewer pages of results
100
+ if ((!this.searchTerm && !isInitialQuery) || this.searchResultsPagesCount <= 1) {
96
101
  return;
97
102
  }
98
103
  return (h("div", { class: 'searchcraft-pagination' }, h("div", { class: 'searchcraft-pagination-control' }, h("searchcraft-button", { disabled: this.searchResultsPage === 1, hierarchy: 'tertiary', onButtonClick: () => this.handleGoToPage(Math.max(1, this.searchResultsPage - 1)), label: 'Previous', iconPosition: 'left', icon: h("svg", { class: 'searchcraft-button-icon', width: '20', height: '20', viewBox: '0 0 20 20', fill: 'none', xmlns: 'http://www.w3.org/2000/svg' }, h("title", null, "Previous page icon"), h("path", { d: 'M12.5 15L7.5 10L12.5 5', stroke: 'currentColor', "stroke-width": '1.5', "stroke-linecap": 'round', "stroke-linejoin": 'round' })), iconOnly: true })), h("ul", { class: 'searchcraft-pagination-list' }, this.renderOddPaginationItem(1), this.renderEvenPaginationItem(2), this.renderMiddlePaginationItem(), this.renderEvenPaginationItem(this.searchResultsPagesCount > 4
@@ -107,6 +112,7 @@ const SearchcraftPagination$1 = /*@__PURE__*/ proxyCustomElement(class Searchcra
107
112
  "searchResultsPerPage": [32],
108
113
  "searchResultsPage": [32],
109
114
  "searchResultsCount": [32],
115
+ "searchClientRequestProperties": [32],
110
116
  "searchResultsPagesCount": [32],
111
117
  "searchResultsRangeMin": [32],
112
118
  "searchResultsRangeMax": [32],
@@ -1 +1 @@
1
- {"file":"searchcraft-pagination.js","mappings":"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","names":["SearchcraftPagination"],"sources":["src/components/searchcraft-pagination/searchcraft-pagination.tsx"],"sourcesContent":["import type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport { Component, h, Prop, State } from '@stencil/core';\nimport classNames from 'classnames';\n\n/**\n * This web component is designed to facilitate pagination of search results. Once a query is submitted, calculates the number for pages.\n *\n * @react-import\n * ```jsx\n * import { SearchcraftPagination } from \"@searchcraft/react-sdk\";\n * ```\n *\n * @vue-import\n * ```jsx\n * import { SearchcraftPagination } from \"@searchcraft/vue-sdk\";\n * ```\n *\n * @js-example\n * ```html\n * <searchcraft-pagination />\n * ```\n *\n * @react-example\n * ```jsx\n * <SearchcraftPagination />\n * ```\n *\n * @vue-example\n * ```jsx\n * <SearchcraftPagination />\n * ```\n */\n@Component({\n tag: 'searchcraft-pagination',\n shadow: false,\n})\nexport class SearchcraftPagination {\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n // store vars\n @State() searchTerm;\n @State() searchResultsPerPage;\n @State() searchResultsPage;\n @State() searchResultsCount;\n\n // local vars\n @State() searchResultsPagesCount = 1;\n @State() searchResultsRangeMin = 1;\n @State() searchResultsRangeMax = 1;\n\n // store functions\n @State() setSearchResultsPage: (page: number) => void = () => {};\n\n private unsubscribe: () => void = () => {};\n private cleanupCore?: () => void;\n\n onCoreAvailable(core: SearchcraftCore) {\n this.unsubscribe = core.store.subscribe((state) => {\n // store vars\n this.searchTerm = state.searchTerm;\n this.searchResultsPerPage = state.searchResultsPerPage;\n this.searchResultsPage = state.searchResultsPage;\n this.searchResultsCount = state.searchResultsCount;\n\n // local vars\n this.searchResultsPagesCount = Math.ceil(\n this.searchResultsCount / this.searchResultsPerPage,\n );\n this.searchResultsRangeMin =\n (this.searchResultsPage - 1) * this.searchResultsPerPage + 1;\n this.searchResultsRangeMax =\n (this.searchResultsPerPage - 1) * this.searchResultsPerPage +\n this.searchResultsPerPage;\n\n // store functions\n this.setSearchResultsPage = state.setSearchResultsPage;\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 handleGoToPage(page: number) {\n this.setSearchResultsPage(page);\n }\n\n renderOddPaginationItem(page: number) {\n return (\n <li>\n <button\n class={classNames('searchcraft-pagination-item', {\n 'searchcraft-pagination-item-active':\n this.searchResultsPage === page,\n })}\n onClick={() => this.handleGoToPage(page)}\n type='button'\n >\n {page}\n </button>\n </li>\n );\n }\n\n renderEvenPaginationItem(page: number) {\n if (this.searchResultsPagesCount <= page) {\n return;\n }\n\n if (\n this.searchResultsPagesCount <= 5 ||\n page < Math.ceil(this.searchResultsPagesCount / 2) // is the first or second even pagination item\n ? this.searchResultsPage <= page + 1\n : this.searchResultsPage >= page - 1\n ) {\n return (\n <li>\n <button\n class={classNames('searchcraft-pagination-item', {\n 'searchcraft-pagination-item-active':\n this.searchResultsPage === page,\n })}\n onClick={() => this.handleGoToPage(page)}\n type='button'\n >\n {page}\n </button>\n </li>\n );\n }\n\n return (\n <li>\n <span class='searchcraft-pagination-item'>...</span>\n </li>\n );\n }\n\n renderMiddlePaginationItem() {\n if (this.searchResultsPagesCount <= 3) {\n return;\n }\n\n if (\n this.searchResultsPagesCount <= 5 ||\n this.searchResultsPage <= 3 ||\n this.searchResultsPage >= this.searchResultsPagesCount - 2\n ) {\n return (\n <li>\n <button\n class={classNames('searchcraft-pagination-item', {\n 'searchcraft-pagination-item-active':\n this.searchResultsPage === 3 ||\n this.searchResultsPage === this.searchResultsPagesCount - 2,\n })}\n type='button'\n onClick={() =>\n this.handleGoToPage(\n this.searchResultsPage >= this.searchResultsPagesCount - 2\n ? this.searchResultsPagesCount - 2\n : 3,\n )\n }\n >\n {this.searchResultsPage >= this.searchResultsPagesCount - 2\n ? this.searchResultsPagesCount - 2\n : 3}\n </button>\n </li>\n );\n }\n\n return (\n <li>\n <span class='searchcraft-pagination-item searchcraft-pagination-item-active'>\n {this.searchResultsPage}\n </span>\n </li>\n );\n }\n\n render() {\n // early return if there isn't a searchTerm or there is 1 or fewer pages of results\n if (!this.searchTerm || this.searchResultsPagesCount <= 1) {\n return;\n }\n\n return (\n <div class='searchcraft-pagination'>\n <div class='searchcraft-pagination-control'>\n <searchcraft-button\n disabled={this.searchResultsPage === 1}\n hierarchy='tertiary'\n onButtonClick={() =>\n this.handleGoToPage(Math.max(1, this.searchResultsPage - 1))\n }\n label='Previous'\n iconPosition='left'\n icon={\n <svg\n class='searchcraft-button-icon'\n width='20'\n height='20'\n viewBox='0 0 20 20'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <title>Previous page icon</title>\n <path\n d='M12.5 15L7.5 10L12.5 5'\n stroke='currentColor'\n stroke-width='1.5'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n }\n iconOnly\n />\n </div>\n <ul class='searchcraft-pagination-list'>\n {this.renderOddPaginationItem(1)}\n {this.renderEvenPaginationItem(2)}\n {this.renderMiddlePaginationItem()}\n {this.renderEvenPaginationItem(\n this.searchResultsPagesCount > 4\n ? this.searchResultsPagesCount - 1\n : 4,\n )}\n {this.renderOddPaginationItem(this.searchResultsPagesCount)}\n </ul>\n <div class='searchcraft-pagination-control'>\n <searchcraft-button\n disabled={this.searchResultsPage === this.searchResultsPagesCount}\n hierarchy='tertiary'\n onButtonClick={() => {\n this.handleGoToPage(\n Math.min(\n this.searchResultsPagesCount,\n this.searchResultsPage + 1,\n ),\n );\n }}\n label='Next'\n iconPosition='right'\n icon={\n <svg\n class='searchcraft-button-icon'\n width='20'\n height='20'\n viewBox='0 0 20 20'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <title>Next page icon</title>\n <path\n d='M7.5 15L12.5 10L7.5 5'\n stroke='currentColor'\n stroke-width='1.5'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n }\n iconOnly\n />\n </div>\n </div>\n );\n }\n}\n"],"version":3}
1
+ {"file":"searchcraft-pagination.js","mappings":"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","names":["SearchcraftPagination"],"sources":["src/components/searchcraft-pagination/searchcraft-pagination.tsx"],"sourcesContent":["import type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport { Component, Prop, State, h } from '@stencil/core';\nimport classNames from 'classnames';\n\n/**\n * This web component is designed to facilitate pagination of search results. Once a query is submitted, calculates the number for pages.\n *\n * @react-import\n * ```jsx\n * import { SearchcraftPagination } from \"@searchcraft/react-sdk\";\n * ```\n *\n * @vue-import\n * ```jsx\n * import { SearchcraftPagination } from \"@searchcraft/vue-sdk\";\n * ```\n *\n * @js-example\n * ```html\n * <searchcraft-pagination />\n * ```\n *\n * @react-example\n * ```jsx\n * <SearchcraftPagination />\n * ```\n *\n * @vue-example\n * ```jsx\n * <SearchcraftPagination />\n * ```\n */\n@Component({\n tag: 'searchcraft-pagination',\n shadow: false,\n})\nexport class SearchcraftPagination {\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n // store vars\n @State() searchTerm;\n @State() searchResultsPerPage;\n @State() searchResultsPage;\n @State() searchResultsCount;\n @State() searchClientRequestProperties;\n\n // local vars\n @State() searchResultsPagesCount = 1;\n @State() searchResultsRangeMin = 1;\n @State() searchResultsRangeMax = 1;\n\n // store functions\n @State() setSearchResultsPage: (page: number) => void = () => {};\n\n private unsubscribe: () => void = () => {};\n private cleanupCore?: () => void;\n\n onCoreAvailable(core: SearchcraftCore) {\n this.unsubscribe = core.store.subscribe((state) => {\n // store vars\n this.searchTerm = state.searchTerm;\n this.searchResultsPerPage = state.searchResultsPerPage;\n this.searchResultsPage = state.searchResultsPage;\n this.searchResultsCount = state.searchResultsCount;\n this.searchClientRequestProperties = state.searchClientRequestProperties;\n\n // local vars\n this.searchResultsPagesCount = Math.ceil(\n this.searchResultsCount / this.searchResultsPerPage,\n );\n this.searchResultsRangeMin =\n (this.searchResultsPage - 1) * this.searchResultsPerPage + 1;\n this.searchResultsRangeMax =\n (this.searchResultsPerPage - 1) * this.searchResultsPerPage +\n this.searchResultsPerPage;\n\n // store functions\n this.setSearchResultsPage = state.setSearchResultsPage;\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 handleGoToPage(page: number) {\n this.setSearchResultsPage(page);\n }\n\n renderOddPaginationItem(page: number) {\n return (\n <li>\n <button\n class={classNames('searchcraft-pagination-item', {\n 'searchcraft-pagination-item-active':\n this.searchResultsPage === page,\n })}\n onClick={() => this.handleGoToPage(page)}\n type='button'\n >\n {page}\n </button>\n </li>\n );\n }\n\n renderEvenPaginationItem(page: number) {\n if (this.searchResultsPagesCount <= page) {\n return;\n }\n\n if (\n this.searchResultsPagesCount <= 5 ||\n page < Math.ceil(this.searchResultsPagesCount / 2) // is the first or second even pagination item\n ? this.searchResultsPage <= page + 1\n : this.searchResultsPage >= page - 1\n ) {\n return (\n <li>\n <button\n class={classNames('searchcraft-pagination-item', {\n 'searchcraft-pagination-item-active':\n this.searchResultsPage === page,\n })}\n onClick={() => this.handleGoToPage(page)}\n type='button'\n >\n {page}\n </button>\n </li>\n );\n }\n\n return (\n <li>\n <span class='searchcraft-pagination-item'>...</span>\n </li>\n );\n }\n\n renderMiddlePaginationItem() {\n if (this.searchResultsPagesCount <= 3) {\n return;\n }\n\n if (\n this.searchResultsPagesCount <= 5 ||\n this.searchResultsPage <= 3 ||\n this.searchResultsPage >= this.searchResultsPagesCount - 2\n ) {\n return (\n <li>\n <button\n class={classNames('searchcraft-pagination-item', {\n 'searchcraft-pagination-item-active':\n this.searchResultsPage === 3 ||\n this.searchResultsPage === this.searchResultsPagesCount - 2,\n })}\n type='button'\n onClick={() =>\n this.handleGoToPage(\n this.searchResultsPage >= this.searchResultsPagesCount - 2\n ? this.searchResultsPagesCount - 2\n : 3,\n )\n }\n >\n {this.searchResultsPage >= this.searchResultsPagesCount - 2\n ? this.searchResultsPagesCount - 2\n : 3}\n </button>\n </li>\n );\n }\n\n return (\n <li>\n <span class='searchcraft-pagination-item searchcraft-pagination-item-active'>\n {this.searchResultsPage}\n </span>\n </li>\n );\n }\n\n render() {\n // Check if this is an initialQuery case (string requestProperties with empty searchTerm)\n const isInitialQuery =\n typeof this.searchClientRequestProperties === 'string' &&\n this.searchTerm.trim() === '';\n\n // early return if there isn't a searchTerm (unless it's initialQuery) or there is 1 or fewer pages of results\n if ((!this.searchTerm && !isInitialQuery) || this.searchResultsPagesCount <= 1) {\n return;\n }\n\n return (\n <div class='searchcraft-pagination'>\n <div class='searchcraft-pagination-control'>\n <searchcraft-button\n disabled={this.searchResultsPage === 1}\n hierarchy='tertiary'\n onButtonClick={() =>\n this.handleGoToPage(Math.max(1, this.searchResultsPage - 1))\n }\n label='Previous'\n iconPosition='left'\n icon={\n <svg\n class='searchcraft-button-icon'\n width='20'\n height='20'\n viewBox='0 0 20 20'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <title>Previous page icon</title>\n <path\n d='M12.5 15L7.5 10L12.5 5'\n stroke='currentColor'\n stroke-width='1.5'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n }\n iconOnly\n />\n </div>\n <ul class='searchcraft-pagination-list'>\n {this.renderOddPaginationItem(1)}\n {this.renderEvenPaginationItem(2)}\n {this.renderMiddlePaginationItem()}\n {this.renderEvenPaginationItem(\n this.searchResultsPagesCount > 4\n ? this.searchResultsPagesCount - 1\n : 4,\n )}\n {this.renderOddPaginationItem(this.searchResultsPagesCount)}\n </ul>\n <div class='searchcraft-pagination-control'>\n <searchcraft-button\n disabled={this.searchResultsPage === this.searchResultsPagesCount}\n hierarchy='tertiary'\n onButtonClick={() => {\n this.handleGoToPage(\n Math.min(\n this.searchResultsPagesCount,\n this.searchResultsPage + 1,\n ),\n );\n }}\n label='Next'\n iconPosition='right'\n icon={\n <svg\n class='searchcraft-button-icon'\n width='20'\n height='20'\n viewBox='0 0 20 20'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <title>Next page icon</title>\n <path\n d='M7.5 15L12.5 10L7.5 5'\n stroke='currentColor'\n stroke-width='1.5'\n stroke-linecap='round'\n stroke-linejoin='round'\n />\n </svg>\n }\n iconOnly\n />\n </div>\n </div>\n );\n }\n}\n"],"version":3}
@@ -4,7 +4,7 @@ import { r as registry } from './p-e30203b1.js';
4
4
  import { d as defineCustomElement$9 } from './p-87435aac.js';
5
5
  import { d as defineCustomElement$8 } from './p-acf23bab.js';
6
6
  import { d as defineCustomElement$7 } from './p-f2585cdf.js';
7
- import { d as defineCustomElement$6 } from './p-b7e99386.js';
7
+ import { d as defineCustomElement$6 } from './p-870f81fd.js';
8
8
  import { d as defineCustomElement$5 } from './p-1adf78b9.js';
9
9
  import { d as defineCustomElement$4 } from './p-1d5c5536.js';
10
10
  import { d as defineCustomElement$3 } from './p-fc8ccffa.js';