@searchspring/snap-controller 0.30.2 → 0.33.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 +81 -6
  7. package/dist/cjs/Finder/FinderController.d.ts.map +1 -1
  8. package/dist/cjs/Finder/FinderController.js +1 -0
  9. package/dist/cjs/Recommendation/RecommendationController.d.ts.map +1 -1
  10. package/dist/cjs/Recommendation/RecommendationController.js +1 -0
  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 +48 -32
  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 +79 -4
  20. package/dist/esm/Finder/FinderController.d.ts.map +1 -1
  21. package/dist/esm/Finder/FinderController.js +1 -0
  22. package/dist/esm/Recommendation/RecommendationController.d.ts.map +1 -1
  23. package/dist/esm/Recommendation/RecommendationController.js +1 -0
  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 +18 -4
  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,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;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*/];
@@ -618,12 +639,14 @@ var AutocompleteController = /** @class */ (function (_super) {
618
639
  var _this = this;
619
640
  var inputs = document.querySelectorAll("input[".concat(INPUT_ATTRIBUTE, "]"));
620
641
  inputs === null || inputs === void 0 ? void 0 : inputs.forEach(function (input) {
621
- var _a;
622
642
  input.removeEventListener('keyup', _this.handlers.input.keyUp);
623
643
  input.removeEventListener('keydown', _this.handlers.input.enterKey);
624
644
  input.removeEventListener('keydown', _this.handlers.input.escKey);
625
645
  input.removeEventListener('focus', _this.handlers.input.focus);
626
- (_a = input.form) === null || _a === void 0 ? void 0 : _a.removeEventListener('submit', _this.handlers.input.formSubmit);
646
+ if (input.form) {
647
+ input.form.removeEventListener('submit', _this.handlers.input.formSubmit);
648
+ unbindFormParameters(input.form, _this.handlers.input.formElementChange);
649
+ }
627
650
  });
628
651
  document.removeEventListener('click', this.handlers.document.click);
629
652
  };
@@ -644,7 +667,7 @@ var AutocompleteController = /** @class */ (function (_super) {
644
667
  this.unbind();
645
668
  inputs = document.querySelectorAll(this.config.selector);
646
669
  inputs.forEach(function (input) {
647
- var _a, _b;
670
+ var _a, _b, _c;
648
671
  input.setAttribute('spellcheck', 'false');
649
672
  input.setAttribute('autocomplete', 'off');
650
673
  input.setAttribute(INPUT_ATTRIBUTE, '');
@@ -657,16 +680,26 @@ var AutocompleteController = /** @class */ (function (_super) {
657
680
  var form = input.form;
658
681
  var formActionUrl;
659
682
  if (_this.config.action) {
660
- formActionUrl = _this.config.action;
661
683
  input.addEventListener('keydown', _this.handlers.input.enterKey);
684
+ formActionUrl = _this.config.action;
662
685
  }
663
686
  else if (form) {
664
- formActionUrl = form.action;
665
687
  form.addEventListener('submit', _this.handlers.input.formSubmit);
688
+ formActionUrl = form.action || '';
689
+ if ((_c = _this.config.settings) === null || _c === void 0 ? void 0 : _c.serializeForm) {
690
+ bindFormParameters(form, _this.handlers.input.formElementChange, function (elem) {
691
+ return elem != input;
692
+ });
693
+ var formParameters = getFormParameters(form, function (elem) {
694
+ return elem != input;
695
+ });
696
+ // set parameters as globals
697
+ _this.store.setService('urlManager', _this.urlManager.reset().withGlobals(formParameters));
698
+ }
666
699
  }
667
700
  // set the root URL on urlManager
668
701
  if (formActionUrl) {
669
- _this.store.setService('urlManager', _this.urlManager.withConfig(function (translatorConfig) {
702
+ _this.store.setService('urlManager', _this.store.services.urlManager.withConfig(function (translatorConfig) {
670
703
  return __assign(__assign({}, translatorConfig), { urlRoot: formActionUrl });
671
704
  }));
672
705
  }
@@ -702,3 +735,45 @@ function timeout(time) {
702
735
  });
703
736
  });
704
737
  }
738
+ // for grabbing other parameters from the form and using them in UrlManager
739
+ var INPUT_TYPE_BLACKLIST = ['file', 'reset', 'submit', 'button', 'image', 'password'];
740
+ function getFormParameters(form, filterFn) {
741
+ var parameters = {};
742
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
743
+ for (var i = form.elements.length - 1; i >= 0; i--) {
744
+ var elem = form.elements[i];
745
+ if (typeof filterFn == 'function' && !filterFn(elem)) {
746
+ continue;
747
+ }
748
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
749
+ if ((elem.type != 'checkbox' && elem.type != 'radio') || elem.checked) {
750
+ parameters[elem.name] = elem.value;
751
+ }
752
+ }
753
+ }
754
+ }
755
+ return parameters;
756
+ }
757
+ function bindFormParameters(form, fn, filterFn) {
758
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
759
+ for (var i = form.elements.length - 1; i >= 0; i--) {
760
+ var elem = form.elements[i];
761
+ if (typeof filterFn == 'function' && !filterFn(elem)) {
762
+ continue;
763
+ }
764
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
765
+ elem.addEventListener('change', fn);
766
+ }
767
+ }
768
+ }
769
+ }
770
+ function unbindFormParameters(form, fn) {
771
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
772
+ for (var i = form.elements.length - 1; i >= 0; i--) {
773
+ var elem = form.elements[i];
774
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
775
+ elem.removeEventListener('change', fn);
776
+ }
777
+ }
778
+ }
779
+ }
@@ -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,CAchC;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*/];
@@ -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,CAsB1C;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*/];
@@ -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;IA0F3B,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;IAmG3B,KAAK,EAAE,kBAAkB,CAwCvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAsC/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA8J9B;CACF"}
@@ -100,8 +100,11 @@ var SearchController = /** @class */ (function (_super) {
100
100
  __extends(SearchController, _super);
101
101
  function SearchController(config, _a, context) {
102
102
  var client = _a.client, store = _a.store, urlManager = _a.urlManager, eventManager = _a.eventManager, profiler = _a.profiler, logger = _a.logger, tracker = _a.tracker;
103
- var _this = _super.call(this, config, { client: client, store: store, urlManager: urlManager, eventManager: eventManager, profiler: profiler, logger: logger, tracker: tracker }, context) || this;
103
+ var _this = this;
104
+ var _b, _c, _d;
105
+ _this = _super.call(this, config, { client: client, store: store, urlManager: urlManager, eventManager: eventManager, profiler: profiler, logger: logger, tracker: tracker }, context) || this;
104
106
  _this.type = types_1.ControllerTypes.search;
107
+ _this.previousResults = [];
105
108
  _this.track = {
106
109
  product: {
107
110
  click: function (e, result) {
@@ -112,6 +115,10 @@ var SearchController = /** @class */ (function (_super) {
112
115
  var paramsObj = JSON.parse(stringyParams);
113
116
  if ((_b = paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.search) === null || _b === void 0 ? void 0 : _b.redirectResponse) {
114
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
+ }
115
122
  }
116
123
  if (paramsObj === null || paramsObj === void 0 ? void 0 : paramsObj.personalization) {
117
124
  paramsObj === null || paramsObj === void 0 ? true : delete paramsObj.personalization;
@@ -137,32 +144,32 @@ var SearchController = /** @class */ (function (_super) {
137
144
  };
138
145
  _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
139
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;
140
- var _b, _c, _d, _e, _f, _g, _h, _j, _k;
141
- return __generator(this, function (_l) {
142
- 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) {
143
150
  case 0:
144
151
  if (!!this.initialized) return [3 /*break*/, 2];
145
152
  return [4 /*yield*/, this.init()];
146
153
  case 1:
147
- _l.sent();
148
- _l.label = 2;
154
+ _m.sent();
155
+ _m.label = 2;
149
156
  case 2:
150
157
  params = this.params;
151
- _l.label = 3;
158
+ _m.label = 3;
152
159
  case 3:
153
- _l.trys.push([3, 20, , 21]);
154
- _l.label = 4;
160
+ _m.trys.push([3, 20, , 21]);
161
+ _m.label = 4;
155
162
  case 4:
156
- _l.trys.push([4, 6, , 7]);
163
+ _m.trys.push([4, 6, , 7]);
157
164
  return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
158
165
  controller: this,
159
166
  request: params,
160
167
  })];
161
168
  case 5:
162
- _l.sent();
169
+ _m.sent();
163
170
  return [3 /*break*/, 7];
164
171
  case 6:
165
- err_1 = _l.sent();
172
+ err_1 = _m.sent();
166
173
  if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
167
174
  this.log.warn("'beforeSearch' middleware cancelled");
168
175
  return [2 /*return*/];
@@ -191,7 +198,7 @@ var SearchController = /** @class */ (function (_super) {
191
198
  searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
192
199
  return [4 /*yield*/, this.client.search(params)];
193
200
  case 8:
194
- _a = _l.sent(), meta = _a[0], response = _a[1];
201
+ _a = _m.sent(), meta = _a[0], response = _a[1];
195
202
  // @ts-ignore
196
203
  if (!response.meta) {
197
204
  /**
@@ -202,7 +209,7 @@ var SearchController = /** @class */ (function (_super) {
202
209
  response.meta = meta;
203
210
  }
204
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];
205
- previousResults_1 = JSON.parse(JSON.stringify(this.store.results)) || [];
212
+ previousResults_1 = this.previousResults;
206
213
  if (!(((_j = this.config.settings) === null || _j === void 0 ? void 0 : _j.infinite.backfill) && !previousResults_1.length)) return [3 /*break*/, 10];
207
214
  backfills = [];
208
215
  for (page = 1; page < ((_k = params.pagination) === null || _k === void 0 ? void 0 : _k.page); page++) {
@@ -211,32 +218,32 @@ var SearchController = /** @class */ (function (_super) {
211
218
  }
212
219
  return [4 /*yield*/, Promise.all(backfills)];
213
220
  case 9:
214
- backfillResponses = _l.sent();
221
+ backfillResponses = _m.sent();
215
222
  backfillResponses.map(function (_a) {
216
223
  var meta = _a[0], data = _a[1];
217
224
  previousResults_1 = previousResults_1.concat(data.results);
218
225
  });
219
- _l.label = 10;
226
+ _m.label = 10;
220
227
  case 10:
221
228
  response.results = __spreadArray(__spreadArray([], previousResults_1, true), (response.results || []), true);
222
- _l.label = 11;
229
+ _m.label = 11;
223
230
  case 11:
224
231
  searchProfile.stop();
225
232
  this.log.profile(searchProfile);
226
233
  afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params }).start();
227
- _l.label = 12;
234
+ _m.label = 12;
228
235
  case 12:
229
- _l.trys.push([12, 14, , 15]);
236
+ _m.trys.push([12, 14, , 15]);
230
237
  return [4 /*yield*/, this.eventManager.fire('afterSearch', {
231
238
  controller: this,
232
239
  request: params,
233
240
  response: response,
234
241
  })];
235
242
  case 13:
236
- _l.sent();
243
+ _m.sent();
237
244
  return [3 /*break*/, 15];
238
245
  case 14:
239
- err_2 = _l.sent();
246
+ err_2 = _m.sent();
240
247
  if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
241
248
  this.log.warn("'afterSearch' middleware cancelled");
242
249
  afterSearchProfile.stop();
@@ -250,23 +257,25 @@ var SearchController = /** @class */ (function (_super) {
250
257
  case 15:
251
258
  afterSearchProfile.stop();
252
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
+ }
253
263
  // update the store
254
- // @ts-ignore
255
264
  this.store.update(response);
256
265
  afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
257
- _l.label = 16;
266
+ _m.label = 16;
258
267
  case 16:
259
- _l.trys.push([16, 18, , 19]);
268
+ _m.trys.push([16, 18, , 19]);
260
269
  return [4 /*yield*/, this.eventManager.fire('afterStore', {
261
270
  controller: this,
262
271
  request: params,
263
272
  response: response,
264
273
  })];
265
274
  case 17:
266
- _l.sent();
275
+ _m.sent();
267
276
  return [3 /*break*/, 19];
268
277
  case 18:
269
- err_3 = _l.sent();
278
+ err_3 = _m.sent();
270
279
  if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
271
280
  this.log.warn("'afterStore' middleware cancelled");
272
281
  afterStoreProfile.stop();
@@ -282,7 +291,7 @@ var SearchController = /** @class */ (function (_super) {
282
291
  this.log.profile(afterStoreProfile);
283
292
  return [3 /*break*/, 21];
284
293
  case 20:
285
- err_4 = _l.sent();
294
+ err_4 = _m.sent();
286
295
  if (err_4) {
287
296
  switch (err_4) {
288
297
  case 429:
@@ -306,6 +315,7 @@ var SearchController = /** @class */ (function (_super) {
306
315
  break;
307
316
  }
308
317
  this.store.loading = false;
318
+ this.handleError(err_4);
309
319
  }
310
320
  return [3 /*break*/, 21];
311
321
  case 21: return [2 /*return*/];
@@ -314,6 +324,12 @@ var SearchController = /** @class */ (function (_super) {
314
324
  }); };
315
325
  // deep merge config with defaults
316
326
  _this.config = (0, deepmerge_1.default)(defaultConfig, _this.config);
327
+ if (((_b = _this.config.settings) === null || _b === void 0 ? void 0 : _b.infinite) && typeof _this.config.settings.infinite.restorePosition == 'undefined') {
328
+ _this.config.settings.infinite.restorePosition = true;
329
+ }
330
+ if ((window === null || window === void 0 ? void 0 : window.history) && ((_d = (_c = _this.config.settings) === null || _c === void 0 ? void 0 : _c.infinite) === null || _d === void 0 ? void 0 : _d.restorePosition)) {
331
+ window.history.scrollRestoration = 'manual';
332
+ }
317
333
  _this.store.setConfig(_this.config);
318
334
  _this.storage = new snap_store_mobx_1.StorageStore({
319
335
  type: snap_store_mobx_1.StorageType.SESSION,
@@ -365,12 +381,12 @@ var SearchController = /** @class */ (function (_super) {
365
381
  _this.eventManager.on('afterStore', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
366
382
  var requestParams, stringyParams, scrollMap_1, scrollToPosition_1, checkCount_1, heightCheck_1;
367
383
  var _this = this;
368
- var _a, _b;
369
- return __generator(this, function (_c) {
370
- switch (_c.label) {
384
+ var _a, _b, _c;
385
+ return __generator(this, function (_d) {
386
+ switch (_d.label) {
371
387
  case 0: return [4 /*yield*/, next()];
372
388
  case 1:
373
- _c.sent();
389
+ _d.sent();
374
390
  search.controller.store.loading = false;
375
391
  // save last params
376
392
  this.storage.set('lastStringyParams', JSON.stringify(search.request));
@@ -382,7 +398,7 @@ var SearchController = /** @class */ (function (_super) {
382
398
  delete requestParams.search.redirectResponse;
383
399
  }
384
400
  stringyParams = JSON.stringify(requestParams);
385
- if (((_b = this.config.settings) === null || _b === void 0 ? void 0 : _b.infinite) && window.scrollY === 0) {
401
+ if ((_c = (_b = this.config.settings) === null || _b === void 0 ? void 0 : _b.infinite) === null || _c === void 0 ? void 0 : _c.restorePosition) {
386
402
  scrollMap_1 = this.storage.get('scrollMap') || {};
387
403
  scrollToPosition_1 = scrollMap_1[stringyParams];
388
404
  if (scrollToPosition_1) {
@@ -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,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;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
  };
@@ -423,7 +443,10 @@ export class AutocompleteController extends AbstractController {
423
443
  input.removeEventListener('keydown', this.handlers.input.enterKey);
424
444
  input.removeEventListener('keydown', this.handlers.input.escKey);
425
445
  input.removeEventListener('focus', this.handlers.input.focus);
426
- input.form?.removeEventListener('submit', this.handlers.input.formSubmit);
446
+ if (input.form) {
447
+ input.form.removeEventListener('submit', this.handlers.input.formSubmit);
448
+ unbindFormParameters(input.form, this.handlers.input.formElementChange);
449
+ }
427
450
  });
428
451
  document.removeEventListener('click', this.handlers.document.click);
429
452
  }
@@ -446,16 +469,26 @@ export class AutocompleteController extends AbstractController {
446
469
  const form = input.form;
447
470
  let formActionUrl;
448
471
  if (this.config.action) {
449
- formActionUrl = this.config.action;
450
472
  input.addEventListener('keydown', this.handlers.input.enterKey);
473
+ formActionUrl = this.config.action;
451
474
  }
452
475
  else if (form) {
453
- formActionUrl = form.action;
454
476
  form.addEventListener('submit', this.handlers.input.formSubmit);
477
+ formActionUrl = form.action || '';
478
+ if (this.config.settings?.serializeForm) {
479
+ bindFormParameters(form, this.handlers.input.formElementChange, function (elem) {
480
+ return elem != input;
481
+ });
482
+ const formParameters = getFormParameters(form, function (elem) {
483
+ return elem != input;
484
+ });
485
+ // set parameters as globals
486
+ this.store.setService('urlManager', this.urlManager.reset().withGlobals(formParameters));
487
+ }
455
488
  }
456
489
  // set the root URL on urlManager
457
490
  if (formActionUrl) {
458
- this.store.setService('urlManager', this.urlManager.withConfig((translatorConfig) => {
491
+ this.store.setService('urlManager', this.store.services.urlManager.withConfig((translatorConfig) => {
459
492
  return {
460
493
  ...translatorConfig,
461
494
  urlRoot: formActionUrl,
@@ -484,3 +517,45 @@ async function timeout(time) {
484
517
  window.setTimeout(resolve, time);
485
518
  });
486
519
  }
520
+ // for grabbing other parameters from the form and using them in UrlManager
521
+ const INPUT_TYPE_BLACKLIST = ['file', 'reset', 'submit', 'button', 'image', 'password'];
522
+ function getFormParameters(form, filterFn) {
523
+ const parameters = {};
524
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
525
+ for (let i = form.elements.length - 1; i >= 0; i--) {
526
+ const elem = form.elements[i];
527
+ if (typeof filterFn == 'function' && !filterFn(elem)) {
528
+ continue;
529
+ }
530
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
531
+ if ((elem.type != 'checkbox' && elem.type != 'radio') || elem.checked) {
532
+ parameters[elem.name] = elem.value;
533
+ }
534
+ }
535
+ }
536
+ }
537
+ return parameters;
538
+ }
539
+ function bindFormParameters(form, fn, filterFn) {
540
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
541
+ for (let i = form.elements.length - 1; i >= 0; i--) {
542
+ const elem = form.elements[i];
543
+ if (typeof filterFn == 'function' && !filterFn(elem)) {
544
+ continue;
545
+ }
546
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
547
+ elem.addEventListener('change', fn);
548
+ }
549
+ }
550
+ }
551
+ }
552
+ function unbindFormParameters(form, fn) {
553
+ if (typeof form == 'object' && form.nodeName == 'FORM') {
554
+ for (let i = form.elements.length - 1; i >= 0; i--) {
555
+ const elem = form.elements[i];
556
+ if (elem.name && !INPUT_TYPE_BLACKLIST.includes(elem.type)) {
557
+ elem.removeEventListener('change', fn);
558
+ }
559
+ }
560
+ }
561
+ }
@@ -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,CAchC;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
  };
@@ -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,CAsB1C;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
  };
@@ -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;IA0F3B,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;IAmG3B,KAAK,EAAE,kBAAkB,CAwCvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAsC/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,11 +202,18 @@ 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
  };
201
209
  // deep merge config with defaults
202
210
  this.config = deepmerge(defaultConfig, this.config);
211
+ if (this.config.settings?.infinite && typeof this.config.settings.infinite.restorePosition == 'undefined') {
212
+ this.config.settings.infinite.restorePosition = true;
213
+ }
214
+ if (window?.history && this.config.settings?.infinite?.restorePosition) {
215
+ window.history.scrollRestoration = 'manual';
216
+ }
203
217
  this.store.setConfig(this.config);
204
218
  this.storage = new StorageStore({
205
219
  type: StorageType.SESSION,
@@ -243,8 +257,8 @@ export class SearchController extends AbstractController {
243
257
  delete requestParams.search.redirectResponse;
244
258
  }
245
259
  const stringyParams = JSON.stringify(requestParams);
246
- if (this.config.settings?.infinite && window.scrollY === 0) {
247
- // browser didn't jump
260
+ if (this.config.settings?.infinite?.restorePosition) {
261
+ // restore the scroll position saved previously
248
262
  const scrollMap = this.storage.get('scrollMap') || {};
249
263
  // interval we ony need to keep checking until the page height > than our stored value
250
264
  const scrollToPosition = scrollMap[stringyParams];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searchspring/snap-controller",
3
- "version": "0.30.2",
3
+ "version": "0.33.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.30.2",
23
+ "@searchspring/snap-toolbox": "^0.33.0",
24
24
  "deepmerge": "4.2.2"
25
25
  },
26
26
  "devDependencies": {
27
- "@searchspring/snap-client": "^0.30.2",
28
- "@searchspring/snap-event-manager": "^0.30.2",
29
- "@searchspring/snap-logger": "^0.30.2",
30
- "@searchspring/snap-profiler": "^0.30.2",
31
- "@searchspring/snap-store-mobx": "^0.30.2",
32
- "@searchspring/snap-tracker": "^0.30.2",
33
- "@searchspring/snap-url-manager": "^0.30.2"
27
+ "@searchspring/snap-client": "^0.33.0",
28
+ "@searchspring/snap-event-manager": "^0.33.0",
29
+ "@searchspring/snap-logger": "^0.33.0",
30
+ "@searchspring/snap-profiler": "^0.33.0",
31
+ "@searchspring/snap-store-mobx": "^0.33.0",
32
+ "@searchspring/snap-tracker": "^0.33.0",
33
+ "@searchspring/snap-url-manager": "^0.33.0"
34
34
  },
35
35
  "sideEffects": false,
36
36
  "files": [
37
37
  "dist/**/*"
38
38
  ],
39
- "gitHead": "0d7dc2c374512e097827aa0f6f724d15a771fd5f"
39
+ "gitHead": "e8b01cef364c79bc56e64e695c8bd672ba0859b1"
40
40
  }