@searchspring/snap-controller 0.65.2 → 0.66.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 (25) hide show
  1. package/dist/cjs/Autocomplete/AutocompleteController.d.ts +2 -1
  2. package/dist/cjs/Autocomplete/AutocompleteController.d.ts.map +1 -1
  3. package/dist/cjs/Autocomplete/AutocompleteController.js +35 -26
  4. package/dist/cjs/Recommendation/RecommendationController.d.ts +2 -3
  5. package/dist/cjs/Recommendation/RecommendationController.d.ts.map +1 -1
  6. package/dist/cjs/Recommendation/RecommendationController.js +39 -31
  7. package/dist/cjs/Search/SearchController.d.ts +1 -1
  8. package/dist/cjs/Search/SearchController.d.ts.map +1 -1
  9. package/dist/cjs/Search/SearchController.js +110 -68
  10. package/dist/cjs/utils/isClickWithinProductLink.d.ts +5 -0
  11. package/dist/cjs/utils/isClickWithinProductLink.d.ts.map +1 -0
  12. package/dist/cjs/utils/isClickWithinProductLink.js +22 -0
  13. package/dist/esm/Autocomplete/AutocompleteController.d.ts +2 -1
  14. package/dist/esm/Autocomplete/AutocompleteController.d.ts.map +1 -1
  15. package/dist/esm/Autocomplete/AutocompleteController.js +30 -22
  16. package/dist/esm/Recommendation/RecommendationController.d.ts +2 -3
  17. package/dist/esm/Recommendation/RecommendationController.d.ts.map +1 -1
  18. package/dist/esm/Recommendation/RecommendationController.js +30 -26
  19. package/dist/esm/Search/SearchController.d.ts +1 -1
  20. package/dist/esm/Search/SearchController.d.ts.map +1 -1
  21. package/dist/esm/Search/SearchController.js +94 -54
  22. package/dist/esm/utils/isClickWithinProductLink.d.ts +5 -0
  23. package/dist/esm/utils/isClickWithinProductLink.d.ts.map +1 -0
  24. package/dist/esm/utils/isClickWithinProductLink.js +17 -0
  25. package/package.json +10 -10
@@ -23,6 +23,7 @@ export declare class AutocompleteController extends AbstractController {
23
23
  storage: StorageStore;
24
24
  events: {
25
25
  product: Record<string, {
26
+ click?: boolean;
26
27
  clickThrough?: boolean;
27
28
  impression?: boolean;
28
29
  render?: boolean;
@@ -51,7 +52,7 @@ export declare class AutocompleteController extends AbstractController {
51
52
  bind(): Promise<void>;
52
53
  searchTrending: () => Promise<void>;
53
54
  search: () => Promise<void>;
54
- addToCart: (product: Product) => Promise<void>;
55
+ addToCart: (_products: Product[] | Product) => Promise<void>;
55
56
  }
56
57
  export {};
57
58
  //# sourceMappingURL=AutocompleteController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAiC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAElI,OAAO,KAAK,EAAE,wBAAwB,EAAgE,MAAM,2BAA2B,CAAC;AAaxI,eAAO,MAAM,WAAW,MAAM,CAAC;AA+B/B,KAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QACzD,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAClC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACtC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;IAE7B,MAAM,EAAE;QACP,OAAO,EAAE,MAAM,CACd,MAAM,EACN;YACC,YAAY,CAAC,EAAE,OAAO,CAAC;YACvB,UAAU,CAAC,EAAE,OAAO,CAAC;YACrB,MAAM,CAAC,EAAE,OAAO,CAAC;SACjB,CACD,CAAC;KACF,CAEC;gBAGD,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;IA0E3B,KAAK,EAAE,wBAAwB,CAqD7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CAwCrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBAkDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCAgDhD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,KAAK;;;;uBAyDL,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgF3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CA6I9B;IAEF,SAAS,YAAmB,OAAO,KAAG,QAAQ,IAAI,CAAC,CAGjD;CACF"}
1
+ {"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAiC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAElI,OAAO,KAAK,EAAE,wBAAwB,EAAgE,MAAM,2BAA2B,CAAC;AAcxI,eAAO,MAAM,WAAW,MAAM,CAAC;AA+B/B,KAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QACzD,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAClC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACtC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;IAE7B,MAAM,EAAE;QACP,OAAO,EAAE,MAAM,CACd,MAAM,EACN;YACC,KAAK,CAAC,EAAE,OAAO,CAAC;YAChB,YAAY,CAAC,EAAE,OAAO,CAAC;YACvB,UAAU,CAAC,EAAE,OAAO,CAAC;YACrB,MAAM,CAAC,EAAE,OAAO,CAAC;SACjB,CACD,CAAC;KACF,CAEC;gBAGD,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;IA4E3B,KAAK,EAAE,wBAAwB,CA0D7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CAwCrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BhE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;wBAkDpD,aAAa,KAAG,IAAI;uBAMrB,UAAU,KAAG,IAAI;4BAQN,MAAM,SAAS,CAAC,gBAAgB,CAAC,KAAG,QAAQ,IAAI,CAAC;mCAgDhD,MAAM,WAAW,CAAC,gBAAgB,CAAC,KAAG,IAAI;uBAqBtD,KAAK;;;;uBAyDL,UAAU,KAAG,IAAI;;MAS5B;IAEF,MAAM,IAAI,IAAI;IAgBR,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgF3B,cAAc,QAAa,QAAQ,IAAI,CAAC,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CA0I9B;IAEF,SAAS,cAAqB,OAAO,EAAE,GAAG,OAAO,KAAG,QAAQ,IAAI,CAAC,CAQ/D;CACF"}
@@ -71,6 +71,7 @@ var snap_store_mobx_1 = require("@searchspring/snap-store-mobx");
71
71
  var AbstractController_1 = require("../Abstract/AbstractController");
72
72
  var getParams_1 = require("../utils/getParams");
73
73
  var types_1 = require("../types");
74
+ var isClickWithinProductLink_1 = require("../utils/isClickWithinProductLink");
74
75
  var INPUT_ATTRIBUTE = 'ss-autocomplete-input';
75
76
  exports.INPUT_DELAY = 200;
76
77
  var KEY_ENTER = 13;
@@ -121,21 +122,22 @@ var AutocompleteController = /** @class */ (function (_super) {
121
122
  _this.tracker.events.autocomplete.clickThrough({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
122
123
  _this.events.product[result.id] = _this.events.product[result.id] || {};
123
124
  _this.events.product[result.id].clickThrough = true;
124
- _this.eventManager.fire('track.product.clickThrough', { controller: _this, event: e, products: [result], trackEvent: data });
125
+ _this.eventManager.fire('track.product.clickThrough', { controller: _this, event: e, product: result, trackEvent: data });
125
126
  },
126
127
  click: function (e, result) {
127
- var _a, _b, _c;
128
- if (result.type === 'banner') {
128
+ var _a;
129
+ if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.click) {
129
130
  return;
130
131
  }
131
- // TODO: closest might be going too far - write own function to only go n levels up - additionally check that href includes result.url
132
- var href = ((_a = e.target) === null || _a === void 0 ? void 0 : _a.getAttribute('href')) || ((_c = (_b = e.target) === null || _b === void 0 ? void 0 : _b.closest('a')) === null || _c === void 0 ? void 0 : _c.getAttribute('href'));
133
- if (href) {
134
- _this.track.product.clickThrough(e, result);
135
- }
136
- else {
137
- // TODO: in future, send as an interaction event
132
+ if (result.type === 'banner') {
133
+ return;
138
134
  }
135
+ (0, isClickWithinProductLink_1.isClickWithinProductLink)(e, result) && _this.track.product.clickThrough(e, result);
136
+ _this.events.product[result.id] = _this.events.product[result.id] || {};
137
+ _this.events.product[result.id].click = true;
138
+ setTimeout(function () {
139
+ _this.events.product[result.id].click = false;
140
+ }, isClickWithinProductLink_1.CLICK_DUPLICATION_TIMEOUT);
139
141
  },
140
142
  render: function (result) {
141
143
  var _a, _b;
@@ -145,7 +147,7 @@ var AutocompleteController = /** @class */ (function (_super) {
145
147
  _this.tracker.events.autocomplete.render({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
146
148
  _this.events.product[result.id] = _this.events.product[result.id] || {};
147
149
  _this.events.product[result.id].render = true;
148
- _this.eventManager.fire('track.product.render', { controller: _this, products: [result], trackEvent: data });
150
+ _this.eventManager.fire('track.product.render', { controller: _this, product: result, trackEvent: data });
149
151
  },
150
152
  impression: function (result) {
151
153
  var _a, _b;
@@ -155,20 +157,20 @@ var AutocompleteController = /** @class */ (function (_super) {
155
157
  _this.tracker.events.autocomplete.impression({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
156
158
  _this.events.product[result.id] = _this.events.product[result.id] || {};
157
159
  _this.events.product[result.id].impression = true;
158
- _this.eventManager.fire('track.product.impression', { controller: _this, products: [result], trackEvent: data });
160
+ _this.eventManager.fire('track.product.impression', { controller: _this, product: result, trackEvent: data });
159
161
  },
160
162
  addToCart: function (result) {
161
163
  var _a;
162
164
  var data = getAutocompleteAddtocartSchemaData({ params: _this.params, store: _this.store, results: [result] });
163
165
  _this.tracker.events.autocomplete.addToCart({ data: data, siteId: (_a = _this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
164
- _this.eventManager.fire('track.product.addToCart', { controller: _this, products: [result], trackEvent: data });
166
+ _this.eventManager.fire('track.product.addToCart', { controller: _this, product: result, trackEvent: data });
165
167
  },
166
168
  },
167
169
  redirect: function (redirectURL) {
168
170
  var _a;
169
171
  var data = getAutocompleteRedirectSchemaData({ redirectURL: redirectURL });
170
172
  _this.tracker.events.autocomplete.redirect({ data: data, siteId: (_a = _this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
171
- _this.eventManager.fire('track.product.redirect', { controller: _this, redirectURL: redirectURL, trackEvent: data });
173
+ _this.eventManager.fire('track.redirect', { controller: _this, redirectURL: redirectURL, trackEvent: data });
172
174
  },
173
175
  };
174
176
  _this.handlers = {
@@ -444,8 +446,6 @@ var AutocompleteController = /** @class */ (function (_super) {
444
446
  _d.sent();
445
447
  _d.label = 2;
446
448
  case 2:
447
- // reset events for new search
448
- this.events = { product: {} };
449
449
  // if urlManager has no query, there will be no need to get params and no query
450
450
  if (!this.urlManager.state.query) {
451
451
  return [2 /*return*/];
@@ -595,10 +595,17 @@ var AutocompleteController = /** @class */ (function (_super) {
595
595
  }
596
596
  });
597
597
  }); };
598
- _this.addToCart = function (product) { return __awaiter(_this, void 0, void 0, function () {
598
+ _this.addToCart = function (_products) { return __awaiter(_this, void 0, void 0, function () {
599
+ var products;
600
+ var _this = this;
599
601
  return __generator(this, function (_a) {
600
- this.track.product.addToCart(product);
601
- this.eventManager.fire('addToCart', { controller: this, products: [product] });
602
+ products = typeof _products.slice == 'function' ? _products.slice() : [_products];
603
+ products.forEach(function (product) {
604
+ _this.track.product.addToCart(product);
605
+ });
606
+ if (products.length > 0) {
607
+ this.eventManager.fire('addToCart', { controller: this, products: products });
608
+ }
602
609
  return [2 /*return*/];
603
610
  });
604
611
  }); };
@@ -618,7 +625,7 @@ var AutocompleteController = /** @class */ (function (_super) {
618
625
  key: "ss-controller-".concat(_this.config.id),
619
626
  });
620
627
  _this.eventManager.on('afterStore', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
621
- var controller, products, results, data;
628
+ var controller, products, results, data_1;
622
629
  var _this = this;
623
630
  var _a;
624
631
  return __generator(this, function (_b) {
@@ -630,13 +637,15 @@ var AutocompleteController = /** @class */ (function (_super) {
630
637
  if (controller.store.loaded && !controller.store.error) {
631
638
  products = controller.store.results.filter(function (result) { return result.type === 'product'; });
632
639
  results = products.length === 0 ? [] : products;
633
- data = getAutocompleteSchemaData({ params: this.params, store: this.store, results: results });
634
- this.tracker.events.autocomplete.render({ data: data, siteId: (_a = this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
640
+ data_1 = getAutocompleteSchemaData({ params: search.request, store: this.store, results: results });
641
+ this.tracker.events.autocomplete.render({ data: data_1, siteId: (_a = this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
635
642
  products.forEach(function (result) {
636
643
  _this.events.product[result.id] = _this.events.product[result.id] || {};
637
644
  _this.events.product[result.id].render = true;
645
+ _this.eventManager.fire('track.product.render', { controller: _this, product: result, trackEvent: data_1 });
638
646
  });
639
- this.eventManager.fire('track.product.render', { controller: this, products: products, trackEvent: data });
647
+ // reset events for new search. It's here for a reason. Ensures render happens before impressions on new input value?
648
+ this.events = { product: {} };
640
649
  }
641
650
  return [2 /*return*/];
642
651
  }
@@ -977,7 +986,7 @@ function getAutocompleteSchemaData(_a) {
977
986
  }
978
987
  return acc;
979
988
  }, {});
980
- return __assign(__assign({ q: ((_d = (_c = store.search) === null || _c === void 0 ? void 0 : _c.originalQuery) === null || _d === void 0 ? void 0 : _d.string) || ((_f = (_e = store.search) === null || _e === void 0 ? void 0 : _e.query) === null || _f === void 0 ? void 0 : _f.string) || '', correctedQuery: ((_h = (_g = store.search) === null || _g === void 0 ? void 0 : _g.originalQuery) === null || _h === void 0 ? void 0 : _h.string) ? (_k = (_j = store.search) === null || _j === void 0 ? void 0 : _j.query) === null || _k === void 0 ? void 0 : _k.string : undefined }, filters), { sort: (_l = params.sorts) === null || _l === void 0 ? void 0 : _l.map(function (sort) {
989
+ return __assign(__assign({ q: ((_d = (_c = store.search) === null || _c === void 0 ? void 0 : _c.originalQuery) === null || _d === void 0 ? void 0 : _d.string) || ((_f = (_e = store.search) === null || _e === void 0 ? void 0 : _e.query) === null || _f === void 0 ? void 0 : _f.string) || '', correctedQuery: ((_h = (_g = store.search) === null || _g === void 0 ? void 0 : _g.originalQuery) === null || _h === void 0 ? void 0 : _h.string) ? (_k = (_j = store.search) === null || _j === void 0 ? void 0 : _j.query) === null || _k === void 0 ? void 0 : _k.string : undefined, matchType: store.search.matchType }, filters), { sort: (_l = params.sorts) === null || _l === void 0 ? void 0 : _l.map(function (sort) {
981
990
  return {
982
991
  field: sort.field,
983
992
  dir: sort.direction,
@@ -1001,11 +1010,11 @@ function getAutocompleteSchemaData(_a) {
1001
1010
  undefined,
1002
1011
  }, results: (results === null || results === void 0 ? void 0 : results.map(function (result) {
1003
1012
  var core = result.mappings.core;
1013
+ var position = result.position;
1004
1014
  return {
1015
+ position: position,
1005
1016
  uid: core.uid || '',
1006
- // childUid: core.uid,
1007
1017
  sku: core.sku,
1008
- // childSku: core.sku,
1009
1018
  };
1010
1019
  })) || [] });
1011
1020
  }
@@ -12,9 +12,6 @@ type RecommendationTrackMethods = {
12
12
  impression: (result: Product) => void;
13
13
  addToCart: (result: Product) => void;
14
14
  };
15
- bundle: {
16
- addToCart: (results: Product[]) => void;
17
- };
18
15
  };
19
16
  export declare class RecommendationController extends AbstractController {
20
17
  type: ControllerTypes;
@@ -22,6 +19,7 @@ export declare class RecommendationController extends AbstractController {
22
19
  config: RecommendationControllerConfig;
23
20
  events: {
24
21
  product: Record<string, {
22
+ click?: boolean;
25
23
  clickThrough?: boolean;
26
24
  impression?: boolean;
27
25
  render?: boolean;
@@ -31,6 +29,7 @@ export declare class RecommendationController extends AbstractController {
31
29
  track: RecommendationTrackMethods;
32
30
  get params(): RecommendRequestModel;
33
31
  search: () => Promise<void>;
32
+ addToCart: (_products: Product[] | Product) => Promise<void>;
34
33
  }
35
34
  export {};
36
35
  //# sourceMappingURL=RecommendationController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RecommendationController.d.ts","sourceRoot":"","sources":["../../../src/Recommendation/RecommendationController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,gBAAgB,EAAiB,MAAM,UAAU,CAAC;AAKpH,KAAK,0BAA0B,GAAG;IACjC,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAChD,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAClC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACtC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;KACrC,CAAC;IACF,MAAM,EAAE;QACP,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;KACxC,CAAC;CACF,CAAC;AAUF,qBAAa,wBAAyB,SAAQ,kBAAkB;IACxD,IAAI,kBAAkC;IACrC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,8BAA8B,CAAC;IAE/C,MAAM,EAAE;QACP,OAAO,EAAE,MAAM,CACd,MAAM,EACN;YACC,YAAY,CAAC,EAAE,OAAO,CAAC;YACvB,UAAU,CAAC,EAAE,OAAO,CAAC;YACrB,MAAM,CAAC,EAAE,OAAO,CAAC;SACjB,CACD,CAAC;KACF,CAEC;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;IAwD3B,KAAK,EAAE,0BAA0B,CAyD/B;IAEF,IAAI,MAAM,IAAI,qBAAqB,CA4BlC;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA6H9B;CACF"}
1
+ {"version":3,"file":"RecommendationController.d.ts","sourceRoot":"","sources":["../../../src/Recommendation/RecommendationController.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,8BAA8B,EAAE,kBAAkB,EAAE,gBAAgB,EAAiB,MAAM,UAAU,CAAC;AAKpH,KAAK,0BAA0B,GAAG;IACjC,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAChD,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAClC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACtC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;KACrC,CAAC;CACF,CAAC;AAUF,qBAAa,wBAAyB,SAAQ,kBAAkB;IACxD,IAAI,kBAAkC;IACrC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,MAAM,EAAE,8BAA8B,CAAC;IAE/C,MAAM,EAAE;QACP,OAAO,EAAE,MAAM,CACd,MAAM,EACN;YACC,KAAK,CAAC,EAAE,OAAO,CAAC;YAChB,YAAY,CAAC,EAAE,OAAO,CAAC;YACvB,UAAU,CAAC,EAAE,OAAO,CAAC;YACrB,MAAM,CAAC,EAAE,OAAO,CAAC;SACjB,CACD,CAAC;KACF,CAEC;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;IAwD3B,KAAK,EAAE,0BAA0B,CAuD/B;IAEF,IAAI,MAAM,IAAI,qBAAqB,CA4BlC;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA6H9B;IAEF,SAAS,cAAqB,OAAO,EAAE,GAAG,OAAO,KAAG,QAAQ,IAAI,CAAC,CAQ/D;CACF"}
@@ -70,6 +70,7 @@ var deepmerge_1 = __importDefault(require("deepmerge"));
70
70
  var snap_store_mobx_1 = require("@searchspring/snap-store-mobx");
71
71
  var AbstractController_1 = require("../Abstract/AbstractController");
72
72
  var types_1 = require("../types");
73
+ var isClickWithinProductLink_1 = require("../utils/isClickWithinProductLink");
73
74
  var defaultConfig = {
74
75
  id: 'recommend',
75
76
  tag: '',
@@ -97,18 +98,22 @@ var RecommendationController = /** @class */ (function (_super) {
97
98
  _this.tracker.events.recommendations.clickThrough({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
98
99
  _this.events.product[result.id] = _this.events.product[result.id] || {};
99
100
  _this.events.product[result.id].clickThrough = true;
100
- _this.eventManager.fire('track.product.clickThrough', { controller: _this, event: e, products: [result], trackEvent: data });
101
+ _this.eventManager.fire('track.product.clickThrough', { controller: _this, event: e, product: result, trackEvent: data });
101
102
  },
102
103
  click: function (e, result) {
103
- var _a, _b, _c;
104
- // TODO: closest might be going too far - write own function to only go n levels up - additionally check that href includes result.url
105
- var href = ((_a = e.target) === null || _a === void 0 ? void 0 : _a.getAttribute('href')) || ((_c = (_b = e.target) === null || _b === void 0 ? void 0 : _b.closest('a')) === null || _c === void 0 ? void 0 : _c.getAttribute('href'));
106
- if (href) {
107
- _this.track.product.clickThrough(e, result);
104
+ var _a;
105
+ if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.click) {
106
+ return;
108
107
  }
109
- else {
110
- // TODO: in future, send as an interaction event
108
+ if (result.type === 'banner') {
109
+ return;
111
110
  }
111
+ (0, isClickWithinProductLink_1.isClickWithinProductLink)(e, result) && _this.track.product.clickThrough(e, result);
112
+ _this.events.product[result.id] = _this.events.product[result.id] || {};
113
+ _this.events.product[result.id].click = true;
114
+ setTimeout(function () {
115
+ _this.events.product[result.id].click = false;
116
+ }, isClickWithinProductLink_1.CLICK_DUPLICATION_TIMEOUT);
112
117
  },
113
118
  impression: function (result) {
114
119
  var _a, _b;
@@ -118,7 +123,7 @@ var RecommendationController = /** @class */ (function (_super) {
118
123
  _this.tracker.events.recommendations.impression({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
119
124
  _this.events.product[result.id] = _this.events.product[result.id] || {};
120
125
  _this.events.product[result.id].impression = true;
121
- _this.eventManager.fire('track.product.impression', { controller: _this, products: [result], trackEvent: data });
126
+ _this.eventManager.fire('track.product.impression', { controller: _this, product: result, trackEvent: data });
122
127
  return data;
123
128
  },
124
129
  render: function (result) {
@@ -129,25 +134,14 @@ var RecommendationController = /** @class */ (function (_super) {
129
134
  _this.tracker.events.recommendations.render({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
130
135
  _this.events.product[result.id] = _this.events.product[result.id] || {};
131
136
  _this.events.product[result.id].render = true;
132
- _this.eventManager.fire('track.product.render', { controller: _this, products: [result], trackEvent: data });
137
+ _this.eventManager.fire('track.product.render', { controller: _this, product: result, trackEvent: data });
133
138
  return data;
134
139
  },
135
140
  addToCart: function (result) {
136
141
  var _a;
137
142
  var data = getRecommendationsAddtocartSchemaData({ store: _this.store, results: [result] });
138
143
  _this.tracker.events.recommendations.addToCart({ data: data, siteId: (_a = _this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
139
- _this.eventManager.fire('track.product.addToCart', { controller: _this, products: [result], trackEvent: data });
140
- return data;
141
- },
142
- },
143
- bundle: {
144
- addToCart: function (results) {
145
- var _a;
146
- if (_this.store.profile.type != 'bundle')
147
- return;
148
- var data = getRecommendationsAddtocartSchemaData({ store: _this.store, results: results });
149
- _this.tracker.events.recommendations.addToCart({ data: data, siteId: (_a = _this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
150
- _this.eventManager.fire('track.bundle.addToCart', { controller: _this, products: results, trackEvent: data });
144
+ _this.eventManager.fire('track.product.addToCart', { controller: _this, product: result, trackEvent: data });
151
145
  return data;
152
146
  },
153
147
  },
@@ -302,6 +296,20 @@ var RecommendationController = /** @class */ (function (_super) {
302
296
  }
303
297
  });
304
298
  }); };
299
+ _this.addToCart = function (_products) { return __awaiter(_this, void 0, void 0, function () {
300
+ var products;
301
+ var _this = this;
302
+ return __generator(this, function (_a) {
303
+ products = typeof _products.slice == 'function' ? _products.slice() : [_products];
304
+ products.forEach(function (product) {
305
+ _this.track.product.addToCart(product);
306
+ });
307
+ if (products.length > 0) {
308
+ this.eventManager.fire('addToCart', { controller: this, products: products });
309
+ }
310
+ return [2 /*return*/];
311
+ });
312
+ }); };
305
313
  if (!config.tag) {
306
314
  throw new Error("Invalid config passed to RecommendationController. The \"tag\" attribute is required.");
307
315
  }
@@ -318,7 +326,7 @@ var RecommendationController = /** @class */ (function (_super) {
318
326
  _this.config = (0, deepmerge_1.default)(defaultConfig, _this.config);
319
327
  _this.store.setConfig(_this.config);
320
328
  _this.eventManager.on('afterStore', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
321
- var controller, products, results, data;
329
+ var controller, products, results, data_1;
322
330
  var _this = this;
323
331
  var _a;
324
332
  return __generator(this, function (_b) {
@@ -330,13 +338,13 @@ var RecommendationController = /** @class */ (function (_super) {
330
338
  if (controller.store.loaded && !controller.store.error) {
331
339
  products = controller.store.results.filter(function (result) { return result.type === 'product'; });
332
340
  results = products.length === 0 ? [] : products;
333
- data = getRecommendationsSchemaData({ store: this.store, results: results });
334
- this.tracker.events.recommendations.render({ data: data, siteId: (_a = this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
341
+ data_1 = getRecommendationsSchemaData({ store: this.store, results: results });
342
+ this.tracker.events.recommendations.render({ data: data_1, siteId: (_a = this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
335
343
  products.forEach(function (result) {
336
344
  _this.events.product[result.id] = _this.events.product[result.id] || {};
337
345
  _this.events.product[result.id].render = true;
346
+ _this.eventManager.fire('track.product.render', { controller: _this, product: result, trackEvent: data_1 });
338
347
  });
339
- this.eventManager.fire('track.product.render', { controller: this, products: products, trackEvent: data });
340
348
  }
341
349
  return [2 /*return*/];
342
350
  }
@@ -389,9 +397,9 @@ function getRecommendationsAddtocartSchemaData(_a) {
389
397
  results: (results === null || results === void 0 ? void 0 : results.map(function (result) {
390
398
  var core = result.mappings.core;
391
399
  return {
392
- uid: core.uid || '',
393
- sku: core.sku,
394
- price: Number(core.price),
400
+ uid: (core === null || core === void 0 ? void 0 : core.uid) || '',
401
+ sku: core === null || core === void 0 ? void 0 : core.sku,
402
+ price: Number(core === null || core === void 0 ? void 0 : core.price),
395
403
  qty: result.quantity || 1,
396
404
  };
397
405
  })) || [],
@@ -403,11 +411,11 @@ function getRecommendationsSchemaData(_a) {
403
411
  tag: store.profile.tag,
404
412
  results: (results === null || results === void 0 ? void 0 : results.map(function (result) {
405
413
  var core = result.mappings.core;
414
+ var position = result.position;
406
415
  return {
416
+ position: position,
407
417
  uid: core.uid || '',
408
- // childUid: core.uid,
409
418
  sku: core.sku,
410
- // childSku: core.sku,
411
419
  };
412
420
  })) || [],
413
421
  };
@@ -26,7 +26,7 @@ export declare class SearchController extends AbstractController {
26
26
  track: SearchTrackMethods;
27
27
  get params(): SearchRequestModel;
28
28
  search: () => Promise<void>;
29
- addToCart: (product: Product) => Promise<void>;
29
+ addToCart: (_products: Product[] | Product) => Promise<void>;
30
30
  }
31
31
  export declare function getStorableRequestParams(request: SearchRequestModel): SearchRequestModel;
32
32
  export declare function generateHrefSelector(element: HTMLElement, href: string, levels?: number): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAa,MAAM,+BAA+B,CAAC;AAExE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,KAAK,EACX,sBAAsB,EAGtB,kBAAkB,EAClB,gBAAgB,EAIhB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EACX,kBAAkB,EAOlB,MAAM,2BAA2B,CAAC;AAgCnC,KAAK,kBAAkB,GAAG;IACzB,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QACzD,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAClC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACtC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,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;IAC/D,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,MAAM,CASM;gBAGnB,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;IAqN3B,KAAK,EAAE,kBAAkB,CA0FvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CA8C/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CAuN9B;IAEF,SAAS,YAAmB,OAAO,KAAG,QAAQ,IAAI,CAAC,CAGjD;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,GAAG,SAAS,CAgCvG"}
1
+ {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../src/Search/SearchController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAa,MAAM,+BAA+B,CAAC;AAExE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,KAAK,EACX,sBAAsB,EAGtB,kBAAkB,EAClB,gBAAgB,EAIhB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EACX,kBAAkB,EAQlB,MAAM,2BAA2B,CAAC;AAkCnC,KAAK,kBAAkB,GAAG;IACzB,OAAO,EAAE;QACR,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;QACzD,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QAClC,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;QACtC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;KACtC,CAAC;IACF,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC,CAAC;AAGF,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;IAC/D,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,MAAM,CAUM;gBAGnB,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;IAuN3B,KAAK,EAAE,kBAAkB,CA+FvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CA8C/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CAyN9B;IAEF,SAAS,cAAqB,OAAO,EAAE,GAAG,OAAO,KAAG,QAAQ,IAAI,CAAC,CAQ/D;CACF;AAwBD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,GAAG,SAAS,CAgCvG"}