@searchspring/snap-controller 0.32.0 → 0.34.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +2 -0
  12. package/dist/cjs/Search/SearchController.d.ts.map +1 -1
  13. package/dist/cjs/Search/SearchController.js +73 -56
  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 +2 -0
  25. package/dist/esm/Search/SearchController.d.ts.map +1 -1
  26. package/dist/esm/Search/SearchController.js +37 -22
  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,10 +15,12 @@ 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;
21
22
  search: () => Promise<void>;
22
23
  }
24
+ export declare function getStorableRequestParams(request: SearchRequestModel): SearchRequestModel;
23
25
  export {};
24
26
  //# sourceMappingURL=SearchController.d.ts.map
@@ -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,CAwCvB;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;IA+F3B,KAAK,EAAE,kBAAkB,CA+BvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA8J9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
@@ -74,7 +74,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
74
74
  return (mod && mod.__esModule) ? mod : { "default": mod };
75
75
  };
76
76
  Object.defineProperty(exports, "__esModule", { value: true });
77
- exports.SearchController = void 0;
77
+ exports.getStorableRequestParams = exports.SearchController = void 0;
78
78
  var deepmerge_1 = __importDefault(require("deepmerge"));
79
79
  var AbstractController_1 = require("../Abstract/AbstractController");
80
80
  var snap_store_mobx_1 = require("@searchspring/snap-store-mobx");
@@ -104,33 +104,25 @@ 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) {
110
- var _a, _b, _c, _d;
111
+ var _a, _b;
111
112
  // store scroll position
112
113
  if ((_a = _this.config.settings) === null || _a === void 0 ? void 0 : _a.infinite) {
113
114
  var stringyParams = _this.storage.get('lastStringyParams');
114
- var paramsObj = JSON.parse(stringyParams);
115
- if ((_b = paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.search) === null || _b === void 0 ? void 0 : _b.redirectResponse) {
116
- (_c = paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.search) === null || _c === void 0 ? true : delete _c.redirectResponse;
117
- if ((paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.search) && Object.keys(paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.search).length === 0) {
118
- // if redirectResponse was the only key, also delete the empty search object
119
- delete paramsObj.search;
120
- }
121
- }
122
- if (paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.personalization) {
123
- paramsObj === null || paramsObj === void 0 ? true : delete paramsObj.personalization;
124
- }
125
- stringyParams = JSON.stringify(paramsObj);
115
+ stringyParams = JSON.parse(stringyParams);
116
+ var storableRequestParams = getStorableRequestParams(stringyParams);
117
+ stringyParams = JSON.stringify(storableRequestParams);
126
118
  var scrollMap = {};
127
119
  scrollMap[stringyParams] = window.scrollY;
128
120
  _this.storage.set('scrollMap', scrollMap);
129
121
  }
130
122
  // track
131
- var _e = result.attributes, intellisuggestData = _e.intellisuggestData, intellisuggestSignature = _e.intellisuggestSignature;
123
+ var _c = result.attributes, intellisuggestData = _c.intellisuggestData, intellisuggestSignature = _c.intellisuggestSignature;
132
124
  var target = e.target;
133
- var href = (target === null || target === void 0 ? void 0 : target.href) || ((_d = result.mappings.core) === null || _d === void 0 ? void 0 : _d.url) || undefined;
125
+ var href = (target === null || target === void 0 ? void 0 : target.href) || ((_b = result.mappings.core) === null || _b === void 0 ? void 0 : _b.url) || undefined;
134
126
  var event = _this.tracker.track.product.click({
135
127
  intellisuggestData: intellisuggestData,
136
128
  intellisuggestSignature: intellisuggestSignature,
@@ -143,32 +135,32 @@ var SearchController = /** @class */ (function (_super) {
143
135
  };
144
136
  _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
145
137
  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;
146
- var _b, _c, _d, _e, _f, _g, _h, _j, _k;
147
- return __generator(this, function (_l) {
148
- switch (_l.label) {
138
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
139
+ return __generator(this, function (_m) {
140
+ switch (_m.label) {
149
141
  case 0:
150
142
  if (!!this.initialized) return [3 /*break*/, 2];
151
143
  return [4 /*yield*/, this.init()];
152
144
  case 1:
153
- _l.sent();
154
- _l.label = 2;
145
+ _m.sent();
146
+ _m.label = 2;
155
147
  case 2:
156
148
  params = this.params;
157
- _l.label = 3;
149
+ _m.label = 3;
158
150
  case 3:
159
- _l.trys.push([3, 20, , 21]);
160
- _l.label = 4;
151
+ _m.trys.push([3, 20, , 21]);
152
+ _m.label = 4;
161
153
  case 4:
162
- _l.trys.push([4, 6, , 7]);
154
+ _m.trys.push([4, 6, , 7]);
163
155
  return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
164
156
  controller: this,
165
157
  request: params,
166
158
  })];
167
159
  case 5:
168
- _l.sent();
160
+ _m.sent();
169
161
  return [3 /*break*/, 7];
170
162
  case 6:
171
- err_1 = _l.sent();
163
+ err_1 = _m.sent();
172
164
  if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
173
165
  this.log.warn("'beforeSearch' middleware cancelled");
174
166
  return [2 /*return*/];
@@ -197,7 +189,7 @@ var SearchController = /** @class */ (function (_super) {
197
189
  searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
198
190
  return [4 /*yield*/, this.client.search(params)];
199
191
  case 8:
200
- _a = _l.sent(), meta = _a[0], response = _a[1];
192
+ _a = _m.sent(), meta = _a[0], response = _a[1];
201
193
  // @ts-ignore
202
194
  if (!response.meta) {
203
195
  /**
@@ -208,7 +200,7 @@ var SearchController = /** @class */ (function (_super) {
208
200
  response.meta = meta;
209
201
  }
210
202
  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];
211
- previousResults_1 = JSON.parse(JSON.stringify(this.store.results)) || [];
203
+ previousResults_1 = this.previousResults;
212
204
  if (!(((_j = this.config.settings) === null || _j === void 0 ? void 0 : _j.infinite.backfill) && !previousResults_1.length)) return [3 /*break*/, 10];
213
205
  backfills = [];
214
206
  for (page = 1; page < ((_k = params.pagination) === null || _k === void 0 ? void 0 : _k.page); page++) {
@@ -217,32 +209,32 @@ var SearchController = /** @class */ (function (_super) {
217
209
  }
218
210
  return [4 /*yield*/, Promise.all(backfills)];
219
211
  case 9:
220
- backfillResponses = _l.sent();
212
+ backfillResponses = _m.sent();
221
213
  backfillResponses.map(function (_a) {
222
214
  var meta = _a[0], data = _a[1];
223
215
  previousResults_1 = previousResults_1.concat(data.results);
224
216
  });
225
- _l.label = 10;
217
+ _m.label = 10;
226
218
  case 10:
227
219
  response.results = __spreadArray(__spreadArray([], previousResults_1, true), (response.results || []), true);
228
- _l.label = 11;
220
+ _m.label = 11;
229
221
  case 11:
230
222
  searchProfile.stop();
231
223
  this.log.profile(searchProfile);
232
224
  afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params }).start();
233
- _l.label = 12;
225
+ _m.label = 12;
234
226
  case 12:
235
- _l.trys.push([12, 14, , 15]);
227
+ _m.trys.push([12, 14, , 15]);
236
228
  return [4 /*yield*/, this.eventManager.fire('afterSearch', {
237
229
  controller: this,
238
230
  request: params,
239
231
  response: response,
240
232
  })];
241
233
  case 13:
242
- _l.sent();
234
+ _m.sent();
243
235
  return [3 /*break*/, 15];
244
236
  case 14:
245
- err_2 = _l.sent();
237
+ err_2 = _m.sent();
246
238
  if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
247
239
  this.log.warn("'afterSearch' middleware cancelled");
248
240
  afterSearchProfile.stop();
@@ -256,23 +248,25 @@ var SearchController = /** @class */ (function (_super) {
256
248
  case 15:
257
249
  afterSearchProfile.stop();
258
250
  this.log.profile(afterSearchProfile);
251
+ if ((_l = this.config.settings) === null || _l === void 0 ? void 0 : _l.infinite) {
252
+ this.previousResults = JSON.parse(JSON.stringify(response.results));
253
+ }
259
254
  // update the store
260
- // @ts-ignore
261
255
  this.store.update(response);
262
256
  afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
263
- _l.label = 16;
257
+ _m.label = 16;
264
258
  case 16:
265
- _l.trys.push([16, 18, , 19]);
259
+ _m.trys.push([16, 18, , 19]);
266
260
  return [4 /*yield*/, this.eventManager.fire('afterStore', {
267
261
  controller: this,
268
262
  request: params,
269
263
  response: response,
270
264
  })];
271
265
  case 17:
272
- _l.sent();
266
+ _m.sent();
273
267
  return [3 /*break*/, 19];
274
268
  case 18:
275
- err_3 = _l.sent();
269
+ err_3 = _m.sent();
276
270
  if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
277
271
  this.log.warn("'afterStore' middleware cancelled");
278
272
  afterStoreProfile.stop();
@@ -288,7 +282,7 @@ var SearchController = /** @class */ (function (_super) {
288
282
  this.log.profile(afterStoreProfile);
289
283
  return [3 /*break*/, 21];
290
284
  case 20:
291
- err_4 = _l.sent();
285
+ err_4 = _m.sent();
292
286
  if (err_4) {
293
287
  switch (err_4) {
294
288
  case 429:
@@ -312,6 +306,7 @@ var SearchController = /** @class */ (function (_super) {
312
306
  break;
313
307
  }
314
308
  this.store.loading = false;
309
+ this.handleError(err_4);
315
310
  }
316
311
  return [3 /*break*/, 21];
317
312
  case 21: return [2 /*return*/];
@@ -375,26 +370,20 @@ var SearchController = /** @class */ (function (_super) {
375
370
  });
376
371
  }); });
377
372
  _this.eventManager.on('afterStore', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
378
- var requestParams, stringyParams, scrollMap_1, scrollToPosition_1, checkCount_1, heightCheck_1;
373
+ var storableRequestParams, stringyParams, scrollMap_1, scrollToPosition_1, checkCount_1, heightCheck_1;
379
374
  var _this = this;
380
- var _a, _b, _c;
381
- return __generator(this, function (_d) {
382
- switch (_d.label) {
375
+ var _a, _b;
376
+ return __generator(this, function (_c) {
377
+ switch (_c.label) {
383
378
  case 0: return [4 /*yield*/, next()];
384
379
  case 1:
385
- _d.sent();
380
+ _c.sent();
386
381
  search.controller.store.loading = false;
387
382
  // save last params
388
383
  this.storage.set('lastStringyParams', JSON.stringify(search.request));
389
- requestParams = __assign({}, search.request);
390
- if (requestParams.personalization) {
391
- delete requestParams.personalization;
392
- }
393
- if ((_a = requestParams === null || requestParams === void 0 ? void 0 : requestParams.search) === null || _a === void 0 ? void 0 : _a.redirectResponse) {
394
- delete requestParams.search.redirectResponse;
395
- }
396
- stringyParams = JSON.stringify(requestParams);
397
- if ((_c = (_b = this.config.settings) === null || _b === void 0 ? void 0 : _b.infinite) === null || _c === void 0 ? void 0 : _c.restorePosition) {
384
+ storableRequestParams = getStorableRequestParams(search.request);
385
+ stringyParams = JSON.stringify(storableRequestParams);
386
+ if ((_b = (_a = this.config.settings) === null || _a === void 0 ? void 0 : _a.infinite) === null || _b === void 0 ? void 0 : _b.restorePosition) {
398
387
  scrollMap_1 = this.storage.get('scrollMap') || {};
399
388
  scrollToPosition_1 = scrollMap_1[stringyParams];
400
389
  if (scrollToPosition_1) {
@@ -435,6 +424,14 @@ var SearchController = /** @class */ (function (_super) {
435
424
  if (userId) {
436
425
  params.tracking.userId = userId;
437
426
  }
427
+ var sessionId = this.tracker.getContext().sessionId;
428
+ if (sessionId) {
429
+ params.tracking.sessionId = sessionId;
430
+ }
431
+ var pageId = this.tracker.getContext().pageLoadId;
432
+ if (pageId) {
433
+ params.tracking.pageLoadId = pageId;
434
+ }
438
435
  if (!((_d = (_c = this.config.globals) === null || _c === void 0 ? void 0 : _c.personalization) === null || _d === void 0 ? void 0 : _d.disabled)) {
439
436
  var cartItems = this.tracker.cookies.cart.get();
440
437
  if (cartItems.length) {
@@ -460,3 +457,23 @@ var SearchController = /** @class */ (function (_super) {
460
457
  return SearchController;
461
458
  }(AbstractController_1.AbstractController));
462
459
  exports.SearchController = SearchController;
460
+ function getStorableRequestParams(request) {
461
+ var _a, _b, _c, _d;
462
+ return {
463
+ siteId: request.siteId,
464
+ sorts: request.sorts,
465
+ search: {
466
+ query: {
467
+ string: ((_b = (_a = request === null || request === void 0 ? void 0 : request.search) === null || _a === void 0 ? void 0 : _a.query) === null || _b === void 0 ? void 0 : _b.string) || '',
468
+ },
469
+ subQuery: ((_c = request === null || request === void 0 ? void 0 : request.search) === null || _c === void 0 ? void 0 : _c.subQuery) || '',
470
+ },
471
+ filters: request.filters,
472
+ pagination: request.pagination,
473
+ facets: request.facets,
474
+ merchandising: {
475
+ landingPage: ((_d = request.merchandising) === null || _d === void 0 ? void 0 : _d.landingPage) || '',
476
+ },
477
+ };
478
+ }
479
+ exports.getStorableRequestParams = getStorableRequestParams;
@@ -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,10 +15,12 @@ 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;
21
22
  search: () => Promise<void>;
22
23
  }
24
+ export declare function getStorableRequestParams(request: SearchRequestModel): SearchRequestModel;
23
25
  export {};
24
26
  //# sourceMappingURL=SearchController.d.ts.map
@@ -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,CAwCvB;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;IA+F3B,KAAK,EAAE,kBAAkB,CA+BvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA8J9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
@@ -23,24 +23,16 @@ 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) => {
29
30
  // store scroll position
30
31
  if (this.config.settings?.infinite) {
31
32
  let stringyParams = this.storage.get('lastStringyParams');
32
- const paramsObj = JSON.parse(stringyParams);
33
- if (paramsObj?.search?.redirectResponse) {
34
- delete paramsObj?.search?.redirectResponse;
35
- if (paramsObj?.search && Object.keys(paramsObj?.search).length === 0) {
36
- // if redirectResponse was the only key, also delete the empty search object
37
- delete paramsObj.search;
38
- }
39
- }
40
- if (paramsObj?.personalization) {
41
- delete paramsObj?.personalization;
42
- }
43
- stringyParams = JSON.stringify(paramsObj);
33
+ stringyParams = JSON.parse(stringyParams);
34
+ const storableRequestParams = getStorableRequestParams(stringyParams);
35
+ stringyParams = JSON.stringify(storableRequestParams);
44
36
  const scrollMap = {};
45
37
  scrollMap[stringyParams] = window.scrollY;
46
38
  this.storage.set('scrollMap', scrollMap);
@@ -112,7 +104,7 @@ export class SearchController extends AbstractController {
112
104
  // if params.page > 1 and infinite setting exists we should append results
113
105
  if (this.config.settings?.infinite && params.pagination?.page > 1) {
114
106
  // if no results fetch results...
115
- let previousResults = JSON.parse(JSON.stringify(this.store.results)) || [];
107
+ let previousResults = this.previousResults;
116
108
  if (this.config.settings?.infinite.backfill && !previousResults.length) {
117
109
  // figure out how many pages of results to backfill and wait on all responses
118
110
  const backfills = [];
@@ -150,8 +142,10 @@ export class SearchController extends AbstractController {
150
142
  }
151
143
  afterSearchProfile.stop();
152
144
  this.log.profile(afterSearchProfile);
145
+ if (this.config.settings?.infinite) {
146
+ this.previousResults = JSON.parse(JSON.stringify(response.results));
147
+ }
153
148
  // update the store
154
- // @ts-ignore
155
149
  this.store.update(response);
156
150
  const afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
157
151
  try {
@@ -199,6 +193,7 @@ export class SearchController extends AbstractController {
199
193
  break;
200
194
  }
201
195
  this.store.loading = false;
196
+ this.handleError(err);
202
197
  }
203
198
  }
204
199
  };
@@ -245,14 +240,8 @@ export class SearchController extends AbstractController {
245
240
  search.controller.store.loading = false;
246
241
  // save last params
247
242
  this.storage.set('lastStringyParams', JSON.stringify(search.request));
248
- const requestParams = { ...search.request };
249
- if (requestParams.personalization) {
250
- delete requestParams.personalization;
251
- }
252
- if (requestParams?.search?.redirectResponse) {
253
- delete requestParams.search.redirectResponse;
254
- }
255
- const stringyParams = JSON.stringify(requestParams);
243
+ const storableRequestParams = getStorableRequestParams(search.request);
244
+ const stringyParams = JSON.stringify(storableRequestParams);
256
245
  if (this.config.settings?.infinite?.restorePosition) {
257
246
  // restore the scroll position saved previously
258
247
  const scrollMap = this.storage.get('scrollMap') || {};
@@ -290,6 +279,14 @@ export class SearchController extends AbstractController {
290
279
  if (userId) {
291
280
  params.tracking.userId = userId;
292
281
  }
282
+ const sessionId = this.tracker.getContext().sessionId;
283
+ if (sessionId) {
284
+ params.tracking.sessionId = sessionId;
285
+ }
286
+ const pageId = this.tracker.getContext().pageLoadId;
287
+ if (pageId) {
288
+ params.tracking.pageLoadId = pageId;
289
+ }
293
290
  if (!this.config.globals?.personalization?.disabled) {
294
291
  const cartItems = this.tracker.cookies.cart.get();
295
292
  if (cartItems.length) {
@@ -310,3 +307,21 @@ export class SearchController extends AbstractController {
310
307
  return params;
311
308
  }
312
309
  }
310
+ export function getStorableRequestParams(request) {
311
+ return {
312
+ siteId: request.siteId,
313
+ sorts: request.sorts,
314
+ search: {
315
+ query: {
316
+ string: request?.search?.query?.string || '',
317
+ },
318
+ subQuery: request?.search?.subQuery || '',
319
+ },
320
+ filters: request.filters,
321
+ pagination: request.pagination,
322
+ facets: request.facets,
323
+ merchandising: {
324
+ landingPage: request.merchandising?.landingPage || '',
325
+ },
326
+ };
327
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searchspring/snap-controller",
3
- "version": "0.32.0",
3
+ "version": "0.34.1",
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.32.0",
23
+ "@searchspring/snap-toolbox": "^0.34.1",
24
24
  "deepmerge": "4.2.2"
25
25
  },
26
26
  "devDependencies": {
27
- "@searchspring/snap-client": "^0.32.0",
28
- "@searchspring/snap-event-manager": "^0.32.0",
29
- "@searchspring/snap-logger": "^0.32.0",
30
- "@searchspring/snap-profiler": "^0.32.0",
31
- "@searchspring/snap-store-mobx": "^0.32.0",
32
- "@searchspring/snap-tracker": "^0.32.0",
33
- "@searchspring/snap-url-manager": "^0.32.0"
27
+ "@searchspring/snap-client": "^0.34.1",
28
+ "@searchspring/snap-event-manager": "^0.34.1",
29
+ "@searchspring/snap-logger": "^0.34.1",
30
+ "@searchspring/snap-profiler": "^0.34.1",
31
+ "@searchspring/snap-store-mobx": "^0.34.1",
32
+ "@searchspring/snap-tracker": "^0.34.1",
33
+ "@searchspring/snap-url-manager": "^0.34.1"
34
34
  },
35
35
  "sideEffects": false,
36
36
  "files": [
37
37
  "dist/**/*"
38
38
  ],
39
- "gitHead": "d63f3b80dca47a54658a6e61c1311044028ff060"
39
+ "gitHead": "ca04548dde7220089c6ca07e88602ff9579a69bf"
40
40
  }