@searchspring/snap-controller 0.31.0 → 0.34.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.
Files changed (27) hide show
  1. package/dist/cjs/Abstract/AbstractController.d.ts +1 -0
  2. package/dist/cjs/Abstract/AbstractController.d.ts.map +1 -1
  3. package/dist/cjs/Abstract/AbstractController.js +38 -0
  4. package/dist/cjs/Autocomplete/AutocompleteController.d.ts +1 -0
  5. package/dist/cjs/Autocomplete/AutocompleteController.d.ts.map +1 -1
  6. package/dist/cjs/Autocomplete/AutocompleteController.js +91 -7
  7. package/dist/cjs/Finder/FinderController.d.ts.map +1 -1
  8. package/dist/cjs/Finder/FinderController.js +16 -0
  9. package/dist/cjs/Recommendation/RecommendationController.d.ts.map +1 -1
  10. package/dist/cjs/Recommendation/RecommendationController.js +2 -1
  11. package/dist/cjs/Search/SearchController.d.ts +1 -0
  12. package/dist/cjs/Search/SearchController.d.ts.map +1 -1
  13. package/dist/cjs/Search/SearchController.js +45 -26
  14. package/dist/esm/Abstract/AbstractController.d.ts +1 -0
  15. package/dist/esm/Abstract/AbstractController.d.ts.map +1 -1
  16. package/dist/esm/Abstract/AbstractController.js +37 -0
  17. package/dist/esm/Autocomplete/AutocompleteController.d.ts +1 -0
  18. package/dist/esm/Autocomplete/AutocompleteController.d.ts.map +1 -1
  19. package/dist/esm/Autocomplete/AutocompleteController.js +89 -5
  20. package/dist/esm/Finder/FinderController.d.ts.map +1 -1
  21. package/dist/esm/Finder/FinderController.js +16 -0
  22. package/dist/esm/Recommendation/RecommendationController.d.ts.map +1 -1
  23. package/dist/esm/Recommendation/RecommendationController.js +2 -1
  24. package/dist/esm/Search/SearchController.d.ts +1 -0
  25. package/dist/esm/Search/SearchController.d.ts.map +1 -1
  26. package/dist/esm/Search/SearchController.js +21 -2
  27. package/package.json +10 -10
@@ -25,6 +25,7 @@ export declare abstract class AbstractController {
25
25
  };
26
26
  protected _initialized: boolean;
27
27
  get initialized(): boolean;
28
+ handleError: (err: unknown) => void;
28
29
  constructor(config: ControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
29
30
  createTargeter(target: Target, onTarget: OnTarget, document?: Document): DomTargeter | undefined;
30
31
  addTargeter(target: DomTargeter): DomTargeter | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractController.d.ts","sourceRoot":"","sources":["../../../src/Abstract/AbstractController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEpH,8BAAsB,kBAAkB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,SAAc;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,gBAAgB,CAAC;IAE1B,SAAS,EAAE;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;KAC3B,CAAM;IAEP,SAAS,CAAC,YAAY,UAAS;IAE/B,IAAI,WAAW,IAAI,OAAO,CAEzB;gBAGA,MAAM,EAAE,gBAAgB,EACxB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,GAAE,gBAAqB;IA2DxB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS;IAIhG,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS;IASnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C3B,QAAQ,IAAI,IAAI;aAMP,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAE1B,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAIpD,GAAG,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;CAoC1C"}
1
+ {"version":3,"file":"AbstractController.d.ts","sourceRoot":"","sources":["../../../src/Abstract/AbstractController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAmB,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEpH,8BAAsB,kBAAkB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,SAAc;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,gBAAgB,CAAC;IAE1B,SAAS,EAAE;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;KAC3B,CAAM;IAEP,SAAS,CAAC,YAAY,UAAS;IAE/B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEM,WAAW,QAAS,OAAO,KAAG,IAAI,CA0CvC;gBAGD,MAAM,EAAE,gBAAgB,EACxB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,GAAE,gBAAqB;IA2DxB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS;IAIhG,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS;IASnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgD3B,QAAQ,IAAI,IAAI;aAMP,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAE1B,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAIpD,GAAG,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;CAoC1C"}
@@ -51,9 +51,46 @@ var AbstractController = /** @class */ (function () {
51
51
  function AbstractController(config, _a, context) {
52
52
  var client = _a.client, store = _a.store, urlManager = _a.urlManager, eventManager = _a.eventManager, profiler = _a.profiler, logger = _a.logger, tracker = _a.tracker;
53
53
  if (context === void 0) { context = {}; }
54
+ var _this = this;
54
55
  this.type = 'abstract';
55
56
  this.targeters = {};
56
57
  this._initialized = false;
58
+ this.handleError = function (err) {
59
+ var event;
60
+ if (err instanceof ErrorEvent) {
61
+ event = err;
62
+ }
63
+ else if (err instanceof Error) {
64
+ event = new ErrorEvent('error', {
65
+ error: err,
66
+ });
67
+ }
68
+ else if (typeof err === 'string') {
69
+ event = new ErrorEvent('error', {
70
+ error: new Error(err),
71
+ });
72
+ }
73
+ else if (typeof err === 'object' && Object.keys(err).length) {
74
+ try {
75
+ event = new ErrorEvent('error', {
76
+ error: new Error(JSON.stringify(err)),
77
+ });
78
+ }
79
+ catch (e) { }
80
+ }
81
+ if (event) {
82
+ var filename = event.filename, colno = event.colno, lineno = event.lineno, stack = event.error.stack, message = event.message, timeStamp = event.timeStamp;
83
+ var beaconPayload = {
84
+ filename: filename || "".concat(_this.id, " (").concat(_this.type.charAt(0).toUpperCase() + _this.type.slice(1), "Controller)"),
85
+ stack: stack,
86
+ message: message,
87
+ colno: colno,
88
+ lineno: lineno,
89
+ errortimestamp: timeStamp,
90
+ };
91
+ _this.tracker.track.error(beaconPayload);
92
+ }
93
+ };
57
94
  if (typeof config != 'object' || typeof config.id != 'string' || !config.id.match(/^[a-zA-Z0-9_-]*$/)) {
58
95
  throw new Error("Invalid config passed to controller. The \"id\" attribute must be an alphanumeric string.");
59
96
  }
@@ -156,6 +193,7 @@ var AbstractController = /** @class */ (function () {
156
193
  err_2 = _a.sent();
157
194
  if (err_2) {
158
195
  console.error(err_2);
196
+ this.handleError(err_2);
159
197
  }
160
198
  return [3 /*break*/, 7];
161
199
  case 7:
@@ -27,6 +27,7 @@ export declare class AutocompleteController extends AbstractController {
27
27
  escKey: (e: KeyboardEvent) => void;
28
28
  focus: (e: FocusEvent) => void;
29
29
  formSubmit: (e: React.FormEvent<HTMLInputElement>) => Promise<void>;
30
+ formElementChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
30
31
  keyUp: (e: KeyboardEvent) => void;
31
32
  timeoutDelay: NodeJS.Timeout | undefined;
32
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACrF,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;AAoB/B,aAAK,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;IAoD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA+BrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBA6CpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;uBA0C5D,aAAa,KAAG,IAAI;;;;uBA8CpB,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAYR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2D3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAsBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAgH9B;CACF"}
1
+ {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACrF,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;AAqB/B,aAAK,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;IAoD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBA6CpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCA0ChD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,aAAa,KAAG,IAAI;;;;uBA8CpB,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwE3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAuBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAiH9B;CACF"}
@@ -84,6 +84,7 @@ var defaultConfig = {
84
84
  settings: {
85
85
  initializeFromUrl: true,
86
86
  syncInputs: true,
87
+ serializeForm: false,
87
88
  facets: {
88
89
  trim: true,
89
90
  pinFiltered: true,
@@ -239,6 +240,25 @@ var AutocompleteController = /** @class */ (function (_super) {
239
240
  }
240
241
  });
241
242
  }); },
243
+ formElementChange: function (e) {
244
+ var _a, _b, _c, _d, _e;
245
+ var input = e.target;
246
+ var form = input === null || input === void 0 ? void 0 : input.form;
247
+ var searchInput = form === null || form === void 0 ? void 0 : form.querySelector("input[".concat(INPUT_ATTRIBUTE, "]"));
248
+ if (form && searchInput && ((_a = _this.config.settings) === null || _a === void 0 ? void 0 : _a.serializeForm)) {
249
+ // get other form parameters (except the input)
250
+ var formParameters = getFormParameters(form, function (elem) {
251
+ return elem != searchInput;
252
+ });
253
+ // set parameters as globals
254
+ _this.store.setService('urlManager', _this.store.services.urlManager.reset().withGlobals(formParameters));
255
+ _this.store.reset();
256
+ // rebuild trending terms with new UrlManager settings
257
+ if (((_c = (_b = _this.config.settings) === null || _b === void 0 ? void 0 : _b.trending) === null || _c === void 0 ? void 0 : _c.limit) && ((_e = (_d = _this.config.settings) === null || _d === void 0 ? void 0 : _d.trending) === null || _e === void 0 ? void 0 : _e.limit) > 0) {
258
+ _this.searchTrending();
259
+ }
260
+ }
261
+ },
242
262
  keyUp: function (e) {
243
263
  var _a, _b, _c, _d, _e;
244
264
  // ignore enter and escape keys
@@ -453,6 +473,7 @@ var AutocompleteController = /** @class */ (function (_super) {
453
473
  break;
454
474
  }
455
475
  this.store.loading = false;
476
+ this.handleError(err_6);
456
477
  }
457
478
  return [3 /*break*/, 16];
458
479
  case 16: return [2 /*return*/];
@@ -525,10 +546,19 @@ var AutocompleteController = /** @class */ (function (_super) {
525
546
  var urlState = this.urlManager.state;
526
547
  var params = (0, deepmerge_1.default)(__assign({}, (0, getParams_1.getSearchParams)(urlState)), this.config.globals);
527
548
  var userId = this.tracker.getUserId();
549
+ var sessionId = this.tracker.getContext().sessionId;
550
+ var pageLoadId = this.tracker.getContext().pageLoadId;
551
+ params.tracking = params.tracking || {};
552
+ params.tracking.domain = window.location.href;
528
553
  if (userId) {
529
- params.tracking = params.tracking || {};
530
554
  params.tracking.userId = userId;
531
555
  }
556
+ if (sessionId) {
557
+ params.tracking.sessionId = sessionId;
558
+ }
559
+ if (pageLoadId) {
560
+ params.tracking.pageLoadId = pageLoadId;
561
+ }
532
562
  if (!((_b = (_a = this.config.globals) === null || _a === void 0 ? void 0 : _a.personalization) === null || _b === void 0 ? void 0 : _b.disabled)) {
533
563
  var cartItems = this.tracker.cookies.cart.get();
534
564
  if (cartItems.length) {
@@ -618,12 +648,14 @@ var AutocompleteController = /** @class */ (function (_super) {
618
648
  var _this = this;
619
649
  var inputs = document.querySelectorAll("input[".concat(INPUT_ATTRIBUTE, "]"));
620
650
  inputs === null || inputs === void 0 ? void 0 : inputs.forEach(function (input) {
621
- var _a;
622
651
  input.removeEventListener('keyup', _this.handlers.input.keyUp);
623
652
  input.removeEventListener('keydown', _this.handlers.input.enterKey);
624
653
  input.removeEventListener('keydown', _this.handlers.input.escKey);
625
654
  input.removeEventListener('focus', _this.handlers.input.focus);
626
- (_a = input.form) === null || _a === void 0 ? void 0 : _a.removeEventListener('submit', _this.handlers.input.formSubmit);
655
+ if (input.form) {
656
+ input.form.removeEventListener('submit', _this.handlers.input.formSubmit);
657
+ unbindFormParameters(input.form, _this.handlers.input.formElementChange);
658
+ }
627
659
  });
628
660
  document.removeEventListener('click', this.handlers.document.click);
629
661
  };
@@ -644,7 +676,7 @@ var AutocompleteController = /** @class */ (function (_super) {
644
676
  this.unbind();
645
677
  inputs = document.querySelectorAll(this.config.selector);
646
678
  inputs.forEach(function (input) {
647
- var _a, _b;
679
+ var _a, _b, _c;
648
680
  input.setAttribute('spellcheck', 'false');
649
681
  input.setAttribute('autocomplete', 'off');
650
682
  input.setAttribute(INPUT_ATTRIBUTE, '');
@@ -657,16 +689,26 @@ var AutocompleteController = /** @class */ (function (_super) {
657
689
  var form = input.form;
658
690
  var formActionUrl;
659
691
  if (_this.config.action) {
660
- formActionUrl = _this.config.action;
661
692
  input.addEventListener('keydown', _this.handlers.input.enterKey);
693
+ formActionUrl = _this.config.action;
662
694
  }
663
695
  else if (form) {
664
- formActionUrl = form.action;
665
696
  form.addEventListener('submit', _this.handlers.input.formSubmit);
697
+ formActionUrl = form.action || '';
698
+ if ((_c = _this.config.settings) === null || _c === void 0 ? void 0 : _c.serializeForm) {
699
+ bindFormParameters(form, _this.handlers.input.formElementChange, function (elem) {
700
+ return elem != input;
701
+ });
702
+ var formParameters = getFormParameters(form, function (elem) {
703
+ return elem != input;
704
+ });
705
+ // set parameters as globals
706
+ _this.store.setService('urlManager', _this.urlManager.reset().withGlobals(formParameters));
707
+ }
666
708
  }
667
709
  // set the root URL on urlManager
668
710
  if (formActionUrl) {
669
- _this.store.setService('urlManager', _this.urlManager.withConfig(function (translatorConfig) {
711
+ _this.store.setService('urlManager', _this.store.services.urlManager.withConfig(function (translatorConfig) {
670
712
  return __assign(__assign({}, translatorConfig), { urlRoot: formActionUrl });
671
713
  }));
672
714
  }
@@ -702,3 +744,45 @@ function timeout(time) {
702
744
  });
703
745
  });
704
746
  }
747
+ // for grabbing other parameters from the form and using them in UrlManager
748
+ var INPUT_TYPE_BLACKLIST = ['file', 'reset', 'submit', 'button', 'image', 'password'];
749
+ function getFormParameters(form, filterFn) {
750
+ var parameters = {};
751
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
752
+ for (var i = form.elements.length - 1; i >= 0; i--) {
753
+ var elem = form.elements[i];
754
+ if (typeof filterFn == 'function' && !filterFn(elem)) {
755
+ continue;
756
+ }
757
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
758
+ if ((elem.type != 'checkbox' && elem.type != 'radio') || elem.checked) {
759
+ parameters[elem.name] = elem.value;
760
+ }
761
+ }
762
+ }
763
+ }
764
+ return parameters;
765
+ }
766
+ function bindFormParameters(form, fn, filterFn) {
767
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
768
+ for (var i = form.elements.length - 1; i >= 0; i--) {
769
+ var elem = form.elements[i];
770
+ if (typeof filterFn == 'function' && !filterFn(elem)) {
771
+ continue;
772
+ }
773
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
774
+ elem.addEventListener('change', fn);
775
+ }
776
+ }
777
+ }
778
+ }
779
+ function unbindFormParameters(form, fn) {
780
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
781
+ for (var i = form.elements.length - 1; i >= 0; i--) {
782
+ var elem = form.elements[i];
783
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
784
+ elem.removeEventListener('change', fn);
785
+ }
786
+ }
787
+ }
788
+ }
@@ -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;IA2C3B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAchC;IAED,IAAI,QAAa,QAAQ,IAAI,CAAC,CAe5B;IAEF,KAAK,QAAO,IAAI,CAId;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAoH9B;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,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;IA2C3B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CA+BhC;IAED,IAAI,QAAa,QAAQ,IAAI,CAAC,CAe5B;IAEF,KAAK,QAAO,IAAI,CAId;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAqH9B;CACF"}
@@ -264,6 +264,7 @@ var FinderController = /** @class */ (function (_super) {
264
264
  break;
265
265
  }
266
266
  this.store.loading = false;
267
+ this.handleError(err_5);
267
268
  }
268
269
  return [3 /*break*/, 18];
269
270
  case 18: return [2 /*return*/];
@@ -322,12 +323,27 @@ var FinderController = /** @class */ (function (_super) {
322
323
  Object.defineProperty(FinderController.prototype, "params", {
323
324
  get: function () {
324
325
  var urlState = this.urlManager.state;
326
+ var userId = this.tracker.getUserId();
327
+ var sessionId = this.tracker.getContext().sessionId;
328
+ var pageLoadId = this.tracker.getContext().pageLoadId;
329
+ var tracking = {};
330
+ if (userId) {
331
+ tracking.userId = userId;
332
+ }
333
+ if (sessionId) {
334
+ tracking.sessionId = sessionId;
335
+ }
336
+ if (pageLoadId) {
337
+ tracking.pageLoadId = pageLoadId;
338
+ }
339
+ tracking.domain = window.location.href;
325
340
  // get only the finder fields and disable auto drill down
326
341
  var defaultParams = {
327
342
  facets: {
328
343
  include: this.config.fields.map(function (fieldConfig) { return fieldConfig.field; }),
329
344
  autoDrillDown: false,
330
345
  },
346
+ tracking: tracking,
331
347
  };
332
348
  var params = (0, deepmerge_1.default)(__assign({}, (0, getParams_1.getSearchParams)(urlState)), (0, deepmerge_1.default)(defaultParams, this.config.globals));
333
349
  return params;
@@ -1 +1 @@
1
- {"version":3,"file":"RecommendationController.d.ts","sourceRoot":"","sources":["../../../src/Recommendation/RecommendationController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,8BAA8B,EAAkC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAErI,aAAK,0BAA0B,GAAG;IACjC,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;QAC/D,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;QACjD,UAAU,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KACrD,CAAC;IACF,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,WAAW,GAAG,SAAS,CAAC;IAClD,UAAU,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC1C,MAAM,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,aAAK,6BAA6B,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,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;IA8B3B,KAAK,EAAE,0BAA0B,CAqK/B;IAEF,IAAI,MAAM,IAAI,6BAA6B,CAsB1C;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CAqG9B;CACF"}
1
+ {"version":3,"file":"RecommendationController.d.ts","sourceRoot":"","sources":["../../../src/Recommendation/RecommendationController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,8BAA8B,EAAkC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAErI,aAAK,0BAA0B,GAAG;IACjC,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;QAC/D,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;QACjD,UAAU,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KACrD,CAAC;IACF,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,WAAW,GAAG,SAAS,CAAC;IAClD,UAAU,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC1C,MAAM,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,aAAK,6BAA6B,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,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;IA8B3B,KAAK,EAAE,0BAA0B,CAqK/B;IAEF,IAAI,MAAM,IAAI,6BAA6B,CAuB1C;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CAsG9B;CACF"}
@@ -383,6 +383,7 @@ var RecommendationController = /** @class */ (function (_super) {
383
383
  break;
384
384
  }
385
385
  this.store.loading = false;
386
+ this.handleError(err_4);
386
387
  }
387
388
  return [3 /*break*/, 18];
388
389
  case 18: return [2 /*return*/];
@@ -428,7 +429,7 @@ var RecommendationController = /** @class */ (function (_super) {
428
429
  get: function () {
429
430
  var _a, _b;
430
431
  var params = __assign({ tag: this.config.tag, batched: this.config.batched, branch: this.config.branch || 'production', order: (_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.order }, this.config.globals);
431
- var shopperId = this.tracker.context.shopperId;
432
+ var shopperId = this.tracker.getContext().shopperId;
432
433
  var cart = this.tracker.cookies.cart.get();
433
434
  var lastViewed = this.tracker.cookies.viewed.get();
434
435
  if (shopperId) {
@@ -15,6 +15,7 @@ export declare class SearchController extends AbstractController {
15
15
  store: SearchStore;
16
16
  config: SearchControllerConfig;
17
17
  storage: StorageStore;
18
+ private previousResults;
18
19
  constructor(config: SearchControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
19
20
  track: SearchTrackMethods;
20
21
  get params(): SearchRequestModel;
@@ -1 +1 @@
1
- {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,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,EAAE,sBAAsB,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7I,OAAO,KAAK,EAAE,kBAAkB,EAA2E,MAAM,2BAA2B,CAAC;AAoB7I,aAAK,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;IAmG3B,KAAK,EAAE,kBAAkB,CAoCvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAsC/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA0J9B;CACF"}
1
+ {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,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,EAAE,sBAAsB,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7I,OAAO,KAAK,EAAE,kBAAkB,EAA2E,MAAM,2BAA2B,CAAC;AAoB7I,aAAK,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;IAuG3B,KAAK,EAAE,kBAAkB,CAwCvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA8J9B;CACF"}
@@ -104,6 +104,7 @@ var SearchController = /** @class */ (function (_super) {
104
104
  var _b, _c, _d;
105
105
  _this = _super.call(this, config, { client: client, store: store, urlManager: urlManager, eventManager: eventManager, profiler: profiler, logger: logger, tracker: tracker }, context) || this;
106
106
  _this.type = types_1.ControllerTypes.search;
107
+ _this.previousResults = [];
107
108
  _this.track = {
108
109
  product: {
109
110
  click: function (e, result) {
@@ -114,6 +115,10 @@ var SearchController = /** @class */ (function (_super) {
114
115
  var paramsObj = JSON.parse(stringyParams);
115
116
  if ((_b = paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.search) === null || _b === void 0 ? void 0 : _b.redirectResponse) {
116
117
  (_c = paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.search) === null || _c === void 0 ? true : delete _c.redirectResponse;
118
+ if ((paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.search) && Object.keys(paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.search).length === 0) {
119
+ // if redirectResponse was the only key, also delete the empty search object
120
+ delete paramsObj.search;
121
+ }
117
122
  }
118
123
  if (paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.personalization) {
119
124
  paramsObj === null || paramsObj === void 0 ? true : delete paramsObj.personalization;
@@ -139,32 +144,32 @@ var SearchController = /** @class */ (function (_super) {
139
144
  };
140
145
  _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
141
146
  var params, err_1, stringyParams, prevStringyParams, preventBackfill, dontBackfill, searchProfile, _a, meta, response, previousResults_1, backfills, page, backfillParams, backfillResponses, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
142
- var _b, _c, _d, _e, _f, _g, _h, _j, _k;
143
- return __generator(this, function (_l) {
144
- switch (_l.label) {
147
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
148
+ return __generator(this, function (_m) {
149
+ switch (_m.label) {
145
150
  case 0:
146
151
  if (!!this.initialized) return [3 /*break*/, 2];
147
152
  return [4 /*yield*/, this.init()];
148
153
  case 1:
149
- _l.sent();
150
- _l.label = 2;
154
+ _m.sent();
155
+ _m.label = 2;
151
156
  case 2:
152
157
  params = this.params;
153
- _l.label = 3;
158
+ _m.label = 3;
154
159
  case 3:
155
- _l.trys.push([3, 20, , 21]);
156
- _l.label = 4;
160
+ _m.trys.push([3, 20, , 21]);
161
+ _m.label = 4;
157
162
  case 4:
158
- _l.trys.push([4, 6, , 7]);
163
+ _m.trys.push([4, 6, , 7]);
159
164
  return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
160
165
  controller: this,
161
166
  request: params,
162
167
  })];
163
168
  case 5:
164
- _l.sent();
169
+ _m.sent();
165
170
  return [3 /*break*/, 7];
166
171
  case 6:
167
- err_1 = _l.sent();
172
+ err_1 = _m.sent();
168
173
  if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
169
174
  this.log.warn("'beforeSearch' middleware cancelled");
170
175
  return [2 /*return*/];
@@ -193,7 +198,7 @@ var SearchController = /** @class */ (function (_super) {
193
198
  searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
194
199
  return [4 /*yield*/, this.client.search(params)];
195
200
  case 8:
196
- _a = _l.sent(), meta = _a[0], response = _a[1];
201
+ _a = _m.sent(), meta = _a[0], response = _a[1];
197
202
  // @ts-ignore
198
203
  if (!response.meta) {
199
204
  /**
@@ -204,7 +209,7 @@ var SearchController = /** @class */ (function (_super) {
204
209
  response.meta = meta;
205
210
  }
206
211
  if (!(((_g = this.config.settings) === null || _g === void 0 ? void 0 : _g.infinite) && ((_h = params.pagination) === null || _h === void 0 ? void 0 : _h.page) > 1)) return [3 /*break*/, 11];
207
- previousResults_1 = JSON.parse(JSON.stringify(this.store.results)) || [];
212
+ previousResults_1 = this.previousResults;
208
213
  if (!(((_j = this.config.settings) === null || _j === void 0 ? void 0 : _j.infinite.backfill) && !previousResults_1.length)) return [3 /*break*/, 10];
209
214
  backfills = [];
210
215
  for (page = 1; page < ((_k = params.pagination) === null || _k === void 0 ? void 0 : _k.page); page++) {
@@ -213,32 +218,32 @@ var SearchController = /** @class */ (function (_super) {
213
218
  }
214
219
  return [4 /*yield*/, Promise.all(backfills)];
215
220
  case 9:
216
- backfillResponses = _l.sent();
221
+ backfillResponses = _m.sent();
217
222
  backfillResponses.map(function (_a) {
218
223
  var meta = _a[0], data = _a[1];
219
224
  previousResults_1 = previousResults_1.concat(data.results);
220
225
  });
221
- _l.label = 10;
226
+ _m.label = 10;
222
227
  case 10:
223
228
  response.results = __spreadArray(__spreadArray([], previousResults_1, true), (response.results || []), true);
224
- _l.label = 11;
229
+ _m.label = 11;
225
230
  case 11:
226
231
  searchProfile.stop();
227
232
  this.log.profile(searchProfile);
228
233
  afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params }).start();
229
- _l.label = 12;
234
+ _m.label = 12;
230
235
  case 12:
231
- _l.trys.push([12, 14, , 15]);
236
+ _m.trys.push([12, 14, , 15]);
232
237
  return [4 /*yield*/, this.eventManager.fire('afterSearch', {
233
238
  controller: this,
234
239
  request: params,
235
240
  response: response,
236
241
  })];
237
242
  case 13:
238
- _l.sent();
243
+ _m.sent();
239
244
  return [3 /*break*/, 15];
240
245
  case 14:
241
- err_2 = _l.sent();
246
+ err_2 = _m.sent();
242
247
  if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
243
248
  this.log.warn("'afterSearch' middleware cancelled");
244
249
  afterSearchProfile.stop();
@@ -252,23 +257,25 @@ var SearchController = /** @class */ (function (_super) {
252
257
  case 15:
253
258
  afterSearchProfile.stop();
254
259
  this.log.profile(afterSearchProfile);
260
+ if ((_l = this.config.settings) === null || _l === void 0 ? void 0 : _l.infinite) {
261
+ this.previousResults = JSON.parse(JSON.stringify(response.results));
262
+ }
255
263
  // update the store
256
- // @ts-ignore
257
264
  this.store.update(response);
258
265
  afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
259
- _l.label = 16;
266
+ _m.label = 16;
260
267
  case 16:
261
- _l.trys.push([16, 18, , 19]);
268
+ _m.trys.push([16, 18, , 19]);
262
269
  return [4 /*yield*/, this.eventManager.fire('afterStore', {
263
270
  controller: this,
264
271
  request: params,
265
272
  response: response,
266
273
  })];
267
274
  case 17:
268
- _l.sent();
275
+ _m.sent();
269
276
  return [3 /*break*/, 19];
270
277
  case 18:
271
- err_3 = _l.sent();
278
+ err_3 = _m.sent();
272
279
  if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
273
280
  this.log.warn("'afterStore' middleware cancelled");
274
281
  afterStoreProfile.stop();
@@ -284,7 +291,7 @@ var SearchController = /** @class */ (function (_super) {
284
291
  this.log.profile(afterStoreProfile);
285
292
  return [3 /*break*/, 21];
286
293
  case 20:
287
- err_4 = _l.sent();
294
+ err_4 = _m.sent();
288
295
  if (err_4) {
289
296
  switch (err_4) {
290
297
  case 429:
@@ -308,6 +315,7 @@ var SearchController = /** @class */ (function (_super) {
308
315
  break;
309
316
  }
310
317
  this.store.loading = false;
318
+ this.handleError(err_4);
311
319
  }
312
320
  return [3 /*break*/, 21];
313
321
  case 21: return [2 /*return*/];
@@ -389,6 +397,9 @@ var SearchController = /** @class */ (function (_super) {
389
397
  if ((_a = requestParams === null || requestParams === void 0 ? void 0 : requestParams.search) === null || _a === void 0 ? void 0 : _a.redirectResponse) {
390
398
  delete requestParams.search.redirectResponse;
391
399
  }
400
+ if (requestParams.tracking.pageLoadId) {
401
+ delete requestParams.tracking.pageLoadId;
402
+ }
392
403
  stringyParams = JSON.stringify(requestParams);
393
404
  if ((_c = (_b = this.config.settings) === null || _b === void 0 ? void 0 : _b.infinite) === null || _c === void 0 ? void 0 : _c.restorePosition) {
394
405
  scrollMap_1 = this.storage.get('scrollMap') || {};
@@ -431,6 +442,14 @@ var SearchController = /** @class */ (function (_super) {
431
442
  if (userId) {
432
443
  params.tracking.userId = userId;
433
444
  }
445
+ var sessionId = this.tracker.getContext().sessionId;
446
+ if (sessionId) {
447
+ params.tracking.sessionId = sessionId;
448
+ }
449
+ var pageId = this.tracker.getContext().pageLoadId;
450
+ if (pageId) {
451
+ params.tracking.pageLoadId = pageId;
452
+ }
434
453
  if (!((_d = (_c = this.config.globals) === null || _c === void 0 ? void 0 : _c.personalization) === null || _d === void 0 ? void 0 : _d.disabled)) {
435
454
  var cartItems = this.tracker.cookies.cart.get();
436
455
  if (cartItems.length) {
@@ -25,6 +25,7 @@ export declare abstract class AbstractController {
25
25
  };
26
26
  protected _initialized: boolean;
27
27
  get initialized(): boolean;
28
+ handleError: (err: unknown) => void;
28
29
  constructor(config: ControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
29
30
  createTargeter(target: Target, onTarget: OnTarget, document?: Document): DomTargeter | undefined;
30
31
  addTargeter(target: DomTargeter): DomTargeter | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractController.d.ts","sourceRoot":"","sources":["../../../src/Abstract/AbstractController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEpH,8BAAsB,kBAAkB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,SAAc;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,gBAAgB,CAAC;IAE1B,SAAS,EAAE;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;KAC3B,CAAM;IAEP,SAAS,CAAC,YAAY,UAAS;IAE/B,IAAI,WAAW,IAAI,OAAO,CAEzB;gBAGA,MAAM,EAAE,gBAAgB,EACxB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,GAAE,gBAAqB;IA2DxB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS;IAIhG,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS;IASnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C3B,QAAQ,IAAI,IAAI;aAMP,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAE1B,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAIpD,GAAG,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;CAoC1C"}
1
+ {"version":3,"file":"AbstractController.d.ts","sourceRoot":"","sources":["../../../src/Abstract/AbstractController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAmB,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEpH,8BAAsB,kBAAkB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,SAAc;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,gBAAgB,CAAC;IAE1B,SAAS,EAAE;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;KAC3B,CAAM;IAEP,SAAS,CAAC,YAAY,UAAS;IAE/B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEM,WAAW,QAAS,OAAO,KAAG,IAAI,CA0CvC;gBAGD,MAAM,EAAE,gBAAgB,EACxB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,GAAE,gBAAqB;IA2DxB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS;IAIhG,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS;IASnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgD3B,QAAQ,IAAI,IAAI;aAMP,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAE1B,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAIpD,GAAG,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;CAoC1C"}
@@ -4,6 +4,42 @@ export class AbstractController {
4
4
  this.type = 'abstract';
5
5
  this.targeters = {};
6
6
  this._initialized = false;
7
+ this.handleError = (err) => {
8
+ let event;
9
+ if (err instanceof ErrorEvent) {
10
+ event = err;
11
+ }
12
+ else if (err instanceof Error) {
13
+ event = new ErrorEvent('error', {
14
+ error: err,
15
+ });
16
+ }
17
+ else if (typeof err === 'string') {
18
+ event = new ErrorEvent('error', {
19
+ error: new Error(err),
20
+ });
21
+ }
22
+ else if (typeof err === 'object' && Object.keys(err).length) {
23
+ try {
24
+ event = new ErrorEvent('error', {
25
+ error: new Error(JSON.stringify(err)),
26
+ });
27
+ }
28
+ catch (e) { }
29
+ }
30
+ if (event) {
31
+ const { filename, colno, lineno, error: { stack }, message, timeStamp, } = event;
32
+ const beaconPayload = {
33
+ filename: filename || `${this.id} (${this.type.charAt(0).toUpperCase() + this.type.slice(1)}Controller)`,
34
+ stack,
35
+ message,
36
+ colno,
37
+ lineno,
38
+ errortimestamp: timeStamp,
39
+ };
40
+ this.tracker.track.error(beaconPayload);
41
+ }
42
+ };
7
43
  if (typeof config != 'object' || typeof config.id != 'string' || !config.id.match(/^[a-zA-Z0-9_-]*$/)) {
8
44
  throw new Error(`Invalid config passed to controller. The "id" attribute must be an alphanumeric string.`);
9
45
  }
@@ -87,6 +123,7 @@ export class AbstractController {
87
123
  catch (err) {
88
124
  if (err) {
89
125
  console.error(err);
126
+ this.handleError(err);
90
127
  }
91
128
  }
92
129
  if (!this._initialized) {
@@ -27,6 +27,7 @@ export declare class AutocompleteController extends AbstractController {
27
27
  escKey: (e: KeyboardEvent) => void;
28
28
  focus: (e: FocusEvent) => void;
29
29
  formSubmit: (e: React.FormEvent<HTMLInputElement>) => Promise<void>;
30
+ formElementChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
30
31
  keyUp: (e: KeyboardEvent) => void;
31
32
  timeoutDelay: NodeJS.Timeout | undefined;
32
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACrF,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;AAoB/B,aAAK,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;IAoD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA+BrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBA6CpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;uBA0C5D,aAAa,KAAG,IAAI;;;;uBA8CpB,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAYR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2D3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAsBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAgH9B;CACF"}
1
+ {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACrF,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;AAqB/B,aAAK,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;IAoD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBA6CpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCA0ChD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,aAAa,KAAG,IAAI;;;;uBA8CpB,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwE3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAuBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAiH9B;CACF"}
@@ -16,6 +16,7 @@ const defaultConfig = {
16
16
  settings: {
17
17
  initializeFromUrl: true,
18
18
  syncInputs: true,
19
+ serializeForm: false,
19
20
  facets: {
20
21
  trim: true,
21
22
  pinFiltered: true,
@@ -127,6 +128,24 @@ export class AutocompleteController extends AbstractController {
127
128
  }
128
129
  form.submit();
129
130
  },
131
+ formElementChange: (e) => {
132
+ const input = e.target;
133
+ const form = input?.form;
134
+ const searchInput = form?.querySelector(`input[${INPUT_ATTRIBUTE}]`);
135
+ if (form && searchInput && this.config.settings?.serializeForm) {
136
+ // get other form parameters (except the input)
137
+ const formParameters = getFormParameters(form, function (elem) {
138
+ return elem != searchInput;
139
+ });
140
+ // set parameters as globals
141
+ this.store.setService('urlManager', this.store.services.urlManager.reset().withGlobals(formParameters));
142
+ this.store.reset();
143
+ // rebuild trending terms with new UrlManager settings
144
+ if (this.config.settings?.trending?.limit && this.config.settings?.trending?.limit > 0) {
145
+ this.searchTrending();
146
+ }
147
+ }
148
+ },
130
149
  keyUp: (e) => {
131
150
  // ignore enter and escape keys
132
151
  if (e?.keyCode == KEY_ENTER || e?.keyCode == KEY_ESCAPE)
@@ -303,6 +322,7 @@ export class AutocompleteController extends AbstractController {
303
322
  break;
304
323
  }
305
324
  this.store.loading = false;
325
+ this.handleError(err);
306
326
  }
307
327
  }
308
328
  };
@@ -347,10 +367,19 @@ export class AutocompleteController extends AbstractController {
347
367
  const urlState = this.urlManager.state;
348
368
  const params = deepmerge({ ...getSearchParams(urlState) }, this.config.globals);
349
369
  const userId = this.tracker.getUserId();
370
+ const sessionId = this.tracker.getContext().sessionId;
371
+ const pageLoadId = this.tracker.getContext().pageLoadId;
372
+ params.tracking = params.tracking || {};
373
+ params.tracking.domain = window.location.href;
350
374
  if (userId) {
351
- params.tracking = params.tracking || {};
352
375
  params.tracking.userId = userId;
353
376
  }
377
+ if (sessionId) {
378
+ params.tracking.sessionId = sessionId;
379
+ }
380
+ if (pageLoadId) {
381
+ params.tracking.pageLoadId = pageLoadId;
382
+ }
354
383
  if (!this.config.globals?.personalization?.disabled) {
355
384
  const cartItems = this.tracker.cookies.cart.get();
356
385
  if (cartItems.length) {
@@ -423,7 +452,10 @@ export class AutocompleteController extends AbstractController {
423
452
  input.removeEventListener('keydown', this.handlers.input.enterKey);
424
453
  input.removeEventListener('keydown', this.handlers.input.escKey);
425
454
  input.removeEventListener('focus', this.handlers.input.focus);
426
- input.form?.removeEventListener('submit', this.handlers.input.formSubmit);
455
+ if (input.form) {
456
+ input.form.removeEventListener('submit', this.handlers.input.formSubmit);
457
+ unbindFormParameters(input.form, this.handlers.input.formElementChange);
458
+ }
427
459
  });
428
460
  document.removeEventListener('click', this.handlers.document.click);
429
461
  }
@@ -446,16 +478,26 @@ export class AutocompleteController extends AbstractController {
446
478
  const form = input.form;
447
479
  let formActionUrl;
448
480
  if (this.config.action) {
449
- formActionUrl = this.config.action;
450
481
  input.addEventListener('keydown', this.handlers.input.enterKey);
482
+ formActionUrl = this.config.action;
451
483
  }
452
484
  else if (form) {
453
- formActionUrl = form.action;
454
485
  form.addEventListener('submit', this.handlers.input.formSubmit);
486
+ formActionUrl = form.action || '';
487
+ if (this.config.settings?.serializeForm) {
488
+ bindFormParameters(form, this.handlers.input.formElementChange, function (elem) {
489
+ return elem != input;
490
+ });
491
+ const formParameters = getFormParameters(form, function (elem) {
492
+ return elem != input;
493
+ });
494
+ // set parameters as globals
495
+ this.store.setService('urlManager', this.urlManager.reset().withGlobals(formParameters));
496
+ }
455
497
  }
456
498
  // set the root URL on urlManager
457
499
  if (formActionUrl) {
458
- this.store.setService('urlManager', this.urlManager.withConfig((translatorConfig) => {
500
+ this.store.setService('urlManager', this.store.services.urlManager.withConfig((translatorConfig) => {
459
501
  return {
460
502
  ...translatorConfig,
461
503
  urlRoot: formActionUrl,
@@ -484,3 +526,45 @@ async function timeout(time) {
484
526
  window.setTimeout(resolve, time);
485
527
  });
486
528
  }
529
+ // for grabbing other parameters from the form and using them in UrlManager
530
+ const INPUT_TYPE_BLACKLIST = ['file', 'reset', 'submit', 'button', 'image', 'password'];
531
+ function getFormParameters(form, filterFn) {
532
+ const parameters = {};
533
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
534
+ for (let i = form.elements.length - 1; i >= 0; i--) {
535
+ const elem = form.elements[i];
536
+ if (typeof filterFn == 'function' && !filterFn(elem)) {
537
+ continue;
538
+ }
539
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
540
+ if ((elem.type != 'checkbox' && elem.type != 'radio') || elem.checked) {
541
+ parameters[elem.name] = elem.value;
542
+ }
543
+ }
544
+ }
545
+ }
546
+ return parameters;
547
+ }
548
+ function bindFormParameters(form, fn, filterFn) {
549
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
550
+ for (let i = form.elements.length - 1; i >= 0; i--) {
551
+ const elem = form.elements[i];
552
+ if (typeof filterFn == 'function' && !filterFn(elem)) {
553
+ continue;
554
+ }
555
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
556
+ elem.addEventListener('change', fn);
557
+ }
558
+ }
559
+ }
560
+ }
561
+ function unbindFormParameters(form, fn) {
562
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
563
+ for (let i = form.elements.length - 1; i >= 0; i--) {
564
+ const elem = form.elements[i];
565
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
566
+ elem.removeEventListener('change', fn);
567
+ }
568
+ }
569
+ }
570
+ }
@@ -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;IA2C3B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAchC;IAED,IAAI,QAAa,QAAQ,IAAI,CAAC,CAe5B;IAEF,KAAK,QAAO,IAAI,CAId;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAoH9B;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,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;IA2C3B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CA+BhC;IAED,IAAI,QAAa,QAAQ,IAAI,CAAC,CAe5B;IAEF,KAAK,QAAO,IAAI,CAId;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAqH9B;CACF"}
@@ -151,6 +151,7 @@ export class FinderController extends AbstractController {
151
151
  break;
152
152
  }
153
153
  this.store.loading = false;
154
+ this.handleError(err);
154
155
  }
155
156
  }
156
157
  };
@@ -185,12 +186,27 @@ export class FinderController extends AbstractController {
185
186
  }
186
187
  get params() {
187
188
  const urlState = this.urlManager.state;
189
+ const userId = this.tracker.getUserId();
190
+ const sessionId = this.tracker.getContext().sessionId;
191
+ const pageLoadId = this.tracker.getContext().pageLoadId;
192
+ let tracking = {};
193
+ if (userId) {
194
+ tracking.userId = userId;
195
+ }
196
+ if (sessionId) {
197
+ tracking.sessionId = sessionId;
198
+ }
199
+ if (pageLoadId) {
200
+ tracking.pageLoadId = pageLoadId;
201
+ }
202
+ tracking.domain = window.location.href;
188
203
  // get only the finder fields and disable auto drill down
189
204
  const defaultParams = {
190
205
  facets: {
191
206
  include: this.config.fields.map((fieldConfig) => fieldConfig.field),
192
207
  autoDrillDown: false,
193
208
  },
209
+ tracking: tracking,
194
210
  };
195
211
  const params = deepmerge({ ...getSearchParams(urlState) }, deepmerge(defaultParams, this.config.globals));
196
212
  return params;
@@ -1 +1 @@
1
- {"version":3,"file":"RecommendationController.d.ts","sourceRoot":"","sources":["../../../src/Recommendation/RecommendationController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,8BAA8B,EAAkC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAErI,aAAK,0BAA0B,GAAG;IACjC,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;QAC/D,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;QACjD,UAAU,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KACrD,CAAC;IACF,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,WAAW,GAAG,SAAS,CAAC;IAClD,UAAU,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC1C,MAAM,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,aAAK,6BAA6B,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,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;IA8B3B,KAAK,EAAE,0BAA0B,CAqK/B;IAEF,IAAI,MAAM,IAAI,6BAA6B,CAsB1C;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CAqG9B;CACF"}
1
+ {"version":3,"file":"RecommendationController.d.ts","sourceRoot":"","sources":["../../../src/Recommendation/RecommendationController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,8BAA8B,EAAkC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAErI,aAAK,0BAA0B,GAAG;IACjC,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;QAC/D,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;QACjD,UAAU,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,WAAW,GAAG,SAAS,CAAC;KACrD,CAAC;IACF,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,WAAW,GAAG,SAAS,CAAC;IAClD,UAAU,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC1C,MAAM,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,aAAK,6BAA6B,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,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;IA8B3B,KAAK,EAAE,0BAA0B,CAqK/B;IAEF,IAAI,MAAM,IAAI,6BAA6B,CAuB1C;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CAsG9B;CACF"}
@@ -281,6 +281,7 @@ export class RecommendationController extends AbstractController {
281
281
  break;
282
282
  }
283
283
  this.store.loading = false;
284
+ this.handleError(err);
284
285
  }
285
286
  }
286
287
  };
@@ -311,7 +312,7 @@ export class RecommendationController extends AbstractController {
311
312
  order: this.context?.options?.order,
312
313
  ...this.config.globals,
313
314
  };
314
- const shopperId = this.tracker.context.shopperId;
315
+ const shopperId = this.tracker.getContext().shopperId;
315
316
  const cart = this.tracker.cookies.cart.get();
316
317
  const lastViewed = this.tracker.cookies.viewed.get();
317
318
  if (shopperId) {
@@ -15,6 +15,7 @@ export declare class SearchController extends AbstractController {
15
15
  store: SearchStore;
16
16
  config: SearchControllerConfig;
17
17
  storage: StorageStore;
18
+ private previousResults;
18
19
  constructor(config: SearchControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
19
20
  track: SearchTrackMethods;
20
21
  get params(): SearchRequestModel;
@@ -1 +1 @@
1
- {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,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,EAAE,sBAAsB,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7I,OAAO,KAAK,EAAE,kBAAkB,EAA2E,MAAM,2BAA2B,CAAC;AAoB7I,aAAK,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;IAmG3B,KAAK,EAAE,kBAAkB,CAoCvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAsC/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA0J9B;CACF"}
1
+ {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAErF,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,EAAE,sBAAsB,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE7I,OAAO,KAAK,EAAE,kBAAkB,EAA2E,MAAM,2BAA2B,CAAC;AAoB7I,aAAK,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;IAuG3B,KAAK,EAAE,kBAAkB,CAwCvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA8J9B;CACF"}
@@ -23,6 +23,7 @@ export class SearchController extends AbstractController {
23
23
  constructor(config, { client, store, urlManager, eventManager, profiler, logger, tracker }, context) {
24
24
  super(config, { client, store, urlManager, eventManager, profiler, logger, tracker }, context);
25
25
  this.type = ControllerTypes.search;
26
+ this.previousResults = [];
26
27
  this.track = {
27
28
  product: {
28
29
  click: (e, result) => {
@@ -32,6 +33,10 @@ export class SearchController extends AbstractController {
32
33
  const paramsObj = JSON.parse(stringyParams);
33
34
  if (paramsObj?.search?.redirectResponse) {
34
35
  delete paramsObj?.search?.redirectResponse;
36
+ if (paramsObj?.search && Object.keys(paramsObj?.search).length === 0) {
37
+ // if redirectResponse was the only key, also delete the empty search object
38
+ delete paramsObj.search;
39
+ }
35
40
  }
36
41
  if (paramsObj?.personalization) {
37
42
  delete paramsObj?.personalization;
@@ -108,7 +113,7 @@ export class SearchController extends AbstractController {
108
113
  // if params.page > 1 and infinite setting exists we should append results
109
114
  if (this.config.settings?.infinite && params.pagination?.page > 1) {
110
115
  // if no results fetch results...
111
- let previousResults = JSON.parse(JSON.stringify(this.store.results)) || [];
116
+ let previousResults = this.previousResults;
112
117
  if (this.config.settings?.infinite.backfill && !previousResults.length) {
113
118
  // figure out how many pages of results to backfill and wait on all responses
114
119
  const backfills = [];
@@ -146,8 +151,10 @@ export class SearchController extends AbstractController {
146
151
  }
147
152
  afterSearchProfile.stop();
148
153
  this.log.profile(afterSearchProfile);
154
+ if (this.config.settings?.infinite) {
155
+ this.previousResults = JSON.parse(JSON.stringify(response.results));
156
+ }
149
157
  // update the store
150
- // @ts-ignore
151
158
  this.store.update(response);
152
159
  const afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
153
160
  try {
@@ -195,6 +202,7 @@ export class SearchController extends AbstractController {
195
202
  break;
196
203
  }
197
204
  this.store.loading = false;
205
+ this.handleError(err);
198
206
  }
199
207
  }
200
208
  };
@@ -248,6 +256,9 @@ export class SearchController extends AbstractController {
248
256
  if (requestParams?.search?.redirectResponse) {
249
257
  delete requestParams.search.redirectResponse;
250
258
  }
259
+ if (requestParams.tracking.pageLoadId) {
260
+ delete requestParams.tracking.pageLoadId;
261
+ }
251
262
  const stringyParams = JSON.stringify(requestParams);
252
263
  if (this.config.settings?.infinite?.restorePosition) {
253
264
  // restore the scroll position saved previously
@@ -286,6 +297,14 @@ export class SearchController extends AbstractController {
286
297
  if (userId) {
287
298
  params.tracking.userId = userId;
288
299
  }
300
+ const sessionId = this.tracker.getContext().sessionId;
301
+ if (sessionId) {
302
+ params.tracking.sessionId = sessionId;
303
+ }
304
+ const pageId = this.tracker.getContext().pageLoadId;
305
+ if (pageId) {
306
+ params.tracking.pageLoadId = pageId;
307
+ }
289
308
  if (!this.config.globals?.personalization?.disabled) {
290
309
  const cartItems = this.tracker.cookies.cart.get();
291
310
  if (cartItems.length) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searchspring/snap-controller",
3
- "version": "0.31.0",
3
+ "version": "0.34.0",
4
4
  "description": "Snap Controllers",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -20,21 +20,21 @@
20
20
  "test:watch": "jest --watch"
21
21
  },
22
22
  "dependencies": {
23
- "@searchspring/snap-toolbox": "^0.31.0",
23
+ "@searchspring/snap-toolbox": "^0.34.0",
24
24
  "deepmerge": "4.2.2"
25
25
  },
26
26
  "devDependencies": {
27
- "@searchspring/snap-client": "^0.31.0",
28
- "@searchspring/snap-event-manager": "^0.31.0",
29
- "@searchspring/snap-logger": "^0.31.0",
30
- "@searchspring/snap-profiler": "^0.31.0",
31
- "@searchspring/snap-store-mobx": "^0.31.0",
32
- "@searchspring/snap-tracker": "^0.31.0",
33
- "@searchspring/snap-url-manager": "^0.31.0"
27
+ "@searchspring/snap-client": "^0.34.0",
28
+ "@searchspring/snap-event-manager": "^0.34.0",
29
+ "@searchspring/snap-logger": "^0.34.0",
30
+ "@searchspring/snap-profiler": "^0.34.0",
31
+ "@searchspring/snap-store-mobx": "^0.34.0",
32
+ "@searchspring/snap-tracker": "^0.34.0",
33
+ "@searchspring/snap-url-manager": "^0.34.0"
34
34
  },
35
35
  "sideEffects": false,
36
36
  "files": [
37
37
  "dist/**/*"
38
38
  ],
39
- "gitHead": "b09e1f5eb179f8ef167d264fab4dc5234ac9f83b"
39
+ "gitHead": "ba20dc14f2c771f77e2ba840059500209e37e07d"
40
40
  }