@sledge-app/react-instant-search 1.0.86 → 1.0.88

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.
@@ -170,6 +170,7 @@ const OBJECT_DATA_STRING_KEY = {
170
170
  CURRENT_PAGE: "{{ current_page }}",
171
171
  TOTAL_PAGE: "{{ total_page }}",
172
172
  TOTAL_RESULT: "{{ total_result }}",
173
+ TOTAL_FILTER_ITEM: "{{ total_filter_item }}",
173
174
  COLLECTION_ID: "{{ collection_id }}",
174
175
  COLLECTION_NAME: "{{ collection_name }}",
175
176
  TOTAL_WISHLIST: "{{ total_wishlist }}",
@@ -298,6 +299,15 @@ const sanitizeDataId = (id) => {
298
299
  return getId;
299
300
  }
300
301
  };
302
+ const getTextBetween = (params) => {
303
+ const { start, end, text } = params;
304
+ if (start && text.includes(start) && end && text.includes(end)) {
305
+ let getText = text.indexOf(start) + start.length;
306
+ return text.substring(getText, text.indexOf(end, getText));
307
+ } else {
308
+ return text;
309
+ }
310
+ };
301
311
  const isFunction = (data) => typeof data === "function";
302
312
  const scrollToElement = (params) => {
303
313
  const { element, headerOffset } = params;
@@ -4571,6 +4581,7 @@ const FacetComponent = (props) => {
4571
4581
  generalDataSettings,
4572
4582
  searchFacetDistribution,
4573
4583
  clickedFacets,
4584
+ setClickedFacets,
4574
4585
  handleFilterChange,
4575
4586
  defaultFacetStats,
4576
4587
  valueFilterPriceChange,
@@ -4583,15 +4594,25 @@ const FacetComponent = (props) => {
4583
4594
  scrollElementSelector,
4584
4595
  layoutType,
4585
4596
  collectionId,
4586
- colorSwatches
4597
+ colorSwatches,
4598
+ ulClasses = "",
4599
+ languageSettings,
4600
+ triggerClickedFacets,
4601
+ setTriggerClickedFacets,
4602
+ handleQueryStringFilter,
4603
+ previousStateFromOutside
4587
4604
  } = props;
4605
+ const [keywordFacet, setKeywordFacet] = React__default.useState("");
4606
+ const [showFacet, setShowFacet] = React__default.useState(false);
4607
+ const searchFacetRef = React__default.useRef(null);
4608
+ const previousState = usePrevious({ keywordFacet });
4588
4609
  let aliases = {};
4589
4610
  if (filter.value === "hierarchicalProductType")
4590
4611
  aliases = settings.productTypeAliases || {};
4591
4612
  if (filter.value === "hierarchicalCollections")
4592
4613
  aliases = settings.collectionAliases || {};
4593
4614
  const { button_load_more } = (generalDataSettings == null ? void 0 : generalDataSettings.languages) || {};
4594
- const { languages: languageSettings } = displaySettings || {};
4615
+ const { search_filter_placeholder, search_filter_show_more_result, search_filter_no_result } = languageSettings || {};
4595
4616
  const {
4596
4617
  color: filter_option_color,
4597
4618
  font_size: filter_option_font_size,
@@ -4606,7 +4627,8 @@ const FacetComponent = (props) => {
4606
4627
  ...filter_option_text_transform && { textTransform: filter_option_text_transform }
4607
4628
  };
4608
4629
  let { value, label, display, indexFilter, items, settings: filterSettings } = filter;
4609
- const { prefix, filter_list, delete_prefix, selected_filter } = filterSettings || {};
4630
+ const { prefix, filter_list, delete_prefix, selected_filter, show_search, auto_select_search, hide_filter_list } = filterSettings || {};
4631
+ const show_filter_list_when_search = !hide_filter_list;
4610
4632
  if (isFirstLoading)
4611
4633
  return null;
4612
4634
  let blockComponent = null;
@@ -4614,6 +4636,11 @@ const FacetComponent = (props) => {
4614
4636
  const isHideFacetWhenZeroValue = (_c = displaySettings == null ? void 0 : displaySettings.filter) == null ? void 0 : _c.hide_when_zero_value;
4615
4637
  const isDisplaySlider = display.toLowerCase() === "slider";
4616
4638
  const getValue = `${value}-${indexFilter}`;
4639
+ if (show_search && keywordFacet && !isDisplaySlider)
4640
+ items = items == null ? void 0 : items.filter(({ name }) => {
4641
+ var _a2, _b2;
4642
+ return (_b2 = (_a2 = String(name)) == null ? void 0 : _a2.toLowerCase()) == null ? void 0 : _b2.includes(keywordFacet == null ? void 0 : keywordFacet.toLowerCase());
4643
+ });
4617
4644
  const handleFacetValues = (items2) => {
4618
4645
  var _a2;
4619
4646
  let facetValues = [];
@@ -4666,12 +4693,56 @@ const FacetComponent = (props) => {
4666
4693
  let currentItems2 = sliced;
4667
4694
  return {
4668
4695
  haveNextPage: haveNextPage2,
4669
- currentItems: currentItems2
4696
+ currentItems: currentItems2,
4697
+ totalItems: Number(arrFacetValues == null ? void 0 : arrFacetValues.length)
4670
4698
  };
4671
4699
  };
4672
- const { haveNextPage, currentItems } = handleFacetLoadMore({
4700
+ const handleSearchShowMore = () => {
4701
+ var _a2, _b2;
4702
+ setShowFacet(true);
4703
+ (searchFacetRef == null ? void 0 : searchFacetRef.current) && ((_b2 = (_a2 = searchFacetRef == null ? void 0 : searchFacetRef.current) == null ? void 0 : _a2.focus) == null ? void 0 : _b2.call(_a2));
4704
+ };
4705
+ const { haveNextPage, currentItems, totalItems } = handleFacetLoadMore({
4673
4706
  facetItems: items
4674
4707
  });
4708
+ const filterSearchShowMoreId = stringToSlug(`filter-search-show-more-${getValue}`);
4709
+ React__default.useEffect(() => {
4710
+ if (!show_search)
4711
+ return;
4712
+ setTimeout(() => {
4713
+ var _a2;
4714
+ return (_a2 = document.querySelector(`#${filterSearchShowMoreId}`)) == null ? void 0 : _a2.addEventListener("click", () => handleSearchShowMore());
4715
+ }, 100);
4716
+ let isKeywordFacetChanged = Boolean(previousState && previousState.keywordFacet !== keywordFacet);
4717
+ let isPreviousStateFromOutsideChanged = Boolean(previousStateFromOutside && (previousStateFromOutside == null ? void 0 : previousStateFromOutside.clickedFacets) !== clickedFacets);
4718
+ if (keywordFacet && isKeywordFacetChanged) {
4719
+ const delayDebounceFn = setTimeout(() => {
4720
+ var _a2, _b2;
4721
+ const isAutoSelectFacet = Boolean(auto_select_search && totalItems && Number(totalItems) === 1);
4722
+ let autoSelectFacets = (_a2 = currentItems == null ? void 0 : currentItems.map(({ value: itemValue }) => {
4723
+ var _a3, _b3;
4724
+ return ((_b3 = (_a3 = clickedFacets == null ? void 0 : clickedFacets[value]) == null ? void 0 : _a3.includes) == null ? void 0 : _b3.call(_a3, itemValue)) ? null : itemValue;
4725
+ })) == null ? void 0 : _a2.filter((item) => item);
4726
+ if (isAutoSelectFacet && (autoSelectFacets == null ? void 0 : autoSelectFacets.length)) {
4727
+ let valueClickedFacets = {
4728
+ ...clickedFacets,
4729
+ ...{
4730
+ [value]: [.../* @__PURE__ */ new Set([...((_b2 = clickedFacets == null ? void 0 : clickedFacets[value]) == null ? void 0 : _b2.length) ? clickedFacets == null ? void 0 : clickedFacets[value] : [], ...autoSelectFacets])]
4731
+ }
4732
+ };
4733
+ let handleQueryStringFilterProp = valueClickedFacets;
4734
+ if (Object.hasOwn(handleQueryStringFilterProp, "variants.inventory_quantity"))
4735
+ handleQueryStringFilterProp == null ? true : delete handleQueryStringFilterProp["variants.inventory_quantity"];
4736
+ handleQueryStringFilter == null ? void 0 : handleQueryStringFilter(handleQueryStringFilterProp);
4737
+ setClickedFacets == null ? void 0 : setClickedFacets(valueClickedFacets);
4738
+ setTriggerClickedFacets == null ? void 0 : setTriggerClickedFacets(!triggerClickedFacets);
4739
+ }
4740
+ }, 500);
4741
+ return () => clearTimeout(delayDebounceFn);
4742
+ }
4743
+ if (!(showFacet && isPreviousStateFromOutsideChanged))
4744
+ setShowFacet(false);
4745
+ }, [keywordFacet, clickedFacets]);
4675
4746
  const loadMoreComponent = /* @__PURE__ */ jsxRuntimeExports.jsxs(
4676
4747
  "div",
4677
4748
  {
@@ -4753,6 +4824,33 @@ const FacetComponent = (props) => {
4753
4824
  let scrollElement = document.querySelector(
4754
4825
  scrollElementSelector || `#filter-${indexFilter}-${layoutType}-${collectionId || "all"}-standard-${stringToSlug(value)} .sledge-instant-search__result-filter-item-list`
4755
4826
  );
4827
+ const isShowSearch = Boolean(
4828
+ show_search && (display.toLowerCase() === "checkbox" || display.toLowerCase() === "tree" || display.toLowerCase() === "radio") && (totalItems || keywordFacet && !totalItems)
4829
+ );
4830
+ const defaultSearchShowMoreFilter = /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
4831
+ totalItems,
4832
+ " items found,",
4833
+ " ",
4834
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sledge-instant-search__result-filter-search-text-action", id: filterSearchShowMoreId, onClick: () => setShowFacet(true), children: "click here" }),
4835
+ " ",
4836
+ "to show"
4837
+ ] });
4838
+ let searchFilterShowMoreResult = search_filter_show_more_result;
4839
+ if (searchFilterShowMoreResult) {
4840
+ const getActionText = getTextBetween({
4841
+ start: "<action>",
4842
+ end: "</action>",
4843
+ text: search_filter_show_more_result
4844
+ });
4845
+ searchFilterShowMoreResult = searchFilterShowMoreResult.replaceAll(OBJECT_DATA_STRING_KEY.TOTAL_FILTER_ITEM, String(Number(totalItems)));
4846
+ searchFilterShowMoreResult = searchFilterShowMoreResult.replaceAll(
4847
+ `<action>${getActionText}</action>`,
4848
+ `
4849
+ <span class="sledge-instant-search__result-filter-search-text-action" id="${filterSearchShowMoreId}">
4850
+ ${getActionText}
4851
+ </span>`
4852
+ );
4853
+ }
4756
4854
  if (isDisplaySlider) {
4757
4855
  items = (defaultFacetStats == null ? void 0 : defaultFacetStats[value]) && Object.keys(defaultFacetStats[value]).length ? defaultFacetStats[value] : {};
4758
4856
  let valueFilterSliderChange = [];
@@ -4877,7 +4975,7 @@ const FacetComponent = (props) => {
4877
4975
  ) }, index);
4878
4976
  }) });
4879
4977
  } else {
4880
- blockComponent = /* @__PURE__ */ jsxRuntimeExports.jsx("li", { className: "sledge-instant-search__result-filter-item-no-result", style: filter_option_style, children: "No result..." });
4978
+ blockComponent = /* @__PURE__ */ jsxRuntimeExports.jsx("li", { className: "sledge-instant-search__result-filter-item-no-result", style: filter_option_style, children: search_filter_no_result || "No result..." });
4881
4979
  }
4882
4980
  if (haveNextPage) {
4883
4981
  blockComponent = React__default.cloneElement(
@@ -4887,7 +4985,26 @@ const FacetComponent = (props) => {
4887
4985
  ] })
4888
4986
  );
4889
4987
  }
4890
- return blockComponent;
4988
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
4989
+ isShowSearch ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "sledge-instant-search__result-filter-search-wrapper", children: [
4990
+ /* @__PURE__ */ jsxRuntimeExports.jsx(
4991
+ SearchInputField,
4992
+ {
4993
+ type: "text",
4994
+ icon: /* @__PURE__ */ jsxRuntimeExports.jsx(SearchIcon, { width: 18, height: 18, color: "#868686" }),
4995
+ placeholder: search_filter_placeholder || "Search filters...",
4996
+ fieldRef: searchFacetRef,
4997
+ value: keywordFacet,
4998
+ onChange: ({ value: value2 }) => setKeywordFacet(value2),
4999
+ onResetField: () => setKeywordFacet(""),
5000
+ className: "sledge-instant-search__result-filter-search-form",
5001
+ withClearField: true
5002
+ }
5003
+ ),
5004
+ keywordFacet && totalItems && Number(totalItems) > 1 && !show_filter_list_when_search && !showFacet ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "sledge-instant-search__result-filter-search-text", style: filter_option_style, children: searchFilterShowMoreResult ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { dangerouslySetInnerHTML: { __html: searchFilterShowMoreResult } }) : defaultSearchShowMoreFilter }) : null
5005
+ ] }) : null,
5006
+ !show_search || show_search && (show_filter_list_when_search || !show_filter_list_when_search && (!totalItems || Number(totalItems) === 1 && keywordFacet) || showFacet) ? /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: ulClasses, children: blockComponent }) : null
5007
+ ] });
4891
5008
  };
4892
5009
  const FilterVerticalComponent = (props) => {
4893
5010
  const { filter, filterSettings, indexFilter, filterTitleStyle = {}, handleOpenFilterVertical, clickedOpenFilters, filterLayoutType, layoutType, collectionId } = props;
@@ -4906,7 +5023,9 @@ const FilterVerticalComponent = (props) => {
4906
5023
  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sledge-instant-search__result-filter-title", style: filterTitleStyle, children: label }),
4907
5024
  /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: false, animate: clickedOpenFilters.includes(getValue) ? "open" : "closed", variants: ROTATE_FILTER_ARROW_ANIMATION, children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronArrowDownIcon, { width: 15, height: 15, color: "#000000" }) })
4908
5025
  ] }),
4909
- clickedOpenFilters.includes(getValue) && /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: classesUlElement.join(" "), children: getFacetComponent() })
5026
+ clickedOpenFilters.includes(getValue) && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "sledge-instant-search__result-filter-item-wrapper", children: getFacetComponent({
5027
+ ulClasses: classesUlElement.join(" ")
5028
+ }) })
4910
5029
  ] }, indexFilter) : null;
4911
5030
  };
4912
5031
  const FilterHorizontalComponent = (props) => {
@@ -4955,7 +5074,9 @@ const FilterHorizontalComponent = (props) => {
4955
5074
  ]
4956
5075
  }
4957
5076
  ),
4958
- content: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "sledge-instant-search__result-filter-horizontal-facet", id: filterItemId, children: isOpenFilterHorizontal && /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: classesUlElement.join(" "), children: getFacetComponent() }) }),
5077
+ content: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "sledge-instant-search__result-filter-horizontal-facet", id: filterItemId, children: isOpenFilterHorizontal && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "sledge-instant-search__result-filter-item-wrapper", children: getFacetComponent({
5078
+ ulClasses: classesUlElement.join(" ")
5079
+ }) }) }),
4959
5080
  withOpenState: true,
4960
5081
  isOpen: isOpenFilterHorizontal,
4961
5082
  setIsOpen: (open) => {
@@ -6233,33 +6354,43 @@ const ResultProduct = (props) => {
6233
6354
  isRender = !defaultValueMin && !defaultValueMax ? false : true;
6234
6355
  }
6235
6356
  let classesUlElement = ["sledge-instant-search__result-filter-item-list"];
6236
- const getFacetComponent = () => /* @__PURE__ */ jsxRuntimeExports.jsx(
6237
- FacetComponent,
6238
- {
6239
- filter: {
6240
- ...filter,
6241
- items
6242
- },
6243
- isFirstLoading,
6244
- displaySettings,
6245
- generalDataSettings,
6246
- settings,
6247
- searchFacetDistribution,
6248
- clickedFacets,
6249
- handleFilterChange,
6250
- defaultFacetStats,
6251
- valueFilterPriceChange,
6252
- setValueFilterPriceChange,
6253
- valueFilterOnSaleChange,
6254
- setValueFilterOnSaleChange,
6255
- separatedFilterItem,
6256
- setSeparatedFilterItem,
6257
- scrollElementSelector,
6258
- layoutType,
6259
- collectionId,
6260
- colorSwatches
6261
- }
6262
- );
6357
+ const getFacetComponent = (props2) => {
6358
+ const { ulClasses = "" } = props2 || {};
6359
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
6360
+ FacetComponent,
6361
+ {
6362
+ filter: {
6363
+ ...filter,
6364
+ items
6365
+ },
6366
+ isFirstLoading,
6367
+ displaySettings,
6368
+ generalDataSettings,
6369
+ settings,
6370
+ searchFacetDistribution,
6371
+ clickedFacets,
6372
+ setClickedFacets,
6373
+ handleFilterChange,
6374
+ defaultFacetStats,
6375
+ valueFilterPriceChange,
6376
+ setValueFilterPriceChange,
6377
+ valueFilterOnSaleChange,
6378
+ setValueFilterOnSaleChange,
6379
+ separatedFilterItem,
6380
+ setSeparatedFilterItem,
6381
+ scrollElementSelector,
6382
+ layoutType,
6383
+ collectionId,
6384
+ colorSwatches,
6385
+ ulClasses,
6386
+ languageSettings,
6387
+ triggerClickedFacets,
6388
+ setTriggerClickedFacets,
6389
+ handleQueryStringFilter,
6390
+ previousStateFromOutside: previousState
6391
+ }
6392
+ );
6393
+ };
6263
6394
  if (display.toLowerCase() === "swatch" && (items == null ? void 0 : items.length))
6264
6395
  classesUlElement.push("sledge-instant-search__result-filter-item-color-swatches");
6265
6396
  if (display.toLowerCase() === "tree")