@searchspring/snap-controller 0.32.0 → 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 +30 -26
  14. package/dist/esm/Abstract/AbstractController.d.ts +1 -0
  15. package/dist/esm/Abstract/AbstractController.d.ts.map +1 -1
  16. package/dist/esm/Abstract/AbstractController.js +37 -0
  17. package/dist/esm/Autocomplete/AutocompleteController.d.ts +1 -0
  18. package/dist/esm/Autocomplete/AutocompleteController.d.ts.map +1 -1
  19. package/dist/esm/Autocomplete/AutocompleteController.js +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 +6 -2
  27. package/package.json +10 -10
@@ -25,6 +25,7 @@ export declare abstract class AbstractController {
25
25
  };
26
26
  protected _initialized: boolean;
27
27
  get initialized(): boolean;
28
+ handleError: (err: unknown) => void;
28
29
  constructor(config: ControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
29
30
  createTargeter(target: Target, onTarget: OnTarget, document?: Document): DomTargeter | undefined;
30
31
  addTargeter(target: DomTargeter): DomTargeter | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractController.d.ts","sourceRoot":"","sources":["../../../src/Abstract/AbstractController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEpH,8BAAsB,kBAAkB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,SAAc;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,gBAAgB,CAAC;IAE1B,SAAS,EAAE;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;KAC3B,CAAM;IAEP,SAAS,CAAC,YAAY,UAAS;IAE/B,IAAI,WAAW,IAAI,OAAO,CAEzB;gBAGA,MAAM,EAAE,gBAAgB,EACxB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,GAAE,gBAAqB;IA2DxB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS;IAIhG,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS;IASnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C3B,QAAQ,IAAI,IAAI;aAMP,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAE1B,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAIpD,GAAG,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;CAoC1C"}
1
+ {"version":3,"file":"AbstractController.d.ts","sourceRoot":"","sources":["../../../src/Abstract/AbstractController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAmB,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEpH,8BAAsB,kBAAkB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,SAAc;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,gBAAgB,CAAC;IAE1B,SAAS,EAAE;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;KAC3B,CAAM;IAEP,SAAS,CAAC,YAAY,UAAS;IAE/B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEM,WAAW,QAAS,OAAO,KAAG,IAAI,CA0CvC;gBAGD,MAAM,EAAE,gBAAgB,EACxB,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,GAAE,gBAAqB;IA2DxB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS;IAIhG,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS;IASnD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgD3B,QAAQ,IAAI,IAAI;aAMP,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAE1B,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAIpD,GAAG,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;CAoC1C"}
@@ -51,9 +51,46 @@ var AbstractController = /** @class */ (function () {
51
51
  function AbstractController(config, _a, context) {
52
52
  var client = _a.client, store = _a.store, urlManager = _a.urlManager, eventManager = _a.eventManager, profiler = _a.profiler, logger = _a.logger, tracker = _a.tracker;
53
53
  if (context === void 0) { context = {}; }
54
+ var _this = this;
54
55
  this.type = 'abstract';
55
56
  this.targeters = {};
56
57
  this._initialized = false;
58
+ this.handleError = function (err) {
59
+ var event;
60
+ if (err instanceof ErrorEvent) {
61
+ event = err;
62
+ }
63
+ else if (err instanceof Error) {
64
+ event = new ErrorEvent('error', {
65
+ error: err,
66
+ });
67
+ }
68
+ else if (typeof err === 'string') {
69
+ event = new ErrorEvent('error', {
70
+ error: new Error(err),
71
+ });
72
+ }
73
+ else if (typeof err === 'object' && Object.keys(err).length) {
74
+ try {
75
+ event = new ErrorEvent('error', {
76
+ error: new Error(JSON.stringify(err)),
77
+ });
78
+ }
79
+ catch (e) { }
80
+ }
81
+ if (event) {
82
+ var filename = event.filename, colno = event.colno, lineno = event.lineno, stack = event.error.stack, message = event.message, timeStamp = event.timeStamp;
83
+ var beaconPayload = {
84
+ filename: filename || "".concat(_this.id, " (").concat(_this.type.charAt(0).toUpperCase() + _this.type.slice(1), "Controller)"),
85
+ stack: stack,
86
+ message: message,
87
+ colno: colno,
88
+ lineno: lineno,
89
+ errortimestamp: timeStamp,
90
+ };
91
+ _this.tracker.track.error(beaconPayload);
92
+ }
93
+ };
57
94
  if (typeof config != 'object' || typeof config.id != 'string' || !config.id.match(/^[a-zA-Z0-9_-]*$/)) {
58
95
  throw new Error("Invalid config passed to controller. The \"id\" attribute must be an alphanumeric string.");
59
96
  }
@@ -156,6 +193,7 @@ var AbstractController = /** @class */ (function () {
156
193
  err_2 = _a.sent();
157
194
  if (err_2) {
158
195
  console.error(err_2);
196
+ this.handleError(err_2);
159
197
  }
160
198
  return [3 /*break*/, 7];
161
199
  case 7:
@@ -27,6 +27,7 @@ export declare class AutocompleteController extends AbstractController {
27
27
  escKey: (e: KeyboardEvent) => void;
28
28
  focus: (e: FocusEvent) => void;
29
29
  formSubmit: (e: React.FormEvent<HTMLInputElement>) => Promise<void>;
30
+ formElementChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
30
31
  keyUp: (e: KeyboardEvent) => void;
31
32
  timeoutDelay: NodeJS.Timeout | undefined;
32
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEnJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,eAAO,MAAM,WAAW,MAAM,CAAC;AAoB/B,aAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAoD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA+BrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBA6CpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;uBA0C5D,aAAa,KAAG,IAAI;;;;uBA8CpB,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAYR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2D3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAsBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAgH9B;CACF"}
1
+ {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAkD,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEnJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,eAAO,MAAM,WAAW,MAAM,CAAC;AAqB/B,aAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAoD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,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;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;IAmG3B,KAAK,EAAE,kBAAkB,CAwCvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAsC/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA8J9B;CACF"}
@@ -104,6 +104,7 @@ var SearchController = /** @class */ (function (_super) {
104
104
  var _b, _c, _d;
105
105
  _this = _super.call(this, config, { client: client, store: store, urlManager: urlManager, eventManager: eventManager, profiler: profiler, logger: logger, tracker: tracker }, context) || this;
106
106
  _this.type = types_1.ControllerTypes.search;
107
+ _this.previousResults = [];
107
108
  _this.track = {
108
109
  product: {
109
110
  click: function (e, result) {
@@ -143,32 +144,32 @@ var SearchController = /** @class */ (function (_super) {
143
144
  };
144
145
  _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
145
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;
146
- var _b, _c, _d, _e, _f, _g, _h, _j, _k;
147
- return __generator(this, function (_l) {
148
- 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) {
149
150
  case 0:
150
151
  if (!!this.initialized) return [3 /*break*/, 2];
151
152
  return [4 /*yield*/, this.init()];
152
153
  case 1:
153
- _l.sent();
154
- _l.label = 2;
154
+ _m.sent();
155
+ _m.label = 2;
155
156
  case 2:
156
157
  params = this.params;
157
- _l.label = 3;
158
+ _m.label = 3;
158
159
  case 3:
159
- _l.trys.push([3, 20, , 21]);
160
- _l.label = 4;
160
+ _m.trys.push([3, 20, , 21]);
161
+ _m.label = 4;
161
162
  case 4:
162
- _l.trys.push([4, 6, , 7]);
163
+ _m.trys.push([4, 6, , 7]);
163
164
  return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
164
165
  controller: this,
165
166
  request: params,
166
167
  })];
167
168
  case 5:
168
- _l.sent();
169
+ _m.sent();
169
170
  return [3 /*break*/, 7];
170
171
  case 6:
171
- err_1 = _l.sent();
172
+ err_1 = _m.sent();
172
173
  if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
173
174
  this.log.warn("'beforeSearch' middleware cancelled");
174
175
  return [2 /*return*/];
@@ -197,7 +198,7 @@ var SearchController = /** @class */ (function (_super) {
197
198
  searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
198
199
  return [4 /*yield*/, this.client.search(params)];
199
200
  case 8:
200
- _a = _l.sent(), meta = _a[0], response = _a[1];
201
+ _a = _m.sent(), meta = _a[0], response = _a[1];
201
202
  // @ts-ignore
202
203
  if (!response.meta) {
203
204
  /**
@@ -208,7 +209,7 @@ var SearchController = /** @class */ (function (_super) {
208
209
  response.meta = meta;
209
210
  }
210
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];
211
- previousResults_1 = JSON.parse(JSON.stringify(this.store.results)) || [];
212
+ previousResults_1 = this.previousResults;
212
213
  if (!(((_j = this.config.settings) === null || _j === void 0 ? void 0 : _j.infinite.backfill) && !previousResults_1.length)) return [3 /*break*/, 10];
213
214
  backfills = [];
214
215
  for (page = 1; page < ((_k = params.pagination) === null || _k === void 0 ? void 0 : _k.page); page++) {
@@ -217,32 +218,32 @@ var SearchController = /** @class */ (function (_super) {
217
218
  }
218
219
  return [4 /*yield*/, Promise.all(backfills)];
219
220
  case 9:
220
- backfillResponses = _l.sent();
221
+ backfillResponses = _m.sent();
221
222
  backfillResponses.map(function (_a) {
222
223
  var meta = _a[0], data = _a[1];
223
224
  previousResults_1 = previousResults_1.concat(data.results);
224
225
  });
225
- _l.label = 10;
226
+ _m.label = 10;
226
227
  case 10:
227
228
  response.results = __spreadArray(__spreadArray([], previousResults_1, true), (response.results || []), true);
228
- _l.label = 11;
229
+ _m.label = 11;
229
230
  case 11:
230
231
  searchProfile.stop();
231
232
  this.log.profile(searchProfile);
232
233
  afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params }).start();
233
- _l.label = 12;
234
+ _m.label = 12;
234
235
  case 12:
235
- _l.trys.push([12, 14, , 15]);
236
+ _m.trys.push([12, 14, , 15]);
236
237
  return [4 /*yield*/, this.eventManager.fire('afterSearch', {
237
238
  controller: this,
238
239
  request: params,
239
240
  response: response,
240
241
  })];
241
242
  case 13:
242
- _l.sent();
243
+ _m.sent();
243
244
  return [3 /*break*/, 15];
244
245
  case 14:
245
- err_2 = _l.sent();
246
+ err_2 = _m.sent();
246
247
  if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
247
248
  this.log.warn("'afterSearch' middleware cancelled");
248
249
  afterSearchProfile.stop();
@@ -256,23 +257,25 @@ var SearchController = /** @class */ (function (_super) {
256
257
  case 15:
257
258
  afterSearchProfile.stop();
258
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
+ }
259
263
  // update the store
260
- // @ts-ignore
261
264
  this.store.update(response);
262
265
  afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
263
- _l.label = 16;
266
+ _m.label = 16;
264
267
  case 16:
265
- _l.trys.push([16, 18, , 19]);
268
+ _m.trys.push([16, 18, , 19]);
266
269
  return [4 /*yield*/, this.eventManager.fire('afterStore', {
267
270
  controller: this,
268
271
  request: params,
269
272
  response: response,
270
273
  })];
271
274
  case 17:
272
- _l.sent();
275
+ _m.sent();
273
276
  return [3 /*break*/, 19];
274
277
  case 18:
275
- err_3 = _l.sent();
278
+ err_3 = _m.sent();
276
279
  if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
277
280
  this.log.warn("'afterStore' middleware cancelled");
278
281
  afterStoreProfile.stop();
@@ -288,7 +291,7 @@ var SearchController = /** @class */ (function (_super) {
288
291
  this.log.profile(afterStoreProfile);
289
292
  return [3 /*break*/, 21];
290
293
  case 20:
291
- err_4 = _l.sent();
294
+ err_4 = _m.sent();
292
295
  if (err_4) {
293
296
  switch (err_4) {
294
297
  case 429:
@@ -312,6 +315,7 @@ var SearchController = /** @class */ (function (_super) {
312
315
  break;
313
316
  }
314
317
  this.store.loading = false;
318
+ this.handleError(err_4);
315
319
  }
316
320
  return [3 /*break*/, 21];
317
321
  case 21: return [2 /*return*/];
@@ -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;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;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) => {
@@ -112,7 +113,7 @@ export class SearchController extends AbstractController {
112
113
  // if params.page > 1 and infinite setting exists we should append results
113
114
  if (this.config.settings?.infinite && params.pagination?.page > 1) {
114
115
  // if no results fetch results...
115
- let previousResults = JSON.parse(JSON.stringify(this.store.results)) || [];
116
+ let previousResults = this.previousResults;
116
117
  if (this.config.settings?.infinite.backfill && !previousResults.length) {
117
118
  // figure out how many pages of results to backfill and wait on all responses
118
119
  const backfills = [];
@@ -150,8 +151,10 @@ export class SearchController extends AbstractController {
150
151
  }
151
152
  afterSearchProfile.stop();
152
153
  this.log.profile(afterSearchProfile);
154
+ if (this.config.settings?.infinite) {
155
+ this.previousResults = JSON.parse(JSON.stringify(response.results));
156
+ }
153
157
  // update the store
154
- // @ts-ignore
155
158
  this.store.update(response);
156
159
  const afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
157
160
  try {
@@ -199,6 +202,7 @@ export class SearchController extends AbstractController {
199
202
  break;
200
203
  }
201
204
  this.store.loading = false;
205
+ this.handleError(err);
202
206
  }
203
207
  }
204
208
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searchspring/snap-controller",
3
- "version": "0.32.0",
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.32.0",
23
+ "@searchspring/snap-toolbox": "^0.33.0",
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.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": "d63f3b80dca47a54658a6e61c1311044028ff060"
39
+ "gitHead": "e8b01cef364c79bc56e64e695c8bd672ba0859b1"
40
40
  }