@abcagency/hc-ui-components 1.9.10 → 1.9.12

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.
@@ -7,6 +7,7 @@ export function getSpecialFeatureOptions(listings: any, filteredListings: any, s
7
7
  name: string;
8
8
  count: any;
9
9
  }[];
10
+ export function getDynamicCustomFieldFilters(listings: any, filteredListings: any, siteConfig: any, filterConfig?: {}): any[];
10
11
  export function generateFilterOptions(filteredListings: any, allListings: any, siteConfig: any, filterOptions: any, parentField: any, favorites: any, selectedFilters: any, filterConfig?: {
11
12
  hideZeroResults: boolean;
12
13
  dynamicCounts: boolean;
@@ -14,7 +15,7 @@ export function generateFilterOptions(filteredListings: any, allListings: any, s
14
15
  collapsedByDefault: boolean;
15
16
  sortAlphabetically: boolean;
16
17
  }): {
17
- filters: any;
18
+ filters: any[];
18
19
  locations: any;
19
20
  pointsOfInterest: {
20
21
  id: string;
@@ -71,7 +71,8 @@ var getSpecialFeatureOptions = function getSpecialFeatureOptions(listings, filte
71
71
  featureKey = _ref2[0],
72
72
  featureName = _ref2[1];
73
73
  var value = getFieldValue(listing, featureKey);
74
- if (value == 1) {
74
+ // Support both numeric (1/0) and string ("true"/"false") boolean values
75
+ if (value == 1 || value === 1 || value === '1' || value === 'true' || value === true) {
75
76
  featureCounts[featureName] += 1;
76
77
  }
77
78
  });
@@ -119,6 +120,90 @@ var getSpecialFeatureOptions = function getSpecialFeatureOptions(listings, filte
119
120
  }
120
121
  return specialFeatureOptions;
121
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;
206
+ };
122
207
  var getPointsOfInterestOptions = function getPointsOfInterestOptions(pointsOfInterestNames) {
123
208
  return Object.entries(pointsOfInterestNames).sort().map(function (_ref5) {
124
209
  var _ref6 = _slicedToArray(_ref5, 2),
@@ -148,10 +233,28 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
148
233
  });
149
234
  }
150
235
  if (fieldName == 'category') {
236
+ // For category counts, exclude specialFeatures from the filter calculation
237
+ // so that toggling specialFeatures updates category counts
238
+ var categoryCountListings = countListings;
239
+ if (filterConfig.dynamicCounts && selectedFilters.specialFeatures) {
240
+ 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];
245
+ if (key === 'specialFeatures') return true; // Exclude specialFeatures
246
+ var fieldValue = getFieldValue(listing, key);
247
+ if (value && _typeof(value) === 'object' && value[fieldValue] === true) {
248
+ return true;
249
+ }
250
+ return false;
251
+ });
252
+ });
253
+ }
151
254
  return {
152
255
  id: fieldName,
153
256
  title: siteConfig.fieldNames[fieldName],
154
- items: getFilterOptions(allListings, countListings, fieldName, filterConfig.hideZeroResults)
257
+ items: getFilterOptions(allListings, categoryCountListings, fieldName, filterConfig.hideZeroResults)
155
258
  };
156
259
  }
157
260
  if (fieldName == 'subCategory' && selectedFilters.category) {
@@ -182,10 +285,10 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
182
285
  var locations = siteConfig.locationFiltersShown.map(function (fieldName, index) {
183
286
  var locationFilteredListings = allListings;
184
287
  locationFilteredListings = allListings.filter(function (listing) {
185
- return Object.entries(selectedFilters).every(function (_ref7) {
186
- var _ref8 = _slicedToArray(_ref7, 2),
187
- key = _ref8[0],
188
- value = _ref8[1];
288
+ return Object.entries(selectedFilters).every(function (_ref9) {
289
+ var _ref10 = _slicedToArray(_ref9, 2),
290
+ key = _ref10[0],
291
+ value = _ref10[1];
189
292
  if (siteConfig.locationFiltersShown.includes(key)) return true;
190
293
  var fieldValue = getFieldValue(listing, key);
191
294
  if (value && _typeof(value) === 'object' && value[fieldValue] === true) {
@@ -253,6 +356,9 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
253
356
  items: getPointsOfInterestOptions(siteConfig.pointsOfInterestConfig.pointsOfInterestNames)
254
357
  };
255
358
 
359
+ // Get dynamic custom field filters (multi-value fields not in specialFeatures)
360
+ var dynamicCustomFilters = getDynamicCustomFieldFilters(allListings, countListings, siteConfig, filterConfig);
361
+
256
362
  // Filter out null filters and ensure items arrays don't contain undefined values
257
363
  var cleanFilters = dynamicFilters.filter(function (f) {
258
364
  return f != null && f.items != null;
@@ -272,8 +378,11 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
272
378
  })
273
379
  });
274
380
  });
381
+
382
+ // Add dynamic custom field filters to the main filters array
383
+ var allCleanFilters = [].concat(_toConsumableArray(cleanFilters), _toConsumableArray(dynamicCustomFilters));
275
384
  return {
276
- filters: cleanFilters,
385
+ filters: allCleanFilters,
277
386
  locations: cleanLocations,
278
387
  pointsOfInterest: pointsOfInterest
279
388
  };
@@ -281,7 +390,7 @@ var generateFilterOptions = function generateFilterOptions(filteredListings, all
281
390
  return null;
282
391
  };
283
392
  var applyFilters = /*#__PURE__*/function () {
284
- var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(allListings, selectedFilters, query, listingEntities, favorites, siteConfig) {
393
+ var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(allListings, selectedFilters, query, listingEntities, favorites, siteConfig) {
285
394
  var isFirstLoad,
286
395
  results,
287
396
  invertedSpecialFeaturesMap,
@@ -299,10 +408,10 @@ var applyFilters = /*#__PURE__*/function () {
299
408
  isFirstLoad = _args2.length > 6 && _args2[6] !== undefined ? _args2[6] : false;
300
409
  results = allListings;
301
410
  if (siteConfig.specialFeatures) {
302
- invertedSpecialFeaturesMap = Object.entries(siteConfig.specialFeatures).reduce(function (acc, _ref10) {
303
- var _ref11 = _slicedToArray(_ref10, 2),
304
- key = _ref11[0],
305
- value = _ref11[1];
411
+ invertedSpecialFeaturesMap = Object.entries(siteConfig.specialFeatures).reduce(function (acc, _ref12) {
412
+ var _ref13 = _slicedToArray(_ref12, 2),
413
+ key = _ref13[0],
414
+ value = _ref13[1];
306
415
  acc[value] = key;
307
416
  return acc;
308
417
  }, {});
@@ -332,13 +441,14 @@ var applyFilters = /*#__PURE__*/function () {
332
441
  case 4:
333
442
  if (field === "specialFeatures" && invertedSpecialFeaturesMap && Object.keys(filterItems).length > 0) {
334
443
  results = results.filter(function (listing) {
335
- return Object.entries(filterItems).some(function (_ref12) {
336
- var _ref13 = _slicedToArray(_ref12, 2),
337
- filterName = _ref13[0],
338
- filterValue = _ref13[1];
444
+ return Object.entries(filterItems).some(function (_ref14) {
445
+ var _ref15 = _slicedToArray(_ref14, 2),
446
+ filterName = _ref15[0],
447
+ filterValue = _ref15[1];
339
448
  var listingFieldName = invertedSpecialFeaturesMap[filterName];
340
449
  var value = getFieldValue(listing, listingFieldName);
341
- return filterValue && value == 1;
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);
342
452
  });
343
453
  });
344
454
  } else if (Object.keys(filterItems).length > 0) {
@@ -432,7 +542,7 @@ var applyFilters = /*#__PURE__*/function () {
432
542
  }, _callee, null, [[25, 31]]);
433
543
  }));
434
544
  return function applyFilters(_x, _x2, _x3, _x4, _x5, _x6) {
435
- return _ref9.apply(this, arguments);
545
+ return _ref11.apply(this, arguments);
436
546
  };
437
547
  }();
438
548
  function searchResults(results, query) {
@@ -479,5 +589,5 @@ var filterListingsByLocation = function filterListingsByLocation(allListings, se
479
589
  };
480
590
  };
481
591
 
482
- export { applyFilters, filterListingsByLocation, generateFilterOptions, getFieldValue, getFilterOptions, getSpecialFeatureOptions };
592
+ export { applyFilters, filterListingsByLocation, generateFilterOptions, getDynamicCustomFieldFilters, getFieldValue, getFilterOptions, getSpecialFeatureOptions };
483
593
  //# 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\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 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abcagency/hc-ui-components",
3
- "version": "1.9.10",
3
+ "version": "1.9.12",
4
4
  "description": "UI Components for HireControl",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -69,7 +69,8 @@ export const getSpecialFeatureOptions = (listings, filteredListings, siteConfig,
69
69
  filteredListings.forEach(listing => {
70
70
  Object.entries(specialFeatures).forEach(([featureKey, featureName]) => {
71
71
  const value = getFieldValue(listing, featureKey);
72
- if (value == 1) {
72
+ // Support both numeric (1/0) and string ("true"/"false") boolean values
73
+ if (value == 1 || value === 1 || value === '1' || value === 'true' || value === true) {
73
74
  featureCounts[featureName] += 1;
74
75
  }
75
76
  });
@@ -100,6 +101,75 @@ export const getSpecialFeatureOptions = (listings, filteredListings, siteConfig,
100
101
  return specialFeatureOptions;
101
102
  };
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
+ }
125
+ }
126
+
127
+ return distinctValues.size > 0 && distinctValues.size <= 2;
128
+ };
129
+
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;
171
+ };
172
+
103
173
  const getPointsOfInterestOptions = pointsOfInterestNames => {
104
174
  return Object.entries(pointsOfInterestNames).sort().map(([key, name]) => ({
105
175
  key,
@@ -132,10 +202,25 @@ export const generateFilterOptions = (
132
202
  return filterOptions.filters.find(filter => filter.id === fieldName);
133
203
  }
134
204
  if(fieldName == 'category'){
205
+ // For category counts, exclude specialFeatures from the filter calculation
206
+ // so that toggling specialFeatures updates category counts
207
+ let categoryCountListings = countListings;
208
+ if (filterConfig.dynamicCounts && selectedFilters.specialFeatures) {
209
+ categoryCountListings = allListings.filter(listing => {
210
+ return Object.entries(selectedFilters).every(([key, value]) => {
211
+ if (key === 'specialFeatures') return true; // Exclude specialFeatures
212
+ const fieldValue = getFieldValue(listing, key);
213
+ if (value && typeof value === 'object' && value[fieldValue] === true) {
214
+ return true;
215
+ }
216
+ return false;
217
+ });
218
+ });
219
+ }
135
220
  return {
136
221
  id: fieldName,
137
222
  title: siteConfig.fieldNames[fieldName],
138
- items: getFilterOptions(allListings, countListings, fieldName, filterConfig.hideZeroResults)
223
+ items: getFilterOptions(allListings, categoryCountListings, fieldName, filterConfig.hideZeroResults)
139
224
  };
140
225
  }
141
226
  if(fieldName == 'subCategory' && selectedFilters.category){
@@ -233,6 +318,9 @@ export const generateFilterOptions = (
233
318
  )
234
319
  };
235
320
 
321
+ // Get dynamic custom field filters (multi-value fields not in specialFeatures)
322
+ const dynamicCustomFilters = getDynamicCustomFieldFilters(allListings, countListings, siteConfig, filterConfig);
323
+
236
324
  // Filter out null filters and ensure items arrays don't contain undefined values
237
325
  const cleanFilters = dynamicFilters
238
326
  .filter(f => f != null && f.items != null)
@@ -248,8 +336,11 @@ export const generateFilterOptions = (
248
336
  items: l.items.filter(item => item != null && item.name != null)
249
337
  }));
250
338
 
339
+ // Add dynamic custom field filters to the main filters array
340
+ const allCleanFilters = [...cleanFilters, ...dynamicCustomFilters];
341
+
251
342
  return {
252
- filters: cleanFilters,
343
+ filters: allCleanFilters,
253
344
  locations: cleanLocations,
254
345
  pointsOfInterest: pointsOfInterest
255
346
  };
@@ -294,7 +385,8 @@ export const applyFilters = async (
294
385
  return Object.entries(filterItems).some(([filterName, filterValue]) => {
295
386
  const listingFieldName = invertedSpecialFeaturesMap[filterName];
296
387
  const value = getFieldValue(listing, listingFieldName);
297
- return filterValue && value == 1;
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);
298
390
  });
299
391
  });
300
392
  } else if (Object.keys(filterItems).length > 0) {