@searchspring/snap-store-mobx 0.20.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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -0
  3. package/dist/cjs/Abstract/AbstractStore.d.ts +18 -0
  4. package/dist/cjs/Abstract/AbstractStore.d.ts.map +1 -0
  5. package/dist/cjs/Abstract/AbstractStore.js +31 -0
  6. package/dist/cjs/Autocomplete/AutocompleteStore.d.ts +32 -0
  7. package/dist/cjs/Autocomplete/AutocompleteStore.d.ts.map +1 -0
  8. package/dist/cjs/Autocomplete/AutocompleteStore.js +121 -0
  9. package/dist/cjs/Autocomplete/Stores/FacetStore.d.ts +9 -0
  10. package/dist/cjs/Autocomplete/Stores/FacetStore.d.ts.map +1 -0
  11. package/dist/cjs/Autocomplete/Stores/FacetStore.js +69 -0
  12. package/dist/cjs/Autocomplete/Stores/QueryStore.d.ts +15 -0
  13. package/dist/cjs/Autocomplete/Stores/QueryStore.d.ts.map +1 -0
  14. package/dist/cjs/Autocomplete/Stores/QueryStore.js +30 -0
  15. package/dist/cjs/Autocomplete/Stores/StateStore.d.ts +23 -0
  16. package/dist/cjs/Autocomplete/Stores/StateStore.d.ts.map +1 -0
  17. package/dist/cjs/Autocomplete/Stores/StateStore.js +52 -0
  18. package/dist/cjs/Autocomplete/Stores/TermStore.d.ts +19 -0
  19. package/dist/cjs/Autocomplete/Stores/TermStore.d.ts.map +1 -0
  20. package/dist/cjs/Autocomplete/Stores/TermStore.js +86 -0
  21. package/dist/cjs/Autocomplete/Stores/TrendingStore.d.ts +7 -0
  22. package/dist/cjs/Autocomplete/Stores/TrendingStore.d.ts.map +1 -0
  23. package/dist/cjs/Autocomplete/Stores/TrendingStore.js +44 -0
  24. package/dist/cjs/Autocomplete/Stores/index.d.ts +6 -0
  25. package/dist/cjs/Autocomplete/Stores/index.d.ts.map +1 -0
  26. package/dist/cjs/Autocomplete/Stores/index.js +13 -0
  27. package/dist/cjs/Finder/FinderStore.d.ts +21 -0
  28. package/dist/cjs/Finder/FinderStore.d.ts.map +1 -0
  29. package/dist/cjs/Finder/FinderStore.js +56 -0
  30. package/dist/cjs/Finder/Stores/SelectionStore.d.ts +8 -0
  31. package/dist/cjs/Finder/Stores/SelectionStore.d.ts.map +1 -0
  32. package/dist/cjs/Finder/Stores/SelectionStore.js +232 -0
  33. package/dist/cjs/Finder/Stores/index.d.ts +2 -0
  34. package/dist/cjs/Finder/Stores/index.d.ts.map +1 -0
  35. package/dist/cjs/Finder/Stores/index.js +5 -0
  36. package/dist/cjs/Recommendation/RecommendationStore.d.ts +14 -0
  37. package/dist/cjs/Recommendation/RecommendationStore.d.ts.map +1 -0
  38. package/dist/cjs/Recommendation/RecommendationStore.js +51 -0
  39. package/dist/cjs/Recommendation/Stores/ProfileStore.d.ts +8 -0
  40. package/dist/cjs/Recommendation/Stores/ProfileStore.d.ts.map +1 -0
  41. package/dist/cjs/Recommendation/Stores/ProfileStore.js +22 -0
  42. package/dist/cjs/Recommendation/Stores/index.d.ts +2 -0
  43. package/dist/cjs/Recommendation/Stores/index.d.ts.map +1 -0
  44. package/dist/cjs/Recommendation/Stores/index.js +5 -0
  45. package/dist/cjs/Search/SearchStore.d.ts +26 -0
  46. package/dist/cjs/Search/SearchStore.d.ts.map +1 -0
  47. package/dist/cjs/Search/SearchStore.js +61 -0
  48. package/dist/cjs/Search/Stores/FacetStore.d.ts +8 -0
  49. package/dist/cjs/Search/Stores/FacetStore.d.ts.map +1 -0
  50. package/dist/cjs/Search/Stores/FacetStore.js +317 -0
  51. package/dist/cjs/Search/Stores/FilterStore.d.ts +7 -0
  52. package/dist/cjs/Search/Stores/FilterStore.d.ts.map +1 -0
  53. package/dist/cjs/Search/Stores/FilterStore.js +100 -0
  54. package/dist/cjs/Search/Stores/MerchandisingStore.d.ts +20 -0
  55. package/dist/cjs/Search/Stores/MerchandisingStore.d.ts.map +1 -0
  56. package/dist/cjs/Search/Stores/MerchandisingStore.js +59 -0
  57. package/dist/cjs/Search/Stores/PaginationStore.d.ts +40 -0
  58. package/dist/cjs/Search/Stores/PaginationStore.d.ts.map +1 -0
  59. package/dist/cjs/Search/Stores/PaginationStore.js +190 -0
  60. package/dist/cjs/Search/Stores/QueryStore.d.ts +16 -0
  61. package/dist/cjs/Search/Stores/QueryStore.d.ts.map +1 -0
  62. package/dist/cjs/Search/Stores/QueryStore.js +34 -0
  63. package/dist/cjs/Search/Stores/ResultStore.d.ts +7 -0
  64. package/dist/cjs/Search/Stores/ResultStore.d.ts.map +1 -0
  65. package/dist/cjs/Search/Stores/ResultStore.js +156 -0
  66. package/dist/cjs/Search/Stores/SortingStore.d.ts +21 -0
  67. package/dist/cjs/Search/Stores/SortingStore.d.ts.map +1 -0
  68. package/dist/cjs/Search/Stores/SortingStore.js +75 -0
  69. package/dist/cjs/Search/Stores/index.d.ts +8 -0
  70. package/dist/cjs/Search/Stores/index.d.ts.map +1 -0
  71. package/dist/cjs/Search/Stores/index.js +17 -0
  72. package/dist/cjs/Storage/StorageStore.d.ts +25 -0
  73. package/dist/cjs/Storage/StorageStore.d.ts.map +1 -0
  74. package/dist/cjs/Storage/StorageStore.js +130 -0
  75. package/dist/cjs/index.d.ts +8 -0
  76. package/dist/cjs/index.d.ts.map +1 -0
  77. package/dist/cjs/index.js +27 -0
  78. package/dist/cjs/types.d.ts +81 -0
  79. package/dist/cjs/types.d.ts.map +1 -0
  80. package/dist/cjs/types.js +9 -0
  81. package/dist/esm/Abstract/AbstractStore.d.ts +18 -0
  82. package/dist/esm/Abstract/AbstractStore.d.ts.map +1 -0
  83. package/dist/esm/Abstract/AbstractStore.js +25 -0
  84. package/dist/esm/Autocomplete/AutocompleteStore.d.ts +32 -0
  85. package/dist/esm/Autocomplete/AutocompleteStore.d.ts.map +1 -0
  86. package/dist/esm/Autocomplete/AutocompleteStore.js +94 -0
  87. package/dist/esm/Autocomplete/Stores/FacetStore.d.ts +9 -0
  88. package/dist/esm/Autocomplete/Stores/FacetStore.d.ts.map +1 -0
  89. package/dist/esm/Autocomplete/Stores/FacetStore.js +29 -0
  90. package/dist/esm/Autocomplete/Stores/QueryStore.d.ts +15 -0
  91. package/dist/esm/Autocomplete/Stores/QueryStore.d.ts.map +1 -0
  92. package/dist/esm/Autocomplete/Stores/QueryStore.js +24 -0
  93. package/dist/esm/Autocomplete/Stores/StateStore.d.ts +23 -0
  94. package/dist/esm/Autocomplete/Stores/StateStore.d.ts.map +1 -0
  95. package/dist/esm/Autocomplete/Stores/StateStore.js +40 -0
  96. package/dist/esm/Autocomplete/Stores/TermStore.d.ts +19 -0
  97. package/dist/esm/Autocomplete/Stores/TermStore.d.ts.map +1 -0
  98. package/dist/esm/Autocomplete/Stores/TermStore.js +42 -0
  99. package/dist/esm/Autocomplete/Stores/TrendingStore.d.ts +7 -0
  100. package/dist/esm/Autocomplete/Stores/TrendingStore.d.ts.map +1 -0
  101. package/dist/esm/Autocomplete/Stores/TrendingStore.js +16 -0
  102. package/dist/esm/Autocomplete/Stores/index.d.ts +6 -0
  103. package/dist/esm/Autocomplete/Stores/index.d.ts.map +1 -0
  104. package/dist/esm/Autocomplete/Stores/index.js +5 -0
  105. package/dist/esm/Finder/FinderStore.d.ts +21 -0
  106. package/dist/esm/Finder/FinderStore.d.ts.map +1 -0
  107. package/dist/esm/Finder/FinderStore.js +33 -0
  108. package/dist/esm/Finder/Stores/SelectionStore.d.ts +8 -0
  109. package/dist/esm/Finder/Stores/SelectionStore.d.ts.map +1 -0
  110. package/dist/esm/Finder/Stores/SelectionStore.js +171 -0
  111. package/dist/esm/Finder/Stores/index.d.ts +2 -0
  112. package/dist/esm/Finder/Stores/index.d.ts.map +1 -0
  113. package/dist/esm/Finder/Stores/index.js +1 -0
  114. package/dist/esm/Recommendation/RecommendationStore.d.ts +14 -0
  115. package/dist/esm/Recommendation/RecommendationStore.d.ts.map +1 -0
  116. package/dist/esm/Recommendation/RecommendationStore.js +28 -0
  117. package/dist/esm/Recommendation/Stores/ProfileStore.d.ts +8 -0
  118. package/dist/esm/Recommendation/Stores/ProfileStore.d.ts.map +1 -0
  119. package/dist/esm/Recommendation/Stores/ProfileStore.js +17 -0
  120. package/dist/esm/Recommendation/Stores/index.d.ts +2 -0
  121. package/dist/esm/Recommendation/Stores/index.d.ts.map +1 -0
  122. package/dist/esm/Recommendation/Stores/index.js +1 -0
  123. package/dist/esm/Search/SearchStore.d.ts +26 -0
  124. package/dist/esm/Search/SearchStore.d.ts.map +1 -0
  125. package/dist/esm/Search/SearchStore.js +38 -0
  126. package/dist/esm/Search/Stores/FacetStore.d.ts +8 -0
  127. package/dist/esm/Search/Stores/FacetStore.d.ts.map +1 -0
  128. package/dist/esm/Search/Stores/FacetStore.js +264 -0
  129. package/dist/esm/Search/Stores/FilterStore.d.ts +7 -0
  130. package/dist/esm/Search/Stores/FilterStore.d.ts.map +1 -0
  131. package/dist/esm/Search/Stores/FilterStore.js +68 -0
  132. package/dist/esm/Search/Stores/MerchandisingStore.d.ts +20 -0
  133. package/dist/esm/Search/Stores/MerchandisingStore.d.ts.map +1 -0
  134. package/dist/esm/Search/Stores/MerchandisingStore.js +32 -0
  135. package/dist/esm/Search/Stores/PaginationStore.d.ts +40 -0
  136. package/dist/esm/Search/Stores/PaginationStore.d.ts.map +1 -0
  137. package/dist/esm/Search/Stores/PaginationStore.js +148 -0
  138. package/dist/esm/Search/Stores/QueryStore.d.ts +16 -0
  139. package/dist/esm/Search/Stores/QueryStore.d.ts.map +1 -0
  140. package/dist/esm/Search/Stores/QueryStore.js +28 -0
  141. package/dist/esm/Search/Stores/ResultStore.d.ts +7 -0
  142. package/dist/esm/Search/Stores/ResultStore.d.ts.map +1 -0
  143. package/dist/esm/Search/Stores/ResultStore.js +117 -0
  144. package/dist/esm/Search/Stores/SortingStore.d.ts +21 -0
  145. package/dist/esm/Search/Stores/SortingStore.d.ts.map +1 -0
  146. package/dist/esm/Search/Stores/SortingStore.js +65 -0
  147. package/dist/esm/Search/Stores/index.d.ts +8 -0
  148. package/dist/esm/Search/Stores/index.d.ts.map +1 -0
  149. package/dist/esm/Search/Stores/index.js +7 -0
  150. package/dist/esm/Storage/StorageStore.d.ts +25 -0
  151. package/dist/esm/Storage/StorageStore.d.ts.map +1 -0
  152. package/dist/esm/Storage/StorageStore.js +123 -0
  153. package/dist/esm/index.d.ts +8 -0
  154. package/dist/esm/index.d.ts.map +1 -0
  155. package/dist/esm/index.js +7 -0
  156. package/dist/esm/types.d.ts +81 -0
  157. package/dist/esm/types.d.ts.map +1 -0
  158. package/dist/esm/types.js +6 -0
  159. package/package.json +34 -0
@@ -0,0 +1,264 @@
1
+ import { makeObservable, observable, action, computed, reaction } from 'mobx';
2
+ export class FacetStore extends Array {
3
+ static get [Symbol.species]() {
4
+ return Array;
5
+ }
6
+ constructor(config, services, storage, facetsData = [], pagination, meta) {
7
+ const facets = facetsData
8
+ .filter((facet) => {
9
+ const facetMeta = meta.facets[facet.field];
10
+ if (config.settings?.facets?.trim) {
11
+ if ((facetMeta.display == 'slider' && facet.type !== 'range') || (facet.type == 'range' && facetMeta.display !== 'slider')) {
12
+ return false;
13
+ }
14
+ else if (facet.type === 'range' &&
15
+ facet.range.low == facet.range.high) {
16
+ return false;
17
+ }
18
+ else if (facet.values?.length == 0) {
19
+ return false;
20
+ }
21
+ else if (!facet.filtered && facet.values?.length == 1) {
22
+ return facet.values[0].count != pagination.totalResults;
23
+ }
24
+ }
25
+ return true;
26
+ })
27
+ .map((facet) => {
28
+ const facetMeta = meta.facets[facet.field];
29
+ switch (facet.type) {
30
+ case 'range':
31
+ return new RangeFacet(services, storage, facet, facetMeta);
32
+ case 'value':
33
+ case 'range-buckets':
34
+ default:
35
+ return new ValueFacet(config, services, storage, facet, facetMeta);
36
+ }
37
+ });
38
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
39
+ // @ts-ignore
40
+ super(...facets);
41
+ }
42
+ }
43
+ class Facet {
44
+ constructor(services, storage, facet, facetMeta) {
45
+ this.filtered = false;
46
+ this.custom = {};
47
+ this.collapsed = false;
48
+ this.display = '';
49
+ this.label = '';
50
+ this.services = services;
51
+ this.storage = storage;
52
+ Object.assign(this, facetMeta, facet);
53
+ makeObservable(this, {
54
+ type: observable,
55
+ field: observable,
56
+ filtered: observable,
57
+ custom: observable,
58
+ collapsed: observable,
59
+ display: observable,
60
+ label: observable,
61
+ clear: computed,
62
+ toggleCollapse: action,
63
+ });
64
+ const collapseData = this.storage.get(`facets.${this.field}.collapsed`);
65
+ this.collapsed = collapseData ?? this.collapsed;
66
+ if (this.filtered && this.collapsed && typeof collapseData == 'undefined') {
67
+ this.toggleCollapse();
68
+ }
69
+ }
70
+ get clear() {
71
+ return {
72
+ url: this.services?.urlManager?.remove('page').remove(`filter.${this.field}`),
73
+ };
74
+ }
75
+ toggleCollapse() {
76
+ this.collapsed = !this.collapsed;
77
+ this.storage.set(`facets.${this.field}.collapsed`, this.collapsed);
78
+ }
79
+ }
80
+ class RangeFacet extends Facet {
81
+ constructor(services, storage, facet, facetMeta) {
82
+ super(services, storage, facet, facetMeta);
83
+ this.range = {
84
+ low: 0,
85
+ high: 0,
86
+ };
87
+ this.active = {
88
+ low: 0,
89
+ high: 0,
90
+ };
91
+ this.step = facet.step;
92
+ const storedRange = this.storage.get(`facets.${this.field}.range`);
93
+ if (storedRange && facet.filtered && (facet.range.low > storedRange.low || facet.range.high < storedRange.high)) {
94
+ // range from API has shrunk
95
+ this.range = this.storage.get(`facets.${this.field}.range`);
96
+ }
97
+ else {
98
+ this.storage.set(`facets.${this.field}.range`, facet.range);
99
+ this.range = facet.range;
100
+ }
101
+ // TODO: Fix api
102
+ // needed when API returns no active (only seems to be when range.low == range.high)
103
+ this.active = facet.active || facet.range;
104
+ this.formatSeparator = facetMeta?.formatSeparator || '-';
105
+ this.formatValue = facetMeta?.formatValue || '%01.2f';
106
+ makeObservable(this, {
107
+ step: observable,
108
+ range: observable,
109
+ active: observable,
110
+ formatSeparator: observable,
111
+ formatValue: observable,
112
+ });
113
+ }
114
+ }
115
+ class ValueFacet extends Facet {
116
+ constructor(config, services, storage, facet, facetMeta) {
117
+ super(services, storage, facet, facetMeta);
118
+ this.values = [];
119
+ this.search = {
120
+ input: '',
121
+ };
122
+ this.overflow = {
123
+ enabled: false,
124
+ limited: true,
125
+ limit: 0,
126
+ remaining: undefined,
127
+ setLimit: function (limit) {
128
+ if (limit != this.limit) {
129
+ this.enabled = true;
130
+ this.limit = limit;
131
+ this.calculate();
132
+ }
133
+ },
134
+ toggle: (val) => {
135
+ if (typeof val != 'undefined') {
136
+ this.overflow.limited = val;
137
+ }
138
+ else {
139
+ this.overflow.limited = !this.overflow.limited;
140
+ }
141
+ this.storage.set(`facets.${this.field}.overflow.limited`, this.overflow.limited);
142
+ this.overflow.calculate();
143
+ },
144
+ calculate: () => {
145
+ if (this.overflow.limit > 0) {
146
+ const remaining = this.values.length - this.overflow.limit;
147
+ if (remaining > 0 && !this.search.input) {
148
+ this.overflow.enabled = true;
149
+ if (this.overflow.limited) {
150
+ this.overflow.remaining = remaining;
151
+ }
152
+ else {
153
+ this.overflow.remaining = 0;
154
+ }
155
+ }
156
+ else {
157
+ this.overflow.enabled = false;
158
+ }
159
+ }
160
+ },
161
+ };
162
+ this.multiple = this.multiple;
163
+ this.values =
164
+ (facet.values &&
165
+ facet.values.map((value) => {
166
+ switch (facet.type) {
167
+ case 'value':
168
+ if (facetMeta.display === 'hierarchy') {
169
+ const filteredValues = facet.values.filter((value) => value.filtered);
170
+ return new HierarchyValue(services, this, value, filteredValues);
171
+ }
172
+ else {
173
+ return new Value(services, this, value);
174
+ }
175
+ case 'range-buckets':
176
+ return new RangeValue(services, this, value);
177
+ }
178
+ })) ||
179
+ [];
180
+ if (config.settings?.facets?.pinFiltered && facetMeta.display !== 'hierarchy') {
181
+ this.values.sort((a, b) => Number(b.filtered) - Number(a.filtered));
182
+ }
183
+ const overflowLimitedState = this.storage.get(`facets.${this.field}.overflow.limited`);
184
+ if (typeof overflowLimitedState != 'undefined') {
185
+ this.overflow.toggle(overflowLimitedState);
186
+ }
187
+ makeObservable(this, {
188
+ values: observable,
189
+ search: observable,
190
+ multiple: observable,
191
+ overflow: observable,
192
+ refinedValues: computed,
193
+ });
194
+ reaction(() => this.search.input, () => {
195
+ this.overflow.calculate();
196
+ });
197
+ }
198
+ get refinedValues() {
199
+ let values = this.values || [];
200
+ if (this.search.input) {
201
+ const search = new RegExp(escapeRegExp(this.search.input), 'i');
202
+ values = this.values.filter((value) => String(value.label).match(search));
203
+ }
204
+ if (this.overflow.enabled && this.overflow.limited) {
205
+ values = values.slice(0, this.overflow.limit);
206
+ }
207
+ return values;
208
+ }
209
+ }
210
+ class Value {
211
+ constructor(services, facet, value) {
212
+ Object.assign(this, value);
213
+ if (this.filtered) {
214
+ this.url = services.urlManager?.remove('page').remove(`filter.${facet.field}`, value.value);
215
+ }
216
+ else {
217
+ let valueUrl = services.urlManager?.remove('page');
218
+ if (facet.multiple == 'single') {
219
+ valueUrl = valueUrl?.remove(`filter.${facet.field}`);
220
+ }
221
+ this.url = valueUrl?.merge(`filter.${facet.field}`, value.value);
222
+ }
223
+ }
224
+ }
225
+ class HierarchyValue extends Value {
226
+ constructor(services, facet, value, filteredValues) {
227
+ super(services, facet, value);
228
+ this.level = 0;
229
+ this.history = false;
230
+ if (value.value && facet.hierarchyDelimiter) {
231
+ this.level = value.value.split(facet.hierarchyDelimiter).length;
232
+ }
233
+ if (facet.filtered && filteredValues?.length) {
234
+ const filteredLevel = filteredValues[0].value.split(facet.hierarchyDelimiter).length;
235
+ if (this.level <= filteredLevel) {
236
+ this.history = true;
237
+ }
238
+ }
239
+ if (value.value) {
240
+ this.url = services?.urlManager?.remove('page').set(`filter.${facet.field}`, value.value);
241
+ }
242
+ else {
243
+ this.url = services?.urlManager?.remove('page').remove(`filter.${facet.field}`);
244
+ }
245
+ }
246
+ }
247
+ class RangeValue {
248
+ constructor(services, facet, value) {
249
+ Object.assign(this, value);
250
+ if (this.filtered) {
251
+ this.url = services?.urlManager.remove('page').remove(`filter.${facet.field}`, [{ low: this.low, high: this.high }]);
252
+ }
253
+ else {
254
+ let valueUrl = services?.urlManager.remove('page');
255
+ if (facet.multiple == 'single') {
256
+ valueUrl = valueUrl?.remove(`filter.${facet.field}`);
257
+ }
258
+ this.url = valueUrl?.merge(`filter.${facet.field}`, [{ low: this.low, high: this.high }]);
259
+ }
260
+ }
261
+ }
262
+ function escapeRegExp(string) {
263
+ return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
264
+ }
@@ -0,0 +1,7 @@
1
+ import type { StoreServices } from '../../types';
2
+ import type { SearchResponseModelFilter, MetaResponseModel } from '@searchspring/snapi-types';
3
+ export declare class FilterStore extends Array {
4
+ static get [Symbol.species](): ArrayConstructor;
5
+ constructor(services: StoreServices, filtersData: SearchResponseModelFilter[], meta: MetaResponseModel);
6
+ }
7
+ //# sourceMappingURL=FilterStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterStore.d.ts","sourceRoot":"","sources":["../../../../src/Search/Stores/FilterStore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EACX,yBAAyB,EACzB,iBAAiB,EAKjB,MAAM,2BAA2B,CAAC;AAEnC,qBAAa,WAAY,SAAQ,KAAK;IACrC,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAE9C;gBAEW,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,yBAAyB,EAAO,EAAE,IAAI,EAAE,iBAAiB;CAuC3G"}
@@ -0,0 +1,68 @@
1
+ import { makeObservable, observable } from 'mobx';
2
+ export class FilterStore extends Array {
3
+ static get [Symbol.species]() {
4
+ return Array;
5
+ }
6
+ constructor(services, filtersData = [], meta) {
7
+ const filters = filtersData.map((filter) => {
8
+ const facetMeta = meta.facets[filter.field];
9
+ switch (filter.type) {
10
+ case 'range':
11
+ const rangeFilter = filter;
12
+ return new RangeFilter(services, {
13
+ facet: {
14
+ field: rangeFilter.field,
15
+ label: facetMeta?.label || rangeFilter.field,
16
+ },
17
+ value: {
18
+ low: rangeFilter.value.low,
19
+ high: rangeFilter.value.high,
20
+ label: rangeFilter.label || `${rangeFilter.value.low} - ${rangeFilter.value.high}`,
21
+ },
22
+ });
23
+ case 'value':
24
+ default:
25
+ const valueFilter = filter;
26
+ return new Filter(services, {
27
+ facet: {
28
+ field: valueFilter.field,
29
+ label: facetMeta?.label || valueFilter.field,
30
+ },
31
+ value: {
32
+ value: valueFilter.value,
33
+ label: valueFilter.label,
34
+ },
35
+ });
36
+ }
37
+ });
38
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
39
+ // @ts-ignore
40
+ super(...filters);
41
+ }
42
+ }
43
+ class Filter {
44
+ constructor(services, filter) {
45
+ this.facet = filter.facet;
46
+ this.value = filter.value;
47
+ this.label = `${filter.facet.label}: ${filter.value.label}`;
48
+ this.url = services?.urlManager?.remove('page').remove(`filter.${this.facet.field}`, this.value.value);
49
+ makeObservable(this, {
50
+ facet: observable,
51
+ value: observable,
52
+ label: observable,
53
+ });
54
+ }
55
+ }
56
+ class RangeFilter {
57
+ constructor(services, filter) {
58
+ this.facet = filter.facet;
59
+ this.value = filter.value;
60
+ this.label = `${filter.facet.label}: ${filter.value.label}`;
61
+ this.url = services?.urlManager?.remove('page').remove(`filter.${filter.facet.field}`, { low: filter.value.low, high: filter.value.high });
62
+ makeObservable(this, {
63
+ facet: observable,
64
+ value: observable,
65
+ label: observable,
66
+ });
67
+ }
68
+ }
@@ -0,0 +1,20 @@
1
+ import type { StoreServices } from '../../types';
2
+ import type { SearchResponseModelMerchandising } from '@searchspring/snapi-types';
3
+ declare enum ContentType {
4
+ HEADER = "header",
5
+ BANNER = "banner",
6
+ FOOTER = "footer",
7
+ LEFT = "left",
8
+ INLINE = "inline"
9
+ }
10
+ export declare class MerchandisingStore {
11
+ redirect: string;
12
+ content: Partial<Record<ContentType, Content[]>>;
13
+ constructor(services: StoreServices, merchData: SearchResponseModelMerchandising);
14
+ }
15
+ declare class Content extends Array {
16
+ static get [Symbol.species](): ArrayConstructor;
17
+ constructor(content: any);
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=MerchandisingStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MerchandisingStore.d.ts","sourceRoot":"","sources":["../../../../src/Search/Stores/MerchandisingStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAElF,aAAK,WAAW;IACf,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,MAAM,WAAW;CACjB;AACD,qBAAa,kBAAkB;IAC9B,QAAQ,SAAM;IACd,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAM;gBAE1C,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,gCAAgC;CAahF;AAED,cAAM,OAAQ,SAAQ,KAAK;IAC1B,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAE9C;gBAEW,OAAO,KAAA;CAGnB"}
@@ -0,0 +1,32 @@
1
+ var ContentType;
2
+ (function (ContentType) {
3
+ ContentType["HEADER"] = "header";
4
+ ContentType["BANNER"] = "banner";
5
+ ContentType["FOOTER"] = "footer";
6
+ ContentType["LEFT"] = "left";
7
+ ContentType["INLINE"] = "inline";
8
+ })(ContentType || (ContentType = {}));
9
+ export class MerchandisingStore {
10
+ constructor(services, merchData) {
11
+ this.redirect = '';
12
+ this.content = {};
13
+ if (merchData) {
14
+ this.redirect = merchData.redirect || '';
15
+ if (merchData.content) {
16
+ Object.values(ContentType).forEach((type) => {
17
+ if (merchData.content[type]) {
18
+ this.content[type] = new Content(merchData.content[type]);
19
+ }
20
+ });
21
+ }
22
+ }
23
+ }
24
+ }
25
+ class Content extends Array {
26
+ static get [Symbol.species]() {
27
+ return Array;
28
+ }
29
+ constructor(content) {
30
+ super(...content);
31
+ }
32
+ }
@@ -0,0 +1,40 @@
1
+ import type { SearchStoreConfig, StoreServices } from '../../types';
2
+ import type { SearchResponseModelPagination } from '@searchspring/snapi-types';
3
+ import type { UrlManager } from '@searchspring/snap-url-manager';
4
+ export declare class PaginationStore {
5
+ private services;
6
+ page: number;
7
+ pageSize: number;
8
+ pageSizeOptions: {
9
+ label: string;
10
+ value: number;
11
+ }[];
12
+ defaultPageSize: number;
13
+ totalResults: number;
14
+ totalPages: number;
15
+ infinite: boolean;
16
+ controllerConfig: SearchStoreConfig;
17
+ constructor(config: SearchStoreConfig, services: StoreServices, paginationData?: SearchResponseModelPagination);
18
+ get begin(): number;
19
+ get end(): number;
20
+ get multiplePages(): boolean;
21
+ get current(): Page;
22
+ get first(): Page;
23
+ get last(): Page;
24
+ get next(): Page;
25
+ get previous(): Page;
26
+ getPages(min?: number, max?: number): Page[];
27
+ setPageSize(num: number): void;
28
+ }
29
+ export declare class Page {
30
+ services: StoreServices;
31
+ number: number;
32
+ active: boolean;
33
+ url: UrlManager;
34
+ key: string;
35
+ constructor(services: StoreServices, page: {
36
+ number: number;
37
+ active?: boolean;
38
+ });
39
+ }
40
+ //# sourceMappingURL=PaginationStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaginationStore.d.ts","sourceRoot":"","sources":["../../../../src/Search/Stores/PaginationStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAEjE,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACd,EAAE,CAAC;IACJ,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,iBAAiB,CAAC;gBAGnC,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,aAAa,EACvB,cAAc,GAAE,6BAMf;IA4CF,IAAI,KAAK,IAAI,MAAM,CAKlB;IAED,IAAI,GAAG,IAAI,MAAM,CAMhB;IAED,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,OAAO,IAAI,IAAI,CAKlB;IAED,IAAI,KAAK,IAAI,IAAI,CAKhB;IAED,IAAI,IAAI,IAAI,IAAI,CAKf;IAED,IAAI,IAAI,IAAI,IAAI,CAMf;IAED,IAAI,QAAQ,IAAI,IAAI,CAMnB;IAED,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE;IAmD5C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAK9B;AAED,qBAAa,IAAI;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,UAAU,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;gBAGX,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;KACjB;CAQF"}
@@ -0,0 +1,148 @@
1
+ import { observable, action, computed, makeObservable } from 'mobx';
2
+ export class PaginationStore {
3
+ constructor(config, services, paginationData = {
4
+ page: undefined,
5
+ pageSize: undefined,
6
+ totalResults: undefined,
7
+ defaultPageSize: 24,
8
+ totalPages: undefined,
9
+ }) {
10
+ this.services = services;
11
+ this.controllerConfig = config;
12
+ this.page = paginationData.page;
13
+ this.pageSize = paginationData.pageSize;
14
+ this.totalResults = paginationData.totalResults;
15
+ this.defaultPageSize = paginationData.defaultPageSize;
16
+ this.totalPages = paginationData.totalPages;
17
+ this.pageSizeOptions = [
18
+ {
19
+ label: `Show ${this.defaultPageSize}`,
20
+ value: this.defaultPageSize,
21
+ },
22
+ {
23
+ label: `Show ${this.defaultPageSize * 2}`,
24
+ value: this.defaultPageSize * 2,
25
+ },
26
+ {
27
+ label: `Show ${this.defaultPageSize * 3}`,
28
+ value: this.defaultPageSize * 3,
29
+ },
30
+ ];
31
+ makeObservable(this, {
32
+ page: observable,
33
+ pageSize: observable,
34
+ totalResults: observable,
35
+ totalPages: observable,
36
+ begin: computed,
37
+ end: computed,
38
+ multiplePages: computed,
39
+ current: computed,
40
+ first: computed,
41
+ last: computed,
42
+ next: computed,
43
+ previous: computed,
44
+ getPages: action,
45
+ setPageSize: action,
46
+ });
47
+ }
48
+ get begin() {
49
+ if (this.controllerConfig.settings?.infinite) {
50
+ return 1;
51
+ }
52
+ return this.pageSize * (this.page - 1) + 1;
53
+ }
54
+ get end() {
55
+ if (this.pageSize * this.page > this.totalResults) {
56
+ return this.totalResults;
57
+ }
58
+ return this.pageSize * this.page;
59
+ }
60
+ get multiplePages() {
61
+ return this.pageSize < this.totalResults;
62
+ }
63
+ get current() {
64
+ return new Page(this.services, {
65
+ number: this.page,
66
+ active: true,
67
+ });
68
+ }
69
+ get first() {
70
+ return new Page(this.services, {
71
+ number: 1,
72
+ active: this.page == 1,
73
+ });
74
+ }
75
+ get last() {
76
+ return new Page(this.services, {
77
+ number: this.totalPages,
78
+ active: this.totalPages == this.page,
79
+ });
80
+ }
81
+ get next() {
82
+ if (this.page < this.totalPages) {
83
+ return new Page(this.services, {
84
+ number: this.page + 1,
85
+ });
86
+ }
87
+ }
88
+ get previous() {
89
+ if (this.page > 1) {
90
+ return new Page(this.services, {
91
+ number: this.page - 1,
92
+ });
93
+ }
94
+ }
95
+ getPages(min, max) {
96
+ if (!Number.isInteger(min)) {
97
+ return [];
98
+ }
99
+ if (!Number.isInteger(max)) {
100
+ const surrounding = min - 1;
101
+ let from = this.page;
102
+ let to = this.page;
103
+ let last = to - from;
104
+ do {
105
+ last = to - from;
106
+ if (to < this.totalPages) {
107
+ to++;
108
+ }
109
+ if (to - from >= surrounding) {
110
+ break;
111
+ }
112
+ if (from > 1) {
113
+ from--;
114
+ }
115
+ } while (last != to - from && to - from < surrounding);
116
+ min = from - this.page;
117
+ max = to - this.page;
118
+ }
119
+ else {
120
+ min = -Math.abs(min);
121
+ max = Math.abs(max);
122
+ }
123
+ const pages = [];
124
+ for (let i = this.page + min; i <= this.page + max; i++) {
125
+ if (i > 0 && i <= this.totalPages) {
126
+ pages.push(new Page(this.services, {
127
+ number: i,
128
+ active: i == this.page,
129
+ }));
130
+ }
131
+ }
132
+ return pages;
133
+ }
134
+ setPageSize(num) {
135
+ if (num) {
136
+ this.services.urlManager.remove('page').set('pageSize', num).go();
137
+ }
138
+ }
139
+ }
140
+ export class Page {
141
+ constructor(services, page) {
142
+ this.services = services;
143
+ this.number = page.number;
144
+ this.active = page.active || false;
145
+ this.url = this.services?.urlManager?.set('page', this.number);
146
+ this.key = this.url.href;
147
+ }
148
+ }
@@ -0,0 +1,16 @@
1
+ import type { UrlManager } from '@searchspring/snap-url-manager';
2
+ import type { StoreServices } from '../../types';
3
+ import type { SearchResponseModelSearch } from '@searchspring/snapi-types';
4
+ export declare class QueryStore {
5
+ query: Query;
6
+ didYouMean: Query;
7
+ originalQuery: Query;
8
+ constructor(services: StoreServices, search: SearchResponseModelSearch);
9
+ }
10
+ declare class Query {
11
+ string: string;
12
+ url: UrlManager;
13
+ constructor(services: StoreServices, query: string);
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=QueryStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryStore.d.ts","sourceRoot":"","sources":["../../../../src/Search/Stores/QueryStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAE3E,qBAAa,UAAU;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,KAAK,CAAC;IAClB,aAAa,EAAE,KAAK,CAAC;gBAET,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,yBAAyB;CAoBtE;AAQD,cAAM,KAAK;IACV,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,UAAU,CAAC;gBAEJ,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM;CASlD"}
@@ -0,0 +1,28 @@
1
+ import { observable, makeObservable } from 'mobx';
2
+ export class QueryStore {
3
+ constructor(services, search) {
4
+ const observables = {};
5
+ if (search?.query) {
6
+ this.query = new Query(services, search.query);
7
+ observables.query = observable;
8
+ }
9
+ if (search?.didYouMean) {
10
+ this.didYouMean = new Query(services, search.didYouMean);
11
+ observables.didYouMean = observable;
12
+ }
13
+ if (search?.originalQuery) {
14
+ this.originalQuery = new Query(services, search.originalQuery);
15
+ observables.originalQuery = observable;
16
+ }
17
+ makeObservable(this, observables);
18
+ }
19
+ }
20
+ class Query {
21
+ constructor(services, query) {
22
+ this.string = query;
23
+ this.url = services.urlManager.remove('page').remove('filter').set('query', this.string);
24
+ makeObservable(this, {
25
+ string: observable,
26
+ });
27
+ }
28
+ }
@@ -0,0 +1,7 @@
1
+ import type { SearchStoreConfig, AutocompleteStoreConfig, StoreServices } from '../../types';
2
+ import type { SearchResponseModelResult, SearchResponseModelPagination, SearchResponseModelMerchandising } from '@searchspring/snapi-types';
3
+ export declare class ResultStore extends Array {
4
+ static get [Symbol.species](): ArrayConstructor;
5
+ constructor(config: SearchStoreConfig | AutocompleteStoreConfig, services: StoreServices, resultData: SearchResponseModelResult[], paginationData?: SearchResponseModelPagination, merchData?: SearchResponseModelMerchandising);
6
+ }
7
+ //# sourceMappingURL=ResultStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultStore.d.ts","sourceRoot":"","sources":["../../../../src/Search/Stores/ResultStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,KAAK,EACX,yBAAyB,EACzB,6BAA6B,EAC7B,gCAAgC,EAIhC,MAAM,2BAA2B,CAAC;AAEnC,qBAAa,WAAY,SAAQ,KAAK;IACrC,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAE9C;gBAGA,MAAM,EAAE,iBAAiB,GAAG,uBAAuB,EACnD,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,yBAAyB,EAAE,EACvC,cAAc,CAAC,EAAE,6BAA6B,EAC9C,SAAS,CAAC,EAAE,gCAAgC;CAuB7C"}