@searchspring/snap-controller 0.61.5 → 0.63.0

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.
@@ -61,15 +61,6 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
61
61
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
62
  }
63
63
  };
64
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
65
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
66
- if (ar || !(i in from)) {
67
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
68
- ar[i] = from[i];
69
- }
70
- }
71
- return to.concat(ar || Array.prototype.slice.call(from));
72
- };
73
64
  var __importDefault = (this && this.__importDefault) || function (mod) {
74
65
  return (mod && mod.__esModule) ? mod : { "default": mod };
75
66
  };
@@ -104,7 +95,6 @@ var SearchController = /** @class */ (function (_super) {
104
95
  var _b, _c, _d, _e, _f;
105
96
  var _this = _super.call(this, config, { client: client, store: store, urlManager: urlManager, eventManager: eventManager, profiler: profiler, logger: logger, tracker: tracker }, context) || this;
106
97
  _this.type = types_1.ControllerTypes.search;
107
- _this.previousResults = [];
108
98
  _this.track = {
109
99
  product: {
110
100
  click: function (e, result) {
@@ -148,39 +138,38 @@ var SearchController = /** @class */ (function (_super) {
148
138
  },
149
139
  };
150
140
  _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
151
- var params, err_1, stringyParams, prevStringyParams, searchProfile, meta, response, preventBackfill, dontBackfill, backfillRequests, backfillResponses, backfillResults, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
141
+ var params_1, err_1, stringyParams, prevStringyParams, searchProfile, meta, response, preventBackfill, dontBackfill, backfillRequests, backfillResponses, backfillResults, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
152
142
  var _a, _b;
153
143
  var _this = this;
154
- var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
155
- return __generator(this, function (_p) {
156
- switch (_p.label) {
144
+ var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
145
+ return __generator(this, function (_o) {
146
+ switch (_o.label) {
157
147
  case 0:
148
+ _o.trys.push([0, 22, 23, 24]);
158
149
  if (!!this.initialized) return [3 /*break*/, 2];
159
150
  return [4 /*yield*/, this.init()];
160
151
  case 1:
161
- _p.sent();
162
- _p.label = 2;
152
+ _o.sent();
153
+ _o.label = 2;
163
154
  case 2:
164
- params = this.params;
155
+ params_1 = this.params;
165
156
  if (((_d = (_c = this.params.search) === null || _c === void 0 ? void 0 : _c.query) === null || _d === void 0 ? void 0 : _d.string) && ((_f = (_e = this.params.search) === null || _e === void 0 ? void 0 : _e.query) === null || _f === void 0 ? void 0 : _f.string.length)) {
166
157
  // save it to the history store
167
158
  this.store.history.save(this.params.search.query.string);
168
159
  }
169
- _p.label = 3;
160
+ this.store.loading = true;
161
+ _o.label = 3;
170
162
  case 3:
171
- _p.trys.push([3, 23, , 24]);
172
- _p.label = 4;
173
- case 4:
174
- _p.trys.push([4, 6, , 7]);
163
+ _o.trys.push([3, 5, , 6]);
175
164
  return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
176
165
  controller: this,
177
- request: params,
166
+ request: params_1,
178
167
  })];
168
+ case 4:
169
+ _o.sent();
170
+ return [3 /*break*/, 6];
179
171
  case 5:
180
- _p.sent();
181
- return [3 /*break*/, 7];
182
- case 6:
183
- err_1 = _p.sent();
172
+ err_1 = _o.sent();
184
173
  if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
185
174
  this.log.warn("'beforeSearch' middleware cancelled");
186
175
  return [2 /*return*/];
@@ -189,19 +178,19 @@ var SearchController = /** @class */ (function (_super) {
189
178
  this.log.error("error in 'beforeSearch' middleware");
190
179
  throw err_1;
191
180
  }
192
- return [3 /*break*/, 7];
193
- case 7:
194
- stringyParams = JSON.stringify(params);
181
+ return [3 /*break*/, 6];
182
+ case 6:
183
+ stringyParams = JSON.stringify(params_1);
195
184
  prevStringyParams = this.storage.get('lastStringyParams');
196
185
  if (stringyParams == prevStringyParams) {
197
186
  // no param change - not searching
198
187
  return [2 /*return*/];
199
188
  }
200
- searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
189
+ searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params_1 }).start();
201
190
  meta = {};
202
191
  response = {};
203
- if (!(((_g = this.config.settings) === null || _g === void 0 ? void 0 : _g.infinite) && ((_h = params.pagination) === null || _h === void 0 ? void 0 : _h.page) && params.pagination.page > 1)) return [3 /*break*/, 12];
204
- preventBackfill = ((_j = this.config.settings.infinite) === null || _j === void 0 ? void 0 : _j.backfill) && !this.store.results.length && params.pagination.page > this.config.settings.infinite.backfill;
192
+ if (!(((_g = this.config.settings) === null || _g === void 0 ? void 0 : _g.infinite) && ((_h = params_1.pagination) === null || _h === void 0 ? void 0 : _h.page) && params_1.pagination.page > 1)) return [3 /*break*/, 11];
193
+ preventBackfill = ((_j = this.config.settings.infinite) === null || _j === void 0 ? void 0 : _j.backfill) && !this.store.results.length && params_1.pagination.page > this.config.settings.infinite.backfill;
205
194
  dontBackfill = !((_k = this.config.settings.infinite) === null || _k === void 0 ? void 0 : _k.backfill) && !this.store.results.length;
206
195
  // if the page is higher than the backfill setting redirect back to page 1
207
196
  if (preventBackfill || dontBackfill) {
@@ -209,12 +198,12 @@ var SearchController = /** @class */ (function (_super) {
209
198
  this.urlManager.set('page', 1).go();
210
199
  return [2 /*return*/];
211
200
  }
212
- if (!(((_l = this.config.settings) === null || _l === void 0 ? void 0 : _l.infinite.backfill) && !this.previousResults.length)) return [3 /*break*/, 9];
213
- backfillRequests = Array(params.pagination.page)
201
+ if (!(((_l = this.config.settings) === null || _l === void 0 ? void 0 : _l.infinite.backfill) && !this.store.loaded)) return [3 /*break*/, 8];
202
+ backfillRequests = Array(params_1.pagination.page)
214
203
  .fill('backfill')
215
204
  .map(function (v, i) {
216
205
  var _a, _b, _c, _d;
217
- var backfillParams = (0, deepmerge_1.default)(__assign({}, params), { pagination: { page: i + 1 }, search: { redirectResponse: 'full' } });
206
+ var backfillParams = (0, deepmerge_1.default)(__assign({}, params_1), { pagination: { page: i + 1 }, search: { redirectResponse: 'full' } });
218
207
  // don't include page parameter if on page 1
219
208
  if (i + 1 == 1) {
220
209
  (_a = backfillParams === null || backfillParams === void 0 ? void 0 : backfillParams.pagination) === null || _a === void 0 ? true : delete _a.page;
@@ -227,8 +216,8 @@ var SearchController = /** @class */ (function (_super) {
227
216
  return _this.client.search(backfillParams);
228
217
  });
229
218
  return [4 /*yield*/, Promise.all(backfillRequests)];
230
- case 8:
231
- backfillResponses = _p.sent();
219
+ case 7:
220
+ backfillResponses = _o.sent();
232
221
  // backfillResponses are [meta, searchResponse][]
233
222
  // set the meta and response to the first page of backfillResponses
234
223
  meta = backfillResponses[0][0];
@@ -239,44 +228,42 @@ var SearchController = /** @class */ (function (_super) {
239
228
  }, []);
240
229
  // overwrite pagination params to expected state
241
230
  response.pagination.totalPages = Math.ceil(response.pagination.totalResults / response.pagination.pageSize);
242
- response.pagination.page = (_m = params.pagination) === null || _m === void 0 ? void 0 : _m.page;
231
+ response.pagination.page = (_m = params_1.pagination) === null || _m === void 0 ? void 0 : _m.page;
243
232
  // set the response results with results from backfill responses
244
233
  response.results = backfillResults;
245
- return [3 /*break*/, 11];
246
- case 9: return [4 /*yield*/, this.client.search(params)];
247
- case 10:
234
+ return [3 /*break*/, 10];
235
+ case 8: return [4 /*yield*/, this.client.search(params_1)];
236
+ case 9:
248
237
  // infinite with no backfills.
249
- _a = _p.sent(), meta = _a[0], response = _a[1];
250
- // append new results to previous results
251
- response.results = __spreadArray(__spreadArray([], this.previousResults, true), (response.results || []), true);
252
- _p.label = 11;
253
- case 11: return [3 /*break*/, 14];
254
- case 12: return [4 /*yield*/, this.client.search(params)];
238
+ _a = _o.sent(), meta = _a[0], response = _a[1];
239
+ _o.label = 10;
240
+ case 10: return [3 /*break*/, 13];
241
+ case 11: return [4 /*yield*/, this.client.search(params_1)];
242
+ case 12:
243
+ // normal request for next page
244
+ _b = _o.sent(), meta = _b[0], response = _b[1];
245
+ _o.label = 13;
255
246
  case 13:
256
- // standard request (not using infinite scroll)
257
- _b = _p.sent(), meta = _b[0], response = _b[1];
258
- _p.label = 14;
259
- case 14:
260
247
  // MockClient will overwrite the client search() method and use SearchData to return mock data which already contains meta data
261
248
  if (!response.meta) {
262
249
  response.meta = meta;
263
250
  }
264
251
  searchProfile.stop();
265
252
  this.log.profile(searchProfile);
266
- afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params }).start();
267
- _p.label = 15;
268
- case 15:
269
- _p.trys.push([15, 17, , 18]);
253
+ afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params_1 }).start();
254
+ _o.label = 14;
255
+ case 14:
256
+ _o.trys.push([14, 16, , 17]);
270
257
  return [4 /*yield*/, this.eventManager.fire('afterSearch', {
271
258
  controller: this,
272
- request: params,
259
+ request: params_1,
273
260
  response: response,
274
261
  })];
262
+ case 15:
263
+ _o.sent();
264
+ return [3 /*break*/, 17];
275
265
  case 16:
276
- _p.sent();
277
- return [3 /*break*/, 18];
278
- case 17:
279
- err_2 = _p.sent();
266
+ err_2 = _o.sent();
280
267
  if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
281
268
  this.log.warn("'afterSearch' middleware cancelled");
282
269
  afterSearchProfile.stop();
@@ -286,30 +273,26 @@ var SearchController = /** @class */ (function (_super) {
286
273
  this.log.error("error in 'afterSearch' middleware");
287
274
  throw err_2;
288
275
  }
289
- return [3 /*break*/, 18];
290
- case 18:
276
+ return [3 /*break*/, 17];
277
+ case 17:
291
278
  afterSearchProfile.stop();
292
279
  this.log.profile(afterSearchProfile);
293
- // store previous results for infinite usage
294
- if ((_o = this.config.settings) === null || _o === void 0 ? void 0 : _o.infinite) {
295
- this.previousResults = JSON.parse(JSON.stringify(response.results));
296
- }
297
280
  // update the store
298
281
  this.store.update(response);
299
- afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
300
- _p.label = 19;
301
- case 19:
302
- _p.trys.push([19, 21, , 22]);
282
+ afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params_1 }).start();
283
+ _o.label = 18;
284
+ case 18:
285
+ _o.trys.push([18, 20, , 21]);
303
286
  return [4 /*yield*/, this.eventManager.fire('afterStore', {
304
287
  controller: this,
305
- request: params,
288
+ request: params_1,
306
289
  response: response,
307
290
  })];
291
+ case 19:
292
+ _o.sent();
293
+ return [3 /*break*/, 21];
308
294
  case 20:
309
- _p.sent();
310
- return [3 /*break*/, 22];
311
- case 21:
312
- err_3 = _p.sent();
295
+ err_3 = _o.sent();
313
296
  if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
314
297
  this.log.warn("'afterStore' middleware cancelled");
315
298
  afterStoreProfile.stop();
@@ -319,13 +302,13 @@ var SearchController = /** @class */ (function (_super) {
319
302
  this.log.error("error in 'afterStore' middleware");
320
303
  throw err_3;
321
304
  }
322
- return [3 /*break*/, 22];
323
- case 22:
305
+ return [3 /*break*/, 21];
306
+ case 21:
324
307
  afterStoreProfile.stop();
325
308
  this.log.profile(afterStoreProfile);
326
309
  return [3 /*break*/, 24];
327
- case 23:
328
- err_4 = _p.sent();
310
+ case 22:
311
+ err_4 = _o.sent();
329
312
  if (err_4) {
330
313
  if (err_4.err && err_4.fetchDetails) {
331
314
  switch (err_4.fetchDetails.status) {
@@ -364,9 +347,11 @@ var SearchController = /** @class */ (function (_super) {
364
347
  this.log.error(err_4);
365
348
  this.handleError(err_4);
366
349
  }
367
- this.store.loading = false;
368
350
  }
369
351
  return [3 /*break*/, 24];
352
+ case 23:
353
+ this.store.loading = false;
354
+ return [7 /*endfinally*/];
370
355
  case 24: return [2 /*return*/];
371
356
  }
372
357
  });
@@ -384,19 +369,6 @@ var SearchController = /** @class */ (function (_super) {
384
369
  });
385
370
  // set last params to undefined for compare in search
386
371
  _this.storage.set('lastStringyParams', undefined);
387
- // add 'beforeSearch' middleware
388
- _this.eventManager.on('beforeSearch', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
389
- return __generator(this, function (_a) {
390
- switch (_a.label) {
391
- case 0:
392
- search.controller.store.loading = true;
393
- return [4 /*yield*/, next()];
394
- case 1:
395
- _a.sent();
396
- return [2 /*return*/];
397
- }
398
- });
399
- }); });
400
372
  // add 'afterSearch' middleware
401
373
  _this.eventManager.on('afterSearch', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
402
374
  var config, redirectURL, searchStore, nonBackgroundFilters;
@@ -415,8 +387,7 @@ var SearchController = /** @class */ (function (_super) {
415
387
  if (((_k = (_j = config === null || config === void 0 ? void 0 : config.settings) === null || _j === void 0 ? void 0 : _j.redirects) === null || _k === void 0 ? void 0 : _k.singleResult) &&
416
388
  ((_m = (_l = search === null || search === void 0 ? void 0 : search.response) === null || _l === void 0 ? void 0 : _l.search) === null || _m === void 0 ? void 0 : _m.query) &&
417
389
  ((_p = (_o = search === null || search === void 0 ? void 0 : search.response) === null || _o === void 0 ? void 0 : _o.pagination) === null || _p === void 0 ? void 0 : _p.totalResults) === 1 &&
418
- !(nonBackgroundFilters === null || nonBackgroundFilters === void 0 ? void 0 : nonBackgroundFilters.length) &&
419
- !search.controller.previousResults.length) {
390
+ !(nonBackgroundFilters === null || nonBackgroundFilters === void 0 ? void 0 : nonBackgroundFilters.length)) {
420
391
  window.location.replace(search === null || search === void 0 ? void 0 : search.response.results[0].mappings.core.url);
421
392
  return [2 /*return*/, false];
422
393
  }
@@ -447,7 +418,6 @@ var SearchController = /** @class */ (function (_super) {
447
418
  return [4 /*yield*/, this.eventManager.fire('restorePosition', { controller: this, element: elementPosition })];
448
419
  case 2:
449
420
  _a.sent();
450
- search.controller.store.loading = false;
451
421
  return [2 /*return*/];
452
422
  }
453
423
  });
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEnJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,eAAO,MAAM,WAAW,MAAM,CAAC;AA2B/B,KAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAuE3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBAkDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCAgDhD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,KAAK;;;;uBAsDL,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgF3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAmI9B;CACF"}
1
+ {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAiC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAElI,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,eAAO,MAAM,WAAW,MAAM,CAAC;AA+B/B,KAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAwD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBAkDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCAgDhD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,KAAK;;;;uBAyDL,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgF3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CA0I9B;CACF"}
@@ -27,6 +27,10 @@ const defaultConfig = {
27
27
  merchandising: true,
28
28
  singleResult: false,
29
29
  },
30
+ bind: {
31
+ input: true,
32
+ submit: true,
33
+ },
30
34
  },
31
35
  };
32
36
  export class AutocompleteController extends AbstractController {
@@ -176,6 +180,8 @@ export class AutocompleteController extends AbstractController {
176
180
  return;
177
181
  }
178
182
  this.store.state.input = value;
183
+ // remove merch redirect to prevent race condition
184
+ this.store.merchandising.redirect = '';
179
185
  if (this.config?.settings?.syncInputs) {
180
186
  const inputs = document.querySelectorAll(this.config.selector);
181
187
  inputs.forEach((input) => {
@@ -247,16 +253,20 @@ export class AutocompleteController extends AbstractController {
247
253
  this.store.updateTrendingTerms(terms);
248
254
  };
249
255
  this.search = async () => {
250
- // if urlManager has no query, there will be no need to get params and no query
251
- if (!this.urlManager.state.query) {
252
- return;
253
- }
254
- const params = this.params;
255
- // if params have no query do not search
256
- if (!params?.search?.query?.string) {
257
- return;
258
- }
259
256
  try {
257
+ if (!this.initialized) {
258
+ await this.init();
259
+ }
260
+ // if urlManager has no query, there will be no need to get params and no query
261
+ if (!this.urlManager.state.query) {
262
+ return;
263
+ }
264
+ const params = this.params;
265
+ // if params have no query do not search
266
+ if (!params?.search?.query?.string) {
267
+ return;
268
+ }
269
+ this.store.loading = true;
260
270
  try {
261
271
  await this.eventManager.fire('beforeSearch', {
262
272
  controller: this,
@@ -366,9 +376,11 @@ export class AutocompleteController extends AbstractController {
366
376
  this.log.error(err);
367
377
  this.handleError(err);
368
378
  }
369
- this.store.loading = false;
370
379
  }
371
380
  }
381
+ finally {
382
+ this.store.loading = false;
383
+ }
372
384
  };
373
385
  // deep merge config with defaults
374
386
  this.config = deepmerge(defaultConfig, this.config);
@@ -385,25 +397,14 @@ export class AutocompleteController extends AbstractController {
385
397
  type: 'session',
386
398
  key: `ss-controller-${this.config.id}`,
387
399
  });
388
- // add 'beforeSearch' middleware
389
- this.eventManager.on('beforeSearch', async (ac, next) => {
390
- ac.controller.store.loading = true;
391
- await next();
392
- });
393
400
  // add 'afterSearch' middleware
394
401
  this.eventManager.on('afterSearch', async (ac, next) => {
395
402
  await next();
396
403
  // cancel search if no input or query doesn't match current urlState
397
404
  if (ac.response.autocomplete.query != ac.controller.urlManager.state.query) {
398
- ac.controller.store.loading = false;
399
405
  return false;
400
406
  }
401
407
  });
402
- // add 'afterStore' middleware
403
- this.eventManager.on('afterStore', async (ac, next) => {
404
- await next();
405
- ac.controller.store.loading = false;
406
- });
407
408
  this.eventManager.on('beforeSubmit', async (ac, next) => {
408
409
  await next();
409
410
  const redirectURL = ac.controller.store.merchandising?.redirect;
@@ -521,7 +522,7 @@ export class AutocompleteController extends AbstractController {
521
522
  input.setAttribute('autocorrect', 'off');
522
523
  input.setAttribute('autocapitalize', 'none');
523
524
  input.setAttribute(INPUT_ATTRIBUTE, '');
524
- input.addEventListener('input', this.handlers.input.input);
525
+ this.config.settings?.bind?.input && input.addEventListener('input', this.handlers.input.input);
525
526
  if (this.config?.settings?.initializeFromUrl && !input.value && this.store.state.input) {
526
527
  input.value = this.store.state.input;
527
528
  }
@@ -530,11 +531,11 @@ export class AutocompleteController extends AbstractController {
530
531
  const form = input.form;
531
532
  let formActionUrl;
532
533
  if (this.config.action) {
533
- input.addEventListener('keydown', this.handlers.input.enterKey);
534
+ this.config.settings?.bind?.submit && input.addEventListener('keydown', this.handlers.input.enterKey);
534
535
  formActionUrl = this.config.action;
535
536
  }
536
537
  else if (form) {
537
- form.addEventListener('submit', this.handlers.input.formSubmit);
538
+ this.config.settings?.bind?.submit && form.addEventListener('submit', this.handlers.input.formSubmit);
538
539
  formActionUrl = form.action || '';
539
540
  // serializeForm will include additional form element in our urlManager as globals
540
541
  if (this.config.settings?.serializeForm) {
@@ -1 +1 @@
1
- {"version":3,"file":"FinderController.d.ts","sourceRoot":"","sources":["../../../src/Finder/FinderController.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,KAAK,EAAE,sBAAsB,EAAmC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAiB9H,qBAAa,gBAAiB,SAAQ,kBAAkB;IAChD,IAAI,kBAA0B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC;gBAGtC,MAAM,EAAE,sBAAsB,EAC9B,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAqC3B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CA+BhC;IAED,IAAI,QAAa,QAAQ,IAAI,CAAC,CAkB5B;IAEF,KAAK,QAAO,IAAI,CAId;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAkI9B;CACF"}
1
+ {"version":3,"file":"FinderController.d.ts","sourceRoot":"","sources":["../../../src/Finder/FinderController.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,KAAK,EAAE,sBAAsB,EAAkB,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAiB7G,qBAAa,gBAAiB,SAAQ,kBAAkB;IAChD,IAAI,kBAA0B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC;gBAGtC,MAAM,EAAE,sBAAsB,EAC9B,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IA+B3B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CA+BhC;IAED,IAAI,QAAa,QAAQ,IAAI,CAAC,CAkB5B;IAEF,KAAK,QAAO,IAAI,CAId;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAoI9B;CACF"}
@@ -46,14 +46,15 @@ export class FinderController extends AbstractController {
46
46
  this.store.setService('urlManager', this.urlManager);
47
47
  };
48
48
  this.search = async () => {
49
- if (!this.initialized) {
50
- await this.init();
51
- }
52
- if (this.store.state.persisted) {
53
- return;
54
- }
55
- const params = this.params;
56
49
  try {
50
+ if (!this.initialized) {
51
+ await this.init();
52
+ }
53
+ if (this.store.state.persisted) {
54
+ return;
55
+ }
56
+ const params = this.params;
57
+ this.store.loading = true;
57
58
  try {
58
59
  await this.eventManager.fire('beforeSearch', {
59
60
  controller: this,
@@ -164,9 +165,11 @@ export class FinderController extends AbstractController {
164
165
  this.log.error(err);
165
166
  this.handleError(err);
166
167
  }
167
- this.store.loading = false;
168
168
  }
169
169
  }
170
+ finally {
171
+ this.store.loading = false;
172
+ }
170
173
  };
171
174
  // deep merge config with defaults
172
175
  this.config = deepmerge(defaultConfig, this.config);
@@ -180,11 +183,7 @@ export class FinderController extends AbstractController {
180
183
  };
181
184
  });
182
185
  }
183
- this.eventManager.on('beforeSearch', async (finder, next) => {
184
- finder.controller.store.loading = true;
185
- await next();
186
- });
187
- // TODO: move this to afterStore
186
+ // TODO: remove this aftersearch when store interface changes
188
187
  this.eventManager.on('afterSearch', async (finder, next) => {
189
188
  await next();
190
189
  finder.controller.store.loading = false;
@@ -1 +1 @@
1
- {"version":3,"file":"RecommendationController.d.ts","sourceRoot":"","sources":["../../../src/Recommendation/RecommendationController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAkC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAErI,KAAK,0BAA0B,GAAG;IACjC,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;QACnE,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;QACrD,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;QACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;QAChE,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;KAC5D,CAAC;IACF,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,WAAW,GAAG,SAAS,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,GAAG,SAAS,CAAC;IAC1E,UAAU,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC1C,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,WAAW,GAAG,SAAS,CAAC;CACzD,CAAC;AAUF,qBAAa,wBAAyB,SAAQ,kBAAkB;IACxD,IAAI,kBAAkC;IACrC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,8BAA8B,CAAC;IAE/C,MAAM,EAAE;QACP,KAAK,CAAC,EAAE,WAAW,CAAC;QACpB,UAAU,CAAC,EAAE,WAAW,CAAC;QACzB,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,UAAU,CAAC,EAAE,WAAW,CAAC;YAAC,MAAM,CAAC,EAAE,WAAW,CAAA;SAAE,CAAC,CAAC;KAC7E,CAKC;gBAGD,MAAM,EAAE,8BAA8B,EACtC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IA2C3B,KAAK,EAAE,0BAA0B,CAwS5B;IAEL,IAAI,MAAM,IAAI,qBAAqB,CA2BlC;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CAuH9B;CACF"}
1
+ {"version":3,"file":"RecommendationController.d.ts","sourceRoot":"","sources":["../../../src/Recommendation/RecommendationController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAa,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAiB,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEpH,KAAK,0BAA0B,GAAG;IACjC,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;QACnE,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;QACrD,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;QACzD,iBAAiB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;QAChE,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,GAAG,SAAS,CAAC;KAC5D,CAAC;IACF,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,WAAW,GAAG,SAAS,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,WAAW,GAAG,SAAS,CAAC;IAC1E,UAAU,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC1C,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,WAAW,GAAG,SAAS,CAAC;CACzD,CAAC;AAUF,qBAAa,wBAAyB,SAAQ,kBAAkB;IACxD,IAAI,kBAAkC;IACrC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,8BAA8B,CAAC;IAE/C,MAAM,EAAE;QACP,KAAK,CAAC,EAAE,WAAW,CAAC;QACpB,UAAU,CAAC,EAAE,WAAW,CAAC;QACzB,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,UAAU,CAAC,EAAE,WAAW,CAAC;YAAC,MAAM,CAAC,EAAE,WAAW,CAAA;SAAE,CAAC,CAAC;KAC7E,CAKC;gBAGD,MAAM,EAAE,8BAA8B,EACtC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IA4C3B,KAAK,EAAE,0BAA0B,CAwS5B;IAEL,IAAI,MAAM,IAAI,qBAAqB,CA2BlC;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA0H9B;CACF"}
@@ -311,11 +311,12 @@ export class RecommendationController extends AbstractController {
311
311
  };
312
312
  })();
313
313
  this.search = async () => {
314
- if (!this.initialized) {
315
- await this.init();
316
- }
317
- const params = this.params;
318
314
  try {
315
+ if (!this.initialized) {
316
+ await this.init();
317
+ }
318
+ const params = this.params;
319
+ this.store.loading = true;
319
320
  try {
320
321
  await this.eventManager.fire('beforeSearch', {
321
322
  controller: this,
@@ -420,21 +421,27 @@ export class RecommendationController extends AbstractController {
420
421
  this.log.error(err);
421
422
  this.handleError(err);
422
423
  }
423
- this.store.loading = false;
424
424
  }
425
425
  }
426
+ finally {
427
+ this.store.loading = false;
428
+ }
426
429
  };
427
430
  if (!config.tag) {
428
431
  throw new Error(`Invalid config passed to RecommendationController. The "tag" attribute is required.`);
429
432
  }
433
+ // attach to bfCache restore event and re-run search on the controller
434
+ // enabled by default
435
+ if (config.settings?.searchOnPageShow !== false) {
436
+ window.addEventListener('pageshow', (e) => {
437
+ if (e.persisted && !this.store.error && this.store.loaded && !this.store.loading) {
438
+ this.search();
439
+ }
440
+ });
441
+ }
430
442
  // deep merge config with defaults
431
443
  this.config = deepmerge(defaultConfig, this.config);
432
444
  this.store.setConfig(this.config);
433
- // add 'beforeSearch' middleware
434
- this.eventManager.on('beforeSearch', async (recommend, next) => {
435
- recommend.controller.store.loading = true;
436
- await next();
437
- });
438
445
  // add 'afterStore' middleware
439
446
  this.eventManager.on('afterStore', async (recommend, next) => {
440
447
  await next();
@@ -449,7 +456,6 @@ export class RecommendationController extends AbstractController {
449
456
  this.track.product.removedFromBundle(item);
450
457
  });
451
458
  });
452
- recommend.controller.store.loading = false;
453
459
  });
454
460
  // attach config plugins and event middleware
455
461
  this.use(this.config);
@@ -15,7 +15,6 @@ export declare class SearchController extends AbstractController {
15
15
  store: SearchStore;
16
16
  config: SearchControllerConfig;
17
17
  storage: StorageStore;
18
- private previousResults;
19
18
  constructor(config: SearchControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
20
19
  track: SearchTrackMethods;
21
20
  get params(): SearchRequestModel;
@@ -1 +1 @@
1
- {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAa,MAAM,+BAA+B,CAAC;AAExE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EACX,sBAAsB,EAItB,kBAAkB,EAClB,gBAAgB,EAGhB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EACX,kBAAkB,EAKlB,MAAM,2BAA2B,CAAC;AAmBnC,KAAK,kBAAkB,GAAG;IACzB,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KAC/D,CAAC;CACF,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,kBAAkB;IAChD,IAAI,kBAA0B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC;IACvC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,eAAe,CAAwC;gBAG9D,MAAM,EAAE,sBAAsB,EAC9B,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAgK3B,KAAK,EAAE,kBAAkB,CA+CvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAiD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CAkN9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,GAAG,SAAS,CAgCvG"}
1
+ {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAa,MAAM,+BAA+B,CAAC;AAExE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EACX,sBAAsB,EAGtB,kBAAkB,EAClB,gBAAgB,EAGhB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EACX,kBAAkB,EAKlB,MAAM,2BAA2B,CAAC;AAmBnC,KAAK,kBAAkB,GAAG;IACzB,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KAC/D,CAAC;CACF,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,kBAAkB;IAChD,IAAI,kBAA0B;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC;IACvC,OAAO,EAAE,YAAY,CAAC;gBAGrB,MAAM,EAAE,sBAAsB,EAC9B,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAsJ3B,KAAK,EAAE,kBAAkB,CA+CvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAiD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA2M9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,GAAG,SAAS,CAgCvG"}