@abcagency/hc-ui-components 1.9.12 → 1.9.14
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/types/util/filterUtil.d.ts +2 -6
- package/dist/util/filterUtil.js +144 -166
- package/dist/util/filterUtil.js.map +1 -1
- package/package.json +1 -1
- package/src/util/filterUtil.js +95 -100
|
@@ -3,11 +3,7 @@ export function getFilterOptions(listings: any, filteredListings: any, field: an
|
|
|
3
3
|
name: any;
|
|
4
4
|
count: any;
|
|
5
5
|
}[];
|
|
6
|
-
export function getSpecialFeatureOptions(listings: any, filteredListings: any, siteConfig: any, favorites: any, filterConfig?: {}):
|
|
7
|
-
name: string;
|
|
8
|
-
count: any;
|
|
9
|
-
}[];
|
|
10
|
-
export function getDynamicCustomFieldFilters(listings: any, filteredListings: any, siteConfig: any, filterConfig?: {}): any[];
|
|
6
|
+
export function getSpecialFeatureOptions(listings: any, filteredListings: any, siteConfig: any, favorites: any, filterConfig?: {}): any[];
|
|
11
7
|
export function generateFilterOptions(filteredListings: any, allListings: any, siteConfig: any, filterOptions: any, parentField: any, favorites: any, selectedFilters: any, filterConfig?: {
|
|
12
8
|
hideZeroResults: boolean;
|
|
13
9
|
dynamicCounts: boolean;
|
|
@@ -15,7 +11,7 @@ export function generateFilterOptions(filteredListings: any, allListings: any, s
|
|
|
15
11
|
collapsedByDefault: boolean;
|
|
16
12
|
sortAlphabetically: boolean;
|
|
17
13
|
}): {
|
|
18
|
-
filters: any
|
|
14
|
+
filters: any;
|
|
19
15
|
locations: any;
|
|
20
16
|
pointsOfInterest: {
|
|
21
17
|
id: string;
|
package/dist/util/filterUtil.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { slicedToArray as _slicedToArray, typeof as _typeof, toConsumableArray as _toConsumableArray, objectSpread2 as _objectSpread2,
|
|
1
|
+
import { slicedToArray as _slicedToArray, typeof as _typeof, toConsumableArray as _toConsumableArray, objectSpread2 as _objectSpread2, asyncToGenerator as _asyncToGenerator, regeneratorRuntime as _regeneratorRuntime, defineProperty as _defineProperty } from '../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
2
|
import { getDistinctItemsByProximity } from './mapUtil.js';
|
|
3
3
|
import { isAlgoliaAvailable, filterListingsByAlgoliaSearch, isAlgoliaInitializing } from './algoliaSearchUtil.js';
|
|
4
4
|
import Fuse from 'fuse.js';
|
|
@@ -61,154 +61,114 @@ var getFilterOptions = function getFilterOptions(listings, filteredListings, fie
|
|
|
61
61
|
var getSpecialFeatureOptions = function getSpecialFeatureOptions(listings, filteredListings, siteConfig, favorites) {
|
|
62
62
|
var filterConfig = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
|
|
63
63
|
var specialFeatures = siteConfig.specialFeatures;
|
|
64
|
-
var
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
featureName = _ref2[1];
|
|
73
|
-
var value = getFieldValue(listing, featureKey);
|
|
74
|
-
// Support both numeric (1/0) and string ("true"/"false") boolean values
|
|
75
|
-
if (value == 1 || value === 1 || value === '1' || value === 'true' || value === true) {
|
|
76
|
-
featureCounts[featureName] += 1;
|
|
77
|
-
}
|
|
64
|
+
var allOptions = [];
|
|
65
|
+
Object.entries(specialFeatures).forEach(function (_ref) {
|
|
66
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
67
|
+
featureKey = _ref2[0],
|
|
68
|
+
featureName = _ref2[1];
|
|
69
|
+
// Check if this field is in regular fields or custom fields
|
|
70
|
+
var hasRegularField = listings.some(function (listing) {
|
|
71
|
+
return listing.fields && listing.fields[featureKey] !== undefined;
|
|
78
72
|
});
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
73
|
+
if (hasRegularField) {
|
|
74
|
+
// Handle as boolean field from regular fields
|
|
75
|
+
var count = 0;
|
|
76
|
+
filteredListings.forEach(function (listing) {
|
|
77
|
+
var value = getFieldValue(listing, featureKey);
|
|
78
|
+
if (value == 1 || value === 1 || value === '1' || value === 'true' || value === true) {
|
|
79
|
+
count += 1;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
allOptions.push({
|
|
83
|
+
name: featureName,
|
|
84
|
+
count: count
|
|
85
|
+
});
|
|
86
|
+
} else {
|
|
87
|
+
// Check if it's in custom fields
|
|
88
|
+
var hasCustomField = listings.some(function (listing) {
|
|
89
|
+
return listing.customFields && Array.isArray(listing.customFields) && listing.customFields.some(function (cf) {
|
|
90
|
+
return cf.id === featureKey || cf.name === featureKey;
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
if (hasCustomField) {
|
|
94
|
+
// Get all distinct values for this custom field
|
|
95
|
+
var distinctValues = new Set();
|
|
96
|
+
listings.forEach(function (listing) {
|
|
97
|
+
var value = getFieldValue(listing, featureKey);
|
|
98
|
+
if (value != null && value !== '' && value !== undefined) {
|
|
99
|
+
distinctValues.add(String(value));
|
|
100
|
+
}
|
|
101
|
+
});
|
|
89
102
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
103
|
+
// Check if it's boolean-like
|
|
104
|
+
var booleanValues = new Set(['true', 'false', '1', '0', 'yes', 'no', 'True', 'False']);
|
|
105
|
+
var allBooleanLike = Array.from(distinctValues).every(function (val) {
|
|
106
|
+
return booleanValues.has(val);
|
|
107
|
+
}) && distinctValues.size <= 2;
|
|
108
|
+
if (allBooleanLike) {
|
|
109
|
+
// Handle as boolean custom field
|
|
110
|
+
var _count = 0;
|
|
111
|
+
filteredListings.forEach(function (listing) {
|
|
112
|
+
var value = getFieldValue(listing, featureKey);
|
|
113
|
+
if (value === '1' || value === 'true' || value === 'True' || value === true || value === 1) {
|
|
114
|
+
_count += 1;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
allOptions.push({
|
|
118
|
+
name: featureName,
|
|
119
|
+
count: _count
|
|
120
|
+
});
|
|
121
|
+
} else {
|
|
122
|
+
// Handle as multi-value custom field - add each distinct value as separate option
|
|
123
|
+
distinctValues.forEach(function (value) {
|
|
124
|
+
var count = 0;
|
|
125
|
+
filteredListings.forEach(function (listing) {
|
|
126
|
+
var listingValue = getFieldValue(listing, featureKey);
|
|
127
|
+
if (listingValue === value) {
|
|
128
|
+
count += 1;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
allOptions.push({
|
|
132
|
+
name: "".concat(featureName, ": ").concat(value),
|
|
133
|
+
count: count
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
100
137
|
}
|
|
101
138
|
}
|
|
139
|
+
});
|
|
102
140
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
141
|
+
// Update favorite count
|
|
142
|
+
for (var _i = 0, _allOptions = allOptions; _i < _allOptions.length; _i++) {
|
|
143
|
+
var option = _allOptions[_i];
|
|
144
|
+
if (option.name === 'Favorite') {
|
|
145
|
+
option.count = filteredListings.filter(function (x) {
|
|
146
|
+
return favorites.includes(x.id);
|
|
147
|
+
}).length;
|
|
148
|
+
}
|
|
108
149
|
}
|
|
150
|
+
|
|
151
|
+
// Hide favorites if filterConfig.showFavorites is false
|
|
152
|
+
var finalOptions = allOptions;
|
|
109
153
|
if (filterConfig.showFavorites === false) {
|
|
110
|
-
|
|
154
|
+
finalOptions = finalOptions.filter(function (option) {
|
|
111
155
|
return option.name !== 'Favorite';
|
|
112
156
|
});
|
|
113
157
|
}
|
|
114
158
|
|
|
115
159
|
// Hide zero results if filterConfig.hideZeroResults is true
|
|
116
160
|
if (filterConfig.hideZeroResults === true) {
|
|
117
|
-
|
|
161
|
+
finalOptions = finalOptions.filter(function (option) {
|
|
118
162
|
return option.count > 0;
|
|
119
163
|
});
|
|
120
164
|
}
|
|
121
|
-
return
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
// Helper to detect if a custom field should be treated as boolean or multi-value
|
|
125
|
-
var isCustomFieldBoolean = function isCustomFieldBoolean(listings, fieldKey) {
|
|
126
|
-
var distinctValues = new Set();
|
|
127
|
-
var _iterator2 = _createForOfIteratorHelper(listings),
|
|
128
|
-
_step2;
|
|
129
|
-
try {
|
|
130
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
131
|
-
var listing = _step2.value;
|
|
132
|
-
var value = getFieldValue(listing, fieldKey);
|
|
133
|
-
if (value != null && value !== '' && value !== undefined) {
|
|
134
|
-
distinctValues.add(String(value).toLowerCase());
|
|
135
|
-
}
|
|
136
|
-
// If we find more than 2 non-empty distinct values, it's not boolean
|
|
137
|
-
if (distinctValues.size > 2) {
|
|
138
|
-
return false;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Check if all values are boolean-like
|
|
143
|
-
} catch (err) {
|
|
144
|
-
_iterator2.e(err);
|
|
145
|
-
} finally {
|
|
146
|
-
_iterator2.f();
|
|
147
|
-
}
|
|
148
|
-
var booleanValues = new Set(['true', 'false', '1', '0', 'yes', 'no']);
|
|
149
|
-
var _iterator3 = _createForOfIteratorHelper(distinctValues),
|
|
150
|
-
_step3;
|
|
151
|
-
try {
|
|
152
|
-
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
153
|
-
var val = _step3.value;
|
|
154
|
-
if (!booleanValues.has(val)) {
|
|
155
|
-
return false;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
} catch (err) {
|
|
159
|
-
_iterator3.e(err);
|
|
160
|
-
} finally {
|
|
161
|
-
_iterator3.f();
|
|
162
|
-
}
|
|
163
|
-
return distinctValues.size > 0 && distinctValues.size <= 2;
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
// Get dynamic custom field filters (for non-boolean multi-value fields)
|
|
167
|
-
var getDynamicCustomFieldFilters = function getDynamicCustomFieldFilters(listings, filteredListings, siteConfig) {
|
|
168
|
-
var filterConfig = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
169
|
-
if (!siteConfig.specialFeatures) return [];
|
|
170
|
-
var dynamicFilters = [];
|
|
171
|
-
var specialFeaturesKeys = Object.keys(siteConfig.specialFeatures);
|
|
172
|
-
|
|
173
|
-
// Find all custom fields used across listings
|
|
174
|
-
var allCustomFields = new Set();
|
|
175
|
-
listings.forEach(function (listing) {
|
|
176
|
-
if (listing.customFields && Array.isArray(listing.customFields)) {
|
|
177
|
-
listing.customFields.forEach(function (cf) {
|
|
178
|
-
if (cf.id || cf.name) {
|
|
179
|
-
allCustomFields.add(cf.id || cf.name);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
// For each custom field, check if it's NOT in specialFeatures and NOT boolean
|
|
186
|
-
allCustomFields.forEach(function (fieldKey) {
|
|
187
|
-
// Skip if already in specialFeatures
|
|
188
|
-
if (specialFeaturesKeys.includes(fieldKey)) return;
|
|
189
|
-
|
|
190
|
-
// Check if this field has multiple non-boolean values
|
|
191
|
-
if (!isCustomFieldBoolean(listings, fieldKey)) {
|
|
192
|
-
var options = getFilterOptions(listings, filteredListings, fieldKey, filterConfig.hideZeroResults);
|
|
193
|
-
|
|
194
|
-
// Only add if there are meaningful options
|
|
195
|
-
if (options.length > 1) {
|
|
196
|
-
dynamicFilters.push({
|
|
197
|
-
id: fieldKey,
|
|
198
|
-
title: fieldKey.charAt(0).toUpperCase() + fieldKey.slice(1).replace(/([A-Z])/g, ' $1').trim(),
|
|
199
|
-
items: options,
|
|
200
|
-
isDynamic: true
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
return dynamicFilters;
|
|
165
|
+
return finalOptions;
|
|
206
166
|
};
|
|
207
167
|
var getPointsOfInterestOptions = function getPointsOfInterestOptions(pointsOfInterestNames) {
|
|
208
|
-
return Object.entries(pointsOfInterestNames).sort().map(function (
|
|
209
|
-
var
|
|
210
|
-
key =
|
|
211
|
-
name =
|
|
168
|
+
return Object.entries(pointsOfInterestNames).sort().map(function (_ref3) {
|
|
169
|
+
var _ref4 = _slicedToArray(_ref3, 2),
|
|
170
|
+
key = _ref4[0],
|
|
171
|
+
name = _ref4[1];
|
|
212
172
|
return {
|
|
213
173
|
key: key,
|
|
214
174
|
name: name
|
|
@@ -238,10 +198,10 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
|
|
|
238
198
|
var categoryCountListings = countListings;
|
|
239
199
|
if (filterConfig.dynamicCounts && selectedFilters.specialFeatures) {
|
|
240
200
|
categoryCountListings = allListings.filter(function (listing) {
|
|
241
|
-
return Object.entries(selectedFilters).every(function (
|
|
242
|
-
var
|
|
243
|
-
key =
|
|
244
|
-
value =
|
|
201
|
+
return Object.entries(selectedFilters).every(function (_ref5) {
|
|
202
|
+
var _ref6 = _slicedToArray(_ref5, 2),
|
|
203
|
+
key = _ref6[0],
|
|
204
|
+
value = _ref6[1];
|
|
245
205
|
if (key === 'specialFeatures') return true; // Exclude specialFeatures
|
|
246
206
|
var fieldValue = getFieldValue(listing, key);
|
|
247
207
|
if (value && _typeof(value) === 'object' && value[fieldValue] === true) {
|
|
@@ -285,10 +245,10 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
|
|
|
285
245
|
var locations = siteConfig.locationFiltersShown.map(function (fieldName, index) {
|
|
286
246
|
var locationFilteredListings = allListings;
|
|
287
247
|
locationFilteredListings = allListings.filter(function (listing) {
|
|
288
|
-
return Object.entries(selectedFilters).every(function (
|
|
289
|
-
var
|
|
290
|
-
key =
|
|
291
|
-
value =
|
|
248
|
+
return Object.entries(selectedFilters).every(function (_ref7) {
|
|
249
|
+
var _ref8 = _slicedToArray(_ref7, 2),
|
|
250
|
+
key = _ref8[0],
|
|
251
|
+
value = _ref8[1];
|
|
292
252
|
if (siteConfig.locationFiltersShown.includes(key)) return true;
|
|
293
253
|
var fieldValue = getFieldValue(listing, key);
|
|
294
254
|
if (value && _typeof(value) === 'object' && value[fieldValue] === true) {
|
|
@@ -356,9 +316,6 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
|
|
|
356
316
|
items: getPointsOfInterestOptions(siteConfig.pointsOfInterestConfig.pointsOfInterestNames)
|
|
357
317
|
};
|
|
358
318
|
|
|
359
|
-
// Get dynamic custom field filters (multi-value fields not in specialFeatures)
|
|
360
|
-
var dynamicCustomFilters = getDynamicCustomFieldFilters(allListings, countListings, siteConfig, filterConfig);
|
|
361
|
-
|
|
362
319
|
// Filter out null filters and ensure items arrays don't contain undefined values
|
|
363
320
|
var cleanFilters = dynamicFilters.filter(function (f) {
|
|
364
321
|
return f != null && f.items != null;
|
|
@@ -378,11 +335,8 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
|
|
|
378
335
|
})
|
|
379
336
|
});
|
|
380
337
|
});
|
|
381
|
-
|
|
382
|
-
// Add dynamic custom field filters to the main filters array
|
|
383
|
-
var allCleanFilters = [].concat(_toConsumableArray(cleanFilters), _toConsumableArray(dynamicCustomFilters));
|
|
384
338
|
return {
|
|
385
|
-
filters:
|
|
339
|
+
filters: cleanFilters,
|
|
386
340
|
locations: cleanLocations,
|
|
387
341
|
pointsOfInterest: pointsOfInterest
|
|
388
342
|
};
|
|
@@ -390,14 +344,14 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
|
|
|
390
344
|
return null;
|
|
391
345
|
};
|
|
392
346
|
var applyFilters = /*#__PURE__*/function () {
|
|
393
|
-
var
|
|
347
|
+
var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(allListings, selectedFilters, query, listingEntities, favorites, siteConfig) {
|
|
394
348
|
var isFirstLoad,
|
|
395
349
|
results,
|
|
396
350
|
invertedSpecialFeaturesMap,
|
|
397
351
|
hasFavorite,
|
|
398
352
|
favorite,
|
|
399
353
|
_loop,
|
|
400
|
-
|
|
354
|
+
_i2,
|
|
401
355
|
_Object$entries,
|
|
402
356
|
attempts,
|
|
403
357
|
distinctItems,
|
|
@@ -408,10 +362,10 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
408
362
|
isFirstLoad = _args2.length > 6 && _args2[6] !== undefined ? _args2[6] : false;
|
|
409
363
|
results = allListings;
|
|
410
364
|
if (siteConfig.specialFeatures) {
|
|
411
|
-
invertedSpecialFeaturesMap = Object.entries(siteConfig.specialFeatures).reduce(function (acc,
|
|
412
|
-
var
|
|
413
|
-
key =
|
|
414
|
-
value =
|
|
365
|
+
invertedSpecialFeaturesMap = Object.entries(siteConfig.specialFeatures).reduce(function (acc, _ref10) {
|
|
366
|
+
var _ref11 = _slicedToArray(_ref10, 2),
|
|
367
|
+
key = _ref11[0],
|
|
368
|
+
value = _ref11[1];
|
|
415
369
|
acc[value] = key;
|
|
416
370
|
return acc;
|
|
417
371
|
}, {});
|
|
@@ -431,7 +385,7 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
431
385
|
return _regeneratorRuntime().wrap(function _loop$(_context) {
|
|
432
386
|
while (1) switch (_context.prev = _context.next) {
|
|
433
387
|
case 0:
|
|
434
|
-
_Object$entries$_i = _slicedToArray(_Object$entries[
|
|
388
|
+
_Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2), field = _Object$entries$_i[0], filterItems = _Object$entries$_i[1];
|
|
435
389
|
formattedField = field;
|
|
436
390
|
if (!(field === "pointsOfInterest")) {
|
|
437
391
|
_context.next = 4;
|
|
@@ -441,14 +395,38 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
441
395
|
case 4:
|
|
442
396
|
if (field === "specialFeatures" && invertedSpecialFeaturesMap && Object.keys(filterItems).length > 0) {
|
|
443
397
|
results = results.filter(function (listing) {
|
|
444
|
-
return Object.entries(filterItems).some(function (
|
|
445
|
-
var
|
|
446
|
-
filterName =
|
|
447
|
-
filterValue =
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
//
|
|
451
|
-
|
|
398
|
+
return Object.entries(filterItems).some(function (_ref12) {
|
|
399
|
+
var _ref13 = _slicedToArray(_ref12, 2),
|
|
400
|
+
filterName = _ref13[0],
|
|
401
|
+
filterValue = _ref13[1];
|
|
402
|
+
if (!filterValue) return false;
|
|
403
|
+
|
|
404
|
+
// Check if this is a multi-value filter (has a colon in the name)
|
|
405
|
+
if (filterName.includes(': ')) {
|
|
406
|
+
var _Object$entries$find;
|
|
407
|
+
var _filterName$split = filterName.split(': '),
|
|
408
|
+
_filterName$split2 = _slicedToArray(_filterName$split, 2),
|
|
409
|
+
baseFeatureName = _filterName$split2[0],
|
|
410
|
+
expectedValue = _filterName$split2[1];
|
|
411
|
+
// Find the field key for this feature
|
|
412
|
+
var listingFieldName = (_Object$entries$find = Object.entries(siteConfig.specialFeatures).find(function (_ref14) {
|
|
413
|
+
var _ref15 = _slicedToArray(_ref14, 2);
|
|
414
|
+
_ref15[0];
|
|
415
|
+
var displayName = _ref15[1];
|
|
416
|
+
return displayName === baseFeatureName;
|
|
417
|
+
})) === null || _Object$entries$find === void 0 ? void 0 : _Object$entries$find[0];
|
|
418
|
+
if (listingFieldName) {
|
|
419
|
+
var value = getFieldValue(listing, listingFieldName);
|
|
420
|
+
return value === expectedValue;
|
|
421
|
+
}
|
|
422
|
+
return false;
|
|
423
|
+
} else {
|
|
424
|
+
// Handle boolean special features
|
|
425
|
+
var _listingFieldName = invertedSpecialFeaturesMap[filterName];
|
|
426
|
+
var _value = getFieldValue(listing, _listingFieldName);
|
|
427
|
+
// Support both numeric (1/0) and string ("true"/"false") boolean values
|
|
428
|
+
return _value == 1 || _value === 1 || _value === '1' || _value === 'true' || _value === true;
|
|
429
|
+
}
|
|
452
430
|
});
|
|
453
431
|
});
|
|
454
432
|
} else if (Object.keys(filterItems).length > 0) {
|
|
@@ -463,9 +441,9 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
463
441
|
}
|
|
464
442
|
}, _loop);
|
|
465
443
|
});
|
|
466
|
-
|
|
444
|
+
_i2 = 0, _Object$entries = Object.entries(selectedFilters);
|
|
467
445
|
case 8:
|
|
468
|
-
if (!(
|
|
446
|
+
if (!(_i2 < _Object$entries.length)) {
|
|
469
447
|
_context2.next = 15;
|
|
470
448
|
break;
|
|
471
449
|
}
|
|
@@ -477,7 +455,7 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
477
455
|
}
|
|
478
456
|
return _context2.abrupt("continue", 12);
|
|
479
457
|
case 12:
|
|
480
|
-
|
|
458
|
+
_i2++;
|
|
481
459
|
_context2.next = 8;
|
|
482
460
|
break;
|
|
483
461
|
case 15:
|
|
@@ -542,7 +520,7 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
542
520
|
}, _callee, null, [[25, 31]]);
|
|
543
521
|
}));
|
|
544
522
|
return function applyFilters(_x, _x2, _x3, _x4, _x5, _x6) {
|
|
545
|
-
return
|
|
523
|
+
return _ref9.apply(this, arguments);
|
|
546
524
|
};
|
|
547
525
|
}();
|
|
548
526
|
function searchResults(results, query) {
|
|
@@ -589,5 +567,5 @@ var filterListingsByLocation = function filterListingsByLocation(allListings, se
|
|
|
589
567
|
};
|
|
590
568
|
};
|
|
591
569
|
|
|
592
|
-
export { applyFilters, filterListingsByLocation, generateFilterOptions,
|
|
570
|
+
export { applyFilters, filterListingsByLocation, generateFilterOptions, getFieldValue, getFilterOptions, getSpecialFeatureOptions };
|
|
593
571
|
//# sourceMappingURL=filterUtil.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterUtil.js","sources":["../../src/util/filterUtil.js"],"sourcesContent":["/* eslint-disable no-undef */\nimport { getDistinctItemsByProximity } from '~/util/mapUtil';\nimport { isAlgoliaAvailable, isAlgoliaInitializing, filterListingsByAlgoliaSearch } from '~/util/algoliaSearchUtil';\n\nimport Fuse from 'fuse.js';\n\n// Helper function to get field value from either fields or customFields\nexport const getFieldValue = (listing, fieldKey) => {\n\t// First check in fields\n\tif (listing.fields && listing.fields[fieldKey] !== undefined && listing.fields[fieldKey] !== null) {\n\t\treturn listing.fields[fieldKey];\n\t}\n\t\n\t// Then check in customFields array\n\tif (listing.customFields && Array.isArray(listing.customFields)) {\n\t\tconst customField = listing.customFields.find(\n\t\t\tcf => cf.id === fieldKey || cf.name === fieldKey\n\t\t);\n\t\tif (customField) {\n\t\t\treturn customField.value;\n\t\t}\n\t}\n\t\n\treturn undefined;\n};\n\nexport const getFilterOptions = (listings, filteredListings, field, excludeZeroCount = false) => {\n\tconst options = new Set();\n\tlistings.forEach(listing => {\n\t\tconst value = getFieldValue(listing, field);\n\t\tif (value) {\n\t\t\toptions.add(value);\n\t\t}\n\t});\n\n\tconst optionCounts = {};\n\toptions.forEach(option => {\n\t\toptionCounts[option] = 0;\n\t});\n\n\tfilteredListings.forEach(listing => {\n\t\tconst value = getFieldValue(listing, field);\n\t\tif (value && Object.prototype.hasOwnProperty.call(optionCounts, value)) {\n\t\t\toptionCounts[value] += 1;\n\t\t}\n\t});\n\n\tlet result = Array.from(options)\n\t\t.filter(option => option != null && option !== '') // Filter out null/empty values\n\t\t.map(option => ({\n\t\t\tname: option,\n\t\t\tcount: optionCounts[option] || 0\n\t\t}))\n\t\t.filter(option => !(excludeZeroCount === true && option.count === 0));\n\n\t// Sort alphabetically\n\tresult.sort((a, b) => a.name.localeCompare(b.name));\n\n\treturn result;\n};\n\nexport const getSpecialFeatureOptions = (listings, filteredListings, siteConfig, favorites, filterConfig = {}) => {\n\tconst specialFeatures = siteConfig.specialFeatures;\n\tconst featureCounts = Object.keys(specialFeatures).sort().reduce((acc, key) => {\n\t\tacc[specialFeatures[key]] = 0;\n\t\treturn acc;\n\t}, {});\n\n\tfilteredListings.forEach(listing => {\n\t\tObject.entries(specialFeatures).forEach(([featureKey, featureName]) => {\n\t\t\tconst value = getFieldValue(listing, featureKey);\n\t\t\t// Support both numeric (1/0) and string (\"true\"/\"false\") boolean values\n\t\t\tif (value == 1 || value === 1 || value === '1' || value === 'true' || value === true) {\n\t\t\t\tfeatureCounts[featureName] += 1;\n\t\t\t}\n\t\t});\n\t});\n\n\tlet specialFeatureOptions = Object.entries(featureCounts).map(([name, count]) => ({\n\t\tname,\n\t\tcount\n\t}));\n\n\t// Update favorite count\n\tfor (let option of specialFeatureOptions) {\n\t\tif (option.name === 'Favorite') {\n\t\t\toption.count = filteredListings.filter(x => favorites.includes(x.id)).length;\n\t\t}\n\t}\n\n\t// Hide favorites if filterConfig.showFavorites is false\n\tif (filterConfig.showFavorites === false) {\n\t\tspecialFeatureOptions = specialFeatureOptions.filter(option => option.name !== 'Favorite');\n\t}\n\n\t// Hide zero results if filterConfig.hideZeroResults is true\n\tif (filterConfig.hideZeroResults === true) {\n\t\tspecialFeatureOptions = specialFeatureOptions.filter(option => option.count > 0);\n\t}\n\n\treturn specialFeatureOptions;\n};\n\n// Helper to detect if a custom field should be treated as boolean or multi-value\nconst isCustomFieldBoolean = (listings, fieldKey) => {\n\tconst distinctValues = new Set();\n\t\n\tfor (const listing of listings) {\n\t\tconst value = getFieldValue(listing, fieldKey);\n\t\tif (value != null && value !== '' && value !== undefined) {\n\t\t\tdistinctValues.add(String(value).toLowerCase());\n\t\t}\n\t\t// If we find more than 2 non-empty distinct values, it's not boolean\n\t\tif (distinctValues.size > 2) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\t// Check if all values are boolean-like\n\tconst booleanValues = new Set(['true', 'false', '1', '0', 'yes', 'no']);\n\tfor (const val of distinctValues) {\n\t\tif (!booleanValues.has(val)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\treturn distinctValues.size > 0 && distinctValues.size <= 2;\n};\n\n// Get dynamic custom field filters (for non-boolean multi-value fields)\nexport const getDynamicCustomFieldFilters = (listings, filteredListings, siteConfig, filterConfig = {}) => {\n\tif (!siteConfig.specialFeatures) return [];\n\t\n\tconst dynamicFilters = [];\n\tconst specialFeaturesKeys = Object.keys(siteConfig.specialFeatures);\n\t\n\t// Find all custom fields used across listings\n\tconst allCustomFields = new Set();\n\tlistings.forEach(listing => {\n\t\tif (listing.customFields && Array.isArray(listing.customFields)) {\n\t\t\tlisting.customFields.forEach(cf => {\n\t\t\t\tif (cf.id || cf.name) {\n\t\t\t\t\tallCustomFields.add(cf.id || cf.name);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t\n\t// For each custom field, check if it's NOT in specialFeatures and NOT boolean\n\tallCustomFields.forEach(fieldKey => {\n\t\t// Skip if already in specialFeatures\n\t\tif (specialFeaturesKeys.includes(fieldKey)) return;\n\t\t\n\t\t// Check if this field has multiple non-boolean values\n\t\tif (!isCustomFieldBoolean(listings, fieldKey)) {\n\t\t\tconst options = getFilterOptions(listings, filteredListings, fieldKey, filterConfig.hideZeroResults);\n\t\t\t\n\t\t\t// Only add if there are meaningful options\n\t\t\tif (options.length > 1) {\n\t\t\t\tdynamicFilters.push({\n\t\t\t\t\tid: fieldKey,\n\t\t\t\t\ttitle: fieldKey.charAt(0).toUpperCase() + fieldKey.slice(1).replace(/([A-Z])/g, ' $1').trim(),\n\t\t\t\t\titems: options,\n\t\t\t\t\tisDynamic: true\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n\t\n\treturn dynamicFilters;\n};\n\nconst getPointsOfInterestOptions = pointsOfInterestNames => {\n\treturn Object.entries(pointsOfInterestNames).sort().map(([key, name]) => ({\n\t\tkey,\n\t\tname\n\t}));\n};\n\nexport const generateFilterOptions = (\n\tfilteredListings,\n\tallListings,\n\tsiteConfig,\n\tfilterOptions,\n\tparentField,\n\tfavorites,\n\tselectedFilters,\n\tfilterConfig = {\n\t\thideZeroResults: false,\n\t\tdynamicCounts: true,\n\t\tshowFavorites: true,\n\t\tcollapsedByDefault: false,\n\t\tsortAlphabetically: false\n\t}\n) => {\n\tif (allListings.length > 0) {\n\t\t// Determine which listings to use for counts based on dynamicCounts setting\n\t\tconst countListings = filterConfig.dynamicCounts ? filteredListings : allListings;\n\n\t\tconst dynamicFilters = siteConfig.fieldFiltersShown.map(fieldName => {\n\t\t\tif (fieldName === parentField && filterOptions?.filters) {\n\t\t\t\treturn filterOptions.filters.find(filter => filter.id === fieldName);\n\t\t\t}\n\t\t\tif(fieldName == 'category'){\n\t\t\t\t// For category counts, exclude specialFeatures from the filter calculation\n\t\t\t\t// so that toggling specialFeatures updates category counts\n\t\t\t\tlet categoryCountListings = countListings;\n\t\t\t\tif (filterConfig.dynamicCounts && selectedFilters.specialFeatures) {\n\t\t\t\t\tcategoryCountListings = allListings.filter(listing => {\n\t\t\t\t\t\treturn Object.entries(selectedFilters).every(([key, value]) => {\n\t\t\t\t\t\t\tif (key === 'specialFeatures') return true; // Exclude specialFeatures\n\t\t\t\t\t\t\tconst fieldValue = getFieldValue(listing, key);\n\t\t\t\t\t\t\tif (value && typeof value === 'object' && value[fieldValue] === true) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tid: fieldName,\n\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\titems: getFilterOptions(allListings, categoryCountListings, fieldName, filterConfig.hideZeroResults)\n\t\t\t\t};\n\t\t\t}\n\t\t\tif(fieldName == 'subCategory' && selectedFilters.category){\n\t\t\t\tconst categoryKeys = Object.keys(selectedFilters.category);\n\t\t\t\tconst filteredByCategory = allListings.filter(\n\t\t\t\t\tx => categoryKeys.includes(x.fields?.category)\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tid: fieldName,\n\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\titems: getFilterOptions(allListings, filteredByCategory, fieldName, filterConfig.hideZeroResults)\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (fieldName == \"specialFeatures\") {\n\t\t\t\treturn {\n\t\t\t\t\tid: fieldName,\n\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\titems: getSpecialFeatureOptions(allListings, countListings, siteConfig, favorites, filterConfig).sort()\n\t\t\t\t};\n\t\t\t}\n\t\treturn {\n\t\t\tid: fieldName,\n\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\titems: getFilterOptions(allListings, countListings, fieldName, filterConfig.hideZeroResults)\n\t\t};\n\t});\t\tconst locations =\n\t\t\tsiteConfig.locationFiltersShown.map((fieldName, index) => {\n\t\t\t\tlet locationFilteredListings = allListings;\n\t\t\t\tlocationFilteredListings = allListings.filter(listing => {\n\t\t\t\t\treturn Object.entries(selectedFilters).every(([key, value]) => {\n\t\t\t\t\t\tif (siteConfig.locationFiltersShown.includes(key)) return true;\n\t\t\t\t\t\tconst fieldValue = getFieldValue(listing, key);\n\t\t\t\t\t\tif (value && typeof value === 'object' && value[fieldValue] === true) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tif (index === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: fieldName,\n\t\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\t\titems: getFilterOptions(allListings, locationFilteredListings, fieldName, true)\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t if (fieldName === 'entityName' && filterOptions?.locations) {\n\t\t\t\t\tconst cityIncluded = siteConfig.locationFiltersShown.includes('city');\n\t\t\t\t\tconst stateIncluded = siteConfig.locationFiltersShown.includes('state');\n\t\t\t\t\tconst cityStateIncluded = siteConfig.locationFiltersShown.includes('cityState');\n\t\t\t\t\tconst uniqueCities = cityIncluded ? [...new Set(filteredListings.map(listing => listing.fields.city))] : [];\n\t\t\t\t\tconst uniqueStates = stateIncluded ? [...new Set(filteredListings.map(listing => listing.fields.state))] : [];\n\t\t\t\t\tconst uniqueCityStates = cityStateIncluded ? [...new Set(filteredListings.map(listing => listing.fields.cityState))] : [];\n\t\t\t\t\tconst filteredByLocation = locationFilteredListings.filter(listing => {\n\t\t\t\t\t\tconst cityMatches = cityIncluded ? uniqueCities.includes(listing.fields.city) : true;\n\t\t\t\t\t\tconst stateMatches = stateIncluded ? uniqueStates.includes(listing.fields.state) : true;\n\t\t\t\t\t\tconst cityStateMatches = cityStateIncluded ? uniqueCityStates.includes(listing.fields.cityState) : true;\n\t\t\t\t\t\treturn cityMatches && stateMatches && cityStateMatches;\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: fieldName,\n\t\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\t\titems: getFilterOptions(allListings, filteredByLocation, fieldName, true)\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (fieldName === 'city') {\n\t\t\t\t\tif (siteConfig.locationFiltersShown.includes('state') && selectedFilters.state) {\n\t\t\t\t\t\tconst selectedStates = Object.keys(selectedFilters.state).filter(\n\t\t\t\t\t\t\tstate => selectedFilters.state[state] === true\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst filteredByLocation = locationFilteredListings.filter(listing =>\n\t\t\t\t\t\t\tselectedStates.includes(listing.fields.state)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: fieldName,\n\t\t\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\t\t\titems: getFilterOptions(allListings, filteredByLocation, fieldName, true)\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tid: fieldName,\n\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\titems: getFilterOptions(allListings, filteredListings, fieldName, true)\n\t\t\t\t};\n\t\t\t});\n\n\t\tconst pointsOfInterest = {\n\t\t\tid: \"pointsOfInterest\",\n\t\t\ttitle: siteConfig.pointsOfInterestConfig.title,\n\t\t\titems: getPointsOfInterestOptions(\n\t\t\t\tsiteConfig.pointsOfInterestConfig.pointsOfInterestNames\n\t\t\t)\n\t\t};\n\n\t\t// Get dynamic custom field filters (multi-value fields not in specialFeatures)\n\t\tconst dynamicCustomFilters = getDynamicCustomFieldFilters(allListings, countListings, siteConfig, filterConfig);\n\n\t\t// Filter out null filters and ensure items arrays don't contain undefined values\n\t\tconst cleanFilters = dynamicFilters\n\t\t\t.filter(f => f != null && f.items != null)\n\t\t\t.map(f => ({\n\t\t\t\t...f,\n\t\t\t\titems: f.items.filter(item => item != null && item.name != null)\n\t\t\t}));\n\n\t\tconst cleanLocations = locations\n\t\t\t.filter(l => l != null && l.items != null)\n\t\t\t.map(l => ({\n\t\t\t\t...l,\n\t\t\t\titems: l.items.filter(item => item != null && item.name != null)\n\t\t\t}));\n\n\t\t// Add dynamic custom field filters to the main filters array\n\t\tconst allCleanFilters = [...cleanFilters, ...dynamicCustomFilters];\n\n\t\treturn {\n\t\t\tfilters: allCleanFilters,\n\t\t\tlocations: cleanLocations,\n\t\t\tpointsOfInterest: pointsOfInterest\n\t\t};\n\t}\n\n\treturn null;\n};\n\nexport const applyFilters = async (\n\tallListings,\n\tselectedFilters,\n\tquery,\n\tlistingEntities,\n\tfavorites,\n\tsiteConfig,\n\tisFirstLoad = false\n) => {\n\tlet results = allListings;\n\tlet invertedSpecialFeaturesMap;\n\tif (siteConfig.specialFeatures) {\n\t\tinvertedSpecialFeaturesMap = Object.entries(siteConfig.specialFeatures).reduce((acc, [key, value]) => {\n\t\t\tacc[value] = key;\n\t\t\treturn acc;\n\t\t}, {});\n\n\t}\n\tconst hasFavorite = !!selectedFilters.specialFeatures && !!selectedFilters.specialFeatures.Favorite;\n\n\tif (hasFavorite && selectedFilters.specialFeatures.Favorite == true) {\n\t\tresults = results.filter(x => favorites.includes(x.id));\n\t}\n\tvar favorite;\n\tif (hasFavorite) {\n\t\tfavorite = selectedFilters.specialFeatures.Favorite;\n\t\tdelete selectedFilters.specialFeatures.Favorite;\n\t}\n\tfor (const [field, filterItems] of Object.entries(selectedFilters)) {\n\t\tconst formattedField = field;\n\t\tif (field === \"pointsOfInterest\") continue;\n\t\tif (field === \"specialFeatures\" && invertedSpecialFeaturesMap && Object.keys(filterItems).length > 0) {\n\t\t\tresults = results.filter(listing => {\n\t\t\t\treturn Object.entries(filterItems).some(([filterName, filterValue]) => {\n\t\t\t\t\tconst listingFieldName = invertedSpecialFeaturesMap[filterName];\n\t\t\t\t\tconst value = getFieldValue(listing, listingFieldName);\n\t\t\t\t\t// Support both numeric (1/0) and string (\"true\"/\"false\") boolean values\n\t\t\t\t\treturn filterValue && (value == 1 || value === 1 || value === '1' || value === 'true' || value === true);\n\t\t\t\t});\n\t\t\t});\n\t\t} else if (Object.keys(filterItems).length > 0) {\n\t\t\tresults = results.filter(listing => {\n\t\t\t\tconst value = getFieldValue(listing, formattedField);\n\t\t\t\treturn Object.prototype.hasOwnProperty.call(filterItems, value);\n\t\t\t});\n\t\t}\n\t}\n\tif (query) {\n\t\t// Wait for Algolia to finish initializing ONLY on first load (from URL/localStorage)\n\t\t// Don't wait on subsequent manual searches to avoid slowing down the interface\n\t\tif (isFirstLoad && isAlgoliaInitializing()) {\n\t\t\t// Wait up to 500ms for Algolia to initialize on first load\n\t\t\tlet attempts = 0;\n\t\t\twhile (isAlgoliaInitializing() && attempts < 10) {\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 50));\n\t\t\t\tattempts++;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Use Algolia if available, otherwise fall back to Fuse.js\n\t\tif (isAlgoliaAvailable()) {\n\t\t\ttry {\n\t\t\t\tresults = await filterListingsByAlgoliaSearch(results, query);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Algolia search failed, falling back to Fuse.js:', error);\n\t\t\t\tresults = searchResults(results, query);\n\t\t\t}\n\t\t} else {\n\t\t\tresults = searchResults(results, query);\n\t\t}\n\t}\n\tconst distinctItems = getDistinctItemsByProximity(results, listingEntities);\n\tif (hasFavorite) {\n\t\tselectedFilters.specialFeatures.Favorite = favorite;\n\t}\n\treturn { filteredListings: results, mapItems: distinctItems };\n};\n\nfunction searchResults(results, query) {\n\tconst fields = [\n\t\t'id',\n\t\t'uniqueId',\n\t\t'fields.posted',\n\t\t'fields.subtitle',\n\t\t'fields.education',\n\t\t'fields.title',\n\t\t'fields.category',\n\t\t'fields.subCategory',\n\t\t'fields.shift',\n\t\t'fields.citystate',\n\t\t'fields.city',\n\t\t'fields.state',\n\t\t'fields.schedule',\n\t\t'fields.customflag1',\n\t\t'fields.bonus',\n\t\t'fields.remote',\n\t\t'fields.useclientjoburl',\n\t\t'fields.datecreated',\n\t\t'fields.datelastedited'\n\t];\n\n\tconst options = {\n\t\tincludeScore: true,\n\t\tthreshold: 0.3,\n\t\tkeys: fields\n\t};\n\n\tconst fuse = new Fuse(results, options);\n\tconst lowerCaseQuery = query.toLowerCase();\n\tconst queryTerms = lowerCaseQuery.split(' ');\n\n\tconst exactIdMatch = results.find(result => result.id.toString() === query || result.uniqueId === query);\n\tif (exactIdMatch) {\n\t\treturn [exactIdMatch];\n\t}\n\n\tconst fuseQuery = queryTerms.map(term => ({\n\t\t$or: fields.map(field => ({ [field]: term }))\n\t}));\n\n\tconst fuseResults = fuse.search({ $and: fuseQuery });\n\n\treturn fuseResults.map(result => result.item);\n}\n\nexport const filterListingsByLocation = (\n\tallListings,\n\tselectedLocation,\n\tlistingEntities\n) => {\n\tlet results = allListings;\n\tif (selectedLocation !== null) {\n\t\tresults = results.filter(item =>\n\t\t\tObject.prototype.hasOwnProperty.call(selectedLocation.items, item.id)\n\t\t);\n\t}\n\tconst mapItems = getDistinctItemsByProximity(results, listingEntities);\n\treturn { filteredListings: results, mapItems: mapItems };\n};\n"],"names":["getFieldValue","listing","fieldKey","fields","undefined","customFields","Array","isArray","customField","find","cf","id","name","value","getFilterOptions","listings","filteredListings","field","excludeZeroCount","arguments","length","options","Set","forEach","add","optionCounts","option","Object","prototype","hasOwnProperty","call","result","from","filter","map","count","sort","a","b","localeCompare","getSpecialFeatureOptions","siteConfig","favorites","filterConfig","specialFeatures","featureCounts","keys","reduce","acc","key","entries","_ref","_ref2","_slicedToArray","featureKey","featureName","specialFeatureOptions","_ref3","_ref4","_iterator","_createForOfIteratorHelper","_step","s","n","done","x","includes","err","e","f","showFavorites","hideZeroResults","isCustomFieldBoolean","distinctValues","_iterator2","_step2","String","toLowerCase","size","booleanValues","_iterator3","_step3","val","has","getDynamicCustomFieldFilters","dynamicFilters","specialFeaturesKeys","allCustomFields","push","title","charAt","toUpperCase","slice","replace","trim","items","isDynamic","getPointsOfInterestOptions","pointsOfInterestNames","_ref5","_ref6","generateFilterOptions","allListings","filterOptions","parentField","selectedFilters","dynamicCounts","collapsedByDefault","sortAlphabetically","countListings","fieldFiltersShown","fieldName","filters","categoryCountListings","every","_ref7","_ref8","fieldValue","_typeof","fieldNames","category","categoryKeys","filteredByCategory","_x$fields","locations","locationFiltersShown","index","locationFilteredListings","_ref9","_ref10","cityIncluded","stateIncluded","cityStateIncluded","uniqueCities","_toConsumableArray","city","uniqueStates","state","uniqueCityStates","cityState","filteredByLocation","cityMatches","stateMatches","cityStateMatches","selectedStates","pointsOfInterest","pointsOfInterestConfig","dynamicCustomFilters","cleanFilters","_objectSpread","item","cleanLocations","l","allCleanFilters","concat","applyFilters","_ref11","_asyncToGenerator","_regeneratorRuntime","mark","_callee","query","listingEntities","isFirstLoad","results","invertedSpecialFeaturesMap","hasFavorite","favorite","_loop","_i","_Object$entries","attempts","distinctItems","_args2","wrap","_callee$","_context2","prev","next","_ref12","_ref13","Favorite","_Object$entries$_i","filterItems","formattedField","_loop$","_context","abrupt","some","_ref14","_ref15","filterName","filterValue","listingFieldName","stop","delegateYield","t0","isAlgoliaInitializing","Promise","resolve","setTimeout","isAlgoliaAvailable","filterListingsByAlgoliaSearch","sent","t1","console","error","searchResults","getDistinctItemsByProximity","mapItems","_x","_x2","_x3","_x4","_x5","_x6","apply","includeScore","threshold","fuse","Fuse","lowerCaseQuery","queryTerms","split","exactIdMatch","toString","uniqueId","fuseQuery","term","$or","_defineProperty","fuseResults","search","$and","filterListingsByLocation","selectedLocation"],"mappings":";;;;;AAMA;AACO,IAAMA,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,OAAO,EAAEC,QAAQ,EAAK;AACnD;EACA,IAAID,OAAO,CAACE,MAAM,IAAIF,OAAO,CAACE,MAAM,CAACD,QAAQ,CAAC,KAAKE,SAAS,IAAIH,OAAO,CAACE,MAAM,CAACD,QAAQ,CAAC,KAAK,IAAI,EAAE;AAClG,IAAA,OAAOD,OAAO,CAACE,MAAM,CAACD,QAAQ,CAAC,CAAA;AAChC,GAAA;;AAEA;AACA,EAAA,IAAID,OAAO,CAACI,YAAY,IAAIC,KAAK,CAACC,OAAO,CAACN,OAAO,CAACI,YAAY,CAAC,EAAE;IAChE,IAAMG,WAAW,GAAGP,OAAO,CAACI,YAAY,CAACI,IAAI,CAC5C,UAAAC,EAAE,EAAA;MAAA,OAAIA,EAAE,CAACC,EAAE,KAAKT,QAAQ,IAAIQ,EAAE,CAACE,IAAI,KAAKV,QAAQ,CAAA;AAAA,KACjD,CAAC,CAAA;AACD,IAAA,IAAIM,WAAW,EAAE;MAChB,OAAOA,WAAW,CAACK,KAAK,CAAA;AACzB,KAAA;AACD,GAAA;AAEA,EAAA,OAAOT,SAAS,CAAA;AACjB,EAAC;AAEM,IAAMU,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAIC,QAAQ,EAAEC,gBAAgB,EAAEC,KAAK,EAA+B;AAAA,EAAA,IAA7BC,gBAAgB,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAf,SAAA,GAAAe,SAAA,CAAA,CAAA,CAAA,GAAG,KAAK,CAAA;AAC3F,EAAA,IAAME,OAAO,GAAG,IAAIC,GAAG,EAAE,CAAA;AACzBP,EAAAA,QAAQ,CAACQ,OAAO,CAAC,UAAAtB,OAAO,EAAI;AAC3B,IAAA,IAAMY,KAAK,GAAGb,aAAa,CAACC,OAAO,EAAEgB,KAAK,CAAC,CAAA;AAC3C,IAAA,IAAIJ,KAAK,EAAE;AACVQ,MAAAA,OAAO,CAACG,GAAG,CAACX,KAAK,CAAC,CAAA;AACnB,KAAA;AACD,GAAC,CAAC,CAAA;EAEF,IAAMY,YAAY,GAAG,EAAE,CAAA;AACvBJ,EAAAA,OAAO,CAACE,OAAO,CAAC,UAAAG,MAAM,EAAI;AACzBD,IAAAA,YAAY,CAACC,MAAM,CAAC,GAAG,CAAC,CAAA;AACzB,GAAC,CAAC,CAAA;AAEFV,EAAAA,gBAAgB,CAACO,OAAO,CAAC,UAAAtB,OAAO,EAAI;AACnC,IAAA,IAAMY,KAAK,GAAGb,aAAa,CAACC,OAAO,EAAEgB,KAAK,CAAC,CAAA;AAC3C,IAAA,IAAIJ,KAAK,IAAIc,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACL,YAAY,EAAEZ,KAAK,CAAC,EAAE;AACvEY,MAAAA,YAAY,CAACZ,KAAK,CAAC,IAAI,CAAC,CAAA;AACzB,KAAA;AACD,GAAC,CAAC,CAAA;AAEF,EAAA,IAAIkB,MAAM,GAAGzB,KAAK,CAAC0B,IAAI,CAACX,OAAO,CAAC,CAC9BY,MAAM,CAAC,UAAAP,MAAM,EAAA;AAAA,IAAA,OAAIA,MAAM,IAAI,IAAI,IAAIA,MAAM,KAAK,EAAE,CAAA;AAAA,GAAA,CAAC;GACjDQ,GAAG,CAAC,UAAAR,MAAM,EAAA;IAAA,OAAK;AACfd,MAAAA,IAAI,EAAEc,MAAM;AACZS,MAAAA,KAAK,EAAEV,YAAY,CAACC,MAAM,CAAC,IAAI,CAAA;KAC/B,CAAA;AAAA,GAAC,CAAC,CACFO,MAAM,CAAC,UAAAP,MAAM,EAAA;IAAA,OAAI,EAAER,gBAAgB,KAAK,IAAI,IAAIQ,MAAM,CAACS,KAAK,KAAK,CAAC,CAAC,CAAA;GAAC,CAAA,CAAA;;AAEtE;AACAJ,EAAAA,MAAM,CAACK,IAAI,CAAC,UAACC,CAAC,EAAEC,CAAC,EAAA;IAAA,OAAKD,CAAC,CAACzB,IAAI,CAAC2B,aAAa,CAACD,CAAC,CAAC1B,IAAI,CAAC,CAAA;GAAC,CAAA,CAAA;AAEnD,EAAA,OAAOmB,MAAM,CAAA;AACd,EAAC;AAEYS,IAAAA,wBAAwB,GAAG,SAA3BA,wBAAwBA,CAAIzB,QAAQ,EAAEC,gBAAgB,EAAEyB,UAAU,EAAEC,SAAS,EAAwB;AAAA,EAAA,IAAtBC,YAAY,GAAAxB,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAf,SAAA,GAAAe,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE,CAAA;AAC5G,EAAA,IAAMyB,eAAe,GAAGH,UAAU,CAACG,eAAe,CAAA;AAClD,EAAA,IAAMC,aAAa,GAAGlB,MAAM,CAACmB,IAAI,CAACF,eAAe,CAAC,CAACR,IAAI,EAAE,CAACW,MAAM,CAAC,UAACC,GAAG,EAAEC,GAAG,EAAK;AAC9ED,IAAAA,GAAG,CAACJ,eAAe,CAACK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;AAC7B,IAAA,OAAOD,GAAG,CAAA;GACV,EAAE,EAAE,CAAC,CAAA;AAENhC,EAAAA,gBAAgB,CAACO,OAAO,CAAC,UAAAtB,OAAO,EAAI;IACnC0B,MAAM,CAACuB,OAAO,CAACN,eAAe,CAAC,CAACrB,OAAO,CAAC,UAAA4B,IAAA,EAA+B;AAAA,MAAA,IAAAC,KAAA,GAAAC,cAAA,CAAAF,IAAA,EAAA,CAAA,CAAA;AAA7BG,QAAAA,UAAU,GAAAF,KAAA,CAAA,CAAA,CAAA;AAAEG,QAAAA,WAAW,GAAAH,KAAA,CAAA,CAAA,CAAA,CAAA;AAChE,MAAA,IAAMvC,KAAK,GAAGb,aAAa,CAACC,OAAO,EAAEqD,UAAU,CAAC,CAAA;AAChD;AACA,MAAA,IAAIzC,KAAK,IAAI,CAAC,IAAIA,KAAK,KAAK,CAAC,IAAIA,KAAK,KAAK,GAAG,IAAIA,KAAK,KAAK,MAAM,IAAIA,KAAK,KAAK,IAAI,EAAE;AACrFgC,QAAAA,aAAa,CAACU,WAAW,CAAC,IAAI,CAAC,CAAA;AAChC,OAAA;AACD,KAAC,CAAC,CAAA;AACH,GAAC,CAAC,CAAA;AAEF,EAAA,IAAIC,qBAAqB,GAAG7B,MAAM,CAACuB,OAAO,CAACL,aAAa,CAAC,CAACX,GAAG,CAAC,UAAAuB,KAAA,EAAA;AAAA,IAAA,IAAAC,KAAA,GAAAL,cAAA,CAAAI,KAAA,EAAA,CAAA,CAAA;AAAE7C,MAAAA,IAAI,GAAA8C,KAAA,CAAA,CAAA,CAAA;AAAEvB,MAAAA,KAAK,GAAAuB,KAAA,CAAA,CAAA,CAAA,CAAA;IAAA,OAAO;AACjF9C,MAAAA,IAAI,EAAJA,IAAI;AACJuB,MAAAA,KAAK,EAALA,KAAAA;KACA,CAAA;AAAA,GAAC,CAAC,CAAA;;AAEH;AAAA,EAAA,IAAAwB,SAAA,GAAAC,0BAAA,CACmBJ,qBAAqB,CAAA;IAAAK,KAAA,CAAA;AAAA,EAAA,IAAA;IAAxC,KAAAF,SAAA,CAAAG,CAAA,EAAAD,EAAAA,CAAAA,CAAAA,KAAA,GAAAF,SAAA,CAAAI,CAAA,EAAAC,EAAAA,IAAA,GAA0C;AAAA,MAAA,IAAjCtC,MAAM,GAAAmC,KAAA,CAAAhD,KAAA,CAAA;AACd,MAAA,IAAIa,MAAM,CAACd,IAAI,KAAK,UAAU,EAAE;QAC/Bc,MAAM,CAACS,KAAK,GAAGnB,gBAAgB,CAACiB,MAAM,CAAC,UAAAgC,CAAC,EAAA;AAAA,UAAA,OAAIvB,SAAS,CAACwB,QAAQ,CAACD,CAAC,CAACtD,EAAE,CAAC,CAAA;AAAA,SAAA,CAAC,CAACS,MAAM,CAAA;AAC7E,OAAA;AACD,KAAA;;AAEA;AAAA,GAAA,CAAA,OAAA+C,GAAA,EAAA;IAAAR,SAAA,CAAAS,CAAA,CAAAD,GAAA,CAAA,CAAA;AAAA,GAAA,SAAA;AAAAR,IAAAA,SAAA,CAAAU,CAAA,EAAA,CAAA;AAAA,GAAA;AACA,EAAA,IAAI1B,YAAY,CAAC2B,aAAa,KAAK,KAAK,EAAE;AACzCd,IAAAA,qBAAqB,GAAGA,qBAAqB,CAACvB,MAAM,CAAC,UAAAP,MAAM,EAAA;AAAA,MAAA,OAAIA,MAAM,CAACd,IAAI,KAAK,UAAU,CAAA;KAAC,CAAA,CAAA;AAC3F,GAAA;;AAEA;AACA,EAAA,IAAI+B,YAAY,CAAC4B,eAAe,KAAK,IAAI,EAAE;AAC1Cf,IAAAA,qBAAqB,GAAGA,qBAAqB,CAACvB,MAAM,CAAC,UAAAP,MAAM,EAAA;AAAA,MAAA,OAAIA,MAAM,CAACS,KAAK,GAAG,CAAC,CAAA;KAAC,CAAA,CAAA;AACjF,GAAA;AAEA,EAAA,OAAOqB,qBAAqB,CAAA;AAC7B,EAAC;;AAED;AACA,IAAMgB,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAIzD,QAAQ,EAAEb,QAAQ,EAAK;AACpD,EAAA,IAAMuE,cAAc,GAAG,IAAInD,GAAG,EAAE,CAAA;AAAC,EAAA,IAAAoD,UAAA,GAAAd,0BAAA,CAEX7C,QAAQ,CAAA;IAAA4D,MAAA,CAAA;AAAA,EAAA,IAAA;IAA9B,KAAAD,UAAA,CAAAZ,CAAA,EAAAa,EAAAA,CAAAA,CAAAA,MAAA,GAAAD,UAAA,CAAAX,CAAA,EAAAC,EAAAA,IAAA,GAAgC;AAAA,MAAA,IAArB/D,OAAO,GAAA0E,MAAA,CAAA9D,KAAA,CAAA;AACjB,MAAA,IAAMA,KAAK,GAAGb,aAAa,CAACC,OAAO,EAAEC,QAAQ,CAAC,CAAA;MAC9C,IAAIW,KAAK,IAAI,IAAI,IAAIA,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAKT,SAAS,EAAE;QACzDqE,cAAc,CAACjD,GAAG,CAACoD,MAAM,CAAC/D,KAAK,CAAC,CAACgE,WAAW,EAAE,CAAC,CAAA;AAChD,OAAA;AACA;AACA,MAAA,IAAIJ,cAAc,CAACK,IAAI,GAAG,CAAC,EAAE;AAC5B,QAAA,OAAO,KAAK,CAAA;AACb,OAAA;AACD,KAAA;;AAEA;AAAA,GAAA,CAAA,OAAAX,GAAA,EAAA;IAAAO,UAAA,CAAAN,CAAA,CAAAD,GAAA,CAAA,CAAA;AAAA,GAAA,SAAA;AAAAO,IAAAA,UAAA,CAAAL,CAAA,EAAA,CAAA;AAAA,GAAA;AACA,EAAA,IAAMU,aAAa,GAAG,IAAIzD,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;AAAC,EAAA,IAAA0D,UAAA,GAAApB,0BAAA,CACtDa,cAAc,CAAA;IAAAQ,MAAA,CAAA;AAAA,EAAA,IAAA;IAAhC,KAAAD,UAAA,CAAAlB,CAAA,EAAAmB,EAAAA,CAAAA,CAAAA,MAAA,GAAAD,UAAA,CAAAjB,CAAA,EAAAC,EAAAA,IAAA,GAAkC;AAAA,MAAA,IAAvBkB,GAAG,GAAAD,MAAA,CAAApE,KAAA,CAAA;AACb,MAAA,IAAI,CAACkE,aAAa,CAACI,GAAG,CAACD,GAAG,CAAC,EAAE;AAC5B,QAAA,OAAO,KAAK,CAAA;AACb,OAAA;AACD,KAAA;AAAC,GAAA,CAAA,OAAAf,GAAA,EAAA;IAAAa,UAAA,CAAAZ,CAAA,CAAAD,GAAA,CAAA,CAAA;AAAA,GAAA,SAAA;AAAAa,IAAAA,UAAA,CAAAX,CAAA,EAAA,CAAA;AAAA,GAAA;EAED,OAAOI,cAAc,CAACK,IAAI,GAAG,CAAC,IAAIL,cAAc,CAACK,IAAI,IAAI,CAAC,CAAA;AAC3D,CAAC,CAAA;;AAED;AACO,IAAMM,4BAA4B,GAAG,SAA/BA,4BAA4BA,CAAIrE,QAAQ,EAAEC,gBAAgB,EAAEyB,UAAU,EAAwB;AAAA,EAAA,IAAtBE,YAAY,GAAAxB,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAf,SAAA,GAAAe,SAAA,CAAA,CAAA,CAAA,GAAG,EAAE,CAAA;AACrG,EAAA,IAAI,CAACsB,UAAU,CAACG,eAAe,EAAE,OAAO,EAAE,CAAA;EAE1C,IAAMyC,cAAc,GAAG,EAAE,CAAA;EACzB,IAAMC,mBAAmB,GAAG3D,MAAM,CAACmB,IAAI,CAACL,UAAU,CAACG,eAAe,CAAC,CAAA;;AAEnE;AACA,EAAA,IAAM2C,eAAe,GAAG,IAAIjE,GAAG,EAAE,CAAA;AACjCP,EAAAA,QAAQ,CAACQ,OAAO,CAAC,UAAAtB,OAAO,EAAI;AAC3B,IAAA,IAAIA,OAAO,CAACI,YAAY,IAAIC,KAAK,CAACC,OAAO,CAACN,OAAO,CAACI,YAAY,CAAC,EAAE;AAChEJ,MAAAA,OAAO,CAACI,YAAY,CAACkB,OAAO,CAAC,UAAAb,EAAE,EAAI;AAClC,QAAA,IAAIA,EAAE,CAACC,EAAE,IAAID,EAAE,CAACE,IAAI,EAAE;UACrB2E,eAAe,CAAC/D,GAAG,CAACd,EAAE,CAACC,EAAE,IAAID,EAAE,CAACE,IAAI,CAAC,CAAA;AACtC,SAAA;AACD,OAAC,CAAC,CAAA;AACH,KAAA;AACD,GAAC,CAAC,CAAA;;AAEF;AACA2E,EAAAA,eAAe,CAAChE,OAAO,CAAC,UAAArB,QAAQ,EAAI;AACnC;AACA,IAAA,IAAIoF,mBAAmB,CAACpB,QAAQ,CAAChE,QAAQ,CAAC,EAAE,OAAA;;AAE5C;AACA,IAAA,IAAI,CAACsE,oBAAoB,CAACzD,QAAQ,EAAEb,QAAQ,CAAC,EAAE;AAC9C,MAAA,IAAMmB,OAAO,GAAGP,gBAAgB,CAACC,QAAQ,EAAEC,gBAAgB,EAAEd,QAAQ,EAAEyC,YAAY,CAAC4B,eAAe,CAAC,CAAA;;AAEpG;AACA,MAAA,IAAIlD,OAAO,CAACD,MAAM,GAAG,CAAC,EAAE;QACvBiE,cAAc,CAACG,IAAI,CAAC;AACnB7E,UAAAA,EAAE,EAAET,QAAQ;AACZuF,UAAAA,KAAK,EAAEvF,QAAQ,CAACwF,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,EAAE,GAAGzF,QAAQ,CAAC0F,KAAK,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAACC,IAAI,EAAE;AAC7FC,UAAAA,KAAK,EAAE1E,OAAO;AACd2E,UAAAA,SAAS,EAAE,IAAA;AACZ,SAAC,CAAC,CAAA;AACH,OAAA;AACD,KAAA;AACD,GAAC,CAAC,CAAA;AAEF,EAAA,OAAOX,cAAc,CAAA;AACtB,EAAC;AAED,IAAMY,0BAA0B,GAAG,SAA7BA,0BAA0BA,CAAGC,qBAAqB,EAAI;AAC3D,EAAA,OAAOvE,MAAM,CAACuB,OAAO,CAACgD,qBAAqB,CAAC,CAAC9D,IAAI,EAAE,CAACF,GAAG,CAAC,UAAAiE,KAAA,EAAA;AAAA,IAAA,IAAAC,KAAA,GAAA/C,cAAA,CAAA8C,KAAA,EAAA,CAAA,CAAA;AAAElD,MAAAA,GAAG,GAAAmD,KAAA,CAAA,CAAA,CAAA;AAAExF,MAAAA,IAAI,GAAAwF,KAAA,CAAA,CAAA,CAAA,CAAA;IAAA,OAAO;AACzEnD,MAAAA,GAAG,EAAHA,GAAG;AACHrC,MAAAA,IAAI,EAAJA,IAAAA;KACA,CAAA;AAAA,GAAC,CAAC,CAAA;AACJ,CAAC,CAAA;IAEYyF,qBAAqB,GAAG,SAAxBA,qBAAqBA,CACjCrF,gBAAgB,EAChBsF,WAAW,EACX7D,UAAU,EACV8D,aAAa,EACbC,WAAW,EACX9D,SAAS,EACT+D,eAAe,EAQX;EAAA,IAPJ9D,YAAY,GAAAxB,SAAA,CAAAC,MAAA,GAAAD,CAAAA,IAAAA,SAAA,CAAAf,CAAAA,CAAAA,KAAAA,SAAA,GAAAe,SAAA,CAAG,CAAA,CAAA,GAAA;AACdoD,IAAAA,eAAe,EAAE,KAAK;AACtBmC,IAAAA,aAAa,EAAE,IAAI;AACnBpC,IAAAA,aAAa,EAAE,IAAI;AACnBqC,IAAAA,kBAAkB,EAAE,KAAK;AACzBC,IAAAA,kBAAkB,EAAE,KAAA;GACpB,CAAA;AAED,EAAA,IAAIN,WAAW,CAAClF,MAAM,GAAG,CAAC,EAAE;AAC3B;IACA,IAAMyF,aAAa,GAAGlE,YAAY,CAAC+D,aAAa,GAAG1F,gBAAgB,GAAGsF,WAAW,CAAA;IAEjF,IAAMjB,cAAc,GAAG5C,UAAU,CAACqE,iBAAiB,CAAC5E,GAAG,CAAC,UAAA6E,SAAS,EAAI;MACpE,IAAIA,SAAS,KAAKP,WAAW,IAAID,aAAa,KAAbA,IAAAA,IAAAA,aAAa,KAAbA,KAAAA,CAAAA,IAAAA,aAAa,CAAES,OAAO,EAAE;AACxD,QAAA,OAAOT,aAAa,CAACS,OAAO,CAACvG,IAAI,CAAC,UAAAwB,MAAM,EAAA;AAAA,UAAA,OAAIA,MAAM,CAACtB,EAAE,KAAKoG,SAAS,CAAA;SAAC,CAAA,CAAA;AACrE,OAAA;MACA,IAAGA,SAAS,IAAI,UAAU,EAAC;AAC1B;AACA;QACA,IAAIE,qBAAqB,GAAGJ,aAAa,CAAA;AACzC,QAAA,IAAIlE,YAAY,CAAC+D,aAAa,IAAID,eAAe,CAAC7D,eAAe,EAAE;AAClEqE,UAAAA,qBAAqB,GAAGX,WAAW,CAACrE,MAAM,CAAC,UAAAhC,OAAO,EAAI;YACrD,OAAO0B,MAAM,CAACuB,OAAO,CAACuD,eAAe,CAAC,CAACS,KAAK,CAAC,UAAAC,KAAA,EAAkB;AAAA,cAAA,IAAAC,KAAA,GAAA/D,cAAA,CAAA8D,KAAA,EAAA,CAAA,CAAA;AAAhBlE,gBAAAA,GAAG,GAAAmE,KAAA,CAAA,CAAA,CAAA;AAAEvG,gBAAAA,KAAK,GAAAuG,KAAA,CAAA,CAAA,CAAA,CAAA;AACxD,cAAA,IAAInE,GAAG,KAAK,iBAAiB,EAAE,OAAO,IAAI,CAAC;AAC3C,cAAA,IAAMoE,UAAU,GAAGrH,aAAa,CAACC,OAAO,EAAEgD,GAAG,CAAC,CAAA;AAC9C,cAAA,IAAIpC,KAAK,IAAIyG,OAAA,CAAOzG,KAAK,CAAK,KAAA,QAAQ,IAAIA,KAAK,CAACwG,UAAU,CAAC,KAAK,IAAI,EAAE;AACrE,gBAAA,OAAO,IAAI,CAAA;AACZ,eAAA;AACA,cAAA,OAAO,KAAK,CAAA;AACb,aAAC,CAAC,CAAA;AACH,WAAC,CAAC,CAAA;AACH,SAAA;QACA,OAAO;AACN1G,UAAAA,EAAE,EAAEoG,SAAS;AACbtB,UAAAA,KAAK,EAAEhD,UAAU,CAAC8E,UAAU,CAACR,SAAS,CAAC;UACvChB,KAAK,EAAEjF,gBAAgB,CAACwF,WAAW,EAAEW,qBAAqB,EAAEF,SAAS,EAAEpE,YAAY,CAAC4B,eAAe,CAAA;SACnG,CAAA;AACF,OAAA;AACA,MAAA,IAAGwC,SAAS,IAAI,aAAa,IAAIN,eAAe,CAACe,QAAQ,EAAC;QACzD,IAAMC,YAAY,GAAG9F,MAAM,CAACmB,IAAI,CAAC2D,eAAe,CAACe,QAAQ,CAAC,CAAA;AAC1D,QAAA,IAAME,kBAAkB,GAAGpB,WAAW,CAACrE,MAAM,CAC5C,UAAAgC,CAAC,EAAA;AAAA,UAAA,IAAA0D,SAAA,CAAA;AAAA,UAAA,OAAIF,YAAY,CAACvD,QAAQ,CAAA,CAAAyD,SAAA,GAAC1D,CAAC,CAAC9D,MAAM,cAAAwH,SAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAARA,SAAA,CAAUH,QAAQ,CAAC,CAAA;AAAA,SAC/C,CAAC,CAAA;QACD,OAAO;AACN7G,UAAAA,EAAE,EAAEoG,SAAS;AACbtB,UAAAA,KAAK,EAAEhD,UAAU,CAAC8E,UAAU,CAACR,SAAS,CAAC;UACvChB,KAAK,EAAEjF,gBAAgB,CAACwF,WAAW,EAAEoB,kBAAkB,EAAEX,SAAS,EAAEpE,YAAY,CAAC4B,eAAe,CAAA;SAChG,CAAA;AACF,OAAA;MACA,IAAIwC,SAAS,IAAI,iBAAiB,EAAE;QACnC,OAAO;AACNpG,UAAAA,EAAE,EAAEoG,SAAS;AACbtB,UAAAA,KAAK,EAAEhD,UAAU,CAAC8E,UAAU,CAACR,SAAS,CAAC;AACvChB,UAAAA,KAAK,EAAEvD,wBAAwB,CAAC8D,WAAW,EAAEO,aAAa,EAAEpE,UAAU,EAAEC,SAAS,EAAEC,YAAY,CAAC,CAACP,IAAI,EAAC;SACtG,CAAA;AACF,OAAA;MACD,OAAO;AACNzB,QAAAA,EAAE,EAAEoG,SAAS;AACbtB,QAAAA,KAAK,EAAEhD,UAAU,CAAC8E,UAAU,CAACR,SAAS,CAAC;QACvChB,KAAK,EAAEjF,gBAAgB,CAACwF,WAAW,EAAEO,aAAa,EAAEE,SAAS,EAAEpE,YAAY,CAAC4B,eAAe,CAAA;OAC3F,CAAA;AACF,KAAC,CAAC,CAAA;AAAG,IAAA,IAAMqD,SAAS,GAClBnF,UAAU,CAACoF,oBAAoB,CAAC3F,GAAG,CAAC,UAAC6E,SAAS,EAAEe,KAAK,EAAK;MACzD,IAAIC,wBAAwB,GAAGzB,WAAW,CAAA;AAC1CyB,MAAAA,wBAAwB,GAAGzB,WAAW,CAACrE,MAAM,CAAC,UAAAhC,OAAO,EAAI;QACxD,OAAO0B,MAAM,CAACuB,OAAO,CAACuD,eAAe,CAAC,CAACS,KAAK,CAAC,UAAAc,KAAA,EAAkB;AAAA,UAAA,IAAAC,MAAA,GAAA5E,cAAA,CAAA2E,KAAA,EAAA,CAAA,CAAA;AAAhB/E,YAAAA,GAAG,GAAAgF,MAAA,CAAA,CAAA,CAAA;AAAEpH,YAAAA,KAAK,GAAAoH,MAAA,CAAA,CAAA,CAAA,CAAA;UACxD,IAAIxF,UAAU,CAACoF,oBAAoB,CAAC3D,QAAQ,CAACjB,GAAG,CAAC,EAAE,OAAO,IAAI,CAAA;AAC9D,UAAA,IAAMoE,UAAU,GAAGrH,aAAa,CAACC,OAAO,EAAEgD,GAAG,CAAC,CAAA;AAC9C,UAAA,IAAIpC,KAAK,IAAIyG,OAAA,CAAOzG,KAAK,CAAK,KAAA,QAAQ,IAAIA,KAAK,CAACwG,UAAU,CAAC,KAAK,IAAI,EAAE;AACrE,YAAA,OAAO,IAAI,CAAA;AACZ,WAAA;AACA,UAAA,OAAO,KAAK,CAAA;AACb,SAAC,CAAC,CAAA;AACH,OAAC,CAAC,CAAA;MACF,IAAIS,KAAK,KAAK,CAAC,EAAE;QAChB,OAAO;AACNnH,UAAAA,EAAE,EAAEoG,SAAS;AACbtB,UAAAA,KAAK,EAAEhD,UAAU,CAAC8E,UAAU,CAACR,SAAS,CAAC;UACvChB,KAAK,EAAEjF,gBAAgB,CAACwF,WAAW,EAAEyB,wBAAwB,EAAEhB,SAAS,EAAE,IAAI,CAAA;SAC9E,CAAA;AACF,OAAA;MACE,IAAIA,SAAS,KAAK,YAAY,IAAIR,aAAa,KAAbA,IAAAA,IAAAA,aAAa,KAAbA,KAAAA,CAAAA,IAAAA,aAAa,CAAEqB,SAAS,EAAE;QAC7D,IAAMM,YAAY,GAAGzF,UAAU,CAACoF,oBAAoB,CAAC3D,QAAQ,CAAC,MAAM,CAAC,CAAA;QACrE,IAAMiE,aAAa,GAAG1F,UAAU,CAACoF,oBAAoB,CAAC3D,QAAQ,CAAC,OAAO,CAAC,CAAA;QACvE,IAAMkE,iBAAiB,GAAG3F,UAAU,CAACoF,oBAAoB,CAAC3D,QAAQ,CAAC,WAAW,CAAC,CAAA;AAC/E,QAAA,IAAMmE,YAAY,GAAGH,YAAY,GAAAI,kBAAA,CAAO,IAAIhH,GAAG,CAACN,gBAAgB,CAACkB,GAAG,CAAC,UAAAjC,OAAO,EAAA;AAAA,UAAA,OAAIA,OAAO,CAACE,MAAM,CAACoI,IAAI,CAAA;SAAC,CAAA,CAAC,IAAI,EAAE,CAAA;AAC3G,QAAA,IAAMC,YAAY,GAAGL,aAAa,GAAAG,kBAAA,CAAO,IAAIhH,GAAG,CAACN,gBAAgB,CAACkB,GAAG,CAAC,UAAAjC,OAAO,EAAA;AAAA,UAAA,OAAIA,OAAO,CAACE,MAAM,CAACsI,KAAK,CAAA;SAAC,CAAA,CAAC,IAAI,EAAE,CAAA;AAC7G,QAAA,IAAMC,gBAAgB,GAAGN,iBAAiB,GAAAE,kBAAA,CAAO,IAAIhH,GAAG,CAACN,gBAAgB,CAACkB,GAAG,CAAC,UAAAjC,OAAO,EAAA;AAAA,UAAA,OAAIA,OAAO,CAACE,MAAM,CAACwI,SAAS,CAAA;SAAC,CAAA,CAAC,IAAI,EAAE,CAAA;QACzH,IAAMC,kBAAkB,GAAGb,wBAAwB,CAAC9F,MAAM,CAAC,UAAAhC,OAAO,EAAI;AACrE,UAAA,IAAM4I,WAAW,GAAGX,YAAY,GAAGG,YAAY,CAACnE,QAAQ,CAACjE,OAAO,CAACE,MAAM,CAACoI,IAAI,CAAC,GAAG,IAAI,CAAA;AACpF,UAAA,IAAMO,YAAY,GAAGX,aAAa,GAAGK,YAAY,CAACtE,QAAQ,CAACjE,OAAO,CAACE,MAAM,CAACsI,KAAK,CAAC,GAAG,IAAI,CAAA;AACvF,UAAA,IAAMM,gBAAgB,GAAGX,iBAAiB,GAAGM,gBAAgB,CAACxE,QAAQ,CAACjE,OAAO,CAACE,MAAM,CAACwI,SAAS,CAAC,GAAG,IAAI,CAAA;AACvG,UAAA,OAAOE,WAAW,IAAIC,YAAY,IAAIC,gBAAgB,CAAA;AACvD,SAAC,CAAC,CAAA;QACF,OAAO;AACNpI,UAAAA,EAAE,EAAEoG,SAAS;AACbtB,UAAAA,KAAK,EAAEhD,UAAU,CAAC8E,UAAU,CAACR,SAAS,CAAC;UACvChB,KAAK,EAAEjF,gBAAgB,CAACwF,WAAW,EAAEsC,kBAAkB,EAAE7B,SAAS,EAAE,IAAI,CAAA;SACxE,CAAA;AACF,OAAA;MACA,IAAIA,SAAS,KAAK,MAAM,EAAE;AACzB,QAAA,IAAItE,UAAU,CAACoF,oBAAoB,CAAC3D,QAAQ,CAAC,OAAO,CAAC,IAAIuC,eAAe,CAACgC,KAAK,EAAE;AAC/E,UAAA,IAAMO,cAAc,GAAGrH,MAAM,CAACmB,IAAI,CAAC2D,eAAe,CAACgC,KAAK,CAAC,CAACxG,MAAM,CAC/D,UAAAwG,KAAK,EAAA;AAAA,YAAA,OAAIhC,eAAe,CAACgC,KAAK,CAACA,KAAK,CAAC,KAAK,IAAI,CAAA;AAAA,WAC/C,CAAC,CAAA;AAED,UAAA,IAAMG,mBAAkB,GAAGb,wBAAwB,CAAC9F,MAAM,CAAC,UAAAhC,OAAO,EAAA;YAAA,OACjE+I,cAAc,CAAC9E,QAAQ,CAACjE,OAAO,CAACE,MAAM,CAACsI,KAAK,CAAC,CAAA;AAAA,WAC9C,CAAC,CAAA;UAED,OAAO;AACN9H,YAAAA,EAAE,EAAEoG,SAAS;AACbtB,YAAAA,KAAK,EAAEhD,UAAU,CAAC8E,UAAU,CAACR,SAAS,CAAC;YACvChB,KAAK,EAAEjF,gBAAgB,CAACwF,WAAW,EAAEsC,mBAAkB,EAAE7B,SAAS,EAAE,IAAI,CAAA;WACxE,CAAA;AACF,SAAA;AACD,OAAA;MAEA,OAAO;AACNpG,QAAAA,EAAE,EAAEoG,SAAS;AACbtB,QAAAA,KAAK,EAAEhD,UAAU,CAAC8E,UAAU,CAACR,SAAS,CAAC;QACvChB,KAAK,EAAEjF,gBAAgB,CAACwF,WAAW,EAAEtF,gBAAgB,EAAE+F,SAAS,EAAE,IAAI,CAAA;OACtE,CAAA;AACF,KAAC,CAAC,CAAA;AAEH,IAAA,IAAMkC,gBAAgB,GAAG;AACxBtI,MAAAA,EAAE,EAAE,kBAAkB;AACtB8E,MAAAA,KAAK,EAAEhD,UAAU,CAACyG,sBAAsB,CAACzD,KAAK;AAC9CM,MAAAA,KAAK,EAAEE,0BAA0B,CAChCxD,UAAU,CAACyG,sBAAsB,CAAChD,qBACnC,CAAA;KACA,CAAA;;AAED;IACA,IAAMiD,oBAAoB,GAAG/D,4BAA4B,CAACkB,WAAW,EAAEO,aAAa,EAAEpE,UAAU,EAAEE,YAAY,CAAC,CAAA;;AAE/G;AACA,IAAA,IAAMyG,YAAY,GAAG/D,cAAc,CACjCpD,MAAM,CAAC,UAAAoC,CAAC,EAAA;MAAA,OAAIA,CAAC,IAAI,IAAI,IAAIA,CAAC,CAAC0B,KAAK,IAAI,IAAI,CAAA;AAAA,KAAA,CAAC,CACzC7D,GAAG,CAAC,UAAAmC,CAAC,EAAA;AAAA,MAAA,OAAAgF,cAAA,CAAAA,cAAA,CAAA,EAAA,EACFhF,CAAC,CAAA,EAAA,EAAA,EAAA;QACJ0B,KAAK,EAAE1B,CAAC,CAAC0B,KAAK,CAAC9D,MAAM,CAAC,UAAAqH,IAAI,EAAA;UAAA,OAAIA,IAAI,IAAI,IAAI,IAAIA,IAAI,CAAC1I,IAAI,IAAI,IAAI,CAAA;AAAA,SAAA,CAAA;AAAC,OAAA,CAAA,CAAA;AAAA,KAC/D,CAAC,CAAA;AAEJ,IAAA,IAAM2I,cAAc,GAAG3B,SAAS,CAC9B3F,MAAM,CAAC,UAAAuH,CAAC,EAAA;MAAA,OAAIA,CAAC,IAAI,IAAI,IAAIA,CAAC,CAACzD,KAAK,IAAI,IAAI,CAAA;AAAA,KAAA,CAAC,CACzC7D,GAAG,CAAC,UAAAsH,CAAC,EAAA;AAAA,MAAA,OAAAH,cAAA,CAAAA,cAAA,CAAA,EAAA,EACFG,CAAC,CAAA,EAAA,EAAA,EAAA;QACJzD,KAAK,EAAEyD,CAAC,CAACzD,KAAK,CAAC9D,MAAM,CAAC,UAAAqH,IAAI,EAAA;UAAA,OAAIA,IAAI,IAAI,IAAI,IAAIA,IAAI,CAAC1I,IAAI,IAAI,IAAI,CAAA;AAAA,SAAA,CAAA;AAAC,OAAA,CAAA,CAAA;AAAA,KAC/D,CAAC,CAAA;;AAEJ;IACA,IAAM6I,eAAe,GAAAC,EAAAA,CAAAA,MAAA,CAAApB,kBAAA,CAAOc,YAAY,CAAAd,EAAAA,kBAAA,CAAKa,oBAAoB,CAAC,CAAA,CAAA;IAElE,OAAO;AACNnC,MAAAA,OAAO,EAAEyC,eAAe;AACxB7B,MAAAA,SAAS,EAAE2B,cAAc;AACzBN,MAAAA,gBAAgB,EAAEA,gBAAAA;KAClB,CAAA;AACF,GAAA;AAEA,EAAA,OAAO,IAAI,CAAA;AACZ,EAAC;IAEYU,YAAY,gBAAA,YAAA;EAAA,IAAAC,MAAA,GAAAC,iBAAA,eAAAC,mBAAA,EAAAC,CAAAA,IAAA,CAAG,SAAAC,OAAAA,CAC3B1D,WAAW,EACXG,eAAe,EACfwD,KAAK,EACLC,eAAe,EACfxH,SAAS,EACTD,UAAU,EAAA;AAAA,IAAA,IAAA0H,WAAA;MAAAC,OAAA;MAAAC,0BAAA;MAAAC,WAAA;MAAAC,QAAA;MAAAC,KAAA;MAAAC,EAAA;MAAAC,eAAA;MAAAC,QAAA;MAAAC,aAAA;AAAAC,MAAAA,MAAA,GAAA1J,SAAA,CAAA;AAAA,IAAA,OAAA2I,mBAAA,EAAA,CAAAgB,IAAA,CAAA,SAAAC,SAAAC,SAAA,EAAA;AAAA,MAAA,OAAA,CAAA,EAAA,QAAAA,SAAA,CAAAC,IAAA,GAAAD,SAAA,CAAAE,IAAA;AAAA,QAAA,KAAA,CAAA;UACVf,WAAW,GAAAU,MAAA,CAAAzJ,MAAA,GAAA,CAAA,IAAAyJ,MAAA,CAAA,CAAA,CAAA,KAAAzK,SAAA,GAAAyK,MAAA,CAAA,CAAA,CAAA,GAAG,KAAK,CAAA;AAEfT,UAAAA,OAAO,GAAG9D,WAAW,CAAA;UAEzB,IAAI7D,UAAU,CAACG,eAAe,EAAE;AAC/ByH,YAAAA,0BAA0B,GAAG1I,MAAM,CAACuB,OAAO,CAACT,UAAU,CAACG,eAAe,CAAC,CAACG,MAAM,CAAC,UAACC,GAAG,EAAAmI,MAAA,EAAmB;AAAA,cAAA,IAAAC,MAAA,GAAA/H,cAAA,CAAA8H,MAAA,EAAA,CAAA,CAAA;AAAhBlI,gBAAAA,GAAG,GAAAmI,MAAA,CAAA,CAAA,CAAA;AAAEvK,gBAAAA,KAAK,GAAAuK,MAAA,CAAA,CAAA,CAAA,CAAA;AAC/FpI,cAAAA,GAAG,CAACnC,KAAK,CAAC,GAAGoC,GAAG,CAAA;AAChB,cAAA,OAAOD,GAAG,CAAA;aACV,EAAE,EAAE,CAAC,CAAA;AAEP,WAAA;AACMsH,UAAAA,WAAW,GAAG,CAAC,CAAC7D,eAAe,CAAC7D,eAAe,IAAI,CAAC,CAAC6D,eAAe,CAAC7D,eAAe,CAACyI,QAAQ,CAAA;UAEnG,IAAIf,WAAW,IAAI7D,eAAe,CAAC7D,eAAe,CAACyI,QAAQ,IAAI,IAAI,EAAE;AACpEjB,YAAAA,OAAO,GAAGA,OAAO,CAACnI,MAAM,CAAC,UAAAgC,CAAC,EAAA;AAAA,cAAA,OAAIvB,SAAS,CAACwB,QAAQ,CAACD,CAAC,CAACtD,EAAE,CAAC,CAAA;aAAC,CAAA,CAAA;AACxD,WAAA;AAEA,UAAA,IAAI2J,WAAW,EAAE;AAChBC,YAAAA,QAAQ,GAAG9D,eAAe,CAAC7D,eAAe,CAACyI,QAAQ,CAAA;AACnD,YAAA,OAAO5E,eAAe,CAAC7D,eAAe,CAACyI,QAAQ,CAAA;AAChD,WAAA;AAACb,UAAAA,KAAA,gBAAAV,mBAAA,EAAAC,CAAAA,IAAA,UAAAS,KAAA,GAAA;AAAA,YAAA,IAAAc,kBAAA,EAAArK,KAAA,EAAAsK,WAAA,EAAAC,cAAA,CAAA;AAAA,YAAA,OAAA1B,mBAAA,EAAA,CAAAgB,IAAA,CAAA,SAAAW,OAAAC,QAAA,EAAA;AAAA,cAAA,OAAA,CAAA,EAAA,QAAAA,QAAA,CAAAT,IAAA,GAAAS,QAAA,CAAAR,IAAA;AAAA,gBAAA,KAAA,CAAA;AAAAI,kBAAAA,kBAAA,GAAAjI,cAAA,CAAAqH,eAAA,CAAAD,EAAA,CACWxJ,EAAAA,CAAAA,CAAAA,EAAAA,KAAK,GAAAqK,kBAAA,CAAEC,CAAAA,CAAAA,EAAAA,WAAW,GAAAD,kBAAA,CAAA,CAAA,CAAA,CAAA;AACvBE,kBAAAA,cAAc,GAAGvK,KAAK,CAAA;kBAAA,IACxBA,EAAAA,KAAK,KAAK,kBAAkB,CAAA,EAAA;AAAAyK,oBAAAA,QAAA,CAAAR,IAAA,GAAA,CAAA,CAAA;AAAA,oBAAA,MAAA;AAAA,mBAAA;kBAAA,OAAAQ,QAAA,CAAAC,MAAA,CAAA,QAAA,EAAA,CAAA,CAAA,CAAA;AAAA,gBAAA,KAAA,CAAA;AAChC,kBAAA,IAAI1K,KAAK,KAAK,iBAAiB,IAAIoJ,0BAA0B,IAAI1I,MAAM,CAACmB,IAAI,CAACyI,WAAW,CAAC,CAACnK,MAAM,GAAG,CAAC,EAAE;AACrGgJ,oBAAAA,OAAO,GAAGA,OAAO,CAACnI,MAAM,CAAC,UAAAhC,OAAO,EAAI;sBACnC,OAAO0B,MAAM,CAACuB,OAAO,CAACqI,WAAW,CAAC,CAACK,IAAI,CAAC,UAAAC,MAAA,EAA+B;AAAA,wBAAA,IAAAC,MAAA,GAAAzI,cAAA,CAAAwI,MAAA,EAAA,CAAA,CAAA;AAA7BE,0BAAAA,UAAU,GAAAD,MAAA,CAAA,CAAA,CAAA;AAAEE,0BAAAA,WAAW,GAAAF,MAAA,CAAA,CAAA,CAAA,CAAA;AAChE,wBAAA,IAAMG,gBAAgB,GAAG5B,0BAA0B,CAAC0B,UAAU,CAAC,CAAA;AAC/D,wBAAA,IAAMlL,KAAK,GAAGb,aAAa,CAACC,OAAO,EAAEgM,gBAAgB,CAAC,CAAA;AACtD;wBACA,OAAOD,WAAW,KAAKnL,KAAK,IAAI,CAAC,IAAIA,KAAK,KAAK,CAAC,IAAIA,KAAK,KAAK,GAAG,IAAIA,KAAK,KAAK,MAAM,IAAIA,KAAK,KAAK,IAAI,CAAC,CAAA;AACzG,uBAAC,CAAC,CAAA;AACH,qBAAC,CAAC,CAAA;AACH,mBAAC,MAAM,IAAIc,MAAM,CAACmB,IAAI,CAACyI,WAAW,CAAC,CAACnK,MAAM,GAAG,CAAC,EAAE;AAC/CgJ,oBAAAA,OAAO,GAAGA,OAAO,CAACnI,MAAM,CAAC,UAAAhC,OAAO,EAAI;AACnC,sBAAA,IAAMY,KAAK,GAAGb,aAAa,CAACC,OAAO,EAAEuL,cAAc,CAAC,CAAA;sBACpD,OAAO7J,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACyJ,WAAW,EAAE1K,KAAK,CAAC,CAAA;AAChE,qBAAC,CAAC,CAAA;AACH,mBAAA;AAAC,gBAAA,KAAA,CAAA,CAAA;AAAA,gBAAA,KAAA,KAAA;kBAAA,OAAA6K,QAAA,CAAAQ,IAAA,EAAA,CAAA;AAAA,eAAA;AAAA,aAAA,EAAA1B,KAAA,CAAA,CAAA;AAAA,WAAA,CAAA,CAAA;UAAAC,EAAA,GAAA,CAAA,EAAAC,eAAA,GAjBiC/I,MAAM,CAACuB,OAAO,CAACuD,eAAe,CAAC,CAAA;AAAA,QAAA,KAAA,CAAA;AAAA,UAAA,IAAA,EAAAgE,EAAA,GAAAC,eAAA,CAAAtJ,MAAA,CAAA,EAAA;AAAA4J,YAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,YAAA,MAAA;AAAA,WAAA;AAAA,UAAA,OAAAF,SAAA,CAAAmB,aAAA,CAAA3B,KAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,CAAA;AAAA,QAAA,KAAA,EAAA;UAAA,IAAAQ,CAAAA,SAAA,CAAAoB,EAAA,EAAA;AAAApB,YAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,YAAA,MAAA;AAAA,WAAA;UAAA,OAAAF,SAAA,CAAAW,MAAA,CAAA,UAAA,EAAA,EAAA,CAAA,CAAA;AAAA,QAAA,KAAA,EAAA;UAAAlB,EAAA,EAAA,CAAA;AAAAO,UAAAA,SAAA,CAAAE,IAAA,GAAA,CAAA,CAAA;AAAA,UAAA,MAAA;AAAA,QAAA,KAAA,EAAA;AAAA,UAAA,IAAA,CAmB9DjB,KAAK,EAAA;AAAAe,YAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,YAAA,MAAA;AAAA,WAAA;AAAA,UAAA,IAAA,EAGJf,WAAW,IAAIkC,qBAAqB,EAAE,CAAA,EAAA;AAAArB,YAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,YAAA,MAAA;AAAA,WAAA;AACzC;AACIP,UAAAA,QAAQ,GAAG,CAAC,CAAA;AAAA,QAAA,KAAA,EAAA;AAAA,UAAA,IAAA,EACT0B,qBAAqB,EAAE,IAAI1B,QAAQ,GAAG,EAAE,CAAA,EAAA;AAAAK,YAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,YAAA,MAAA;AAAA,WAAA;AAAAF,UAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,UAAA,OACxC,IAAIoB,OAAO,CAAC,UAAAC,OAAO,EAAA;AAAA,YAAA,OAAIC,UAAU,CAACD,OAAO,EAAE,EAAE,CAAC,CAAA;WAAC,CAAA,CAAA;AAAA,QAAA,KAAA,EAAA;AACrD5B,UAAAA,QAAQ,EAAE,CAAA;AAACK,UAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,UAAA,MAAA;AAAA,QAAA,KAAA,EAAA;UAAA,IAKTuB,CAAAA,kBAAkB,EAAE,EAAA;AAAAzB,YAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,YAAA,MAAA;AAAA,WAAA;AAAAF,UAAAA,SAAA,CAAAC,IAAA,GAAA,EAAA,CAAA;AAAAD,UAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,UAAA,OAENwB,6BAA6B,CAACtC,OAAO,EAAEH,KAAK,CAAC,CAAA;AAAA,QAAA,KAAA,EAAA;UAA7DG,OAAO,GAAAY,SAAA,CAAA2B,IAAA,CAAA;AAAA3B,UAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,UAAA,MAAA;AAAA,QAAA,KAAA,EAAA;AAAAF,UAAAA,SAAA,CAAAC,IAAA,GAAA,EAAA,CAAA;UAAAD,SAAA,CAAA4B,EAAA,GAAA5B,SAAA,CAAA,OAAA,CAAA,CAAA,EAAA,CAAA,CAAA;UAEP6B,OAAO,CAACC,KAAK,CAAC,iDAAiD,EAAA9B,SAAA,CAAA4B,EAAO,CAAC,CAAA;AACvExC,UAAAA,OAAO,GAAG2C,aAAa,CAAC3C,OAAO,EAAEH,KAAK,CAAC,CAAA;AAAC,QAAA,KAAA,EAAA;AAAAe,UAAAA,SAAA,CAAAE,IAAA,GAAA,EAAA,CAAA;AAAA,UAAA,MAAA;AAAA,QAAA,KAAA,EAAA;AAGzCd,UAAAA,OAAO,GAAG2C,aAAa,CAAC3C,OAAO,EAAEH,KAAK,CAAC,CAAA;AAAC,QAAA,KAAA,EAAA;AAGpCW,UAAAA,aAAa,GAAGoC,2BAA2B,CAAC5C,OAAO,EAAEF,eAAe,CAAC,CAAA;AAC3E,UAAA,IAAII,WAAW,EAAE;AAChB7D,YAAAA,eAAe,CAAC7D,eAAe,CAACyI,QAAQ,GAAGd,QAAQ,CAAA;AACpD,WAAA;UAAC,OAAAS,SAAA,CAAAW,MAAA,CACM,QAAA,EAAA;AAAE3K,YAAAA,gBAAgB,EAAEoJ,OAAO;AAAE6C,YAAAA,QAAQ,EAAErC,aAAAA;WAAe,CAAA,CAAA;AAAA,QAAA,KAAA,EAAA,CAAA;AAAA,QAAA,KAAA,KAAA;UAAA,OAAAI,SAAA,CAAAkB,IAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA,EAAAlC,OAAA,EAAA,IAAA,EAAA,CAAA,CAAA,EAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA;GAC7D,CAAA,CAAA,CAAA;AAAA,EAAA,OAAA,SA5EYL,YAAYA,CAAAuD,EAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA,EAAAC,GAAA,EAAA;AAAA,IAAA,OAAA3D,MAAA,CAAA4D,KAAA,CAAA,IAAA,EAAArM,SAAA,CAAA,CAAA;AAAA,GAAA,CAAA;AAAA,CA4ExB,GAAA;AAED,SAAS4L,aAAaA,CAAC3C,OAAO,EAAEH,KAAK,EAAE;AACtC,EAAA,IAAM9J,MAAM,GAAG,CACd,IAAI,EACJ,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,CACvB,CAAA;AAED,EAAA,IAAMkB,OAAO,GAAG;AACfoM,IAAAA,YAAY,EAAE,IAAI;AAClBC,IAAAA,SAAS,EAAE,GAAG;AACd5K,IAAAA,IAAI,EAAE3C,MAAAA;GACN,CAAA;EAED,IAAMwN,IAAI,GAAG,IAAIC,IAAI,CAACxD,OAAO,EAAE/I,OAAO,CAAC,CAAA;AACvC,EAAA,IAAMwM,cAAc,GAAG5D,KAAK,CAACpF,WAAW,EAAE,CAAA;AAC1C,EAAA,IAAMiJ,UAAU,GAAGD,cAAc,CAACE,KAAK,CAAC,GAAG,CAAC,CAAA;AAE5C,EAAA,IAAMC,YAAY,GAAG5D,OAAO,CAAC3J,IAAI,CAAC,UAAAsB,MAAM,EAAA;AAAA,IAAA,OAAIA,MAAM,CAACpB,EAAE,CAACsN,QAAQ,EAAE,KAAKhE,KAAK,IAAIlI,MAAM,CAACmM,QAAQ,KAAKjE,KAAK,CAAA;GAAC,CAAA,CAAA;AACxG,EAAA,IAAI+D,YAAY,EAAE;IACjB,OAAO,CAACA,YAAY,CAAC,CAAA;AACtB,GAAA;AAEA,EAAA,IAAMG,SAAS,GAAGL,UAAU,CAAC5L,GAAG,CAAC,UAAAkM,IAAI,EAAA;IAAA,OAAK;AACzCC,MAAAA,GAAG,EAAElO,MAAM,CAAC+B,GAAG,CAAC,UAAAjB,KAAK,EAAA;AAAA,QAAA,OAAAqN,eAAA,CAAA,EAAA,EAAQrN,KAAK,EAAGmN,IAAI,CAAA,CAAA;OAAG,CAAA;KAC5C,CAAA;AAAA,GAAC,CAAC,CAAA;AAEH,EAAA,IAAMG,WAAW,GAAGZ,IAAI,CAACa,MAAM,CAAC;AAAEC,IAAAA,IAAI,EAAEN,SAAAA;AAAU,GAAC,CAAC,CAAA;AAEpD,EAAA,OAAOI,WAAW,CAACrM,GAAG,CAAC,UAAAH,MAAM,EAAA;IAAA,OAAIA,MAAM,CAACuH,IAAI,CAAA;GAAC,CAAA,CAAA;AAC9C,CAAA;AAEO,IAAMoF,wBAAwB,GAAG,SAA3BA,wBAAwBA,CACpCpI,WAAW,EACXqI,gBAAgB,EAChBzE,eAAe,EACX;EACJ,IAAIE,OAAO,GAAG9D,WAAW,CAAA;EACzB,IAAIqI,gBAAgB,KAAK,IAAI,EAAE;AAC9BvE,IAAAA,OAAO,GAAGA,OAAO,CAACnI,MAAM,CAAC,UAAAqH,IAAI,EAAA;AAAA,MAAA,OAC5B3H,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAAC6M,gBAAgB,CAAC5I,KAAK,EAAEuD,IAAI,CAAC3I,EAAE,CAAC,CAAA;AAAA,KACtE,CAAC,CAAA;AACF,GAAA;AACA,EAAA,IAAMsM,QAAQ,GAAGD,2BAA2B,CAAC5C,OAAO,EAAEF,eAAe,CAAC,CAAA;EACtE,OAAO;AAAElJ,IAAAA,gBAAgB,EAAEoJ,OAAO;AAAE6C,IAAAA,QAAQ,EAAEA,QAAAA;GAAU,CAAA;AACzD;;;;"}
|
|
1
|
+
{"version":3,"file":"filterUtil.js","sources":["../../src/util/filterUtil.js"],"sourcesContent":["/* eslint-disable no-undef */\nimport { getDistinctItemsByProximity } from '~/util/mapUtil';\nimport { isAlgoliaAvailable, isAlgoliaInitializing, filterListingsByAlgoliaSearch } from '~/util/algoliaSearchUtil';\n\nimport Fuse from 'fuse.js';\n\n// Helper function to get field value from either fields or customFields\nexport const getFieldValue = (listing, fieldKey) => {\n\t// First check in fields\n\tif (listing.fields && listing.fields[fieldKey] !== undefined && listing.fields[fieldKey] !== null) {\n\t\treturn listing.fields[fieldKey];\n\t}\n\t\n\t// Then check in customFields array\n\tif (listing.customFields && Array.isArray(listing.customFields)) {\n\t\tconst customField = listing.customFields.find(\n\t\t\tcf => cf.id === fieldKey || cf.name === fieldKey\n\t\t);\n\t\tif (customField) {\n\t\t\treturn customField.value;\n\t\t}\n\t}\n\t\n\treturn undefined;\n};\n\nexport const getFilterOptions = (listings, filteredListings, field, excludeZeroCount = false) => {\n\tconst options = new Set();\n\tlistings.forEach(listing => {\n\t\tconst value = getFieldValue(listing, field);\n\t\tif (value) {\n\t\t\toptions.add(value);\n\t\t}\n\t});\n\n\tconst optionCounts = {};\n\toptions.forEach(option => {\n\t\toptionCounts[option] = 0;\n\t});\n\n\tfilteredListings.forEach(listing => {\n\t\tconst value = getFieldValue(listing, field);\n\t\tif (value && Object.prototype.hasOwnProperty.call(optionCounts, value)) {\n\t\t\toptionCounts[value] += 1;\n\t\t}\n\t});\n\n\tlet result = Array.from(options)\n\t\t.filter(option => option != null && option !== '') // Filter out null/empty values\n\t\t.map(option => ({\n\t\t\tname: option,\n\t\t\tcount: optionCounts[option] || 0\n\t\t}))\n\t\t.filter(option => !(excludeZeroCount === true && option.count === 0));\n\n\t// Sort alphabetically\n\tresult.sort((a, b) => a.name.localeCompare(b.name));\n\n\treturn result;\n};\n\nexport const getSpecialFeatureOptions = (listings, filteredListings, siteConfig, favorites, filterConfig = {}) => {\n\tconst specialFeatures = siteConfig.specialFeatures;\n\tconst allOptions = [];\n\n\tObject.entries(specialFeatures).forEach(([featureKey, featureName]) => {\n\t\t// Check if this field is in regular fields or custom fields\n\t\tconst hasRegularField = listings.some(listing => \n\t\t\tlisting.fields && listing.fields[featureKey] !== undefined\n\t\t);\n\n\t\tif (hasRegularField) {\n\t\t\t// Handle as boolean field from regular fields\n\t\t\tlet count = 0;\n\t\t\tfilteredListings.forEach(listing => {\n\t\t\t\tconst value = getFieldValue(listing, featureKey);\n\t\t\t\tif (value == 1 || value === 1 || value === '1' || value === 'true' || value === true) {\n\t\t\t\t\tcount += 1;\n\t\t\t\t}\n\t\t\t});\n\t\t\tallOptions.push({ name: featureName, count });\n\t\t} else {\n\t\t\t// Check if it's in custom fields\n\t\t\tconst hasCustomField = listings.some(listing => \n\t\t\t\tlisting.customFields && Array.isArray(listing.customFields) &&\n\t\t\t\tlisting.customFields.some(cf => cf.id === featureKey || cf.name === featureKey)\n\t\t\t);\n\n\t\t\tif (hasCustomField) {\n\t\t\t\t// Get all distinct values for this custom field\n\t\t\t\tconst distinctValues = new Set();\n\t\t\t\tlistings.forEach(listing => {\n\t\t\t\t\tconst value = getFieldValue(listing, featureKey);\n\t\t\t\t\tif (value != null && value !== '' && value !== undefined) {\n\t\t\t\t\t\tdistinctValues.add(String(value));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Check if it's boolean-like\n\t\t\t\tconst booleanValues = new Set(['true', 'false', '1', '0', 'yes', 'no', 'True', 'False']);\n\t\t\t\tconst allBooleanLike = Array.from(distinctValues).every(val => \n\t\t\t\t\tbooleanValues.has(val)\n\t\t\t\t) && distinctValues.size <= 2;\n\n\t\t\t\tif (allBooleanLike) {\n\t\t\t\t\t// Handle as boolean custom field\n\t\t\t\t\tlet count = 0;\n\t\t\t\t\tfilteredListings.forEach(listing => {\n\t\t\t\t\t\tconst value = getFieldValue(listing, featureKey);\n\t\t\t\t\t\tif (value === '1' || value === 'true' || value === 'True' || value === true || value === 1) {\n\t\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tallOptions.push({ name: featureName, count });\n\t\t\t\t} else {\n\t\t\t\t\t// Handle as multi-value custom field - add each distinct value as separate option\n\t\t\t\t\tdistinctValues.forEach(value => {\n\t\t\t\t\t\tlet count = 0;\n\t\t\t\t\t\tfilteredListings.forEach(listing => {\n\t\t\t\t\t\t\tconst listingValue = getFieldValue(listing, featureKey);\n\t\t\t\t\t\t\tif (listingValue === value) {\n\t\t\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tallOptions.push({ \n\t\t\t\t\t\t\tname: `${featureName}: ${value}`, \n\t\t\t\t\t\t\tcount\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t// Update favorite count\n\tfor (let option of allOptions) {\n\t\tif (option.name === 'Favorite') {\n\t\t\toption.count = filteredListings.filter(x => favorites.includes(x.id)).length;\n\t\t}\n\t}\n\n\t// Hide favorites if filterConfig.showFavorites is false\n\tlet finalOptions = allOptions;\n\tif (filterConfig.showFavorites === false) {\n\t\tfinalOptions = finalOptions.filter(option => option.name !== 'Favorite');\n\t}\n\n\t// Hide zero results if filterConfig.hideZeroResults is true\n\tif (filterConfig.hideZeroResults === true) {\n\t\tfinalOptions = finalOptions.filter(option => option.count > 0);\n\t}\n\n\treturn finalOptions;\n};\n\nconst getPointsOfInterestOptions = pointsOfInterestNames => {\n\treturn Object.entries(pointsOfInterestNames).sort().map(([key, name]) => ({\n\t\tkey,\n\t\tname\n\t}));\n};\n\nexport const generateFilterOptions = (\n\tfilteredListings,\n\tallListings,\n\tsiteConfig,\n\tfilterOptions,\n\tparentField,\n\tfavorites,\n\tselectedFilters,\n\tfilterConfig = {\n\t\thideZeroResults: false,\n\t\tdynamicCounts: true,\n\t\tshowFavorites: true,\n\t\tcollapsedByDefault: false,\n\t\tsortAlphabetically: false\n\t}\n) => {\n\tif (allListings.length > 0) {\n\t\t// Determine which listings to use for counts based on dynamicCounts setting\n\t\tconst countListings = filterConfig.dynamicCounts ? filteredListings : allListings;\n\n\t\tconst dynamicFilters = siteConfig.fieldFiltersShown.map(fieldName => {\n\t\t\tif (fieldName === parentField && filterOptions?.filters) {\n\t\t\t\treturn filterOptions.filters.find(filter => filter.id === fieldName);\n\t\t\t}\n\t\t\tif(fieldName == 'category'){\n\t\t\t\t// For category counts, exclude specialFeatures from the filter calculation\n\t\t\t\t// so that toggling specialFeatures updates category counts\n\t\t\t\tlet categoryCountListings = countListings;\n\t\t\t\tif (filterConfig.dynamicCounts && selectedFilters.specialFeatures) {\n\t\t\t\t\tcategoryCountListings = allListings.filter(listing => {\n\t\t\t\t\t\treturn Object.entries(selectedFilters).every(([key, value]) => {\n\t\t\t\t\t\t\tif (key === 'specialFeatures') return true; // Exclude specialFeatures\n\t\t\t\t\t\t\tconst fieldValue = getFieldValue(listing, key);\n\t\t\t\t\t\t\tif (value && typeof value === 'object' && value[fieldValue] === true) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tid: fieldName,\n\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\titems: getFilterOptions(allListings, categoryCountListings, fieldName, filterConfig.hideZeroResults)\n\t\t\t\t};\n\t\t\t}\n\t\t\tif(fieldName == 'subCategory' && selectedFilters.category){\n\t\t\t\tconst categoryKeys = Object.keys(selectedFilters.category);\n\t\t\t\tconst filteredByCategory = allListings.filter(\n\t\t\t\t\tx => categoryKeys.includes(x.fields?.category)\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tid: fieldName,\n\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\titems: getFilterOptions(allListings, filteredByCategory, fieldName, filterConfig.hideZeroResults)\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (fieldName == \"specialFeatures\") {\n\t\t\t\treturn {\n\t\t\t\t\tid: fieldName,\n\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\titems: getSpecialFeatureOptions(allListings, countListings, siteConfig, favorites, filterConfig).sort()\n\t\t\t\t};\n\t\t\t}\n\t\treturn {\n\t\t\tid: fieldName,\n\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\titems: getFilterOptions(allListings, countListings, fieldName, filterConfig.hideZeroResults)\n\t\t};\n\t});\t\tconst locations =\n\t\t\tsiteConfig.locationFiltersShown.map((fieldName, index) => {\n\t\t\t\tlet locationFilteredListings = allListings;\n\t\t\t\tlocationFilteredListings = allListings.filter(listing => {\n\t\t\t\t\treturn Object.entries(selectedFilters).every(([key, value]) => {\n\t\t\t\t\t\tif (siteConfig.locationFiltersShown.includes(key)) return true;\n\t\t\t\t\t\tconst fieldValue = getFieldValue(listing, key);\n\t\t\t\t\t\tif (value && typeof value === 'object' && value[fieldValue] === true) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tif (index === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: fieldName,\n\t\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\t\titems: getFilterOptions(allListings, locationFilteredListings, fieldName, true)\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t if (fieldName === 'entityName' && filterOptions?.locations) {\n\t\t\t\t\tconst cityIncluded = siteConfig.locationFiltersShown.includes('city');\n\t\t\t\t\tconst stateIncluded = siteConfig.locationFiltersShown.includes('state');\n\t\t\t\t\tconst cityStateIncluded = siteConfig.locationFiltersShown.includes('cityState');\n\t\t\t\t\tconst uniqueCities = cityIncluded ? [...new Set(filteredListings.map(listing => listing.fields.city))] : [];\n\t\t\t\t\tconst uniqueStates = stateIncluded ? [...new Set(filteredListings.map(listing => listing.fields.state))] : [];\n\t\t\t\t\tconst uniqueCityStates = cityStateIncluded ? [...new Set(filteredListings.map(listing => listing.fields.cityState))] : [];\n\t\t\t\t\tconst filteredByLocation = locationFilteredListings.filter(listing => {\n\t\t\t\t\t\tconst cityMatches = cityIncluded ? uniqueCities.includes(listing.fields.city) : true;\n\t\t\t\t\t\tconst stateMatches = stateIncluded ? uniqueStates.includes(listing.fields.state) : true;\n\t\t\t\t\t\tconst cityStateMatches = cityStateIncluded ? uniqueCityStates.includes(listing.fields.cityState) : true;\n\t\t\t\t\t\treturn cityMatches && stateMatches && cityStateMatches;\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: fieldName,\n\t\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\t\titems: getFilterOptions(allListings, filteredByLocation, fieldName, true)\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (fieldName === 'city') {\n\t\t\t\t\tif (siteConfig.locationFiltersShown.includes('state') && selectedFilters.state) {\n\t\t\t\t\t\tconst selectedStates = Object.keys(selectedFilters.state).filter(\n\t\t\t\t\t\t\tstate => selectedFilters.state[state] === true\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst filteredByLocation = locationFilteredListings.filter(listing =>\n\t\t\t\t\t\t\tselectedStates.includes(listing.fields.state)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid: fieldName,\n\t\t\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\t\t\titems: getFilterOptions(allListings, filteredByLocation, fieldName, true)\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tid: fieldName,\n\t\t\t\t\ttitle: siteConfig.fieldNames[fieldName],\n\t\t\t\t\titems: getFilterOptions(allListings, filteredListings, fieldName, true)\n\t\t\t\t};\n\t\t\t});\n\n\t\tconst pointsOfInterest = {\n\t\t\tid: \"pointsOfInterest\",\n\t\t\ttitle: siteConfig.pointsOfInterestConfig.title,\n\t\t\titems: getPointsOfInterestOptions(\n\t\t\t\tsiteConfig.pointsOfInterestConfig.pointsOfInterestNames\n\t\t\t)\n\t\t};\n\n\t\t// Filter out null filters and ensure items arrays don't contain undefined values\n\t\tconst cleanFilters = dynamicFilters\n\t\t\t.filter(f => f != null && f.items != null)\n\t\t\t.map(f => ({\n\t\t\t\t...f,\n\t\t\t\titems: f.items.filter(item => item != null && item.name != null)\n\t\t\t}));\n\n\t\tconst cleanLocations = locations\n\t\t\t.filter(l => l != null && l.items != null)\n\t\t\t.map(l => ({\n\t\t\t\t...l,\n\t\t\t\titems: l.items.filter(item => item != null && item.name != null)\n\t\t\t}));\n\n\t\treturn {\n\t\t\tfilters: cleanFilters,\n\t\t\tlocations: cleanLocations,\n\t\t\tpointsOfInterest: pointsOfInterest\n\t\t};\n\t}\n\n\treturn null;\n};\n\nexport const applyFilters = async (\n\tallListings,\n\tselectedFilters,\n\tquery,\n\tlistingEntities,\n\tfavorites,\n\tsiteConfig,\n\tisFirstLoad = false\n) => {\n\tlet results = allListings;\n\tlet invertedSpecialFeaturesMap;\n\tif (siteConfig.specialFeatures) {\n\t\tinvertedSpecialFeaturesMap = Object.entries(siteConfig.specialFeatures).reduce((acc, [key, value]) => {\n\t\t\tacc[value] = key;\n\t\t\treturn acc;\n\t\t}, {});\n\n\t}\n\tconst hasFavorite = !!selectedFilters.specialFeatures && !!selectedFilters.specialFeatures.Favorite;\n\n\tif (hasFavorite && selectedFilters.specialFeatures.Favorite == true) {\n\t\tresults = results.filter(x => favorites.includes(x.id));\n\t}\n\tvar favorite;\n\tif (hasFavorite) {\n\t\tfavorite = selectedFilters.specialFeatures.Favorite;\n\t\tdelete selectedFilters.specialFeatures.Favorite;\n\t}\n\tfor (const [field, filterItems] of Object.entries(selectedFilters)) {\n\t\tconst formattedField = field;\n\t\tif (field === \"pointsOfInterest\") continue;\n\t\tif (field === \"specialFeatures\" && invertedSpecialFeaturesMap && Object.keys(filterItems).length > 0) {\n\t\t\tresults = results.filter(listing => {\n\t\t\t\treturn Object.entries(filterItems).some(([filterName, filterValue]) => {\n\t\t\t\t\tif (!filterValue) return false;\n\t\t\t\t\t\n\t\t\t\t\t// Check if this is a multi-value filter (has a colon in the name)\n\t\t\t\t\tif (filterName.includes(': ')) {\n\t\t\t\t\t\tconst [baseFeatureName, expectedValue] = filterName.split(': ');\n\t\t\t\t\t\t// Find the field key for this feature\n\t\t\t\t\t\tconst listingFieldName = Object.entries(siteConfig.specialFeatures).find(\n\t\t\t\t\t\t\t([key, displayName]) => displayName === baseFeatureName\n\t\t\t\t\t\t)?.[0];\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (listingFieldName) {\n\t\t\t\t\t\t\tconst value = getFieldValue(listing, listingFieldName);\n\t\t\t\t\t\t\treturn value === expectedValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Handle boolean special features\n\t\t\t\t\t\tconst listingFieldName = invertedSpecialFeaturesMap[filterName];\n\t\t\t\t\t\tconst value = getFieldValue(listing, listingFieldName);\n\t\t\t\t\t\t// Support both numeric (1/0) and string (\"true\"/\"false\") boolean values\n\t\t\t\t\t\treturn value == 1 || value === 1 || value === '1' || value === 'true' || value === true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t} else if (Object.keys(filterItems).length > 0) {\n\t\t\tresults = results.filter(listing => {\n\t\t\t\tconst value = getFieldValue(listing, formattedField);\n\t\t\t\treturn Object.prototype.hasOwnProperty.call(filterItems, value);\n\t\t\t});\n\t\t}\n\t}\n\tif (query) {\n\t\t// Wait for Algolia to finish initializing ONLY on first load (from URL/localStorage)\n\t\t// Don't wait on subsequent manual searches to avoid slowing down the interface\n\t\tif (isFirstLoad && isAlgoliaInitializing()) {\n\t\t\t// Wait up to 500ms for Algolia to initialize on first load\n\t\t\tlet attempts = 0;\n\t\t\twhile (isAlgoliaInitializing() && attempts < 10) {\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 50));\n\t\t\t\tattempts++;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Use Algolia if available, otherwise fall back to Fuse.js\n\t\tif (isAlgoliaAvailable()) {\n\t\t\ttry {\n\t\t\t\tresults = await filterListingsByAlgoliaSearch(results, query);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Algolia search failed, falling back to Fuse.js:', error);\n\t\t\t\tresults = searchResults(results, query);\n\t\t\t}\n\t\t} else {\n\t\t\tresults = searchResults(results, query);\n\t\t}\n\t}\n\tconst distinctItems = getDistinctItemsByProximity(results, listingEntities);\n\tif (hasFavorite) {\n\t\tselectedFilters.specialFeatures.Favorite = favorite;\n\t}\n\treturn { filteredListings: results, mapItems: distinctItems };\n};\n\nfunction searchResults(results, query) {\n\tconst fields = [\n\t\t'id',\n\t\t'uniqueId',\n\t\t'fields.posted',\n\t\t'fields.subtitle',\n\t\t'fields.education',\n\t\t'fields.title',\n\t\t'fields.category',\n\t\t'fields.subCategory',\n\t\t'fields.shift',\n\t\t'fields.citystate',\n\t\t'fields.city',\n\t\t'fields.state',\n\t\t'fields.schedule',\n\t\t'fields.customflag1',\n\t\t'fields.bonus',\n\t\t'fields.remote',\n\t\t'fields.useclientjoburl',\n\t\t'fields.datecreated',\n\t\t'fields.datelastedited'\n\t];\n\n\tconst options = {\n\t\tincludeScore: true,\n\t\tthreshold: 0.3,\n\t\tkeys: fields\n\t};\n\n\tconst fuse = new Fuse(results, options);\n\tconst lowerCaseQuery = query.toLowerCase();\n\tconst queryTerms = lowerCaseQuery.split(' ');\n\n\tconst exactIdMatch = results.find(result => result.id.toString() === query || result.uniqueId === query);\n\tif (exactIdMatch) {\n\t\treturn [exactIdMatch];\n\t}\n\n\tconst fuseQuery = queryTerms.map(term => ({\n\t\t$or: fields.map(field => ({ [field]: term }))\n\t}));\n\n\tconst fuseResults = fuse.search({ $and: fuseQuery });\n\n\treturn fuseResults.map(result => result.item);\n}\n\nexport const filterListingsByLocation = (\n\tallListings,\n\tselectedLocation,\n\tlistingEntities\n) => {\n\tlet results = allListings;\n\tif (selectedLocation !== null) {\n\t\tresults = results.filter(item =>\n\t\t\tObject.prototype.hasOwnProperty.call(selectedLocation.items, item.id)\n\t\t);\n\t}\n\tconst mapItems = getDistinctItemsByProximity(results, listingEntities);\n\treturn { filteredListings: results, mapItems: mapItems };\n};\n"],"names":["getFieldValue","listing","fieldKey","fields","undefined","customFields","Array","isArray","customField","find","cf","id","name","value","getFilterOptions","listings","filteredListings","field","excludeZeroCount","arguments","length","options","Set","forEach","add","optionCounts","option","Object","prototype","hasOwnProperty","call","result","from","filter","map","count","sort","a","b","localeCompare","getSpecialFeatureOptions","siteConfig","favorites","filterConfig","specialFeatures","allOptions","entries","_ref","_ref2","_slicedToArray","featureKey","featureName","hasRegularField","some","push","hasCustomField","distinctValues","String","booleanValues","allBooleanLike","every","val","has","size","listingValue","concat","_i","_allOptions","x","includes","finalOptions","showFavorites","hideZeroResults","getPointsOfInterestOptions","pointsOfInterestNames","_ref3","_ref4","key","generateFilterOptions","allListings","filterOptions","parentField","selectedFilters","dynamicCounts","collapsedByDefault","sortAlphabetically","countListings","dynamicFilters","fieldFiltersShown","fieldName","filters","categoryCountListings","_ref5","_ref6","fieldValue","_typeof","title","fieldNames","items","category","categoryKeys","keys","filteredByCategory","_x$fields","locations","locationFiltersShown","index","locationFilteredListings","_ref7","_ref8","cityIncluded","stateIncluded","cityStateIncluded","uniqueCities","_toConsumableArray","city","uniqueStates","state","uniqueCityStates","cityState","filteredByLocation","cityMatches","stateMatches","cityStateMatches","selectedStates","pointsOfInterest","pointsOfInterestConfig","cleanFilters","f","_objectSpread","item","cleanLocations","l","applyFilters","_ref9","_asyncToGenerator","_regeneratorRuntime","mark","_callee","query","listingEntities","isFirstLoad","results","invertedSpecialFeaturesMap","hasFavorite","favorite","_loop","_i2","_Object$entries","attempts","distinctItems","_args2","wrap","_callee$","_context2","prev","next","reduce","acc","_ref10","_ref11","Favorite","_Object$entries$_i","filterItems","formattedField","_loop$","_context","abrupt","_ref12","_ref13","filterName","filterValue","_Object$entries$find","_filterName$split","split","_filterName$split2","baseFeatureName","expectedValue","listingFieldName","_ref14","_ref15","displayName","stop","delegateYield","t0","isAlgoliaInitializing","Promise","resolve","setTimeout","isAlgoliaAvailable","filterListingsByAlgoliaSearch","sent","t1","console","error","searchResults","getDistinctItemsByProximity","mapItems","_x","_x2","_x3","_x4","_x5","_x6","apply","includeScore","threshold","fuse","Fuse","lowerCaseQuery","toLowerCase","queryTerms","exactIdMatch","toString","uniqueId","fuseQuery","term","$or","_defineProperty","fuseResults","search","$and","filterListingsByLocation","selectedLocation"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/util/filterUtil.js
CHANGED
|
@@ -61,113 +61,96 @@ export const getFilterOptions = (listings, filteredListings, field, excludeZeroC
|
|
|
61
61
|
|
|
62
62
|
export const getSpecialFeatureOptions = (listings, filteredListings, siteConfig, favorites, filterConfig = {}) => {
|
|
63
63
|
const specialFeatures = siteConfig.specialFeatures;
|
|
64
|
-
const
|
|
65
|
-
acc[specialFeatures[key]] = 0;
|
|
66
|
-
return acc;
|
|
67
|
-
}, {});
|
|
64
|
+
const allOptions = [];
|
|
68
65
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
66
|
+
Object.entries(specialFeatures).forEach(([featureKey, featureName]) => {
|
|
67
|
+
// Check if this field is in regular fields or custom fields
|
|
68
|
+
const hasRegularField = listings.some(listing =>
|
|
69
|
+
listing.fields && listing.fields[featureKey] !== undefined
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
if (hasRegularField) {
|
|
73
|
+
// Handle as boolean field from regular fields
|
|
74
|
+
let count = 0;
|
|
75
|
+
filteredListings.forEach(listing => {
|
|
76
|
+
const value = getFieldValue(listing, featureKey);
|
|
77
|
+
if (value == 1 || value === 1 || value === '1' || value === 'true' || value === true) {
|
|
78
|
+
count += 1;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
allOptions.push({ name: featureName, count });
|
|
82
|
+
} else {
|
|
83
|
+
// Check if it's in custom fields
|
|
84
|
+
const hasCustomField = listings.some(listing =>
|
|
85
|
+
listing.customFields && Array.isArray(listing.customFields) &&
|
|
86
|
+
listing.customFields.some(cf => cf.id === featureKey || cf.name === featureKey)
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
if (hasCustomField) {
|
|
90
|
+
// Get all distinct values for this custom field
|
|
91
|
+
const distinctValues = new Set();
|
|
92
|
+
listings.forEach(listing => {
|
|
93
|
+
const value = getFieldValue(listing, featureKey);
|
|
94
|
+
if (value != null && value !== '' && value !== undefined) {
|
|
95
|
+
distinctValues.add(String(value));
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// Check if it's boolean-like
|
|
100
|
+
const booleanValues = new Set(['true', 'false', '1', '0', 'yes', 'no', 'True', 'False']);
|
|
101
|
+
const allBooleanLike = Array.from(distinctValues).every(val =>
|
|
102
|
+
booleanValues.has(val)
|
|
103
|
+
) && distinctValues.size <= 2;
|
|
104
|
+
|
|
105
|
+
if (allBooleanLike) {
|
|
106
|
+
// Handle as boolean custom field
|
|
107
|
+
let count = 0;
|
|
108
|
+
filteredListings.forEach(listing => {
|
|
109
|
+
const value = getFieldValue(listing, featureKey);
|
|
110
|
+
if (value === '1' || value === 'true' || value === 'True' || value === true || value === 1) {
|
|
111
|
+
count += 1;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
allOptions.push({ name: featureName, count });
|
|
115
|
+
} else {
|
|
116
|
+
// Handle as multi-value custom field - add each distinct value as separate option
|
|
117
|
+
distinctValues.forEach(value => {
|
|
118
|
+
let count = 0;
|
|
119
|
+
filteredListings.forEach(listing => {
|
|
120
|
+
const listingValue = getFieldValue(listing, featureKey);
|
|
121
|
+
if (listingValue === value) {
|
|
122
|
+
count += 1;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
allOptions.push({
|
|
126
|
+
name: `${featureName}: ${value}`,
|
|
127
|
+
count
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
75
131
|
}
|
|
76
|
-
}
|
|
132
|
+
}
|
|
77
133
|
});
|
|
78
134
|
|
|
79
|
-
let specialFeatureOptions = Object.entries(featureCounts).map(([name, count]) => ({
|
|
80
|
-
name,
|
|
81
|
-
count
|
|
82
|
-
}));
|
|
83
|
-
|
|
84
135
|
// Update favorite count
|
|
85
|
-
for (let option of
|
|
136
|
+
for (let option of allOptions) {
|
|
86
137
|
if (option.name === 'Favorite') {
|
|
87
138
|
option.count = filteredListings.filter(x => favorites.includes(x.id)).length;
|
|
88
139
|
}
|
|
89
140
|
}
|
|
90
141
|
|
|
91
142
|
// Hide favorites if filterConfig.showFavorites is false
|
|
143
|
+
let finalOptions = allOptions;
|
|
92
144
|
if (filterConfig.showFavorites === false) {
|
|
93
|
-
|
|
145
|
+
finalOptions = finalOptions.filter(option => option.name !== 'Favorite');
|
|
94
146
|
}
|
|
95
147
|
|
|
96
148
|
// Hide zero results if filterConfig.hideZeroResults is true
|
|
97
149
|
if (filterConfig.hideZeroResults === true) {
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return specialFeatureOptions;
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
// Helper to detect if a custom field should be treated as boolean or multi-value
|
|
105
|
-
const isCustomFieldBoolean = (listings, fieldKey) => {
|
|
106
|
-
const distinctValues = new Set();
|
|
107
|
-
|
|
108
|
-
for (const listing of listings) {
|
|
109
|
-
const value = getFieldValue(listing, fieldKey);
|
|
110
|
-
if (value != null && value !== '' && value !== undefined) {
|
|
111
|
-
distinctValues.add(String(value).toLowerCase());
|
|
112
|
-
}
|
|
113
|
-
// If we find more than 2 non-empty distinct values, it's not boolean
|
|
114
|
-
if (distinctValues.size > 2) {
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Check if all values are boolean-like
|
|
120
|
-
const booleanValues = new Set(['true', 'false', '1', '0', 'yes', 'no']);
|
|
121
|
-
for (const val of distinctValues) {
|
|
122
|
-
if (!booleanValues.has(val)) {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
150
|
+
finalOptions = finalOptions.filter(option => option.count > 0);
|
|
125
151
|
}
|
|
126
|
-
|
|
127
|
-
return distinctValues.size > 0 && distinctValues.size <= 2;
|
|
128
|
-
};
|
|
129
152
|
|
|
130
|
-
|
|
131
|
-
export const getDynamicCustomFieldFilters = (listings, filteredListings, siteConfig, filterConfig = {}) => {
|
|
132
|
-
if (!siteConfig.specialFeatures) return [];
|
|
133
|
-
|
|
134
|
-
const dynamicFilters = [];
|
|
135
|
-
const specialFeaturesKeys = Object.keys(siteConfig.specialFeatures);
|
|
136
|
-
|
|
137
|
-
// Find all custom fields used across listings
|
|
138
|
-
const allCustomFields = new Set();
|
|
139
|
-
listings.forEach(listing => {
|
|
140
|
-
if (listing.customFields && Array.isArray(listing.customFields)) {
|
|
141
|
-
listing.customFields.forEach(cf => {
|
|
142
|
-
if (cf.id || cf.name) {
|
|
143
|
-
allCustomFields.add(cf.id || cf.name);
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// For each custom field, check if it's NOT in specialFeatures and NOT boolean
|
|
150
|
-
allCustomFields.forEach(fieldKey => {
|
|
151
|
-
// Skip if already in specialFeatures
|
|
152
|
-
if (specialFeaturesKeys.includes(fieldKey)) return;
|
|
153
|
-
|
|
154
|
-
// Check if this field has multiple non-boolean values
|
|
155
|
-
if (!isCustomFieldBoolean(listings, fieldKey)) {
|
|
156
|
-
const options = getFilterOptions(listings, filteredListings, fieldKey, filterConfig.hideZeroResults);
|
|
157
|
-
|
|
158
|
-
// Only add if there are meaningful options
|
|
159
|
-
if (options.length > 1) {
|
|
160
|
-
dynamicFilters.push({
|
|
161
|
-
id: fieldKey,
|
|
162
|
-
title: fieldKey.charAt(0).toUpperCase() + fieldKey.slice(1).replace(/([A-Z])/g, ' $1').trim(),
|
|
163
|
-
items: options,
|
|
164
|
-
isDynamic: true
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
return dynamicFilters;
|
|
153
|
+
return finalOptions;
|
|
171
154
|
};
|
|
172
155
|
|
|
173
156
|
const getPointsOfInterestOptions = pointsOfInterestNames => {
|
|
@@ -318,9 +301,6 @@ export const generateFilterOptions = (
|
|
|
318
301
|
)
|
|
319
302
|
};
|
|
320
303
|
|
|
321
|
-
// Get dynamic custom field filters (multi-value fields not in specialFeatures)
|
|
322
|
-
const dynamicCustomFilters = getDynamicCustomFieldFilters(allListings, countListings, siteConfig, filterConfig);
|
|
323
|
-
|
|
324
304
|
// Filter out null filters and ensure items arrays don't contain undefined values
|
|
325
305
|
const cleanFilters = dynamicFilters
|
|
326
306
|
.filter(f => f != null && f.items != null)
|
|
@@ -336,11 +316,8 @@ export const generateFilterOptions = (
|
|
|
336
316
|
items: l.items.filter(item => item != null && item.name != null)
|
|
337
317
|
}));
|
|
338
318
|
|
|
339
|
-
// Add dynamic custom field filters to the main filters array
|
|
340
|
-
const allCleanFilters = [...cleanFilters, ...dynamicCustomFilters];
|
|
341
|
-
|
|
342
319
|
return {
|
|
343
|
-
filters:
|
|
320
|
+
filters: cleanFilters,
|
|
344
321
|
locations: cleanLocations,
|
|
345
322
|
pointsOfInterest: pointsOfInterest
|
|
346
323
|
};
|
|
@@ -383,10 +360,28 @@ export const applyFilters = async (
|
|
|
383
360
|
if (field === "specialFeatures" && invertedSpecialFeaturesMap && Object.keys(filterItems).length > 0) {
|
|
384
361
|
results = results.filter(listing => {
|
|
385
362
|
return Object.entries(filterItems).some(([filterName, filterValue]) => {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
//
|
|
389
|
-
|
|
363
|
+
if (!filterValue) return false;
|
|
364
|
+
|
|
365
|
+
// Check if this is a multi-value filter (has a colon in the name)
|
|
366
|
+
if (filterName.includes(': ')) {
|
|
367
|
+
const [baseFeatureName, expectedValue] = filterName.split(': ');
|
|
368
|
+
// Find the field key for this feature
|
|
369
|
+
const listingFieldName = Object.entries(siteConfig.specialFeatures).find(
|
|
370
|
+
([key, displayName]) => displayName === baseFeatureName
|
|
371
|
+
)?.[0];
|
|
372
|
+
|
|
373
|
+
if (listingFieldName) {
|
|
374
|
+
const value = getFieldValue(listing, listingFieldName);
|
|
375
|
+
return value === expectedValue;
|
|
376
|
+
}
|
|
377
|
+
return false;
|
|
378
|
+
} else {
|
|
379
|
+
// Handle boolean special features
|
|
380
|
+
const listingFieldName = invertedSpecialFeaturesMap[filterName];
|
|
381
|
+
const value = getFieldValue(listing, listingFieldName);
|
|
382
|
+
// Support both numeric (1/0) and string ("true"/"false") boolean values
|
|
383
|
+
return value == 1 || value === 1 || value === '1' || value === 'true' || value === true;
|
|
384
|
+
}
|
|
390
385
|
});
|
|
391
386
|
});
|
|
392
387
|
} else if (Object.keys(filterItems).length > 0) {
|