@abcagency/hc-ui-components 1.9.12 → 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.
@@ -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;
@@ -1,4 +1,4 @@
1
- import { slicedToArray as _slicedToArray, typeof as _typeof, toConsumableArray as _toConsumableArray, objectSpread2 as _objectSpread2, createForOfIteratorHelper as _createForOfIteratorHelper, asyncToGenerator as _asyncToGenerator, regeneratorRuntime as _regeneratorRuntime, defineProperty as _defineProperty } from '../_virtual/_rollupPluginBabelHelpers.js';
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,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 featureCounts = Object.keys(specialFeatures).sort().reduce(function (acc, key) {
65
- acc[specialFeatures[key]] = 0;
66
- return acc;
67
- }, {});
68
- filteredListings.forEach(function (listing) {
69
- Object.entries(specialFeatures).forEach(function (_ref) {
70
- var _ref2 = _slicedToArray(_ref, 2),
71
- featureKey = _ref2[0],
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
- var specialFeatureOptions = Object.entries(featureCounts).map(function (_ref3) {
81
- var _ref4 = _slicedToArray(_ref3, 2),
82
- name = _ref4[0],
83
- count = _ref4[1];
84
- return {
85
- name: name,
86
- count: count
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
+ 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
+ });
89
104
 
90
- // Update favorite count
91
- var _iterator = _createForOfIteratorHelper(specialFeatureOptions),
92
- _step;
93
- try {
94
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
95
- var option = _step.value;
96
- if (option.name === 'Favorite') {
97
- option.count = filteredListings.filter(function (x) {
98
- return favorites.includes(x.id);
99
- }).length;
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
+ }
100
144
  }
101
145
  }
146
+ });
102
147
 
103
- // Hide favorites if filterConfig.showFavorites is false
104
- } catch (err) {
105
- _iterator.e(err);
106
- } finally {
107
- _iterator.f();
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
+ }
108
156
  }
157
+
158
+ // Hide favorites if filterConfig.showFavorites is false
159
+ var finalOptions = allOptions;
109
160
  if (filterConfig.showFavorites === false) {
110
- specialFeatureOptions = specialFeatureOptions.filter(function (option) {
161
+ finalOptions = finalOptions.filter(function (option) {
111
162
  return option.name !== 'Favorite';
112
163
  });
113
164
  }
114
165
 
115
166
  // Hide zero results if filterConfig.hideZeroResults is true
116
167
  if (filterConfig.hideZeroResults === true) {
117
- specialFeatureOptions = specialFeatureOptions.filter(function (option) {
168
+ finalOptions = finalOptions.filter(function (option) {
118
169
  return option.count > 0;
119
170
  });
120
171
  }
121
- return specialFeatureOptions;
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;
172
+ return finalOptions;
206
173
  };
207
174
  var getPointsOfInterestOptions = function getPointsOfInterestOptions(pointsOfInterestNames) {
208
- return Object.entries(pointsOfInterestNames).sort().map(function (_ref5) {
209
- var _ref6 = _slicedToArray(_ref5, 2),
210
- key = _ref6[0],
211
- name = _ref6[1];
175
+ return Object.entries(pointsOfInterestNames).sort().map(function (_ref3) {
176
+ var _ref4 = _slicedToArray(_ref3, 2),
177
+ key = _ref4[0],
178
+ name = _ref4[1];
212
179
  return {
213
180
  key: key,
214
181
  name: name
@@ -238,10 +205,10 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
238
205
  var categoryCountListings = countListings;
239
206
  if (filterConfig.dynamicCounts && selectedFilters.specialFeatures) {
240
207
  categoryCountListings = allListings.filter(function (listing) {
241
- return Object.entries(selectedFilters).every(function (_ref7) {
242
- var _ref8 = _slicedToArray(_ref7, 2),
243
- key = _ref8[0],
244
- value = _ref8[1];
208
+ return Object.entries(selectedFilters).every(function (_ref5) {
209
+ var _ref6 = _slicedToArray(_ref5, 2),
210
+ key = _ref6[0],
211
+ value = _ref6[1];
245
212
  if (key === 'specialFeatures') return true; // Exclude specialFeatures
246
213
  var fieldValue = getFieldValue(listing, key);
247
214
  if (value && _typeof(value) === 'object' && value[fieldValue] === true) {
@@ -285,10 +252,10 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
285
252
  var locations = siteConfig.locationFiltersShown.map(function (fieldName, index) {
286
253
  var locationFilteredListings = allListings;
287
254
  locationFilteredListings = allListings.filter(function (listing) {
288
- return Object.entries(selectedFilters).every(function (_ref9) {
289
- var _ref10 = _slicedToArray(_ref9, 2),
290
- key = _ref10[0],
291
- value = _ref10[1];
255
+ return Object.entries(selectedFilters).every(function (_ref7) {
256
+ var _ref8 = _slicedToArray(_ref7, 2),
257
+ key = _ref8[0],
258
+ value = _ref8[1];
292
259
  if (siteConfig.locationFiltersShown.includes(key)) return true;
293
260
  var fieldValue = getFieldValue(listing, key);
294
261
  if (value && _typeof(value) === 'object' && value[fieldValue] === true) {
@@ -356,9 +323,6 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
356
323
  items: getPointsOfInterestOptions(siteConfig.pointsOfInterestConfig.pointsOfInterestNames)
357
324
  };
358
325
 
359
- // Get dynamic custom field filters (multi-value fields not in specialFeatures)
360
- var dynamicCustomFilters = getDynamicCustomFieldFilters(allListings, countListings, siteConfig, filterConfig);
361
-
362
326
  // Filter out null filters and ensure items arrays don't contain undefined values
363
327
  var cleanFilters = dynamicFilters.filter(function (f) {
364
328
  return f != null && f.items != null;
@@ -378,11 +342,8 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
378
342
  })
379
343
  });
380
344
  });
381
-
382
- // Add dynamic custom field filters to the main filters array
383
- var allCleanFilters = [].concat(_toConsumableArray(cleanFilters), _toConsumableArray(dynamicCustomFilters));
384
345
  return {
385
- filters: allCleanFilters,
346
+ filters: cleanFilters,
386
347
  locations: cleanLocations,
387
348
  pointsOfInterest: pointsOfInterest
388
349
  };
@@ -390,14 +351,14 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
390
351
  return null;
391
352
  };
392
353
  var applyFilters = /*#__PURE__*/function () {
393
- var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(allListings, selectedFilters, query, listingEntities, favorites, siteConfig) {
354
+ var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(allListings, selectedFilters, query, listingEntities, favorites, siteConfig) {
394
355
  var isFirstLoad,
395
356
  results,
396
357
  invertedSpecialFeaturesMap,
397
358
  hasFavorite,
398
359
  favorite,
399
360
  _loop,
400
- _i,
361
+ _i2,
401
362
  _Object$entries,
402
363
  attempts,
403
364
  distinctItems,
@@ -408,10 +369,10 @@ var applyFilters = /*#__PURE__*/function () {
408
369
  isFirstLoad = _args2.length > 6 && _args2[6] !== undefined ? _args2[6] : false;
409
370
  results = allListings;
410
371
  if (siteConfig.specialFeatures) {
411
- invertedSpecialFeaturesMap = Object.entries(siteConfig.specialFeatures).reduce(function (acc, _ref12) {
412
- var _ref13 = _slicedToArray(_ref12, 2),
413
- key = _ref13[0],
414
- value = _ref13[1];
372
+ invertedSpecialFeaturesMap = Object.entries(siteConfig.specialFeatures).reduce(function (acc, _ref10) {
373
+ var _ref11 = _slicedToArray(_ref10, 2),
374
+ key = _ref11[0],
375
+ value = _ref11[1];
415
376
  acc[value] = key;
416
377
  return acc;
417
378
  }, {});
@@ -431,7 +392,7 @@ var applyFilters = /*#__PURE__*/function () {
431
392
  return _regeneratorRuntime().wrap(function _loop$(_context) {
432
393
  while (1) switch (_context.prev = _context.next) {
433
394
  case 0:
434
- _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), field = _Object$entries$_i[0], filterItems = _Object$entries$_i[1];
395
+ _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2), field = _Object$entries$_i[0], filterItems = _Object$entries$_i[1];
435
396
  formattedField = field;
436
397
  if (!(field === "pointsOfInterest")) {
437
398
  _context.next = 4;
@@ -441,14 +402,38 @@ var applyFilters = /*#__PURE__*/function () {
441
402
  case 4:
442
403
  if (field === "specialFeatures" && invertedSpecialFeaturesMap && Object.keys(filterItems).length > 0) {
443
404
  results = results.filter(function (listing) {
444
- return Object.entries(filterItems).some(function (_ref14) {
445
- var _ref15 = _slicedToArray(_ref14, 2),
446
- filterName = _ref15[0],
447
- filterValue = _ref15[1];
448
- var listingFieldName = invertedSpecialFeaturesMap[filterName];
449
- var value = getFieldValue(listing, listingFieldName);
450
- // Support both numeric (1/0) and string ("true"/"false") boolean values
451
- return filterValue && (value == 1 || value === 1 || value === '1' || value === 'true' || value === true);
405
+ return Object.entries(filterItems).some(function (_ref12) {
406
+ var _ref13 = _slicedToArray(_ref12, 2),
407
+ filterName = _ref13[0],
408
+ filterValue = _ref13[1];
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
+ }
452
437
  });
453
438
  });
454
439
  } else if (Object.keys(filterItems).length > 0) {
@@ -463,9 +448,9 @@ var applyFilters = /*#__PURE__*/function () {
463
448
  }
464
449
  }, _loop);
465
450
  });
466
- _i = 0, _Object$entries = Object.entries(selectedFilters);
451
+ _i2 = 0, _Object$entries = Object.entries(selectedFilters);
467
452
  case 8:
468
- if (!(_i < _Object$entries.length)) {
453
+ if (!(_i2 < _Object$entries.length)) {
469
454
  _context2.next = 15;
470
455
  break;
471
456
  }
@@ -477,7 +462,7 @@ var applyFilters = /*#__PURE__*/function () {
477
462
  }
478
463
  return _context2.abrupt("continue", 12);
479
464
  case 12:
480
- _i++;
465
+ _i2++;
481
466
  _context2.next = 8;
482
467
  break;
483
468
  case 15:
@@ -542,7 +527,7 @@ var applyFilters = /*#__PURE__*/function () {
542
527
  }, _callee, null, [[25, 31]]);
543
528
  }));
544
529
  return function applyFilters(_x, _x2, _x3, _x4, _x5, _x6) {
545
- return _ref11.apply(this, arguments);
530
+ return _ref9.apply(this, arguments);
546
531
  };
547
532
  }();
548
533
  function searchResults(results, query) {
@@ -589,5 +574,5 @@ var filterListingsByLocation = function filterListingsByLocation(allListings, se
589
574
  };
590
575
  };
591
576
 
592
- export { applyFilters, filterListingsByLocation, generateFilterOptions, getDynamicCustomFieldFilters, getFieldValue, getFilterOptions, getSpecialFeatureOptions };
577
+ export { applyFilters, filterListingsByLocation, generateFilterOptions, getFieldValue, getFilterOptions, getSpecialFeatureOptions };
593
578
  //# 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":"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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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abcagency/hc-ui-components",
3
- "version": "1.9.12",
3
+ "version": "1.9.13",
4
4
  "description": "UI Components for HireControl",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -61,113 +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 featureCounts = Object.keys(specialFeatures).sort().reduce((acc, key) => {
65
- acc[specialFeatures[key]] = 0;
66
- return acc;
67
- }, {});
64
+ const allOptions = [];
68
65
 
69
- filteredListings.forEach(listing => {
70
- Object.entries(specialFeatures).forEach(([featureKey, featureName]) => {
71
- const value = getFieldValue(listing, featureKey);
72
- // Support both numeric (1/0) and string ("true"/"false") boolean values
73
- if (value == 1 || value === 1 || value === '1' || value === 'true' || value === true) {
74
- featureCounts[featureName] += 1;
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
+ }
75
134
  }
76
- });
135
+ }
77
136
  });
78
137
 
79
- let specialFeatureOptions = Object.entries(featureCounts).map(([name, count]) => ({
80
- name,
81
- count
82
- }));
83
-
84
138
  // Update favorite count
85
- for (let option of specialFeatureOptions) {
139
+ for (let option of allOptions) {
86
140
  if (option.name === 'Favorite') {
87
141
  option.count = filteredListings.filter(x => favorites.includes(x.id)).length;
88
142
  }
89
143
  }
90
144
 
91
145
  // Hide favorites if filterConfig.showFavorites is false
146
+ let finalOptions = allOptions;
92
147
  if (filterConfig.showFavorites === false) {
93
- specialFeatureOptions = specialFeatureOptions.filter(option => option.name !== 'Favorite');
148
+ finalOptions = finalOptions.filter(option => option.name !== 'Favorite');
94
149
  }
95
150
 
96
151
  // Hide zero results if filterConfig.hideZeroResults is true
97
152
  if (filterConfig.hideZeroResults === true) {
98
- specialFeatureOptions = specialFeatureOptions.filter(option => option.count > 0);
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
- }
153
+ finalOptions = finalOptions.filter(option => option.count > 0);
125
154
  }
126
-
127
- return distinctValues.size > 0 && distinctValues.size <= 2;
128
- };
129
155
 
130
- // Get dynamic custom field filters (for non-boolean multi-value fields)
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;
156
+ return finalOptions;
171
157
  };
172
158
 
173
159
  const getPointsOfInterestOptions = pointsOfInterestNames => {
@@ -318,9 +304,6 @@ export const generateFilterOptions = (
318
304
  )
319
305
  };
320
306
 
321
- // Get dynamic custom field filters (multi-value fields not in specialFeatures)
322
- const dynamicCustomFilters = getDynamicCustomFieldFilters(allListings, countListings, siteConfig, filterConfig);
323
-
324
307
  // Filter out null filters and ensure items arrays don't contain undefined values
325
308
  const cleanFilters = dynamicFilters
326
309
  .filter(f => f != null && f.items != null)
@@ -336,11 +319,8 @@ export const generateFilterOptions = (
336
319
  items: l.items.filter(item => item != null && item.name != null)
337
320
  }));
338
321
 
339
- // Add dynamic custom field filters to the main filters array
340
- const allCleanFilters = [...cleanFilters, ...dynamicCustomFilters];
341
-
342
322
  return {
343
- filters: allCleanFilters,
323
+ filters: cleanFilters,
344
324
  locations: cleanLocations,
345
325
  pointsOfInterest: pointsOfInterest
346
326
  };
@@ -383,10 +363,28 @@ export const applyFilters = async (
383
363
  if (field === "specialFeatures" && invertedSpecialFeaturesMap && Object.keys(filterItems).length > 0) {
384
364
  results = results.filter(listing => {
385
365
  return Object.entries(filterItems).some(([filterName, filterValue]) => {
386
- const listingFieldName = invertedSpecialFeaturesMap[filterName];
387
- const value = getFieldValue(listing, listingFieldName);
388
- // Support both numeric (1/0) and string ("true"/"false") boolean values
389
- return filterValue && (value == 1 || value === 1 || value === '1' || value === 'true' || value === true);
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
+ }
390
388
  });
391
389
  });
392
390
  } else if (Object.keys(filterItems).length > 0) {