@searchspring/snap-controller 0.37.0 → 0.38.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.
@@ -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;AAuB/B,aAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAoD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;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,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"}
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;AAuB/B,aAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAoD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;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,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,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAiH9B;CACF"}
@@ -328,9 +328,9 @@ var AutocompleteController = /** @class */ (function (_super) {
328
328
  };
329
329
  _this.searchTrending = function () { return __awaiter(_this, void 0, void 0, function () {
330
330
  var terms, storedTerms, trendingParams, trendingProfile;
331
- var _a, _b;
332
- return __generator(this, function (_c) {
333
- switch (_c.label) {
331
+ var _a, _b, _c, _d;
332
+ return __generator(this, function (_e) {
333
+ switch (_e.label) {
334
334
  case 0:
335
335
  storedTerms = this.storage.get('terms');
336
336
  if (!storedTerms) return [3 /*break*/, 1];
@@ -344,11 +344,13 @@ var AutocompleteController = /** @class */ (function (_super) {
344
344
  trendingProfile = this.profiler.create({ type: 'event', name: 'trending', context: trendingParams }).start();
345
345
  return [4 /*yield*/, this.client.trending(trendingParams)];
346
346
  case 2:
347
- terms = _c.sent();
347
+ terms = _e.sent();
348
348
  trendingProfile.stop();
349
349
  this.log.profile(trendingProfile);
350
- this.storage.set('terms', JSON.stringify(terms));
351
- _c.label = 3;
350
+ if ((_d = (_c = terms === null || terms === void 0 ? void 0 : terms.trending) === null || _c === void 0 ? void 0 : _c.queries) === null || _d === void 0 ? void 0 : _d.length) {
351
+ this.storage.set('terms', JSON.stringify(terms));
352
+ }
353
+ _e.label = 3;
352
354
  case 3:
353
355
  this.store.updateTrendingTerms(terms);
354
356
  return [2 /*return*/];
@@ -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;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;IA2F3B,KAAK,EAAE,kBAAkB,CA+BvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA8J9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
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;AAqB7I,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;IA2F3B,KAAK,EAAE,kBAAkB,CA+BvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA6N9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
@@ -93,6 +93,7 @@ var defaultConfig = {
93
93
  trim: true,
94
94
  pinFiltered: true,
95
95
  storeRange: true,
96
+ autoOpenActive: true,
96
97
  },
97
98
  },
98
99
  };
@@ -134,33 +135,34 @@ var SearchController = /** @class */ (function (_super) {
134
135
  },
135
136
  };
136
137
  _this.search = function () { return __awaiter(_this, void 0, void 0, function () {
137
- var params, err_1, stringyParams, prevStringyParams, preventBackfill, dontBackfill, searchProfile, _a, meta, response, previousResults_1, backfills, page, backfillParams, backfillResponses, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
138
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
139
- return __generator(this, function (_m) {
140
- switch (_m.label) {
138
+ var params, err_1, stringyParams, prevStringyParams, searchProfile, meta_1, response_1, preventBackfill, dontBackfill, previousResults, backfills, pageSize, pagesNeeded1, totalResultsNeeded, apiLimit, backfillParams, pagesNeeded, lastPageCount, i, backfillParams, backfillResults_1, backfillResponses, afterSearchProfile, err_2, afterStoreProfile, err_3, err_4;
139
+ var _a, _b;
140
+ var _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
141
+ return __generator(this, function (_u) {
142
+ switch (_u.label) {
141
143
  case 0:
142
144
  if (!!this.initialized) return [3 /*break*/, 2];
143
145
  return [4 /*yield*/, this.init()];
144
146
  case 1:
145
- _m.sent();
146
- _m.label = 2;
147
+ _u.sent();
148
+ _u.label = 2;
147
149
  case 2:
148
150
  params = this.params;
149
- _m.label = 3;
151
+ _u.label = 3;
150
152
  case 3:
151
- _m.trys.push([3, 20, , 21]);
152
- _m.label = 4;
153
+ _u.trys.push([3, 23, , 24]);
154
+ _u.label = 4;
153
155
  case 4:
154
- _m.trys.push([4, 6, , 7]);
156
+ _u.trys.push([4, 6, , 7]);
155
157
  return [4 /*yield*/, this.eventManager.fire('beforeSearch', {
156
158
  controller: this,
157
159
  request: params,
158
160
  })];
159
161
  case 5:
160
- _m.sent();
162
+ _u.sent();
161
163
  return [3 /*break*/, 7];
162
164
  case 6:
163
- err_1 = _m.sent();
165
+ err_1 = _u.sent();
164
166
  if ((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) == 'cancelled') {
165
167
  this.log.warn("'beforeSearch' middleware cancelled");
166
168
  return [2 /*return*/];
@@ -177,64 +179,120 @@ var SearchController = /** @class */ (function (_super) {
177
179
  // no param change - not searching
178
180
  return [2 /*return*/];
179
181
  }
180
- if ((_b = this.config.settings) === null || _b === void 0 ? void 0 : _b.infinite) {
181
- preventBackfill = ((_c = this.config.settings.infinite) === null || _c === void 0 ? void 0 : _c.backfill) && !this.store.results.length && ((_d = params.pagination) === null || _d === void 0 ? void 0 : _d.page) > this.config.settings.infinite.backfill;
182
- dontBackfill = !((_e = this.config.settings.infinite) === null || _e === void 0 ? void 0 : _e.backfill) && !this.store.results.length && ((_f = params.pagination) === null || _f === void 0 ? void 0 : _f.page) > 1;
183
- if (preventBackfill || dontBackfill) {
184
- this.storage.set('scrollMap', {});
185
- this.urlManager.set('page', 1).go();
186
- return [2 /*return*/];
182
+ searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
183
+ if (!(((_c = this.config.settings) === null || _c === void 0 ? void 0 : _c.infinite) && ((_d = params.pagination) === null || _d === void 0 ? void 0 : _d.page) > 1)) return [3 /*break*/, 12];
184
+ preventBackfill = ((_e = this.config.settings.infinite) === null || _e === void 0 ? void 0 : _e.backfill) && !this.store.results.length && ((_f = params.pagination) === null || _f === void 0 ? void 0 : _f.page) > this.config.settings.infinite.backfill;
185
+ dontBackfill = !((_g = this.config.settings.infinite) === null || _g === void 0 ? void 0 : _g.backfill) && !this.store.results.length && ((_h = params.pagination) === null || _h === void 0 ? void 0 : _h.page) > 1;
186
+ //if the page is higher than the backfill setting redirect back to page 1
187
+ if (preventBackfill || dontBackfill) {
188
+ this.storage.set('scrollMap', {});
189
+ this.urlManager.set('page', 1).go();
190
+ return [2 /*return*/];
191
+ }
192
+ previousResults = this.previousResults;
193
+ backfills = [];
194
+ if (((_j = this.config.settings) === null || _j === void 0 ? void 0 : _j.infinite.backfill) && !previousResults.length) {
195
+ pageSize = ((_k = params.pagination) === null || _k === void 0 ? void 0 : _k.pageSize) || this.store.pagination.pageSize || this.store.pagination.defaultPageSize;
196
+ pagesNeeded1 = ((_l = params.pagination) === null || _l === void 0 ? void 0 : _l.page) && ((_m = params.pagination) === null || _m === void 0 ? void 0 : _m.page) > ((_o = this.config.settings) === null || _o === void 0 ? void 0 : _o.infinite.backfill)
197
+ ? (_p = this.config.settings) === null || _p === void 0 ? void 0 : _p.infinite.backfill
198
+ : (_q = params.pagination) === null || _q === void 0 ? void 0 : _q.page;
199
+ totalResultsNeeded = pageSize * (pagesNeeded1 || 1);
200
+ apiLimit = 500;
201
+ // our search api is limited to a certain amount per request.
202
+ //so we will need to make more than one request if totalresultsneeded is greater.
203
+ if (totalResultsNeeded < apiLimit) {
204
+ backfillParams = (0, deepmerge_1.default)(__assign({}, params), { pagination: { pageSize: totalResultsNeeded, page: 1 } });
205
+ backfills.push(this.client.search(backfillParams));
206
+ }
207
+ else {
208
+ pagesNeeded = Math.ceil(totalResultsNeeded / apiLimit);
209
+ lastPageCount = apiLimit - (pagesNeeded * apiLimit - totalResultsNeeded);
210
+ for (i = 1; i <= pagesNeeded; i++) {
211
+ backfillParams = (0, deepmerge_1.default)(__assign({}, params), { pagination: { pageSize: i < pagesNeeded ? apiLimit : lastPageCount, page: i } });
212
+ backfills.push(this.client.search(backfillParams));
213
+ }
187
214
  }
188
215
  }
189
- searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
190
- return [4 /*yield*/, this.client.search(params)];
216
+ if (!(backfills && backfills.length)) return [3 /*break*/, 9];
217
+ backfillResults_1 = [];
218
+ return [4 /*yield*/, Promise.all(backfills)];
191
219
  case 8:
192
- _a = _m.sent(), meta = _a[0], response = _a[1];
220
+ backfillResponses = _u.sent();
221
+ backfillResponses.map(function (_a) {
222
+ var Bmeta = _a[0], Bresponse = _a[1];
223
+ if (!meta_1) {
224
+ meta_1 = Bmeta;
225
+ }
226
+ if (!response_1) {
227
+ response_1 = Bresponse;
228
+ backfillResults_1 = response_1.results;
229
+ }
230
+ else {
231
+ backfillResults_1 = backfillResults_1.concat(Bresponse.results);
232
+ }
233
+ });
234
+ if (!response_1.meta) {
235
+ /**
236
+ * MockClient will overwrite the client search() method and use
237
+ * SearchData to return mock data which already contains meta data
238
+ */
239
+ // @ts-ignore
240
+ response_1.meta = meta_1;
241
+ }
242
+ //we need to overwrite the pagination params so the ui doesnt get confused.
243
+ response_1.pagination.pageSize = ((_r = params.pagination) === null || _r === void 0 ? void 0 : _r.pageSize) || this.store.pagination.pageSize || this.store.pagination.defaultPageSize;
244
+ response_1.pagination.page = (_s = params.pagination) === null || _s === void 0 ? void 0 : _s.page;
245
+ //set the response results after all backfill promises are resolved.
246
+ response_1.results = backfillResults_1;
247
+ return [3 /*break*/, 11];
248
+ case 9: return [4 /*yield*/, this.client.search(params)];
249
+ case 10:
250
+ // infinite with no backfills.
251
+ _a = _u.sent(), meta_1 = _a[0], response_1 = _a[1];
193
252
  // @ts-ignore
194
- if (!response.meta) {
253
+ if (!response_1.meta) {
195
254
  /**
196
255
  * MockClient will overwrite the client search() method and use
197
256
  * SearchData to return mock data which already contains meta data
198
257
  */
199
258
  // @ts-ignore
200
- response.meta = meta;
259
+ response_1.meta = meta_1;
201
260
  }
202
- if (!(((_g = this.config.settings) === null || _g === void 0 ? void 0 : _g.infinite) && ((_h = params.pagination) === null || _h === void 0 ? void 0 : _h.page) > 1)) return [3 /*break*/, 11];
203
- previousResults_1 = this.previousResults;
204
- if (!(((_j = this.config.settings) === null || _j === void 0 ? void 0 : _j.infinite.backfill) && !previousResults_1.length)) return [3 /*break*/, 10];
205
- backfills = [];
206
- for (page = 1; page < ((_k = params.pagination) === null || _k === void 0 ? void 0 : _k.page); page++) {
207
- backfillParams = (0, deepmerge_1.default)(__assign({}, params), { pagination: { page: page } });
208
- backfills.push(this.client.search(backfillParams));
261
+ //append new results to previous results
262
+ response_1.results = __spreadArray(__spreadArray([], previousResults, true), (response_1.results || []), true);
263
+ _u.label = 11;
264
+ case 11: return [3 /*break*/, 14];
265
+ case 12: return [4 /*yield*/, this.client.search(params)];
266
+ case 13:
267
+ //standard.
268
+ _b = _u.sent(), meta_1 = _b[0], response_1 = _b[1];
269
+ // @ts-ignore
270
+ if (!response_1.meta) {
271
+ /**
272
+ * MockClient will overwrite the client search() method and use
273
+ * SearchData to return mock data which already contains meta data
274
+ */
275
+ // @ts-ignore
276
+ response_1.meta = meta_1;
209
277
  }
210
- return [4 /*yield*/, Promise.all(backfills)];
211
- case 9:
212
- backfillResponses = _m.sent();
213
- backfillResponses.map(function (_a) {
214
- var meta = _a[0], data = _a[1];
215
- previousResults_1 = previousResults_1.concat(data.results);
216
- });
217
- _m.label = 10;
218
- case 10:
219
- response.results = __spreadArray(__spreadArray([], previousResults_1, true), (response.results || []), true);
220
- _m.label = 11;
221
- case 11:
278
+ _u.label = 14;
279
+ case 14:
222
280
  searchProfile.stop();
223
281
  this.log.profile(searchProfile);
224
282
  afterSearchProfile = this.profiler.create({ type: 'event', name: 'afterSearch', context: params }).start();
225
- _m.label = 12;
226
- case 12:
227
- _m.trys.push([12, 14, , 15]);
283
+ _u.label = 15;
284
+ case 15:
285
+ _u.trys.push([15, 17, , 18]);
228
286
  return [4 /*yield*/, this.eventManager.fire('afterSearch', {
229
287
  controller: this,
230
288
  request: params,
231
- response: response,
289
+ response: response_1,
232
290
  })];
233
- case 13:
234
- _m.sent();
235
- return [3 /*break*/, 15];
236
- case 14:
237
- err_2 = _m.sent();
291
+ case 16:
292
+ _u.sent();
293
+ return [3 /*break*/, 18];
294
+ case 17:
295
+ err_2 = _u.sent();
238
296
  if ((err_2 === null || err_2 === void 0 ? void 0 : err_2.message) == 'cancelled') {
239
297
  this.log.warn("'afterSearch' middleware cancelled");
240
298
  afterSearchProfile.stop();
@@ -244,29 +302,29 @@ var SearchController = /** @class */ (function (_super) {
244
302
  this.log.error("error in 'afterSearch' middleware");
245
303
  throw err_2;
246
304
  }
247
- return [3 /*break*/, 15];
248
- case 15:
305
+ return [3 /*break*/, 18];
306
+ case 18:
249
307
  afterSearchProfile.stop();
250
308
  this.log.profile(afterSearchProfile);
251
- if ((_l = this.config.settings) === null || _l === void 0 ? void 0 : _l.infinite) {
252
- this.previousResults = JSON.parse(JSON.stringify(response.results));
309
+ if ((_t = this.config.settings) === null || _t === void 0 ? void 0 : _t.infinite) {
310
+ this.previousResults = JSON.parse(JSON.stringify(response_1.results));
253
311
  }
254
312
  // update the store
255
- this.store.update(response);
313
+ this.store.update(response_1);
256
314
  afterStoreProfile = this.profiler.create({ type: 'event', name: 'afterStore', context: params }).start();
257
- _m.label = 16;
258
- case 16:
259
- _m.trys.push([16, 18, , 19]);
315
+ _u.label = 19;
316
+ case 19:
317
+ _u.trys.push([19, 21, , 22]);
260
318
  return [4 /*yield*/, this.eventManager.fire('afterStore', {
261
319
  controller: this,
262
320
  request: params,
263
- response: response,
321
+ response: response_1,
264
322
  })];
265
- case 17:
266
- _m.sent();
267
- return [3 /*break*/, 19];
268
- case 18:
269
- err_3 = _m.sent();
323
+ case 20:
324
+ _u.sent();
325
+ return [3 /*break*/, 22];
326
+ case 21:
327
+ err_3 = _u.sent();
270
328
  if ((err_3 === null || err_3 === void 0 ? void 0 : err_3.message) == 'cancelled') {
271
329
  this.log.warn("'afterStore' middleware cancelled");
272
330
  afterStoreProfile.stop();
@@ -276,13 +334,13 @@ var SearchController = /** @class */ (function (_super) {
276
334
  this.log.error("error in 'afterStore' middleware");
277
335
  throw err_3;
278
336
  }
279
- return [3 /*break*/, 19];
280
- case 19:
337
+ return [3 /*break*/, 22];
338
+ case 22:
281
339
  afterStoreProfile.stop();
282
340
  this.log.profile(afterStoreProfile);
283
- return [3 /*break*/, 21];
284
- case 20:
285
- err_4 = _m.sent();
341
+ return [3 /*break*/, 24];
342
+ case 23:
343
+ err_4 = _u.sent();
286
344
  if (err_4) {
287
345
  switch (err_4) {
288
346
  case 429:
@@ -308,8 +366,8 @@ var SearchController = /** @class */ (function (_super) {
308
366
  this.store.loading = false;
309
367
  this.handleError(err_4);
310
368
  }
311
- return [3 /*break*/, 21];
312
- case 21: return [2 /*return*/];
369
+ return [3 /*break*/, 24];
370
+ case 24: return [2 /*return*/];
313
371
  }
314
372
  });
315
373
  }); };
@@ -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;AAuB/B,aAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAoD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;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,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"}
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;AAuB/B,aAAK,wBAAwB,GAAG;IAC/B,OAAO,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;KAC5C,CAAC;CACF,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,kBAAkB;IACtD,IAAI,kBAAgC;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,4BAA4B,CAAC;IACtC,OAAO,EAAE,YAAY,CAAC;gBAG5B,MAAM,EAAE,4BAA4B,EACpC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAC1F,OAAO,CAAC,EAAE,gBAAgB;IAoD3B,KAAK,EAAE,wBAAwB,CAO7B;IAEF,IAAI,MAAM,IAAI,wBAAwB,CA0CrC;IAEK,UAAU,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsChE,KAAK,IAAI,IAAI;IASb,QAAQ;;0BAEc,aAAa,KAAG,QAAQ,OAAO,GAAG,SAAS,CAAC;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,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,CAwBtC;IAEF,MAAM,QAAa,QAAQ,IAAI,CAAC,CAiH9B;CACF"}
@@ -228,7 +228,9 @@ export class AutocompleteController extends AbstractController {
228
228
  terms = await this.client.trending(trendingParams);
229
229
  trendingProfile.stop();
230
230
  this.log.profile(trendingProfile);
231
- this.storage.set('terms', JSON.stringify(terms));
231
+ if (terms?.trending?.queries?.length) {
232
+ this.storage.set('terms', JSON.stringify(terms));
233
+ }
232
234
  }
233
235
  this.store.updateTrendingTerms(terms);
234
236
  };
@@ -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;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;IA2F3B,KAAK,EAAE,kBAAkB,CA+BvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA8J9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
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;AAqB7I,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;IA2F3B,KAAK,EAAE,kBAAkB,CA+BvB;IAEF,IAAI,MAAM,IAAI,kBAAkB,CAgD/B;IAED,MAAM,QAAa,QAAQ,IAAI,CAAC,CA6N9B;CACF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxF"}
@@ -16,6 +16,7 @@ const defaultConfig = {
16
16
  trim: true,
17
17
  pinFiltered: true,
18
18
  storeRange: true,
19
+ autoOpenActive: true,
19
20
  },
20
21
  },
21
22
  };
@@ -79,45 +80,107 @@ export class SearchController extends AbstractController {
79
80
  // no param change - not searching
80
81
  return;
81
82
  }
82
- if (this.config.settings?.infinite) {
83
- // TODO: refactor this
83
+ const searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
84
+ let meta;
85
+ let response;
86
+ // infinite functionality
87
+ // if params.page > 1 and infinite setting exists we should append results
88
+ if (this.config.settings?.infinite && params.pagination?.page > 1) {
84
89
  const preventBackfill = this.config.settings.infinite?.backfill && !this.store.results.length && params.pagination?.page > this.config.settings.infinite.backfill;
85
90
  const dontBackfill = !this.config.settings.infinite?.backfill && !this.store.results.length && params.pagination?.page > 1;
91
+ //if the page is higher than the backfill setting redirect back to page 1
86
92
  if (preventBackfill || dontBackfill) {
87
93
  this.storage.set('scrollMap', {});
88
94
  this.urlManager.set('page', 1).go();
89
95
  return;
90
96
  }
91
- }
92
- const searchProfile = this.profiler.create({ type: 'event', name: 'search', context: params }).start();
93
- const [meta, response] = await this.client.search(params);
94
- // @ts-ignore
95
- if (!response.meta) {
96
- /**
97
- * MockClient will overwrite the client search() method and use
98
- * SearchData to return mock data which already contains meta data
99
- */
100
- // @ts-ignore
101
- response.meta = meta;
102
- }
103
- // infinite functionality
104
- // if params.page > 1 and infinite setting exists we should append results
105
- if (this.config.settings?.infinite && params.pagination?.page > 1) {
106
97
  // if no results fetch results...
107
98
  let previousResults = this.previousResults;
99
+ const backfills = [];
108
100
  if (this.config.settings?.infinite.backfill && !previousResults.length) {
109
101
  // figure out how many pages of results to backfill and wait on all responses
110
- const backfills = [];
111
- for (let page = 1; page < params.pagination?.page; page++) {
112
- const backfillParams = deepmerge({ ...params }, { pagination: { page } });
102
+ const pageSize = params.pagination?.pageSize || this.store.pagination.pageSize || this.store.pagination.defaultPageSize;
103
+ let pagesNeeded1 = params.pagination?.page && params.pagination?.page > this.config.settings?.infinite.backfill
104
+ ? this.config.settings?.infinite.backfill
105
+ : params.pagination?.page;
106
+ let totalResultsNeeded = pageSize * (pagesNeeded1 || 1);
107
+ const apiLimit = 500;
108
+ // our search api is limited to a certain amount per request.
109
+ //so we will need to make more than one request if totalresultsneeded is greater.
110
+ if (totalResultsNeeded < apiLimit) {
111
+ const backfillParams = deepmerge({ ...params }, { pagination: { pageSize: totalResultsNeeded, page: 1 } });
113
112
  backfills.push(this.client.search(backfillParams));
114
113
  }
114
+ else {
115
+ //how many pages are needed?
116
+ let pagesNeeded = Math.ceil(totalResultsNeeded / apiLimit);
117
+ // we dont want to get the full apiLimit # of results on the last page, so lets find out how many are left.
118
+ let lastPageCount = apiLimit - (pagesNeeded * apiLimit - totalResultsNeeded);
119
+ for (let i = 1; i <= pagesNeeded; i++) {
120
+ const backfillParams = deepmerge({ ...params }, { pagination: { pageSize: i < pagesNeeded ? apiLimit : lastPageCount, page: i } });
121
+ backfills.push(this.client.search(backfillParams));
122
+ }
123
+ }
124
+ }
125
+ //infinite backfill and prev results
126
+ // use the previous results and only make request for new result
127
+ if (backfills && backfills.length) {
128
+ let backfillResults = [];
115
129
  const backfillResponses = await Promise.all(backfills);
116
- backfillResponses.map(([meta, data]) => {
117
- previousResults = previousResults.concat(data.results);
130
+ backfillResponses.map(([Bmeta, Bresponse]) => {
131
+ if (!meta) {
132
+ meta = Bmeta;
133
+ }
134
+ if (!response) {
135
+ response = Bresponse;
136
+ backfillResults = response.results;
137
+ }
138
+ else {
139
+ backfillResults = backfillResults.concat(Bresponse.results);
140
+ }
118
141
  });
142
+ if (!response.meta) {
143
+ /**
144
+ * MockClient will overwrite the client search() method and use
145
+ * SearchData to return mock data which already contains meta data
146
+ */
147
+ // @ts-ignore
148
+ response.meta = meta;
149
+ }
150
+ //we need to overwrite the pagination params so the ui doesnt get confused.
151
+ response.pagination.pageSize = params.pagination?.pageSize || this.store.pagination.pageSize || this.store.pagination.defaultPageSize;
152
+ response.pagination.page = params.pagination?.page;
153
+ //set the response results after all backfill promises are resolved.
154
+ response.results = backfillResults;
155
+ }
156
+ else {
157
+ // infinite with no backfills.
158
+ [meta, response] = await this.client.search(params);
159
+ // @ts-ignore
160
+ if (!response.meta) {
161
+ /**
162
+ * MockClient will overwrite the client search() method and use
163
+ * SearchData to return mock data which already contains meta data
164
+ */
165
+ // @ts-ignore
166
+ response.meta = meta;
167
+ }
168
+ //append new results to previous results
169
+ response.results = [...previousResults, ...(response.results || [])];
170
+ }
171
+ }
172
+ else {
173
+ //standard.
174
+ [meta, response] = await this.client.search(params);
175
+ // @ts-ignore
176
+ if (!response.meta) {
177
+ /**
178
+ * MockClient will overwrite the client search() method and use
179
+ * SearchData to return mock data which already contains meta data
180
+ */
181
+ // @ts-ignore
182
+ response.meta = meta;
119
183
  }
120
- response.results = [...previousResults, ...(response.results || [])];
121
184
  }
122
185
  searchProfile.stop();
123
186
  this.log.profile(searchProfile);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searchspring/snap-controller",
3
- "version": "0.37.0",
3
+ "version": "0.38.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.37.0",
23
+ "@searchspring/snap-toolbox": "^0.38.0",
24
24
  "deepmerge": "4.2.2"
25
25
  },
26
26
  "devDependencies": {
27
- "@searchspring/snap-client": "^0.37.0",
28
- "@searchspring/snap-event-manager": "^0.37.0",
29
- "@searchspring/snap-logger": "^0.37.0",
30
- "@searchspring/snap-profiler": "^0.37.0",
31
- "@searchspring/snap-store-mobx": "^0.37.0",
32
- "@searchspring/snap-tracker": "^0.37.0",
33
- "@searchspring/snap-url-manager": "^0.37.0"
27
+ "@searchspring/snap-client": "^0.38.0",
28
+ "@searchspring/snap-event-manager": "^0.38.0",
29
+ "@searchspring/snap-logger": "^0.38.0",
30
+ "@searchspring/snap-profiler": "^0.38.0",
31
+ "@searchspring/snap-store-mobx": "^0.38.0",
32
+ "@searchspring/snap-tracker": "^0.38.0",
33
+ "@searchspring/snap-url-manager": "^0.38.0"
34
34
  },
35
35
  "sideEffects": false,
36
36
  "files": [
37
37
  "dist/**/*"
38
38
  ],
39
- "gitHead": "d917c5638aa9a0d7eba3e453e70ff36278c96afa"
39
+ "gitHead": "88f7d1f065081f9691f26563666320e198c45ca9"
40
40
  }