@mikezimm/fps-core-v7
Version:
Library of reusable core interfaces, types and constants migrated from fps-library-v2
67 lines • 3.19 kB
JavaScript
import { getDetailValueType } from "../../Types/typeServices";
import { getGroupByDate } from "./getGroupByDate";
import { getGroupByNumber } from "./getGroupByNumber";
/**
* 2024-08-24: Migrated from drillFunctions
* getRefinerFromField
*
* This takes a field value of type any (number, date, text) and a set of rules to apply
* And returns an array of strings that can be used for filtering.
* This with grouping items into smaller buckets... like 1000's instead of 1001, 1002, 1003... etc
* @param fieldValue
* @param ruleSet
* @param emptyRefiner
* @returns
*/
export function getRefinerFromField(fieldValue, ruleSet, emptyRefiner) {
let result = [];
// Basic types copied from: https://www.w3schools.com/js/tryit.asp?filename=tryjs_typeof_all
let detailType = getDetailValueType(fieldValue);
if (detailType === 'null' || detailType === 'undefined' || detailType === 'function') {
result = [emptyRefiner];
}
else if (detailType === 'boolean') {
result = [fieldValue === true ? 'true' : 'false'];
}
else if (detailType === 'number') {
result = [getGroupByNumber(fieldValue, detailType, ruleSet)];
}
else if (detailType === 'array') {
result = fieldValue;
//Applying this logic would cause the refiner list to grow for some reason... likely due to nesting
// result = fieldValue.map( value => {
// return getRefinerFromField( value, ruleSet, emptyRefiner );
// });
}
else if (detailType === 'object') {
result = [JSON.stringify(fieldValue)];
}
else if (detailType === 'datestring' && ruleSet.indexOf('groupByString') < 0) {
result = [getGroupByDate(fieldValue, ruleSet)];
}
else if (detailType === 'numberstring' && ruleSet.indexOf('groupByString') < 0) {
fieldValue = fieldValue.trim();
result = [getGroupByNumber(fieldValue, detailType, ruleSet)];
}
else if (detailType === 'string' || ruleSet.indexOf('groupByString') > -1) {
//If it's a string, then test if it's a date, return the best date in an array. Object.prototype.toString.call(date) === '[object Date]' //https://stackoverflow.com/a/643827
//As of 2020-09-01: This does not accurately detect dates.
fieldValue = fieldValue.trim();
//parse by semiColon or comma if rule dictates
if (ruleSet.indexOf('parseBySemiColons') > -1 && fieldValue.indexOf(';') > -1) {
fieldValue = getRefinerFromField(fieldValue.split(';'), ruleSet, emptyRefiner);
}
else if (ruleSet.indexOf('parseByCommas') > -1 && fieldValue.indexOf(',') > -1) {
fieldValue = getRefinerFromField(fieldValue.split(','), ruleSet, emptyRefiner);
//This loop closes https://github.com/mikezimm/drilldown7/issues/83
}
else if (ruleSet.indexOf('groupByString') > -1 && fieldValue === '') {
result = [emptyRefiner];
}
else { // This should be a string
result = [fieldValue];
}
}
return result;
}
//# sourceMappingURL=getRefinerFromField.js.map