From 0b8e33f96dc5bea79d00375debd9f7ddd575b395 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Thu, 28 Sep 2023 12:51:29 +0200 Subject: [PATCH] feat(formatter): Implement find array item by property transformer --- .../src/apps/formatter/actions/index.ts | 3 +- .../apps/formatter/actions/utilities/index.ts | 54 +++++++++++++++++++ .../find-array-item-by-property.ts | 13 +++++ .../list-transform-options/index.ts | 18 ++++--- .../utilities/find-array-item-by-property.ts | 28 ++++++++++ 5 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 packages/backend/src/apps/formatter/actions/utilities/index.ts create mode 100644 packages/backend/src/apps/formatter/actions/utilities/transformers/find-array-item-by-property.ts create mode 100644 packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/utilities/find-array-item-by-property.ts diff --git a/packages/backend/src/apps/formatter/actions/index.ts b/packages/backend/src/apps/formatter/actions/index.ts index 0609b8c9..f62ed06b 100644 --- a/packages/backend/src/apps/formatter/actions/index.ts +++ b/packages/backend/src/apps/formatter/actions/index.ts @@ -1,5 +1,6 @@ import text from './text'; import numbers from './numbers'; import dateTime from './date-time'; +import utilities from './utilities'; -export default [text, numbers, dateTime]; +export default [text, numbers, dateTime, utilities]; diff --git a/packages/backend/src/apps/formatter/actions/utilities/index.ts b/packages/backend/src/apps/formatter/actions/utilities/index.ts new file mode 100644 index 00000000..c88088d5 --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/utilities/index.ts @@ -0,0 +1,54 @@ +import defineAction from '../../../../helpers/define-action'; + +import findArrayItemByProperty from './transformers/find-array-item-by-property'; + +const transformers = { + findArrayItemByProperty, +}; + +export default defineAction({ + name: 'Utilities', + key: 'utilities', + description: 'Specific utilities to help you transform your data.', + arguments: [ + { + label: 'Transform', + key: 'transform', + type: 'dropdown' as const, + required: true, + variables: true, + options: [ + { + label: 'Find Array Item By Property', + value: 'findArrayItemByProperty', + }, + ], + 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/utilities/transformers/find-array-item-by-property.ts b/packages/backend/src/apps/formatter/actions/utilities/transformers/find-array-item-by-property.ts new file mode 100644 index 00000000..587cff94 --- /dev/null +++ b/packages/backend/src/apps/formatter/actions/utilities/transformers/find-array-item-by-property.ts @@ -0,0 +1,13 @@ +import { IGlobalVariable } from '@automatisch/types'; +import { find } from 'lodash'; + +const findArrayItemByProperty = ($: IGlobalVariable) => { + const value = JSON.parse($.step.parameters.value as string); + const propertyName = $.step.parameters.propertyName as string; + const propertyValue = $.step.parameters.propertyValue as string; + + const foundItem = find(value, { [propertyName]: propertyValue }); + return foundItem; +}; + +export default findArrayItemByProperty; 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 60c3f50c..85580da7 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 @@ -2,33 +2,35 @@ import { IGlobalVariable, IJSONObject } from '@automatisch/types'; import capitalize from './text/capitalize'; import extractEmailAddress from './text/extract-email-address'; import extractNumber from './text/extract-number'; +import findArrayItemByProperty from './utilities/find-array-item-by-property'; +import formatDateTime from './date-time/format-date-time'; +import formatNumber from './numbers/format-number'; import htmlToMarkdown from './text/html-to-markdown'; import lowercase from './text/lowercase'; import markdownToHtml from './text/markdown-to-html'; +import performMathOperation from './numbers/perform-math-operation'; import pluralize from './text/pluralize'; +import randomNumber from './numbers/random-number'; 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'; -import randomNumber from './numbers/random-number'; -import formatNumber from './numbers/format-number'; -import formatDateTime from './date-time/format-date-time'; const options: IJSONObject = { capitalize, extractEmailAddress, extractNumber, + findArrayItemByProperty, + formatDateTime, + formatNumber, htmlToMarkdown, lowercase, markdownToHtml, + performMathOperation, pluralize, + randomNumber, replace, trimWhitespace, useDefaultValue, - performMathOperation, - randomNumber, - formatNumber, - formatDateTime, }; export default { diff --git a/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/utilities/find-array-item-by-property.ts b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/utilities/find-array-item-by-property.ts new file mode 100644 index 00000000..af2ec7b2 --- /dev/null +++ b/packages/backend/src/apps/formatter/dynamic-fields/list-transform-options/utilities/find-array-item-by-property.ts @@ -0,0 +1,28 @@ +const findArrayItemByProperty = [ + { + label: 'Value', + key: 'value', + type: 'string' as const, + required: true, + description: 'Array of objects that will be searched.', + variables: true, + }, + { + label: 'Property Name', + key: 'propertyName', + type: 'string' as const, + required: true, + description: 'Property name that will be searched.', + variables: true, + }, + { + label: 'Property Value', + key: 'propertyValue', + type: 'string' as const, + required: true, + description: 'Property value that will be matched.', + variables: true, + }, +]; + +export default findArrayItemByProperty;