UNPKG

@adaptabletools/adaptable

Version:

Powerful AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements

229 lines (228 loc) 7.61 kB
import { format as dateFnsFormat } from 'date-fns'; import { sentenceCase } from '../Extensions/StringExtensions'; import { DEFAULT_DATE_FORMAT_PATTERN } from '../Constants/GeneralConstants'; import Helper from './Helper'; import StringExtensions from '../Extensions/StringExtensions'; const getInputFractionDigitCount = (input) => { const fraction = String(input).split('.')[1]; return fraction ? fraction.replace(/0+$/, '').length : 0; }; const getFractionDigitsAfterMultiplier = (input, multiplier, explicitFractionDigits) => { if (explicitFractionDigits != null) { return explicitFractionDigits; } if (multiplier === 1) { return getInputFractionDigitCount(input); } const multiplierPower = Math.round(Math.log10(Math.abs(multiplier))); return Math.max(0, getInputFractionDigitCount(input) - multiplierPower); }; export function NumberFormatter(input, options = {}, rowNode, column, api) { let preparedInput; if (options.Content) { const context = { column, rowNode, input, api, }; preparedInput = formatPlaceholder(options.Content.toString(), context); } else { preparedInput = input; } if (preparedInput == null || preparedInput == undefined) { return undefined; } if (typeof preparedInput === 'string') { return preparedInput; } let n = Number(preparedInput); if (isNaN(n)) { return preparedInput.toString(); } let multiplier = options.Multiplier ? options.Multiplier : 1; let multiplierFractionDigits; if (options.Multiplier !== undefined) { n *= multiplier; multiplierFractionDigits = getFractionDigitsAfterMultiplier(preparedInput, options.Multiplier, options.FractionDigits); n = parseFloat(n.toFixed(multiplierFractionDigits)); } if (options.IntegerDigits > 20) { options.IntegerDigits = 20; } if (options.FractionDigits > 20) { options.FractionDigits = 20; } if (options.Parentheses === true && preparedInput < 0) { n *= -1; n = parseFloat(n.toFixed(12)); } if (options.Abs) { n = Math.abs(n); } if (options.Truncate) { n = Math.trunc(n); } if (options.Ceiling) { n = Math.ceil(n); } if (options.Round) { n = Math.round(n); } if (options.Floor) { n = Math.floor(n); } if (options.Empty) { return ' '; } if (n === 0 && options.ZeroDisplay !== undefined && options.ZeroDisplay !== '0') { return options.ZeroDisplay; } let s; let digitsToUse; const fractionsSepatator = options.FractionSeparator ?? '.'; if (options.Truncate || options.Ceiling || options.Round || options.Floor) { digitsToUse = 0; } else if (options.FractionDigits != null) { digitsToUse = options.FractionDigits; } else if (multiplierFractionDigits != null) { digitsToUse = multiplierFractionDigits; } else { let decimalCount = Math.floor(n) === n ? 0 : n.toString().split(fractionsSepatator)[1]?.length || 0; digitsToUse = decimalCount; } if (options.Notation === 'scientific') { s = n.toExponential(options.FractionDigits != null ? digitsToUse : undefined); if (options.FractionSeparator !== undefined && options.FractionSeparator !== '.') { s = s.replace('.', options.FractionSeparator); } } else { s = n.toLocaleString('en-US', { minimumIntegerDigits: options.IntegerDigits || undefined, minimumFractionDigits: digitsToUse, maximumFractionDigits: digitsToUse, }); if (options.FractionSeparator !== undefined) { s = s.replace(/\./g, options.FractionSeparator); } if (options.IntegerSeparator !== undefined) { if (options.FractionSeparator !== ',') { s = s.replace(/\,/g, options.IntegerSeparator); } else { s = StringExtensions.ReplaceAllOccurencesExceptLastOne(s, ',', options.IntegerSeparator); } } } s = (options.Prefix || '') + s + (options.Suffix || ''); if (options.Parentheses === true && preparedInput < 0) { s = '(' + s + ')'; } return s; } export function DateFormatter(input, options, strictFormatting = false) { if (input == null || input == undefined || input == 'Invalid Date') { return undefined; } try { if (typeof input === 'string') { const cleanDateString = input.replace(/([+-]\d{2}:\d{2}|Z)$/, ''); input = new Date(cleanDateString); } return dateFnsFormat(input, options?.Pattern || DEFAULT_DATE_FORMAT_PATTERN); } catch (error) { if (strictFormatting) { return `Invalid date formatting pattern`; } if (typeof input !== 'string') { return String(input); } return input; } } export function StringFormatter(input, options = {}, rowNode, column, api) { let normalisedTextInput = input; if (input != undefined && typeof input !== 'string') { const warningMessage = column ? `StringFormatter: input '${input}' from column ${column.columnId} (${column.dataType}) is not a string, but a ${typeof input}` : `StringFormatter: input '${input}' is not a string, received ${typeof input}`; if (api) { api.logWarn(warningMessage); } else { console.warn(warningMessage); } normalisedTextInput = `${input}`; } let preparedInput; if (options.Content) { const context = { column, rowNode, input: normalisedTextInput, api, }; preparedInput = formatPlaceholder(options.Content, context); } else { preparedInput = normalisedTextInput; } if (StringExtensions.IsNullOrEmptyOrWhiteSpace(preparedInput)) { return undefined; } if (options.Empty) { return ' '; } let s = preparedInput; if (options.Prefix !== undefined) { s = options.Prefix + s; } if (options.Suffix !== undefined) { s = s + options.Suffix; } if (options.Case !== undefined) { if (options.Case == 'Lower') { s = s.toLowerCase(); } else if (options.Case == 'Upper') { s = s.toUpperCase(); } else if (options.Case == 'Sentence') { s = sentenceCase(s); } } if (options.Trim !== undefined && options.Trim == true) { s = s.trim(); } return s; } function formatPlaceholder(text, context) { if (!text) { return text; } if (!context) { return text; } if (context?.input) { text = Helper.replaceAll(text, '[value]', context.input); } if (context?.column) { text = Helper.replaceAll(text, '[column]', context.api.columnApi.getFriendlyNameForColumnId(context.column.columnId)); } if (context?.rowNode) { const columns = Helper.extractColsFromText(text); for (const column of columns) { if (context.api.columnApi.getColumnWithColumnId(column)) { text = Helper.replaceAll(text, `[rowData.${column}]`, context.api.gridApi.getRawValueFromRowNode(context.rowNode, column)); } } } return text; } export default { NumberFormatter, DateFormatter, StringFormatter };