@abcagency/hc-ui-components 1.9.10 → 1.9.13
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 +1 -4
- package/dist/util/filterUtil.js +150 -55
- package/dist/util/filterUtil.js.map +1 -1
- package/package.json +1 -1
- package/src/util/filterUtil.js +113 -23
|
@@ -3,10 +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
|
-
}[];
|
|
6
|
+
export function getSpecialFeatureOptions(listings: any, filteredListings: any, siteConfig: any, favorites: any, filterConfig?: {}): any[];
|
|
10
7
|
export function generateFilterOptions(filteredListings: any, allListings: any, siteConfig: any, filterOptions: any, parentField: any, favorites: any, selectedFilters: any, filterConfig?: {
|
|
11
8
|
hideZeroResults: boolean;
|
|
12
9
|
dynamicCounts: boolean;
|
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,69 +61,121 @@ 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
|
-
if (value == 1) {
|
|
75
|
-
featureCounts[featureName] += 1;
|
|
76
|
-
}
|
|
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;
|
|
77
72
|
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
+
fieldKey: fieldKey,
|
|
86
|
+
isBoolean: true
|
|
87
|
+
});
|
|
88
|
+
} else {
|
|
89
|
+
// Check if it's in custom fields
|
|
90
|
+
var hasCustomField = listings.some(function (listing) {
|
|
91
|
+
return listing.customFields && Array.isArray(listing.customFields) && listing.customFields.some(function (cf) {
|
|
92
|
+
return cf.id === featureKey || cf.name === featureKey;
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
if (hasCustomField) {
|
|
96
|
+
// Get all distinct values for this custom field
|
|
97
|
+
var distinctValues = new Set();
|
|
98
|
+
listings.forEach(function (listing) {
|
|
99
|
+
var value = getFieldValue(listing, featureKey);
|
|
100
|
+
if (value != null && value !== '' && value !== undefined) {
|
|
101
|
+
distinctValues.add(String(value));
|
|
102
|
+
}
|
|
103
|
+
});
|
|
88
104
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
105
|
+
// Check if it's boolean-like
|
|
106
|
+
var booleanValues = new Set(['true', 'false', '1', '0', 'yes', 'no', 'True', 'False']);
|
|
107
|
+
var allBooleanLike = Array.from(distinctValues).every(function (val) {
|
|
108
|
+
return booleanValues.has(val);
|
|
109
|
+
}) && distinctValues.size <= 2;
|
|
110
|
+
if (allBooleanLike) {
|
|
111
|
+
// Handle as boolean custom field
|
|
112
|
+
var _count = 0;
|
|
113
|
+
filteredListings.forEach(function (listing) {
|
|
114
|
+
var value = getFieldValue(listing, featureKey);
|
|
115
|
+
if (value === '1' || value === 'true' || value === 'True' || value === true || value === 1) {
|
|
116
|
+
_count += 1;
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
allOptions.push({
|
|
120
|
+
name: featureName,
|
|
121
|
+
count: _count,
|
|
122
|
+
fieldKey: fieldKey,
|
|
123
|
+
isBoolean: true
|
|
124
|
+
});
|
|
125
|
+
} else {
|
|
126
|
+
// Handle as multi-value custom field - add each distinct value as separate option
|
|
127
|
+
distinctValues.forEach(function (value) {
|
|
128
|
+
var count = 0;
|
|
129
|
+
filteredListings.forEach(function (listing) {
|
|
130
|
+
var listingValue = getFieldValue(listing, featureKey);
|
|
131
|
+
if (listingValue === value) {
|
|
132
|
+
count += 1;
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
allOptions.push({
|
|
136
|
+
name: "".concat(featureName, ": ").concat(value),
|
|
137
|
+
count: count,
|
|
138
|
+
fieldKey: fieldKey,
|
|
139
|
+
fieldValue: value,
|
|
140
|
+
isBoolean: false
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
99
144
|
}
|
|
100
145
|
}
|
|
146
|
+
});
|
|
101
147
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
148
|
+
// Update favorite count
|
|
149
|
+
for (var _i = 0, _allOptions = allOptions; _i < _allOptions.length; _i++) {
|
|
150
|
+
var option = _allOptions[_i];
|
|
151
|
+
if (option.name === 'Favorite') {
|
|
152
|
+
option.count = filteredListings.filter(function (x) {
|
|
153
|
+
return favorites.includes(x.id);
|
|
154
|
+
}).length;
|
|
155
|
+
}
|
|
107
156
|
}
|
|
157
|
+
|
|
158
|
+
// Hide favorites if filterConfig.showFavorites is false
|
|
159
|
+
var finalOptions = allOptions;
|
|
108
160
|
if (filterConfig.showFavorites === false) {
|
|
109
|
-
|
|
161
|
+
finalOptions = finalOptions.filter(function (option) {
|
|
110
162
|
return option.name !== 'Favorite';
|
|
111
163
|
});
|
|
112
164
|
}
|
|
113
165
|
|
|
114
166
|
// Hide zero results if filterConfig.hideZeroResults is true
|
|
115
167
|
if (filterConfig.hideZeroResults === true) {
|
|
116
|
-
|
|
168
|
+
finalOptions = finalOptions.filter(function (option) {
|
|
117
169
|
return option.count > 0;
|
|
118
170
|
});
|
|
119
171
|
}
|
|
120
|
-
return
|
|
172
|
+
return finalOptions;
|
|
121
173
|
};
|
|
122
174
|
var getPointsOfInterestOptions = function getPointsOfInterestOptions(pointsOfInterestNames) {
|
|
123
|
-
return Object.entries(pointsOfInterestNames).sort().map(function (
|
|
124
|
-
var
|
|
125
|
-
key =
|
|
126
|
-
name =
|
|
175
|
+
return Object.entries(pointsOfInterestNames).sort().map(function (_ref3) {
|
|
176
|
+
var _ref4 = _slicedToArray(_ref3, 2),
|
|
177
|
+
key = _ref4[0],
|
|
178
|
+
name = _ref4[1];
|
|
127
179
|
return {
|
|
128
180
|
key: key,
|
|
129
181
|
name: name
|
|
@@ -148,10 +200,28 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
|
|
|
148
200
|
});
|
|
149
201
|
}
|
|
150
202
|
if (fieldName == 'category') {
|
|
203
|
+
// For category counts, exclude specialFeatures from the filter calculation
|
|
204
|
+
// so that toggling specialFeatures updates category counts
|
|
205
|
+
var categoryCountListings = countListings;
|
|
206
|
+
if (filterConfig.dynamicCounts && selectedFilters.specialFeatures) {
|
|
207
|
+
categoryCountListings = allListings.filter(function (listing) {
|
|
208
|
+
return Object.entries(selectedFilters).every(function (_ref5) {
|
|
209
|
+
var _ref6 = _slicedToArray(_ref5, 2),
|
|
210
|
+
key = _ref6[0],
|
|
211
|
+
value = _ref6[1];
|
|
212
|
+
if (key === 'specialFeatures') return true; // Exclude specialFeatures
|
|
213
|
+
var fieldValue = getFieldValue(listing, key);
|
|
214
|
+
if (value && _typeof(value) === 'object' && value[fieldValue] === true) {
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
return false;
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
}
|
|
151
221
|
return {
|
|
152
222
|
id: fieldName,
|
|
153
223
|
title: siteConfig.fieldNames[fieldName],
|
|
154
|
-
items: getFilterOptions(allListings,
|
|
224
|
+
items: getFilterOptions(allListings, categoryCountListings, fieldName, filterConfig.hideZeroResults)
|
|
155
225
|
};
|
|
156
226
|
}
|
|
157
227
|
if (fieldName == 'subCategory' && selectedFilters.category) {
|
|
@@ -288,7 +358,7 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
288
358
|
hasFavorite,
|
|
289
359
|
favorite,
|
|
290
360
|
_loop,
|
|
291
|
-
|
|
361
|
+
_i2,
|
|
292
362
|
_Object$entries,
|
|
293
363
|
attempts,
|
|
294
364
|
distinctItems,
|
|
@@ -322,7 +392,7 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
322
392
|
return _regeneratorRuntime().wrap(function _loop$(_context) {
|
|
323
393
|
while (1) switch (_context.prev = _context.next) {
|
|
324
394
|
case 0:
|
|
325
|
-
_Object$entries$_i = _slicedToArray(_Object$entries[
|
|
395
|
+
_Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2), field = _Object$entries$_i[0], filterItems = _Object$entries$_i[1];
|
|
326
396
|
formattedField = field;
|
|
327
397
|
if (!(field === "pointsOfInterest")) {
|
|
328
398
|
_context.next = 4;
|
|
@@ -336,9 +406,34 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
336
406
|
var _ref13 = _slicedToArray(_ref12, 2),
|
|
337
407
|
filterName = _ref13[0],
|
|
338
408
|
filterValue = _ref13[1];
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
409
|
+
if (!filterValue) return false;
|
|
410
|
+
|
|
411
|
+
// Check if this is a multi-value filter (has a colon in the name)
|
|
412
|
+
if (filterName.includes(': ')) {
|
|
413
|
+
var _Object$entries$find;
|
|
414
|
+
var _filterName$split = filterName.split(': '),
|
|
415
|
+
_filterName$split2 = _slicedToArray(_filterName$split, 2),
|
|
416
|
+
baseFeatureName = _filterName$split2[0],
|
|
417
|
+
expectedValue = _filterName$split2[1];
|
|
418
|
+
// Find the field key for this feature
|
|
419
|
+
var listingFieldName = (_Object$entries$find = Object.entries(siteConfig.specialFeatures).find(function (_ref14) {
|
|
420
|
+
var _ref15 = _slicedToArray(_ref14, 2);
|
|
421
|
+
_ref15[0];
|
|
422
|
+
var displayName = _ref15[1];
|
|
423
|
+
return displayName === baseFeatureName;
|
|
424
|
+
})) === null || _Object$entries$find === void 0 ? void 0 : _Object$entries$find[0];
|
|
425
|
+
if (listingFieldName) {
|
|
426
|
+
var value = getFieldValue(listing, listingFieldName);
|
|
427
|
+
return value === expectedValue;
|
|
428
|
+
}
|
|
429
|
+
return false;
|
|
430
|
+
} else {
|
|
431
|
+
// Handle boolean special features
|
|
432
|
+
var _listingFieldName = invertedSpecialFeaturesMap[filterName];
|
|
433
|
+
var _value = getFieldValue(listing, _listingFieldName);
|
|
434
|
+
// Support both numeric (1/0) and string ("true"/"false") boolean values
|
|
435
|
+
return _value == 1 || _value === 1 || _value === '1' || _value === 'true' || _value === true;
|
|
436
|
+
}
|
|
342
437
|
});
|
|
343
438
|
});
|
|
344
439
|
} else if (Object.keys(filterItems).length > 0) {
|
|
@@ -353,9 +448,9 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
353
448
|
}
|
|
354
449
|
}, _loop);
|
|
355
450
|
});
|
|
356
|
-
|
|
451
|
+
_i2 = 0, _Object$entries = Object.entries(selectedFilters);
|
|
357
452
|
case 8:
|
|
358
|
-
if (!(
|
|
453
|
+
if (!(_i2 < _Object$entries.length)) {
|
|
359
454
|
_context2.next = 15;
|
|
360
455
|
break;
|
|
361
456
|
}
|
|
@@ -367,7 +462,7 @@ var applyFilters = /*#__PURE__*/function () {
|
|
|
367
462
|
}
|
|
368
463
|
return _context2.abrupt("continue", 12);
|
|
369
464
|
case 12:
|
|
370
|
-
|
|
465
|
+
_i2++;
|
|
371
466
|
_context2.next = 8;
|
|
372
467
|
break;
|
|
373
468
|
case 15:
|
|
@@ -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\tif (value == 1) {\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\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\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, countListings, 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\tconst listingFieldName = invertedSpecialFeaturesMap[filterName];\n\t\t\t\t\tconst value = getFieldValue(listing, listingFieldName);\n\t\t\t\t\treturn filterValue && value == 1;\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","getPointsOfInterestOptions","pointsOfInterestNames","_ref5","_ref6","generateFilterOptions","allListings","filterOptions","parentField","selectedFilters","dynamicCounts","collapsedByDefault","sortAlphabetically","countListings","dynamicFilters","fieldFiltersShown","fieldName","filters","title","fieldNames","items","category","categoryKeys","filteredByCategory","_x$fields","locations","locationFiltersShown","index","locationFilteredListings","every","_ref7","_ref8","fieldValue","_typeof","cityIncluded","stateIncluded","cityStateIncluded","uniqueCities","_toConsumableArray","city","uniqueStates","state","uniqueCityStates","cityState","filteredByLocation","cityMatches","stateMatches","cityStateMatches","selectedStates","pointsOfInterest","pointsOfInterestConfig","cleanFilters","_objectSpread","item","cleanLocations","l","applyFilters","_ref9","_asyncToGenerator","_regeneratorRuntime","mark","_callee","query","listingEntities","isFirstLoad","results","invertedSpecialFeaturesMap","hasFavorite","favorite","_loop","_i","_Object$entries","attempts","distinctItems","_args2","wrap","_callee$","_context2","prev","next","_ref10","_ref11","Favorite","_Object$entries$_i","filterItems","formattedField","_loop$","_context","abrupt","some","_ref12","_ref13","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","toLowerCase","queryTerms","split","exactIdMatch","toString","uniqueId","fuseQuery","term","$or","_defineProperty","fuseResults","search","$and","filterListingsByLocation","selectedLocation"],"mappings":"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"}
|
|
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, fieldKey, isBoolean: true });\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, fieldKey, isBoolean: true });\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\tfieldKey, \n\t\t\t\t\t\t\tfieldValue: value,\n\t\t\t\t\t\t\tisBoolean: false \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","isBoolean","hasCustomField","distinctValues","String","booleanValues","allBooleanLike","every","val","has","size","listingValue","concat","fieldValue","_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","_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,43 +61,99 @@ 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
|
-
|
|
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, fieldKey, isBoolean: true });
|
|
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, fieldKey, isBoolean: true });
|
|
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
|
+
fieldKey,
|
|
129
|
+
fieldValue: value,
|
|
130
|
+
isBoolean: false
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
74
134
|
}
|
|
75
|
-
}
|
|
135
|
+
}
|
|
76
136
|
});
|
|
77
137
|
|
|
78
|
-
let specialFeatureOptions = Object.entries(featureCounts).map(([name, count]) => ({
|
|
79
|
-
name,
|
|
80
|
-
count
|
|
81
|
-
}));
|
|
82
|
-
|
|
83
138
|
// Update favorite count
|
|
84
|
-
for (let option of
|
|
139
|
+
for (let option of allOptions) {
|
|
85
140
|
if (option.name === 'Favorite') {
|
|
86
141
|
option.count = filteredListings.filter(x => favorites.includes(x.id)).length;
|
|
87
142
|
}
|
|
88
143
|
}
|
|
89
144
|
|
|
90
145
|
// Hide favorites if filterConfig.showFavorites is false
|
|
146
|
+
let finalOptions = allOptions;
|
|
91
147
|
if (filterConfig.showFavorites === false) {
|
|
92
|
-
|
|
148
|
+
finalOptions = finalOptions.filter(option => option.name !== 'Favorite');
|
|
93
149
|
}
|
|
94
150
|
|
|
95
151
|
// Hide zero results if filterConfig.hideZeroResults is true
|
|
96
152
|
if (filterConfig.hideZeroResults === true) {
|
|
97
|
-
|
|
153
|
+
finalOptions = finalOptions.filter(option => option.count > 0);
|
|
98
154
|
}
|
|
99
155
|
|
|
100
|
-
return
|
|
156
|
+
return finalOptions;
|
|
101
157
|
};
|
|
102
158
|
|
|
103
159
|
const getPointsOfInterestOptions = pointsOfInterestNames => {
|
|
@@ -132,10 +188,25 @@ export const generateFilterOptions = (
|
|
|
132
188
|
return filterOptions.filters.find(filter => filter.id === fieldName);
|
|
133
189
|
}
|
|
134
190
|
if(fieldName == 'category'){
|
|
191
|
+
// For category counts, exclude specialFeatures from the filter calculation
|
|
192
|
+
// so that toggling specialFeatures updates category counts
|
|
193
|
+
let categoryCountListings = countListings;
|
|
194
|
+
if (filterConfig.dynamicCounts && selectedFilters.specialFeatures) {
|
|
195
|
+
categoryCountListings = allListings.filter(listing => {
|
|
196
|
+
return Object.entries(selectedFilters).every(([key, value]) => {
|
|
197
|
+
if (key === 'specialFeatures') return true; // Exclude specialFeatures
|
|
198
|
+
const fieldValue = getFieldValue(listing, key);
|
|
199
|
+
if (value && typeof value === 'object' && value[fieldValue] === true) {
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
return false;
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
135
206
|
return {
|
|
136
207
|
id: fieldName,
|
|
137
208
|
title: siteConfig.fieldNames[fieldName],
|
|
138
|
-
items: getFilterOptions(allListings,
|
|
209
|
+
items: getFilterOptions(allListings, categoryCountListings, fieldName, filterConfig.hideZeroResults)
|
|
139
210
|
};
|
|
140
211
|
}
|
|
141
212
|
if(fieldName == 'subCategory' && selectedFilters.category){
|
|
@@ -292,9 +363,28 @@ export const applyFilters = async (
|
|
|
292
363
|
if (field === "specialFeatures" && invertedSpecialFeaturesMap && Object.keys(filterItems).length > 0) {
|
|
293
364
|
results = results.filter(listing => {
|
|
294
365
|
return Object.entries(filterItems).some(([filterName, filterValue]) => {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
366
|
+
if (!filterValue) return false;
|
|
367
|
+
|
|
368
|
+
// Check if this is a multi-value filter (has a colon in the name)
|
|
369
|
+
if (filterName.includes(': ')) {
|
|
370
|
+
const [baseFeatureName, expectedValue] = filterName.split(': ');
|
|
371
|
+
// Find the field key for this feature
|
|
372
|
+
const listingFieldName = Object.entries(siteConfig.specialFeatures).find(
|
|
373
|
+
([key, displayName]) => displayName === baseFeatureName
|
|
374
|
+
)?.[0];
|
|
375
|
+
|
|
376
|
+
if (listingFieldName) {
|
|
377
|
+
const value = getFieldValue(listing, listingFieldName);
|
|
378
|
+
return value === expectedValue;
|
|
379
|
+
}
|
|
380
|
+
return false;
|
|
381
|
+
} else {
|
|
382
|
+
// Handle boolean special features
|
|
383
|
+
const listingFieldName = invertedSpecialFeaturesMap[filterName];
|
|
384
|
+
const value = getFieldValue(listing, listingFieldName);
|
|
385
|
+
// Support both numeric (1/0) and string ("true"/"false") boolean values
|
|
386
|
+
return value == 1 || value === 1 || value === '1' || value === 'true' || value === true;
|
|
387
|
+
}
|
|
298
388
|
});
|
|
299
389
|
});
|
|
300
390
|
} else if (Object.keys(filterItems).length > 0) {
|