instantsearch.js 4.56.3 → 4.56.5

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 (39) hide show
  1. package/cjs/connectors/breadcrumb/connectBreadcrumb.js +31 -4
  2. package/cjs/connectors/hierarchical-menu/connectHierarchicalMenu.js +9 -3
  3. package/cjs/connectors/hits-per-page/connectHitsPerPage.js +12 -3
  4. package/cjs/connectors/menu/connectMenu.js +7 -1
  5. package/cjs/connectors/numeric-menu/connectNumericMenu.js +7 -1
  6. package/cjs/connectors/pagination/connectPagination.js +7 -5
  7. package/cjs/connectors/rating-menu/connectRatingMenu.js +12 -3
  8. package/cjs/connectors/refinement-list/connectRefinementList.js +7 -1
  9. package/cjs/connectors/toggle-refinement/connectToggleRefinement.js +15 -3
  10. package/cjs/lib/version.js +1 -1
  11. package/cjs/middlewares/createRouterMiddleware.js +12 -2
  12. package/cjs/widgets/index/index.js +6 -3
  13. package/dist/instantsearch.development.d.ts +7 -3
  14. package/dist/instantsearch.development.js +127 -31
  15. package/dist/instantsearch.development.js.map +1 -1
  16. package/dist/instantsearch.production.d.ts +7 -3
  17. package/dist/instantsearch.production.min.d.ts +7 -3
  18. package/dist/instantsearch.production.min.js +2 -2
  19. package/dist/instantsearch.production.min.js.map +1 -1
  20. package/es/connectors/breadcrumb/connectBreadcrumb.js +31 -4
  21. package/es/connectors/hierarchical-menu/connectHierarchicalMenu.js +9 -3
  22. package/es/connectors/hits-per-page/connectHitsPerPage.d.ts +5 -1
  23. package/es/connectors/hits-per-page/connectHitsPerPage.js +12 -3
  24. package/es/connectors/menu/connectMenu.js +7 -1
  25. package/es/connectors/numeric-menu/connectNumericMenu.js +7 -1
  26. package/es/connectors/pagination/connectPagination.js +7 -5
  27. package/es/connectors/rating-menu/connectRatingMenu.js +12 -3
  28. package/es/connectors/refinement-list/connectRefinementList.js +7 -1
  29. package/es/connectors/toggle-refinement/connectToggleRefinement.d.ts +1 -1
  30. package/es/connectors/toggle-refinement/connectToggleRefinement.js +15 -3
  31. package/es/connectors/toggle-refinement/types.d.ts +5 -40
  32. package/es/lib/utils/render-args.d.ts +222 -2
  33. package/es/lib/version.d.ts +1 -1
  34. package/es/lib/version.js +1 -1
  35. package/es/middlewares/createRouterMiddleware.js +12 -2
  36. package/es/types/widget.d.ts +1 -1
  37. package/es/widgets/index/index.d.ts +1 -1
  38. package/es/widgets/index/index.js +6 -3
  39. package/package.json +5 -5
@@ -73,6 +73,7 @@ var connectBreadcrumb = function connectBreadcrumb(renderFn) {
73
73
  });
74
74
  },
75
75
  getWidgetRenderState: function getWidgetRenderState(_ref2) {
76
+ var _this = this;
76
77
  var helper = _ref2.helper,
77
78
  createURL = _ref2.createURL,
78
79
  results = _ref2.results,
@@ -96,7 +97,12 @@ var connectBreadcrumb = function connectBreadcrumb(renderFn) {
96
97
  var items = getItems();
97
98
  if (!connectorState.createURL) {
98
99
  connectorState.createURL = function (facetValue) {
99
- return createURL(getRefinedState(helper.state, facetValue));
100
+ return createURL(function (uiState) {
101
+ return _this.getWidgetUiState(uiState, {
102
+ searchParameters: getRefinedState(helper.state, facetValue),
103
+ helper: helper
104
+ });
105
+ });
100
106
  };
101
107
  }
102
108
  if (!connectorState.refine) {
@@ -112,18 +118,39 @@ var connectBreadcrumb = function connectBreadcrumb(renderFn) {
112
118
  widgetParams: widgetParams
113
119
  };
114
120
  },
115
- getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters) {
121
+ getWidgetUiState: function getWidgetUiState(uiState, _ref3) {
122
+ var searchParameters = _ref3.searchParameters;
123
+ var path = searchParameters.getHierarchicalFacetBreadcrumb(hierarchicalFacetName);
124
+ if (!path.length) {
125
+ return uiState;
126
+ }
127
+ return _objectSpread(_objectSpread({}, uiState), {}, {
128
+ hierarchicalMenu: _objectSpread(_objectSpread({}, uiState.hierarchicalMenu), {}, _defineProperty({}, hierarchicalFacetName, path))
129
+ });
130
+ },
131
+ getWidgetSearchParameters: function getWidgetSearchParameters(searchParameters, _ref4) {
132
+ var uiState = _ref4.uiState;
133
+ var values = uiState.hierarchicalMenu && uiState.hierarchicalMenu[hierarchicalFacetName];
134
+ if (searchParameters.isConjunctiveFacet(hierarchicalFacetName) || searchParameters.isDisjunctiveFacet(hierarchicalFacetName)) {
135
+ process.env.NODE_ENV === 'development' ? (0, _utils.warning)(false, "HierarchicalMenu: Attribute \"".concat(hierarchicalFacetName, "\" is already used by another widget applying conjunctive or disjunctive faceting.\nAs this is not supported, please make sure to remove this other widget or this HierarchicalMenu widget will not work at all.")) : void 0;
136
+ return searchParameters;
137
+ }
116
138
  if (searchParameters.isHierarchicalFacet(hierarchicalFacetName)) {
117
139
  var facet = searchParameters.getHierarchicalFacetByName(hierarchicalFacetName);
118
140
  process.env.NODE_ENV === 'development' ? (0, _utils.warning)((0, _utils.isEqual)(facet.attributes, attributes) && facet.separator === separator && facet.rootPath === rootPath, 'Using Breadcrumb and HierarchicalMenu on the same facet with different options overrides the configuration of the HierarchicalMenu.') : void 0;
119
- return searchParameters;
120
141
  }
121
- return searchParameters.addHierarchicalFacet({
142
+ var withFacetConfiguration = searchParameters.removeHierarchicalFacet(hierarchicalFacetName).addHierarchicalFacet({
122
143
  name: hierarchicalFacetName,
123
144
  attributes: attributes,
124
145
  separator: separator,
125
146
  rootPath: rootPath
126
147
  });
148
+ if (!values) {
149
+ return withFacetConfiguration.setQueryParameters({
150
+ hierarchicalFacetsRefinements: _objectSpread(_objectSpread({}, withFacetConfiguration.hierarchicalFacetsRefinements), {}, _defineProperty({}, hierarchicalFacetName, []))
151
+ });
152
+ }
153
+ return withFacetConfiguration.addHierarchicalFacetRefinement(hierarchicalFacetName, values.join(separator));
127
154
  }
128
155
  };
129
156
  };
@@ -136,6 +136,7 @@ var connectHierarchicalMenu = function connectHierarchicalMenu(renderFn) {
136
136
  });
137
137
  },
138
138
  getWidgetRenderState: function getWidgetRenderState(_ref4) {
139
+ var _this = this;
139
140
  var results = _ref4.results,
140
141
  state = _ref4.state,
141
142
  createURL = _ref4.createURL,
@@ -145,9 +146,14 @@ var connectHierarchicalMenu = function connectHierarchicalMenu(renderFn) {
145
146
  var canToggleShowMore = false;
146
147
 
147
148
  // Bind createURL to this specific attribute
148
- function _createURL(facetValue) {
149
- return createURL(state.resetPage().toggleFacetRefinement(hierarchicalFacetName, facetValue));
150
- }
149
+ var _createURL = function _createURL(facetValue) {
150
+ return createURL(function (uiState) {
151
+ return _this.getWidgetUiState(uiState, {
152
+ searchParameters: state.resetPage().toggleFacetRefinement(hierarchicalFacetName, facetValue),
153
+ helper: helper
154
+ });
155
+ });
156
+ };
151
157
  if (!sendEvent) {
152
158
  sendEvent = (0, _utils.createSendEventForFacet)({
153
159
  instantSearchInstance: instantSearchInstance,
@@ -61,9 +61,16 @@ var connectHitsPerPage = function connectHitsPerPage(renderFn) {
61
61
  },
62
62
  createURLFactory: function createURLFactory(_ref3) {
63
63
  var state = _ref3.state,
64
- createURL = _ref3.createURL;
64
+ createURL = _ref3.createURL,
65
+ getWidgetUiState = _ref3.getWidgetUiState,
66
+ helper = _ref3.helper;
65
67
  return function (value) {
66
- return createURL(state.resetPage().setQueryParameter('hitsPerPage', !value && value !== 0 ? undefined : value));
68
+ return createURL(function (uiState) {
69
+ return getWidgetUiState(uiState, {
70
+ searchParameters: state.resetPage().setQueryParameter('hitsPerPage', !value && value !== 0 ? undefined : value),
71
+ helper: helper
72
+ });
73
+ });
67
74
  };
68
75
  }
69
76
  };
@@ -118,7 +125,9 @@ var connectHitsPerPage = function connectHitsPerPage(renderFn) {
118
125
  refine: connectorState.getRefine(helper),
119
126
  createURL: connectorState.createURLFactory({
120
127
  state: state,
121
- createURL: createURL
128
+ createURL: createURL,
129
+ getWidgetUiState: this.getWidgetUiState,
130
+ helper: helper
122
131
  }),
123
132
  hasNoResults: !canRefine,
124
133
  canRefine: canRefine,
@@ -103,6 +103,7 @@ var connectMenu = function connectMenu(renderFn) {
103
103
  });
104
104
  },
105
105
  getWidgetRenderState: function getWidgetRenderState(renderOptions) {
106
+ var _this = this;
106
107
  var results = renderOptions.results,
107
108
  createURL = renderOptions.createURL,
108
109
  instantSearchInstance = renderOptions.instantSearchInstance,
@@ -119,7 +120,12 @@ var connectMenu = function connectMenu(renderFn) {
119
120
  }
120
121
  if (!_createURL) {
121
122
  _createURL = function _createURL(facetValue) {
122
- return createURL(helper.state.resetPage().toggleFacetRefinement(attribute, facetValue));
123
+ return createURL(function (uiState) {
124
+ return _this.getWidgetUiState(uiState, {
125
+ searchParameters: helper.state.resetPage().toggleFacetRefinement(attribute, facetValue),
126
+ helper: helper
127
+ });
128
+ });
123
129
  };
124
130
  }
125
131
  if (!_refine) {
@@ -135,6 +135,7 @@ var connectNumericMenu = function connectNumericMenu(renderFn) {
135
135
  });
136
136
  },
137
137
  getWidgetRenderState: function getWidgetRenderState(_ref7) {
138
+ var _this = this;
138
139
  var results = _ref7.results,
139
140
  state = _ref7.state,
140
141
  instantSearchInstance = _ref7.instantSearchInstance,
@@ -150,7 +151,12 @@ var connectNumericMenu = function connectNumericMenu(renderFn) {
150
151
  if (!connectorState.createURL) {
151
152
  connectorState.createURL = function (newState) {
152
153
  return function (facetValue) {
153
- return createURL(getRefinedState(newState, attribute, facetValue));
154
+ return createURL(function (uiState) {
155
+ return _this.getWidgetUiState(uiState, {
156
+ searchParameters: getRefinedState(newState, attribute, facetValue),
157
+ helper: helper
158
+ });
159
+ });
154
160
  };
155
161
  };
156
162
  }
@@ -88,10 +88,12 @@ var connectPagination = function connectPagination(renderFn) {
88
88
  };
89
89
  }
90
90
  if (!connectorState.createURL) {
91
- connectorState.createURL = function (helperState) {
92
- return function (page) {
93
- return createURL(helperState.setPage(page));
94
- };
91
+ connectorState.createURL = function (page) {
92
+ return createURL(function (uiState) {
93
+ return _objectSpread(_objectSpread({}, uiState), {}, {
94
+ page: page
95
+ });
96
+ });
95
97
  };
96
98
  }
97
99
  var page = state.page || 0;
@@ -101,7 +103,7 @@ var connectPagination = function connectPagination(renderFn) {
101
103
  pager.currentPage = page;
102
104
  pager.total = nbPages;
103
105
  return {
104
- createURL: connectorState.createURL(state),
106
+ createURL: connectorState.createURL,
105
107
  refine: connectorState.refine,
106
108
  canRefine: nbPages > 1,
107
109
  currentRefinement: page,
@@ -142,9 +142,16 @@ var connectRatingMenu = function connectRatingMenu(renderFn) {
142
142
  },
143
143
  createURLFactory: function createURLFactory(_ref4) {
144
144
  var state = _ref4.state,
145
- createURL = _ref4.createURL;
145
+ createURL = _ref4.createURL,
146
+ getWidgetUiState = _ref4.getWidgetUiState,
147
+ helper = _ref4.helper;
146
148
  return function (value) {
147
- return createURL(getRefinedState(state, value));
149
+ return createURL(function (uiState) {
150
+ return getWidgetUiState(uiState, {
151
+ searchParameters: getRefinedState(state, value),
152
+ helper: helper
153
+ });
154
+ });
148
155
  };
149
156
  }
150
157
  };
@@ -240,7 +247,9 @@ var connectRatingMenu = function connectRatingMenu(renderFn) {
240
247
  sendEvent: sendEvent,
241
248
  createURL: connectorState.createURLFactory({
242
249
  state: state,
243
- createURL: createURL
250
+ createURL: createURL,
251
+ helper: helper,
252
+ getWidgetUiState: this.getWidgetUiState
244
253
  }),
245
254
  widgetParams: widgetParams
246
255
  };
@@ -163,6 +163,7 @@ var connectRefinementList = function connectRefinementList(renderFn) {
163
163
  });
164
164
  },
165
165
  getWidgetRenderState: function getWidgetRenderState(renderOptions) {
166
+ var _this = this;
166
167
  var results = renderOptions.results,
167
168
  state = renderOptions.state,
168
169
  _createURL = renderOptions.createURL,
@@ -216,7 +217,12 @@ var connectRefinementList = function connectRefinementList(renderFn) {
216
217
  var canToggleShowMore = canShowLess || canShowMore;
217
218
  return {
218
219
  createURL: function createURL(facetValue) {
219
- return _createURL(state.resetPage().toggleFacetRefinement(attribute, facetValue));
220
+ return _createURL(function (uiState) {
221
+ return _this.getWidgetUiState(uiState, {
222
+ searchParameters: state.resetPage().toggleFacetRefinement(attribute, facetValue),
223
+ helper: helper
224
+ });
225
+ });
220
226
  },
221
227
  items: items,
222
228
  refine: triggerRefine,
@@ -125,7 +125,9 @@ var connectToggleRefinement = function connectToggleRefinement(renderFn) {
125
125
  var connectorState = {
126
126
  createURLFactory: function createURLFactory(isRefined, _ref4) {
127
127
  var state = _ref4.state,
128
- createURL = _ref4.createURL;
128
+ createURL = _ref4.createURL,
129
+ getWidgetUiState = _ref4.getWidgetUiState,
130
+ helper = _ref4.helper;
129
131
  return function () {
130
132
  state = state.resetPage();
131
133
  var valuesToRemove = isRefined ? on : off;
@@ -140,7 +142,12 @@ var connectToggleRefinement = function connectToggleRefinement(renderFn) {
140
142
  state = state.addDisjunctiveFacetRefinement(attribute, v);
141
143
  });
142
144
  }
143
- return createURL(state);
145
+ return createURL(function (uiState) {
146
+ return getWidgetUiState(uiState, {
147
+ searchParameters: state,
148
+ helper: helper
149
+ });
150
+ });
144
151
  };
145
152
  }
146
153
  };
@@ -245,7 +252,9 @@ var connectToggleRefinement = function connectToggleRefinement(renderFn) {
245
252
  },
246
253
  createURL: connectorState.createURLFactory(isRefined, {
247
254
  state: state,
248
- createURL: createURL
255
+ createURL: createURL,
256
+ helper: helper,
257
+ getWidgetUiState: this.getWidgetUiState
249
258
  }),
250
259
  sendEvent: sendEvent,
251
260
  canRefine: Boolean(results ? nextRefinement.count : null),
@@ -259,6 +268,9 @@ var connectToggleRefinement = function connectToggleRefinement(renderFn) {
259
268
  return searchParameters.isDisjunctiveFacetRefined(attribute, v);
260
269
  });
261
270
  if (!isRefined) {
271
+ var _uiState$toggle;
272
+ // This needs to be done in the case `uiState` comes from `createURL`
273
+ (_uiState$toggle = uiState.toggle) === null || _uiState$toggle === void 0 ? true : delete _uiState$toggle[attribute];
262
274
  return uiState;
263
275
  }
264
276
  return _objectSpread(_objectSpread({}, uiState), {}, {
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _default = '4.56.3';
7
+ var _default = '4.56.5';
8
8
  exports.default = _default;
@@ -25,9 +25,17 @@ var createRouterMiddleware = function createRouterMiddleware() {
25
25
  return function (_ref) {
26
26
  var instantSearchInstance = _ref.instantSearchInstance;
27
27
  function topLevelCreateURL(nextState) {
28
+ var previousUiState =
29
+ // If only the mainIndex is initialized, we don't yet know what other
30
+ // index widgets are used. Therefore we fall back to the initialUiState.
31
+ // We can't indiscriminately use the initialUiState because then we
32
+ // reintroduce state that was changed by the user.
33
+ // When there are no widgets, we are sure the user can't yet have made
34
+ // any changes.
35
+ instantSearchInstance.mainIndex.getWidgets().length === 0 ? instantSearchInstance._initialUiState : instantSearchInstance.mainIndex.getWidgetUiState({});
28
36
  var uiState = Object.keys(nextState).reduce(function (acc, indexId) {
29
37
  return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, indexId, nextState[indexId]));
30
- }, instantSearchInstance.mainIndex.getWidgetUiState({}));
38
+ }, previousUiState);
31
39
  var route = stateMapping.stateToRoute(uiState);
32
40
  return router.createURL(route);
33
41
  }
@@ -51,7 +59,9 @@ var createRouterMiddleware = function createRouterMiddleware() {
51
59
  subscribe: function subscribe() {
52
60
  instantSearchInstance._initialUiState = _objectSpread(_objectSpread({}, initialUiState), stateMapping.routeToState(router.read()));
53
61
  router.onUpdate(function (route) {
54
- instantSearchInstance.setUiState(stateMapping.routeToState(route));
62
+ if (instantSearchInstance.mainIndex.getWidgets().length > 0) {
63
+ instantSearchInstance.setUiState(stateMapping.routeToState(route));
64
+ }
55
65
  });
56
66
  },
57
67
  started: function started() {
@@ -147,6 +147,9 @@ var index = function index(widgetParams) {
147
147
  return localParent;
148
148
  },
149
149
  createURL: function createURL(nextState) {
150
+ if (typeof nextState === 'function') {
151
+ return localInstantSearchInstance._createURL(_defineProperty({}, indexId, nextState(localUiState)));
152
+ }
150
153
  return localInstantSearchInstance._createURL(_defineProperty({}, indexId, getLocalWidgetsUiState(localWidgets, {
151
154
  searchParameters: nextState,
152
155
  helper: helper
@@ -211,7 +214,7 @@ var index = function index(widgetParams) {
211
214
  return widgets.indexOf(widget) === -1;
212
215
  });
213
216
  if (localInstantSearchInstance && Boolean(widgets.length)) {
214
- var nextState = widgets.reduce(function (state, widget) {
217
+ var _nextState = widgets.reduce(function (state, widget) {
215
218
  // the `dispose` method exists at this point we already assert it
216
219
  var next = widget.dispose({
217
220
  helper: helper,
@@ -221,12 +224,12 @@ var index = function index(widgetParams) {
221
224
  return next || state;
222
225
  }, helper.state);
223
226
  localUiState = getLocalWidgetsUiState(localWidgets, {
224
- searchParameters: nextState,
227
+ searchParameters: _nextState,
225
228
  helper: helper
226
229
  });
227
230
  helper.setState(getLocalWidgetsSearchParameters(localWidgets, {
228
231
  uiState: localUiState,
229
- initialSearchParameters: nextState
232
+ initialSearchParameters: _nextState
230
233
  }));
231
234
  if (localWidgets.length) {
232
235
  localInstantSearchInstance.scheduleSearch();
@@ -1915,6 +1915,10 @@ declare type HitsPerPageRenderState = {
1915
1915
  * Array of objects defining the different values and labels.
1916
1916
  */
1917
1917
  items: HitsPerPageRenderStateItem[];
1918
+ /**
1919
+ * Creates the URL for a single item name in the list.
1920
+ */
1921
+ createURL: CreateURL<HitsPerPageConnectorParamsItem['value']>;
1918
1922
  /**
1919
1923
  * Sets the number of hits per page and triggers a search.
1920
1924
  */
@@ -2077,7 +2081,7 @@ declare type IndexWidget<TUiState extends UiState = UiState> = Omit<Widget<Index
2077
2081
  getScopedResults: () => ScopedResult[];
2078
2082
  getParent: () => IndexWidget | null;
2079
2083
  getWidgets: () => Array<Widget | IndexWidget>;
2080
- createURL: (state: SearchParameters) => string;
2084
+ createURL: (nextState: SearchParameters | ((state: IndexUiState) => IndexUiState)) => string;
2081
2085
  addWidgets: (widgets: Array<Widget | IndexWidget>) => IndexWidget;
2082
2086
  removeWidgets: (widgets: Array<Widget | IndexWidget>) => IndexWidget;
2083
2087
  init: (options: IndexInitOptions) => void;
@@ -4836,7 +4840,7 @@ declare type SharedRenderOptions = {
4836
4840
  };
4837
4841
  status: InstantSearch['status'];
4838
4842
  error: InstantSearch['error'];
4839
- createURL: (state: SearchParameters) => string;
4843
+ createURL: (nextState: SearchParameters | ((state: IndexUiState) => IndexUiState)) => string;
4840
4844
  };
4841
4845
 
4842
4846
  declare function simpleStateMapping<TUiState extends UiState = UiState>(): StateMapping<TUiState, TUiState>;
@@ -5275,7 +5279,7 @@ declare type ToggleRefinementRenderState = {
5275
5279
  /**
5276
5280
  * Creates an URL for the next state.
5277
5281
  */
5278
- createURL: CreateURL<string>;
5282
+ createURL: CreateURL<void>;
5279
5283
  /**
5280
5284
  * Send a "Facet Clicked" Insights event.
5281
5285
  */