@searchspring/snap-controller 0.63.5 → 0.65.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.
- package/dist/cjs/Autocomplete/AutocompleteController.d.ts +15 -2
- package/dist/cjs/Autocomplete/AutocompleteController.d.ts.map +1 -1
- package/dist/cjs/Autocomplete/AutocompleteController.js +133 -7
- package/dist/cjs/Finder/FinderController.d.ts.map +1 -1
- package/dist/cjs/Finder/FinderController.js +1 -3
- package/dist/cjs/Recommendation/RecommendationController.d.ts +12 -16
- package/dist/cjs/Recommendation/RecommendationController.d.ts.map +1 -1
- package/dist/cjs/Recommendation/RecommendationController.js +83 -320
- package/dist/cjs/Search/SearchController.d.ts +10 -3
- package/dist/cjs/Search/SearchController.d.ts.map +1 -1
- package/dist/cjs/Search/SearchController.js +221 -48
- package/dist/esm/Autocomplete/AutocompleteController.d.ts +15 -2
- package/dist/esm/Autocomplete/AutocompleteController.d.ts.map +1 -1
- package/dist/esm/Autocomplete/AutocompleteController.js +127 -7
- package/dist/esm/Finder/FinderController.d.ts.map +1 -1
- package/dist/esm/Finder/FinderController.js +1 -3
- package/dist/esm/Recommendation/RecommendationController.d.ts +12 -16
- package/dist/esm/Recommendation/RecommendationController.d.ts.map +1 -1
- package/dist/esm/Recommendation/RecommendationController.js +79 -302
- package/dist/esm/Search/SearchController.d.ts +10 -3
- package/dist/esm/Search/SearchController.d.ts.map +1 -1
- package/dist/esm/Search/SearchController.js +178 -22
- package/package.json +10 -10
|
@@ -81,6 +81,8 @@ var AbstractController_1 = require("../Abstract/AbstractController");
|
|
|
81
81
|
var snap_store_mobx_1 = require("@searchspring/snap-store-mobx");
|
|
82
82
|
var getParams_1 = require("../utils/getParams");
|
|
83
83
|
var types_1 = require("../types");
|
|
84
|
+
var BACKGROUND_FILTER_FIELD_MATCHES = ['collection', 'category', 'categories', 'hierarchy'];
|
|
85
|
+
var BACKGROUND_FILTERS_VALUE_FLAGS = [1, 0, '1', '0', 'true', 'false', true, false];
|
|
84
86
|
var defaultConfig = {
|
|
85
87
|
id: 'search',
|
|
86
88
|
globals: {},
|
|
@@ -105,19 +107,24 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
105
107
|
var _this = _super.call(this, config, { client: client, store: store, urlManager: urlManager, eventManager: eventManager, profiler: profiler, logger: logger, tracker: tracker }, context) || this;
|
|
106
108
|
_this.type = types_1.ControllerTypes.search;
|
|
107
109
|
_this.previousResults = [];
|
|
110
|
+
_this.pageType = 'search';
|
|
111
|
+
_this.events = { product: {} };
|
|
108
112
|
_this.track = {
|
|
109
113
|
product: {
|
|
110
|
-
|
|
111
|
-
var _a, _b, _c, _d;
|
|
114
|
+
clickThrough: function (e, result) {
|
|
115
|
+
var _a, _b, _c, _d, _e, _f;
|
|
116
|
+
if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.clickThrough) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
112
119
|
var target = e.target;
|
|
113
|
-
var resultHref = ((
|
|
120
|
+
var resultHref = ((_c = (_b = result.display) === null || _b === void 0 ? void 0 : _b.mappings.core) === null || _c === void 0 ? void 0 : _c.url) || ((_d = result.mappings.core) === null || _d === void 0 ? void 0 : _d.url) || '';
|
|
114
121
|
var elemHref = target === null || target === void 0 ? void 0 : target.getAttribute('href');
|
|
115
122
|
// the href that should be used for restoration - if the elemHref contains the resultHref - use resultHref
|
|
116
123
|
var storedHref = (elemHref === null || elemHref === void 0 ? void 0 : elemHref.indexOf(resultHref)) != -1 ? resultHref : elemHref || resultHref;
|
|
117
124
|
var scrollMap = {};
|
|
118
125
|
// generate the selector using element class and parent classes
|
|
119
126
|
var selector = generateHrefSelector(target, storedHref);
|
|
120
|
-
var domRect = selector ? (
|
|
127
|
+
var domRect = selector ? (_e = document === null || document === void 0 ? void 0 : document.querySelector(selector)) === null || _e === void 0 ? void 0 : _e.getBoundingClientRect() : undefined;
|
|
121
128
|
// store element position data to scrollMap
|
|
122
129
|
if (selector || storedHref || domRect) {
|
|
123
130
|
try {
|
|
@@ -135,51 +142,100 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
135
142
|
}
|
|
136
143
|
// store position data or empty object
|
|
137
144
|
_this.storage.set('scrollMap', scrollMap);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
145
|
+
var data = getSearchSchemaData({ params: _this.params, store: _this.store, results: [result] });
|
|
146
|
+
_this.tracker.events[_this.pageType].clickThrough({ data: data, siteId: (_f = _this.config.globals) === null || _f === void 0 ? void 0 : _f.siteId });
|
|
147
|
+
_this.events.product[result.id] = _this.events.product[result.id] || {};
|
|
148
|
+
_this.events.product[result.id].clickThrough = true;
|
|
149
|
+
_this.eventManager.fire('track.product.clickThrough', { controller: _this, event: e, products: [result], trackEvent: data });
|
|
150
|
+
},
|
|
151
|
+
click: function (e, result) {
|
|
152
|
+
var _a, _b, _c;
|
|
153
|
+
if (result.type === 'banner') {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// TODO: closest might be going too far - write own function to only go n levels up - additionally check that href includes result.url
|
|
157
|
+
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'));
|
|
158
|
+
if (href) {
|
|
159
|
+
_this.track.product.clickThrough(e, result);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// TODO: in future, send as an interaction event
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
render: function (result) {
|
|
166
|
+
var _a, _b;
|
|
167
|
+
if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.render) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
var data = getSearchSchemaData({ params: _this.params, store: _this.store, results: [result] });
|
|
171
|
+
_this.tracker.events[_this.pageType].render({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
|
|
172
|
+
_this.events.product[result.id] = _this.events.product[result.id] || {};
|
|
173
|
+
_this.events.product[result.id].render = true;
|
|
174
|
+
_this.eventManager.fire('track.product.render', { controller: _this, products: [result], trackEvent: data });
|
|
175
|
+
},
|
|
176
|
+
impression: function (result) {
|
|
177
|
+
var _a, _b;
|
|
178
|
+
if ((_a = _this.events.product[result.id]) === null || _a === void 0 ? void 0 : _a.impression) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
var data = getSearchSchemaData({ params: _this.params, store: _this.store, results: [result] });
|
|
182
|
+
_this.tracker.events[_this.pageType].impression({ data: data, siteId: (_b = _this.config.globals) === null || _b === void 0 ? void 0 : _b.siteId });
|
|
183
|
+
_this.events.product[result.id] = _this.events.product[result.id] || {};
|
|
184
|
+
_this.events.product[result.id].impression = true;
|
|
185
|
+
_this.eventManager.fire('track.product.impression', { controller: _this, products: [result], trackEvent: data });
|
|
186
|
+
},
|
|
187
|
+
addToCart: function (result) {
|
|
188
|
+
var _a;
|
|
189
|
+
var data = getSearchSchemaData({ params: _this.params, store: _this.store, results: [result] });
|
|
190
|
+
_this.tracker.events[_this.pageType].addToCart({
|
|
191
|
+
data: data,
|
|
192
|
+
siteId: (_a = _this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId,
|
|
144
193
|
});
|
|
145
|
-
_this.eventManager.fire('track.product.
|
|
146
|
-
return event;
|
|
194
|
+
_this.eventManager.fire('track.product.addToCart', { controller: _this, products: [result], trackEvent: data });
|
|
147
195
|
},
|
|
148
196
|
},
|
|
197
|
+
redirect: function (redirectURL) {
|
|
198
|
+
var _a;
|
|
199
|
+
var data = getSearchRedirectSchemaData({ redirectURL: redirectURL });
|
|
200
|
+
_this.tracker.events.search.redirect({ data: data, siteId: (_a = _this.config.globals) === null || _a === void 0 ? void 0 : _a.siteId });
|
|
201
|
+
_this.eventManager.fire('track.product.redirect', { controller: _this, redirectURL: redirectURL, trackEvent: data });
|
|
202
|
+
},
|
|
149
203
|
};
|
|
150
204
|
_this.search = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
151
205
|
var params_1, err_1, stringyParams, prevStringyParams, searchProfile, meta, response, preventBackfill, dontBackfill, backfillRequests, backfillResponses, backfillResults, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
|
|
152
206
|
var _a, _b;
|
|
153
207
|
var _this = this;
|
|
154
|
-
var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m
|
|
155
|
-
return __generator(this, function (
|
|
156
|
-
switch (
|
|
208
|
+
var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
209
|
+
return __generator(this, function (_o) {
|
|
210
|
+
switch (_o.label) {
|
|
157
211
|
case 0:
|
|
158
|
-
|
|
212
|
+
_o.trys.push([0, 22, 23, 24]);
|
|
159
213
|
if (!!this.initialized) return [3 /*break*/, 2];
|
|
160
214
|
return [4 /*yield*/, this.init()];
|
|
161
215
|
case 1:
|
|
162
|
-
|
|
163
|
-
|
|
216
|
+
_o.sent();
|
|
217
|
+
_o.label = 2;
|
|
164
218
|
case 2:
|
|
165
219
|
params_1 = this.params;
|
|
166
|
-
|
|
220
|
+
// reset events for new search
|
|
221
|
+
this.events = { product: {} };
|
|
222
|
+
if (((_d = (_c = params_1.search) === null || _c === void 0 ? void 0 : _c.query) === null || _d === void 0 ? void 0 : _d.string) && ((_f = (_e = params_1.search) === null || _e === void 0 ? void 0 : _e.query) === null || _f === void 0 ? void 0 : _f.string.length)) {
|
|
167
223
|
// save it to the history store
|
|
168
|
-
this.store.history.save(
|
|
224
|
+
this.store.history.save(params_1.search.query.string);
|
|
169
225
|
}
|
|
170
226
|
this.store.loading = true;
|
|
171
|
-
|
|
227
|
+
_o.label = 3;
|
|
172
228
|
case 3:
|
|
173
|
-
|
|
229
|
+
_o.trys.push([3, 5, , 6]);
|
|
174
230
|
return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
|
|
175
231
|
controller: this,
|
|
176
232
|
request: params_1,
|
|
177
233
|
})];
|
|
178
234
|
case 4:
|
|
179
|
-
|
|
235
|
+
_o.sent();
|
|
180
236
|
return [3 /*break*/, 6];
|
|
181
237
|
case 5:
|
|
182
|
-
err_1 =
|
|
238
|
+
err_1 = _o.sent();
|
|
183
239
|
if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
|
|
184
240
|
this.log.warn("'beforeSearch' middleware cancelled");
|
|
185
241
|
return [2 /*return*/];
|
|
@@ -227,7 +283,7 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
227
283
|
});
|
|
228
284
|
return [4 /*yield*/, Promise.all(backfillRequests)];
|
|
229
285
|
case 7:
|
|
230
|
-
backfillResponses =
|
|
286
|
+
backfillResponses = _o.sent();
|
|
231
287
|
// backfillResponses are [meta, searchResponse][]
|
|
232
288
|
// set the meta and response to the first page of backfillResponses
|
|
233
289
|
meta = backfillResponses[0][0];
|
|
@@ -245,10 +301,10 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
245
301
|
case 8: return [4 /*yield*/, this.client.search(params_1)];
|
|
246
302
|
case 9:
|
|
247
303
|
// infinite with no backfills.
|
|
248
|
-
_a =
|
|
304
|
+
_a = _o.sent(), meta = _a[0], response = _a[1];
|
|
249
305
|
// append new results to previous results
|
|
250
306
|
response.results = __spreadArray(__spreadArray([], this.previousResults, true), (response.results || []), true);
|
|
251
|
-
|
|
307
|
+
_o.label = 10;
|
|
252
308
|
case 10: return [3 /*break*/, 13];
|
|
253
309
|
case 11:
|
|
254
310
|
// normal request for next page
|
|
@@ -256,8 +312,8 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
256
312
|
this.previousResults = [];
|
|
257
313
|
return [4 /*yield*/, this.client.search(params_1)];
|
|
258
314
|
case 12:
|
|
259
|
-
_b =
|
|
260
|
-
|
|
315
|
+
_b = _o.sent(), meta = _b[0], response = _b[1];
|
|
316
|
+
_o.label = 13;
|
|
261
317
|
case 13:
|
|
262
318
|
// MockClient will overwrite the client search() method and use SearchData to return mock data which already contains meta data
|
|
263
319
|
if (!response.meta) {
|
|
@@ -266,19 +322,19 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
266
322
|
searchProfile.stop();
|
|
267
323
|
this.log.profile(searchProfile);
|
|
268
324
|
afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params_1 }).start();
|
|
269
|
-
|
|
325
|
+
_o.label = 14;
|
|
270
326
|
case 14:
|
|
271
|
-
|
|
327
|
+
_o.trys.push([14, 16, , 17]);
|
|
272
328
|
return [4 /*yield*/, this.eventManager.fire('afterSearch', {
|
|
273
329
|
controller: this,
|
|
274
330
|
request: params_1,
|
|
275
331
|
response: response,
|
|
276
332
|
})];
|
|
277
333
|
case 15:
|
|
278
|
-
|
|
334
|
+
_o.sent();
|
|
279
335
|
return [3 /*break*/, 17];
|
|
280
336
|
case 16:
|
|
281
|
-
err_2 =
|
|
337
|
+
err_2 = _o.sent();
|
|
282
338
|
if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
|
|
283
339
|
this.log.warn("'afterSearch' middleware cancelled");
|
|
284
340
|
afterSearchProfile.stop();
|
|
@@ -292,26 +348,24 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
292
348
|
case 17:
|
|
293
349
|
afterSearchProfile.stop();
|
|
294
350
|
this.log.profile(afterSearchProfile);
|
|
295
|
-
// store previous results for infinite usage
|
|
296
|
-
|
|
297
|
-
this.previousResults = JSON.parse(JSON.stringify(response.results));
|
|
298
|
-
}
|
|
351
|
+
// store previous results for infinite usage (need to alsways store in case switch to infinite after pagination)
|
|
352
|
+
this.previousResults = JSON.parse(JSON.stringify(response.results));
|
|
299
353
|
// update the store
|
|
300
354
|
this.store.update(response);
|
|
301
355
|
afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params_1 }).start();
|
|
302
|
-
|
|
356
|
+
_o.label = 18;
|
|
303
357
|
case 18:
|
|
304
|
-
|
|
358
|
+
_o.trys.push([18, 20, , 21]);
|
|
305
359
|
return [4 /*yield*/, this.eventManager.fire('afterStore', {
|
|
306
360
|
controller: this,
|
|
307
361
|
request: params_1,
|
|
308
362
|
response: response,
|
|
309
363
|
})];
|
|
310
364
|
case 19:
|
|
311
|
-
|
|
365
|
+
_o.sent();
|
|
312
366
|
return [3 /*break*/, 21];
|
|
313
367
|
case 20:
|
|
314
|
-
err_3 =
|
|
368
|
+
err_3 = _o.sent();
|
|
315
369
|
if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
|
|
316
370
|
this.log.warn("'afterStore' middleware cancelled");
|
|
317
371
|
afterStoreProfile.stop();
|
|
@@ -327,7 +381,7 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
327
381
|
this.log.profile(afterStoreProfile);
|
|
328
382
|
return [3 /*break*/, 24];
|
|
329
383
|
case 22:
|
|
330
|
-
err_4 =
|
|
384
|
+
err_4 = _o.sent();
|
|
331
385
|
if (err_4) {
|
|
332
386
|
if (err_4.err && err_4.fetchDetails) {
|
|
333
387
|
switch (err_4.fetchDetails.status) {
|
|
@@ -375,6 +429,13 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
375
429
|
}
|
|
376
430
|
});
|
|
377
431
|
}); };
|
|
432
|
+
_this.addToCart = function (product) { return __awaiter(_this, void 0, void 0, function () {
|
|
433
|
+
return __generator(this, function (_a) {
|
|
434
|
+
this.track.product.addToCart(product);
|
|
435
|
+
this.eventManager.fire('addToCart', { controller: this, products: [product] });
|
|
436
|
+
return [2 /*return*/];
|
|
437
|
+
});
|
|
438
|
+
}); };
|
|
378
439
|
// deep merge config with defaults
|
|
379
440
|
_this.config = (0, deepmerge_1.default)(defaultConfig, _this.config);
|
|
380
441
|
// set restorePosition to be enabled by default when using infinite (if not provided)
|
|
@@ -388,6 +449,53 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
388
449
|
});
|
|
389
450
|
// set last params to undefined for compare in search
|
|
390
451
|
_this.storage.set('lastStringyParams', undefined);
|
|
452
|
+
_this.eventManager.on('beforeSearch', function (_a, next) {
|
|
453
|
+
var request = _a.request;
|
|
454
|
+
return __awaiter(_this, void 0, void 0, function () {
|
|
455
|
+
var req, query, hasCategoryBackgroundFilters;
|
|
456
|
+
var _b, _c, _d;
|
|
457
|
+
return __generator(this, function (_e) {
|
|
458
|
+
switch (_e.label) {
|
|
459
|
+
case 0:
|
|
460
|
+
// wait for other middleware to resolve
|
|
461
|
+
return [4 /*yield*/, next()];
|
|
462
|
+
case 1:
|
|
463
|
+
// wait for other middleware to resolve
|
|
464
|
+
_e.sent();
|
|
465
|
+
if (((_b = this.context) === null || _b === void 0 ? void 0 : _b.pageType) === 'category') {
|
|
466
|
+
this.pageType = 'category';
|
|
467
|
+
return [2 /*return*/];
|
|
468
|
+
}
|
|
469
|
+
req = request;
|
|
470
|
+
query = (_c = req.search) === null || _c === void 0 ? void 0 : _c.query;
|
|
471
|
+
if (!query) {
|
|
472
|
+
hasCategoryBackgroundFilters = (_d = req.filters) === null || _d === void 0 ? void 0 : _d.filter(function (filter) { return filter.background; }).filter(function (filter) {
|
|
473
|
+
return BACKGROUND_FILTER_FIELD_MATCHES.find(function (bgFilter) {
|
|
474
|
+
var _a;
|
|
475
|
+
return (_a = filter.field) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(bgFilter);
|
|
476
|
+
});
|
|
477
|
+
}).filter(function (filter) {
|
|
478
|
+
return BACKGROUND_FILTERS_VALUE_FLAGS.every(function (flag) {
|
|
479
|
+
switch (filter.type) {
|
|
480
|
+
case 'range':
|
|
481
|
+
var rangeFilter = filter;
|
|
482
|
+
return rangeFilter.value !== flag;
|
|
483
|
+
case 'value':
|
|
484
|
+
default:
|
|
485
|
+
var valueFilter = filter;
|
|
486
|
+
return valueFilter.value !== flag;
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
if (hasCategoryBackgroundFilters === null || hasCategoryBackgroundFilters === void 0 ? void 0 : hasCategoryBackgroundFilters.length) {
|
|
491
|
+
this.pageType = 'category';
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return [2 /*return*/];
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
});
|
|
498
|
+
});
|
|
391
499
|
// add 'afterSearch' middleware
|
|
392
500
|
_this.eventManager.on('afterSearch', function (search, next) { return __awaiter(_this, void 0, void 0, function () {
|
|
393
501
|
var config, redirectURL, searchStore, nonBackgroundFilters;
|
|
@@ -399,6 +507,9 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
399
507
|
redirectURL = (_b = (_a = search.response) === null || _a === void 0 ? void 0 : _a.merchandising) === null || _b === void 0 ? void 0 : _b.redirect;
|
|
400
508
|
searchStore = search.controller.store;
|
|
401
509
|
if (redirectURL && ((_d = (_c = config === null || config === void 0 ? void 0 : config.settings) === null || _c === void 0 ? void 0 : _c.redirects) === null || _d === void 0 ? void 0 : _d.merchandising) && !((_f = (_e = search === null || search === void 0 ? void 0 : search.response) === null || _e === void 0 ? void 0 : _e.filters) === null || _f === void 0 ? void 0 : _f.length) && !searchStore.loaded) {
|
|
510
|
+
//set loaded to true to prevent infinite search/reloading from happening
|
|
511
|
+
searchStore.loaded = true;
|
|
512
|
+
this.track.redirect(redirectURL);
|
|
402
513
|
window.location.replace(redirectURL);
|
|
403
514
|
return [2 /*return*/, false];
|
|
404
515
|
}
|
|
@@ -407,6 +518,8 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
407
518
|
((_m = (_l = search === null || search === void 0 ? void 0 : search.response) === null || _l === void 0 ? void 0 : _l.search) === null || _m === void 0 ? void 0 : _m.query) &&
|
|
408
519
|
((_p = (_o = search === null || search === void 0 ? void 0 : search.response) === null || _o === void 0 ? void 0 : _o.pagination) === null || _p === void 0 ? void 0 : _p.totalResults) === 1 &&
|
|
409
520
|
!(nonBackgroundFilters === null || nonBackgroundFilters === void 0 ? void 0 : nonBackgroundFilters.length)) {
|
|
521
|
+
//set loaded to true to prevent infinite search/reloading from happening
|
|
522
|
+
searchStore.loaded = true;
|
|
410
523
|
window.location.replace(search === null || search === void 0 ? void 0 : search.response.results[0].mappings.core.url);
|
|
411
524
|
return [2 /*return*/, false];
|
|
412
525
|
}
|
|
@@ -556,17 +669,15 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
556
669
|
}
|
|
557
670
|
params.tracking = params.tracking || {};
|
|
558
671
|
params.tracking.domain = window.location.href;
|
|
559
|
-
var
|
|
672
|
+
var _e = this.tracker.getContext(), userId = _e.userId, sessionId = _e.sessionId, pageLoadId = _e.pageLoadId, shopperId = _e.shopperId;
|
|
560
673
|
if (userId) {
|
|
561
674
|
params.tracking.userId = userId;
|
|
562
675
|
}
|
|
563
|
-
var sessionId = this.tracker.getContext().sessionId;
|
|
564
676
|
if (sessionId) {
|
|
565
677
|
params.tracking.sessionId = sessionId;
|
|
566
678
|
}
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
params.tracking.pageLoadId = pageId;
|
|
679
|
+
if (pageLoadId) {
|
|
680
|
+
params.tracking.pageLoadId = pageLoadId;
|
|
570
681
|
}
|
|
571
682
|
if (!((_d = (_c = this.config.globals) === null || _c === void 0 ? void 0 : _c.personalization) === null || _d === void 0 ? void 0 : _d.disabled)) {
|
|
572
683
|
var cartItems = this.tracker.cookies.cart.get();
|
|
@@ -579,7 +690,6 @@ var SearchController = /** @class */ (function (_super) {
|
|
|
579
690
|
params.personalization = params.personalization || {};
|
|
580
691
|
params.personalization.lastViewed = lastViewedItems.join(',');
|
|
581
692
|
}
|
|
582
|
-
var shopperId = this.tracker.getShopperId();
|
|
583
693
|
if (shopperId) {
|
|
584
694
|
params.personalization = params.personalization || {};
|
|
585
695
|
params.personalization.shopper = shopperId;
|
|
@@ -639,3 +749,66 @@ function generateHrefSelector(element, href, levels) {
|
|
|
639
749
|
return;
|
|
640
750
|
}
|
|
641
751
|
exports.generateHrefSelector = generateHrefSelector;
|
|
752
|
+
function getSearchRedirectSchemaData(_a) {
|
|
753
|
+
var redirectURL = _a.redirectURL;
|
|
754
|
+
return {
|
|
755
|
+
redirect: redirectURL,
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
function getSearchSchemaData(_a) {
|
|
759
|
+
var _b, _c, _d, _e, _f, _g, _h, _j;
|
|
760
|
+
var params = _a.params, store = _a.store, results = _a.results;
|
|
761
|
+
var filters = (_b = params.filters) === null || _b === void 0 ? void 0 : _b.reduce(function (acc, filter) {
|
|
762
|
+
var _a;
|
|
763
|
+
var _b, _c, _d, _e;
|
|
764
|
+
var key = filter.background ? 'bgfilter' : 'filter';
|
|
765
|
+
acc[key] = acc[key] || [];
|
|
766
|
+
var value = filter.type === 'range' &&
|
|
767
|
+
!isNaN((_b = filter.value) === null || _b === void 0 ? void 0 : _b.low) &&
|
|
768
|
+
!isNaN((_c = filter.value) === null || _c === void 0 ? void 0 : _c.low)
|
|
769
|
+
? ["low=".concat((_d = filter.value) === null || _d === void 0 ? void 0 : _d.low), "high=".concat((_e = filter.value) === null || _e === void 0 ? void 0 : _e.high)]
|
|
770
|
+
: ["".concat(filter.value)];
|
|
771
|
+
var existing = acc[key].find(function (item) { return item.field === filter.field; });
|
|
772
|
+
if (existing && !existing.value.includes(value[0])) {
|
|
773
|
+
(_a = existing.value).push.apply(_a, value);
|
|
774
|
+
}
|
|
775
|
+
else {
|
|
776
|
+
acc[key].push({
|
|
777
|
+
field: filter.field,
|
|
778
|
+
value: value,
|
|
779
|
+
});
|
|
780
|
+
}
|
|
781
|
+
return acc;
|
|
782
|
+
}, {});
|
|
783
|
+
return __assign(__assign({ q: ((_d = (_c = params.search) === null || _c === void 0 ? void 0 : _c.query) === null || _d === void 0 ? void 0 : _d.string) || '', correctedQuery: (_e = params.search) === null || _e === void 0 ? void 0 : _e.originalQuery }, filters), { sort: [
|
|
784
|
+
{
|
|
785
|
+
field: (_f = store.sorting.current) === null || _f === void 0 ? void 0 : _f.field,
|
|
786
|
+
dir: (_g = store.sorting.current) === null || _g === void 0 ? void 0 : _g.direction,
|
|
787
|
+
},
|
|
788
|
+
], pagination: {
|
|
789
|
+
totalResults: store.pagination.totalResults,
|
|
790
|
+
page: store.pagination.page,
|
|
791
|
+
resultsPerPage: store.pagination.pageSize,
|
|
792
|
+
}, merchandising: {
|
|
793
|
+
personalized: store.merchandising.personalized,
|
|
794
|
+
redirect: store.merchandising.redirect,
|
|
795
|
+
triggeredCampaigns: (((_h = store.merchandising.campaigns) === null || _h === void 0 ? void 0 : _h.length) &&
|
|
796
|
+
((_j = store.merchandising.campaigns) === null || _j === void 0 ? void 0 : _j.map(function (campaign) {
|
|
797
|
+
var experiement = store.merchandising.experiments.find(function (experiment) { return experiment.campaignId === campaign.id; });
|
|
798
|
+
return {
|
|
799
|
+
id: campaign.id,
|
|
800
|
+
experimentId: experiement === null || experiement === void 0 ? void 0 : experiement.experimentId,
|
|
801
|
+
variationId: experiement === null || experiement === void 0 ? void 0 : experiement.variationId,
|
|
802
|
+
};
|
|
803
|
+
}))) ||
|
|
804
|
+
undefined,
|
|
805
|
+
}, results: (results === null || results === void 0 ? void 0 : results.map(function (result) {
|
|
806
|
+
var core = result.mappings.core;
|
|
807
|
+
return {
|
|
808
|
+
uid: core.uid || '',
|
|
809
|
+
// childUid: core.uid,
|
|
810
|
+
sku: core.sku,
|
|
811
|
+
// childSku: core.sku,
|
|
812
|
+
};
|
|
813
|
+
})) || [] });
|
|
814
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import { StorageStore } from '@searchspring/snap-store-mobx';
|
|
2
|
+
import { StorageStore, Product, Banner } from '@searchspring/snap-store-mobx';
|
|
3
3
|
import { AbstractController } from '../Abstract/AbstractController';
|
|
4
4
|
import { ControllerTypes } from '../types';
|
|
5
5
|
import { AutocompleteStore } from '@searchspring/snap-store-mobx';
|
|
@@ -8,14 +8,26 @@ import type { AutocompleteRequestModel } from '@searchspring/snapi-types';
|
|
|
8
8
|
export declare const INPUT_DELAY = 200;
|
|
9
9
|
type AutocompleteTrackMethods = {
|
|
10
10
|
product: {
|
|
11
|
-
|
|
11
|
+
clickThrough: (e: MouseEvent, result: Product) => void;
|
|
12
|
+
click: (e: MouseEvent, result: Product | Banner) => void;
|
|
13
|
+
render: (result: Product) => void;
|
|
14
|
+
impression: (result: Product) => void;
|
|
15
|
+
addToCart: (results: Product) => void;
|
|
12
16
|
};
|
|
17
|
+
redirect: (redirectURL: string) => void;
|
|
13
18
|
};
|
|
14
19
|
export declare class AutocompleteController extends AbstractController {
|
|
15
20
|
type: ControllerTypes;
|
|
16
21
|
store: AutocompleteStore;
|
|
17
22
|
config: AutocompleteControllerConfig;
|
|
18
23
|
storage: StorageStore;
|
|
24
|
+
events: {
|
|
25
|
+
product: Record<string, {
|
|
26
|
+
clickThrough?: boolean;
|
|
27
|
+
impression?: boolean;
|
|
28
|
+
render?: boolean;
|
|
29
|
+
}>;
|
|
30
|
+
};
|
|
19
31
|
constructor(config: AutocompleteControllerConfig, { client, store, urlManager, eventManager, profiler, logger, tracker }: ControllerServices, context?: ContextVariables);
|
|
20
32
|
track: AutocompleteTrackMethods;
|
|
21
33
|
get params(): AutocompleteRequestModel;
|
|
@@ -39,6 +51,7 @@ export declare class AutocompleteController extends AbstractController {
|
|
|
39
51
|
bind(): Promise<void>;
|
|
40
52
|
searchTrending: () => Promise<void>;
|
|
41
53
|
search: () => Promise<void>;
|
|
54
|
+
addToCart: (product: Product) => Promise<void>;
|
|
42
55
|
}
|
|
43
56
|
export {};
|
|
44
57
|
//# 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,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"AutocompleteController.d.ts","sourceRoot":"","sources":["../../../src/Autocomplete/AutocompleteController.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAa,OAAO,EAAqB,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5G,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;AAWxI,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;IA0D3B,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"}
|