From a6a6b63e5a6207d149b1ae946f6fd29c95ef735f Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Tue, 5 Sep 2023 16:05:18 +0200 Subject: [PATCH] feat(formatter): Add format number transformer to numbers action --- packages/backend/package.json | 2 + .../apps/formatter/actions/numbers/index.ts | 3 ++ .../numbers/transformers/format-number.ts | 28 ++++++++++++++ .../list-transform-options/index.ts | 2 + .../numbers/format-number.ts | 38 +++++++++++++++++++ yarn.lock | 10 +++++ 6 files changed, 83 insertions(+) create mode 100644 packages/backend/src/apps/formatter/actions/numbers/transformers/format-number.ts create mode 100644 packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-number.ts diff --git a/packages/backend/package.json b/packages/backend/package.json index a0cf65ed..dde140e5 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -31,9 +31,11 @@ "@rudderstack/rudder-sdk-node": "^1.1.2", "@sentry/node": "^7.42.0", "@sentry/tracing": "^7.42.0", + "@types/accounting": "^0.4.2", "@types/luxon": "^2.3.1", "@types/passport": "^1.0.12", "@types/xmlrpc": "^1.3.7", + "accounting": "^0.4.1", "ajv-formats": "^2.1.1", "axios": "0.24.0", "bcrypt": "^5.0.1", diff --git a/packages/backend/src/apps/formatter/actions/numbers/index.ts b/packages/backend/src/apps/formatter/actions/numbers/index.ts index c6c25a97..80531947 100644 --- a/packages/backend/src/apps/formatter/actions/numbers/index.ts +++ b/packages/backend/src/apps/formatter/actions/numbers/index.ts @@ -2,10 +2,12 @@ import defineAction from '../../../../helpers/define-action'; import performMathOperation from './transformers/perform-math-operation'; import randomNumber from './transformers/random-number'; +import formatNumber from './transformers/format-number'; const transformers = { performMathOperation, randomNumber, + formatNumber, }; export default defineAction({ @@ -23,6 +25,7 @@ export default defineAction({ options: [ { label: 'Perform Math Operation', value: 'performMathOperation' }, { label: 'Random Number', value: 'randomNumber' }, + { label: 'Format Number', value: 'formatNumber' }, ], additionalFields: { type: 'query', diff --git a/packages/backend/src/apps/formatter/actions/numbers/transformers/format-number.ts b/packages/backend/src/apps/formatter/actions/numbers/transformers/format-number.ts new file mode 100644 index 00000000..7d03904f --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/numbers/transformers/format-number.ts @@ -0,0 +1,28 @@ +import { IGlobalVariable } from '@automatisch/types'; +import accounting from 'accounting'; + +const formatNumber = ($: IGlobalVariable) => { + const input = $.step.parameters.input as string; + const inputDecimalMark = $.step.parameters.inputDecimalMark as string; + const toFormat = $.step.parameters.toFormat as string; + + const normalizedNumber = accounting.unformat(input, inputDecimalMark); + const decimalPart = normalizedNumber.toString().split('.')[1]; + const precision = decimalPart ? decimalPart.length : 0; + + if (toFormat === '0') { + // Comma for grouping & period for decimal + return accounting.formatNumber(normalizedNumber, precision, ',', '.'); + } else if (toFormat === '1') { + // Period for grouping & comma for decimal + return accounting.formatNumber(normalizedNumber, precision, '.', ','); + } else if (toFormat === '2') { + // Space for grouping & period for decimal + return accounting.formatNumber(normalizedNumber, precision, ' ', '.'); + } else if (toFormat === '3') { + // Space for grouping & comma for decimal + return accounting.formatNumber(normalizedNumber, precision, ' ', ','); + } +}; + +export default formatNumber; diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/index.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/index.ts index d762ef54..32d8e71e 100644 --- a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/index.ts +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/index.ts @@ -11,6 +11,7 @@ import trimWhitespace from './text/trim-whitespace'; import useDefaultValue from './text/use-default-value'; import performMathOperation from './numbers/perform-math-operation'; import randomNumber from './numbers/random-number'; +import formatNumber from './numbers/format-number'; const options: IJSONObject = { capitalize, @@ -25,6 +26,7 @@ const options: IJSONObject = { useDefaultValue, performMathOperation, randomNumber, + formatNumber, }; export default { diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-number.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-number.ts new file mode 100644 index 00000000..96f1033b --- /dev/null +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/format-number.ts @@ -0,0 +1,38 @@ +const formatNumber = [ + { + label: 'Input', + key: 'input', + type: 'string' as const, + required: true, + description: 'The number you want to format.', + variables: true, + }, + { + label: 'Input Decimal Mark', + key: 'inputDecimalMark', + type: 'dropdown' as const, + required: true, + description: 'The decimal mark of the input number.', + variables: true, + options: [ + { label: 'Comma', value: ',' }, + { label: 'Period', value: '.' }, + ], + }, + { + label: 'To Format', + key: 'toFormat', + type: 'dropdown' as const, + required: true, + description: 'The format you want to convert the number to.', + variables: true, + options: [ + { label: 'Comma for grouping & period for decimal', value: '0' }, + { label: 'Period for grouping & comma for decimal', value: '1' }, + { label: 'Space for grouping & period for decimal', value: '2' }, + { label: 'Space for grouping & comma for decimal', value: '3' }, + ], + }, +]; + +export default formatNumber; diff --git a/yarn.lock b/yarn.lock index 5112ff5f..369f8199 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3735,6 +3735,11 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== +"@types/accounting@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@types/accounting/-/accounting-0.4.2.tgz#81239fc56bc62511a3d3ff535dde2e0bbf3c53c1" + integrity sha512-M8W6tsLZguGdRaSQMmg58PUM/5HgoDuBGVyMiYNGi0FZkLzJDjUBGGYRYj1J9OWELCTqfux+ogVyKObCzfWJgg== + "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" @@ -5050,6 +5055,11 @@ accepts@^1.3.7, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +accounting@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/accounting/-/accounting-0.4.1.tgz#87dd4103eff7f4460f1e186f5c677ed6cf566883" + integrity sha512-RU6KY9Y5wllyaCNBo1W11ZOTnTHMMgOZkIwdOOs6W5ibMTp72i4xIbEA48djxVGqMNTUNbvrP/1nWg5Af5m2gQ== + acorn-globals@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"