UNPKG

@mikezimm/fps-core-v7

Version:

Library of reusable core interfaces, types and constants migrated from fps-library-v2

67 lines 3.19 kB
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