instantsearch.js 4.44.0 → 4.45.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 (36) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/cjs/connectors/hits-per-page/connectHitsPerPage.js +3 -1
  3. package/cjs/connectors/numeric-menu/connectNumericMenu.js +31 -43
  4. package/cjs/connectors/range/connectRange.js +7 -46
  5. package/cjs/connectors/rating-menu/connectRatingMenu.js +10 -4
  6. package/cjs/connectors/sort-by/connectSortBy.js +3 -1
  7. package/cjs/lib/version.js +1 -1
  8. package/cjs/widgets/clear-refinements/clear-refinements.js +2 -2
  9. package/dist/instantsearch.development.d.ts +29 -10
  10. package/dist/instantsearch.development.js +113 -124
  11. package/dist/instantsearch.development.js.map +1 -1
  12. package/dist/instantsearch.production.d.ts +29 -10
  13. package/dist/instantsearch.production.min.d.ts +29 -10
  14. package/dist/instantsearch.production.min.js +2 -2
  15. package/dist/instantsearch.production.min.js.map +1 -1
  16. package/es/components/Answers/Answers.d.ts +2 -2
  17. package/es/components/Hits/Hits.d.ts +2 -2
  18. package/es/components/InfiniteHits/InfiniteHits.d.ts +2 -2
  19. package/es/connectors/answers/connectAnswers.d.ts +2 -2
  20. package/es/connectors/autocomplete/connectAutocomplete.d.ts +2 -2
  21. package/es/connectors/hits-per-page/connectHitsPerPage.d.ts +5 -0
  22. package/es/connectors/hits-per-page/connectHitsPerPage.js +3 -1
  23. package/es/connectors/numeric-menu/connectNumericMenu.d.ts +8 -0
  24. package/es/connectors/numeric-menu/connectNumericMenu.js +32 -44
  25. package/es/connectors/range/connectRange.js +8 -47
  26. package/es/connectors/rating-menu/connectRatingMenu.d.ts +2 -0
  27. package/es/connectors/rating-menu/connectRatingMenu.js +10 -4
  28. package/es/connectors/sort-by/connectSortBy.d.ts +5 -0
  29. package/es/connectors/sort-by/connectSortBy.js +3 -1
  30. package/es/lib/insights/client.d.ts +2 -2
  31. package/es/lib/utils/createSendEventForHits.d.ts +3 -3
  32. package/es/lib/version.d.ts +1 -1
  33. package/es/lib/version.js +1 -1
  34. package/es/types/connector.d.ts +2 -2
  35. package/es/widgets/clear-refinements/clear-refinements.js +2 -2
  36. package/package.json +4 -3
@@ -1,4 +1,4 @@
1
- /*! InstantSearch.js 4.44.0 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch.js */
1
+ /*! InstantSearch.js 4.45.1 | © Algolia, Inc. and contributors; MIT License | https://github.com/algolia/instantsearch.js */
2
2
  (function (global, factory) {
3
3
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
4
4
  typeof define === 'function' && define.amd ? define(factory) :
@@ -297,6 +297,63 @@
297
297
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
298
298
  }
299
299
 
300
+ function _createForOfIteratorHelper(o, allowArrayLike) {
301
+ var it;
302
+
303
+ if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
304
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
305
+ if (it) o = it;
306
+ var i = 0;
307
+
308
+ var F = function () {};
309
+
310
+ return {
311
+ s: F,
312
+ n: function () {
313
+ if (i >= o.length) return {
314
+ done: true
315
+ };
316
+ return {
317
+ done: false,
318
+ value: o[i++]
319
+ };
320
+ },
321
+ e: function (e) {
322
+ throw e;
323
+ },
324
+ f: F
325
+ };
326
+ }
327
+
328
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
329
+ }
330
+
331
+ var normalCompletion = true,
332
+ didErr = false,
333
+ err;
334
+ return {
335
+ s: function () {
336
+ it = o[Symbol.iterator]();
337
+ },
338
+ n: function () {
339
+ var step = it.next();
340
+ normalCompletion = step.done;
341
+ return step;
342
+ },
343
+ e: function (e) {
344
+ didErr = true;
345
+ err = e;
346
+ },
347
+ f: function () {
348
+ try {
349
+ if (!normalCompletion && it.return != null) it.return();
350
+ } finally {
351
+ if (didErr) throw err;
352
+ }
353
+ }
354
+ };
355
+ }
356
+
300
357
  function clone(value) {
301
358
  if (typeof value === 'object' && value !== null) {
302
359
  return _merge(Array.isArray(value) ? [] : {}, value);
@@ -7918,31 +7975,6 @@
7918
7975
  }
7919
7976
  }
7920
7977
 
7921
- function convertNumericRefinementsToFilters(state, attribute) {
7922
- if (!state) {
7923
- return null;
7924
- }
7925
-
7926
- var filtersObj = state.numericRefinements[attribute];
7927
- /*
7928
- filtersObj === {
7929
- "<=": [10],
7930
- "=": [],
7931
- ">=": [5]
7932
- }
7933
- */
7934
-
7935
- var filters = [];
7936
- Object.keys(filtersObj).filter(function (operator) {
7937
- return Array.isArray(filtersObj[operator]) && filtersObj[operator].length > 0;
7938
- }).forEach(function (operator) {
7939
- filtersObj[operator].forEach(function (value) {
7940
- filters.push("".concat(attribute).concat(operator).concat(value));
7941
- });
7942
- });
7943
- return filters;
7944
- }
7945
-
7946
7978
  // copied from
7947
7979
  // https://github.com/algolia/autocomplete.js/blob/307a7acc4283e10a19cb7d067f04f1bea79dc56f/packages/autocomplete-core/src/utils/createConcurrentSafePromise.ts#L1:L1
7948
7980
 
@@ -8603,7 +8635,7 @@
8603
8635
  instantSearchInstance.renderState = _objectSpread2(_objectSpread2({}, instantSearchInstance.renderState), {}, _defineProperty({}, parentIndexName, _objectSpread2(_objectSpread2({}, instantSearchInstance.renderState[parentIndexName]), renderState)));
8604
8636
  }
8605
8637
 
8606
- var version$1 = '4.44.0';
8638
+ var version$1 = '4.45.1';
8607
8639
 
8608
8640
  var NAMESPACE = 'ais';
8609
8641
  var component = function component(componentName) {
@@ -11637,6 +11669,7 @@
11637
11669
  results = _ref5.results,
11638
11670
  createURL = _ref5.createURL,
11639
11671
  helper = _ref5.helper;
11672
+ var canRefine = results ? results.nbHits > 0 : false;
11640
11673
  return {
11641
11674
  items: transformItems(normalizeItems(state), {
11642
11675
  results: results
@@ -11646,7 +11679,8 @@
11646
11679
  state: state,
11647
11680
  createURL: createURL
11648
11681
  }),
11649
- hasNoResults: results ? results.nbHits === 0 : true,
11682
+ hasNoResults: !canRefine,
11683
+ canRefine: canRefine,
11650
11684
  widgetParams: widgetParams
11651
11685
  };
11652
11686
  },
@@ -12117,46 +12151,11 @@
12117
12151
  var $$type = 'ais.numericMenu';
12118
12152
 
12119
12153
  var createSendEvent = function createSendEvent(_ref) {
12120
- var instantSearchInstance = _ref.instantSearchInstance,
12121
- helper = _ref.helper,
12122
- attribute = _ref.attribute;
12154
+ var instantSearchInstance = _ref.instantSearchInstance;
12123
12155
  return function () {
12124
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
12125
- args[_key] = arguments[_key];
12126
- }
12127
-
12128
- if (args.length === 1) {
12129
- instantSearchInstance.sendEventToInsights(args[0]);
12130
- return;
12131
- }
12132
-
12133
- var eventType = args[0],
12134
- facetValue = args[1],
12135
- _args$ = args[2],
12136
- eventName = _args$ === void 0 ? 'Filter Applied' : _args$;
12137
-
12138
- if (eventType !== 'click') {
12156
+ if (arguments.length === 1) {
12157
+ instantSearchInstance.sendEventToInsights(arguments.length <= 0 ? undefined : arguments[0]);
12139
12158
  return;
12140
- } // facetValue === "%7B%22start%22:5,%22end%22:10%7D"
12141
-
12142
-
12143
- var filters = convertNumericRefinementsToFilters(getRefinedState(helper.state, attribute, facetValue), attribute);
12144
-
12145
- if (filters && filters.length > 0) {
12146
- /*
12147
- filters === ["price<=10", "price>=5"]
12148
- */
12149
- instantSearchInstance.sendEventToInsights({
12150
- insightsMethod: 'clickedFilters',
12151
- widgetType: $$type,
12152
- eventType: eventType,
12153
- payload: {
12154
- eventName: eventName,
12155
- index: helper.getIndex(),
12156
- filters: filters
12157
- },
12158
- attribute: attribute
12159
- });
12160
12159
  }
12161
12160
  };
12162
12161
  };
@@ -12301,18 +12300,39 @@
12301
12300
 
12302
12301
  if (!connectorState.sendEvent) {
12303
12302
  connectorState.sendEvent = createSendEvent({
12304
- instantSearchInstance: instantSearchInstance,
12305
- helper: helper,
12306
- attribute: attribute
12303
+ instantSearchInstance: instantSearchInstance
12307
12304
  });
12308
12305
  }
12309
12306
 
12307
+ var hasNoResults = results ? results.nbHits === 0 : true;
12308
+ var preparedItems = prepareItems(state);
12309
+ var allIsSelected = true;
12310
+
12311
+ var _iterator = _createForOfIteratorHelper(preparedItems),
12312
+ _step;
12313
+
12314
+ try {
12315
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
12316
+ var item = _step.value;
12317
+
12318
+ if (item.isRefined && decodeURI(item.value) !== '{}') {
12319
+ allIsSelected = false;
12320
+ break;
12321
+ }
12322
+ }
12323
+ } catch (err) {
12324
+ _iterator.e(err);
12325
+ } finally {
12326
+ _iterator.f();
12327
+ }
12328
+
12310
12329
  return {
12311
12330
  createURL: connectorState.createURL(state),
12312
- items: transformItems(prepareItems(state), {
12331
+ items: transformItems(preparedItems, {
12313
12332
  results: results
12314
12333
  }),
12315
- hasNoResults: results ? results.nbHits === 0 : true,
12334
+ hasNoResults: hasNoResults,
12335
+ canRefine: !(hasNoResults && allIsSelected),
12316
12336
  refine: connectorState.refine,
12317
12337
  sendEvent: connectorState.sendEvent,
12318
12338
  widgetParams: widgetParams
@@ -12729,50 +12749,12 @@
12729
12749
  return null;
12730
12750
  };
12731
12751
 
12732
- var sendEventWithRefinedState = function sendEventWithRefinedState(refinedState, instantSearchInstance, helper) {
12733
- var eventName = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'Filter Applied';
12734
- var filters = convertNumericRefinementsToFilters(refinedState, attribute);
12735
-
12736
- if (filters && filters.length > 0) {
12737
- instantSearchInstance.sendEventToInsights({
12738
- insightsMethod: 'clickedFilters',
12739
- widgetType: $$type$1,
12740
- eventType: 'click',
12741
- payload: {
12742
- eventName: eventName,
12743
- index: helper.getIndex(),
12744
- filters: filters
12745
- },
12746
- attribute: attribute
12747
- });
12748
- }
12749
- };
12750
-
12751
- var createSendEvent = function createSendEvent(instantSearchInstance, helper, currentRange) {
12752
+ var createSendEvent = function createSendEvent(instantSearchInstance) {
12752
12753
  return function () {
12753
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
12754
- args[_key] = arguments[_key];
12755
- }
12756
-
12757
- if (args.length === 1) {
12758
- instantSearchInstance.sendEventToInsights(args[0]);
12759
- return;
12760
- }
12761
-
12762
- var eventType = args[0],
12763
- facetValue = args[1],
12764
- eventName = args[2];
12765
-
12766
- if (eventType !== 'click') {
12754
+ if (arguments.length === 1) {
12755
+ instantSearchInstance.sendEventToInsights(arguments.length <= 0 ? undefined : arguments[0]);
12767
12756
  return;
12768
12757
  }
12769
-
12770
- var _facetValue = _slicedToArray(facetValue, 2),
12771
- nextMin = _facetValue[0],
12772
- nextMax = _facetValue[1];
12773
-
12774
- var refinedState = getRefinedState(helper, currentRange, nextMin, nextMax);
12775
- sendEventWithRefinedState(refinedState, instantSearchInstance, helper, eventName);
12776
12758
  };
12777
12759
  };
12778
12760
 
@@ -12818,7 +12800,7 @@
12818
12800
  return [min, max];
12819
12801
  }
12820
12802
 
12821
- function _refine(instantSearchInstance, helper, currentRange) {
12803
+ function _refine(helper, currentRange) {
12822
12804
  return function () {
12823
12805
  var _ref11 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [undefined, undefined],
12824
12806
  _ref12 = _slicedToArray(_ref11, 2),
@@ -12828,7 +12810,6 @@
12828
12810
  var refinedState = getRefinedState(helper, currentRange, nextMin, nextMax);
12829
12811
 
12830
12812
  if (refinedState) {
12831
- sendEventWithRefinedState(refinedState, instantSearchInstance, helper);
12832
12813
  helper.setState(refinedState).search();
12833
12814
  }
12834
12815
  };
@@ -12874,12 +12855,12 @@
12874
12855
  // On first render pass an empty range
12875
12856
  // to be able to bypass the validation
12876
12857
  // related to it
12877
- refine = _refine(instantSearchInstance, helper, {
12858
+ refine = _refine(helper, {
12878
12859
  min: undefined,
12879
12860
  max: undefined
12880
12861
  });
12881
12862
  } else {
12882
- refine = _refine(instantSearchInstance, helper, currentRange);
12863
+ refine = _refine(helper, currentRange);
12883
12864
  }
12884
12865
 
12885
12866
  return {
@@ -12887,7 +12868,7 @@
12887
12868
  canRefine: currentRange.min !== currentRange.max,
12888
12869
  format: rangeFormatter,
12889
12870
  range: currentRange,
12890
- sendEvent: createSendEvent(instantSearchInstance, helper, currentRange),
12871
+ sendEvent: createSendEvent(instantSearchInstance),
12891
12872
  widgetParams: _objectSpread2(_objectSpread2({}, widgetParams), {}, {
12892
12873
  precision: precision
12893
12874
  }),
@@ -13407,13 +13388,15 @@
13407
13388
  };
13408
13389
  }
13409
13390
 
13391
+ var hasNoResults = results ? results.nbHits === 0 : true;
13410
13392
  return {
13411
13393
  currentRefinement: state.index,
13412
13394
  options: transformItems(items, {
13413
13395
  results: results
13414
13396
  }),
13415
13397
  refine: connectorState.setIndex,
13416
- hasNoResults: results ? results.nbHits === 0 : true,
13398
+ hasNoResults: hasNoResults,
13399
+ canRefine: !hasNoResults && items.length > 0,
13417
13400
  widgetParams: widgetParams
13418
13401
  };
13419
13402
  },
@@ -13617,8 +13600,11 @@
13617
13600
  });
13618
13601
  }
13619
13602
 
13620
- if (results) {
13621
- var facetResults = results.getFacetValues(attribute, {});
13603
+ var refinementIsApplied = false;
13604
+ var totalCount = 0;
13605
+ var facetResults = results === null || results === void 0 ? void 0 : results.getFacetValues(attribute, {});
13606
+
13607
+ if (results && facetResults) {
13622
13608
  var maxValuesPerFacet = facetResults.length;
13623
13609
  var maxDecimalPlaces = getFacetsMaxDecimalPlaces(facetResults);
13624
13610
  var maxFacets = Math.pow(10, maxDecimalPlaces) * max;
@@ -13632,6 +13618,7 @@
13632
13618
 
13633
13619
  var _loop = function _loop(star) {
13634
13620
  var isRefined = refinedStar === star;
13621
+ refinementIsApplied = refinementIsApplied || isRefined;
13635
13622
  var count = facetResults.filter(function (f) {
13636
13623
  return Number(f.name) >= star && Number(f.name) <= max;
13637
13624
  }).map(function (f) {
@@ -13639,6 +13626,7 @@
13639
13626
  }).reduce(function (sum, current) {
13640
13627
  return sum + current;
13641
13628
  }, 0);
13629
+ totalCount += count;
13642
13630
 
13643
13631
  if (refinedStar && !isRefined && count === 0) {
13644
13632
  // skip count==0 when at least 1 refinement is enabled
@@ -13668,10 +13656,11 @@
13668
13656
  }
13669
13657
 
13670
13658
  facetValues = facetValues.reverse();
13659
+ var hasNoResults = results ? results.nbHits === 0 : true;
13671
13660
  return {
13672
13661
  items: facetValues,
13673
- hasNoResults: results ? results.nbHits === 0 : true,
13674
- canRefine: facetValues.length > 0,
13662
+ hasNoResults: hasNoResults,
13663
+ canRefine: (!hasNoResults || refinementIsApplied) && totalCount > 0,
13675
13664
  refine: connectorState.toggleRefinementFactory(helper),
13676
13665
  sendEvent: sendEvent,
13677
13666
  createURL: connectorState.createURLFactory({
@@ -16103,7 +16092,7 @@
16103
16092
  templates = _ref.templates;
16104
16093
  return function (_ref2, isFirstRendering) {
16105
16094
  var refine = _ref2.refine,
16106
- hasRefinements = _ref2.hasRefinements,
16095
+ canRefine = _ref2.canRefine,
16107
16096
  instantSearchInstance = _ref2.instantSearchInstance;
16108
16097
 
16109
16098
  if (isFirstRendering) {
@@ -16118,7 +16107,7 @@
16118
16107
  S(v(ClearRefinements, {
16119
16108
  refine: refine,
16120
16109
  cssClasses: cssClasses,
16121
- hasRefinements: hasRefinements,
16110
+ hasRefinements: canRefine,
16122
16111
  templateProps: renderState.templateProps
16123
16112
  }), containerNode);
16124
16113
  };