diff --git a/packages/backend/src/apps/formatter/actions/index.ts b/packages/backend/src/apps/formatter/actions/index.ts index 3f0691a8..4019a7d4 100644 --- a/packages/backend/src/apps/formatter/actions/index.ts +++ b/packages/backend/src/apps/formatter/actions/index.ts @@ -1,3 +1,4 @@ import text from './text'; +import numbers from './numbers'; -export default [text]; +export default [text, numbers]; diff --git a/packages/backend/src/apps/formatter/actions/numbers/index.ts b/packages/backend/src/apps/formatter/actions/numbers/index.ts new file mode 100644 index 00000000..9f74172d --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/numbers/index.ts @@ -0,0 +1,52 @@ +import defineAction from '../../../../helpers/define-action'; + +import performMathOperation from './transformers/perform-math-operation'; + +const transformers = { + performMathOperation, +}; + +export default defineAction({ + name: 'Numbers', + key: 'numbers', + description: + 'Transform numbers to perform math operations, generate random numbers, format numbers, and much more.', + arguments: [ + { + label: 'Transform', + key: 'transform', + type: 'dropdown' as const, + required: true, + variables: true, + options: [ + { label: 'Perform Math Operation', value: 'performMathOperation' }, + ], + additionalFields: { + type: 'query', + name: 'getDynamicFields', + arguments: [ + { + name: 'key', + value: 'listTransformOptions', + }, + { + name: 'parameters.transform', + value: '{parameters.transform}', + }, + ], + }, + }, + ], + + async run($) { + const transformerName = $.step.parameters + .transform as keyof typeof transformers; + const output = transformers[transformerName]($); + + $.setActionItem({ + raw: { + output, + }, + }); + }, +}); diff --git a/packages/backend/src/apps/formatter/actions/numbers/transformers/perform-math-operation.ts b/packages/backend/src/apps/formatter/actions/numbers/transformers/perform-math-operation.ts new file mode 100644 index 00000000..b4126ce2 --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/numbers/transformers/perform-math-operation.ts @@ -0,0 +1,23 @@ +import { IGlobalVariable, IJSONObject } from '@automatisch/types'; +import { add, divide, multiply, subtract } from 'lodash'; + +const mathOperation = ($: IGlobalVariable) => { + const mathOperation = $.step.parameters.mathOperation as string; + const values = ($.step.parameters.values as IJSONObject[]).map((value) => + Number(value.input) + ) as number[]; + + if (mathOperation === 'add') { + return values.reduce((acc, curr) => add(acc, curr), 0); + } else if (mathOperation === 'divide') { + return values.reduce((acc, curr) => divide(acc, curr)); + } else if (mathOperation === 'makeNegative') { + return values.map((value) => -value); + } else if (mathOperation === 'multiply') { + return values.reduce((acc, curr) => multiply(acc, curr), 1); + } else if (mathOperation === 'subtract') { + return values.reduce((acc, curr) => subtract(acc, curr)); + } +}; + +export default mathOperation; diff --git a/packages/backend/src/apps/formatter/actions/text/index.ts b/packages/backend/src/apps/formatter/actions/text/index.ts index 85572452..06d8b533 100644 --- a/packages/backend/src/apps/formatter/actions/text/index.ts +++ b/packages/backend/src/apps/formatter/actions/text/index.ts @@ -1,5 +1,6 @@ -import capitalize from './transformers/capitalize'; import defineAction from '../../../../helpers/define-action'; + +import capitalize from './transformers/capitalize'; import extractEmailAddress from './transformers/extract-email-address'; import extractNumber from './transformers/extract-number'; import htmlToMarkdown from './transformers/html-to-markdown'; @@ -34,7 +35,6 @@ export default defineAction({ key: 'transform', type: 'dropdown' as const, required: true, - description: 'Pick a channel to send the message to.', variables: true, options: [ { label: 'Capitalize', value: 'capitalize' }, 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 af10bf49..dfcf3b08 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 @@ -1,14 +1,15 @@ import { IGlobalVariable, IJSONObject } from '@automatisch/types'; -import capitalize from './options/capitalize'; -import extractEmailAddress from './options/extract-email-address'; -import extractNumber from './options/extract-number'; -import htmlToMarkdown from './options/html-to-markdown'; -import lowercase from './options/lowercase'; -import markdownToHtml from './options/markdown-to-html'; -import pluralize from './options/pluralize'; -import replace from './options/replace'; -import trimWhitespace from './options/trim-whitespace'; -import useDefaultValue from './options/use-default-value'; +import capitalize from './text/capitalize'; +import extractEmailAddress from './text/extract-email-address'; +import extractNumber from './text/extract-number'; +import htmlToMarkdown from './text/html-to-markdown'; +import lowercase from './text/lowercase'; +import markdownToHtml from './text/markdown-to-html'; +import pluralize from './text/pluralize'; +import replace from './text/replace'; +import trimWhitespace from './text/trim-whitespace'; +import useDefaultValue from './text/use-default-value'; +import performMathOperation from './numbers/perform-math-operation'; const options: IJSONObject = { capitalize, @@ -21,6 +22,7 @@ const options: IJSONObject = { replace, trimWhitespace, useDefaultValue, + performMathOperation, }; export default { diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/perform-math-operation.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/perform-math-operation.ts new file mode 100644 index 00000000..1d377640 --- /dev/null +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/numbers/perform-math-operation.ts @@ -0,0 +1,36 @@ +const performMathOperation = [ + { + label: 'Math Operation', + key: 'mathOperation', + type: 'dropdown' as const, + required: true, + description: 'The math operation to perform.', + variables: true, + options: [ + { label: 'Add', value: 'add' }, + { label: 'Divide', value: 'divide' }, + { label: 'Make Negative', value: 'makeNegative' }, + { label: 'Multiply', value: 'multiply' }, + { label: 'Subtract', value: 'subtract' }, + ], + }, + { + label: 'Values', + key: 'values', + type: 'dynamic' as const, + required: false, + description: 'Add or remove numbers as needed.', + fields: [ + { + label: 'Input', + key: 'input', + type: 'string' as const, + required: true, + description: 'The number to perform the math operation on.', + variables: true, + }, + ], + }, +]; + +export default performMathOperation; diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/capitalize.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/capitalize.ts similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/capitalize.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/capitalize.ts diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/extract-email-address.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-email-address.ts similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/extract-email-address.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-email-address.ts diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/extract-number.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-number.ts similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/extract-number.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/extract-number.ts diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/html-to-markdown.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/html-to-markdown.ts similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/html-to-markdown.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/html-to-markdown.ts diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/lowercase.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/lowercase.ts similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/lowercase.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/lowercase.ts diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/markdown-to-html.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/markdown-to-html.ts similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/markdown-to-html.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/markdown-to-html.ts diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/pluralize.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/pluralize.ts similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/pluralize.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/pluralize.ts diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/replace.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/replace.ts similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/replace.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/replace.ts diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/trim-whitespace.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/trim-whitespace.ts similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/trim-whitespace.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/trim-whitespace.ts diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/use-default-value.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/use-default-value.ts similarity index 100% rename from packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/options/use-default-value.ts rename to packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/text/use-default-value.ts diff --git a/packages/web/src/graphql/queries/get-dynamic-fields.ts b/packages/web/src/graphql/queries/get-dynamic-fields.ts index 40fc3034..91f538d9 100644 --- a/packages/web/src/graphql/queries/get-dynamic-fields.ts +++ b/packages/web/src/graphql/queries/get-dynamic-fields.ts @@ -13,10 +13,58 @@ export const GET_DYNAMIC_FIELDS = gql` required description variables + dependsOn + value options { label value } + source { + type + name + arguments { + name + value + } + } + additionalFields { + type + name + arguments { + name + value + } + } + fields { + label + key + type + required + description + variables + value + dependsOn + options { + label + value + } + source { + type + name + arguments { + name + value + } + } + additionalFields { + type + name + arguments { + name + value + } + } + } } } `;