From 02e0b855720d0e5da0a6d51532ef1d4ff894bec8 Mon Sep 17 00:00:00 2001 From: Thomas Lathuiliere Date: Mon, 10 Jul 2023 13:44:48 +0200 Subject: [PATCH] WIP --- .../app/components/Edit/EditAstNode.tsx | 67 +++++-------------- .../i/$iterationId/edit.rules.$ruleId.tsx | 47 ++++++++----- .../app/services/editor/identifiers.tsx | 42 ++++++++++++ apps/builder/app/services/editor/index.ts | 0 libs/models/src/lib/ast-expression.ts | 15 ++++- libs/repositories/src/index.ts | 2 +- libs/repositories/src/lib/editor.ts | 30 +++++++++ libs/repositories/src/lib/index.ts | 1 + 8 files changed, 135 insertions(+), 69 deletions(-) create mode 100644 apps/builder/app/services/editor/identifiers.tsx create mode 100644 apps/builder/app/services/editor/index.ts create mode 100644 libs/repositories/src/lib/editor.ts diff --git a/apps/builder/app/components/Edit/EditAstNode.tsx b/apps/builder/app/components/Edit/EditAstNode.tsx index f64552dfd..b17b3212a 100644 --- a/apps/builder/app/components/Edit/EditAstNode.tsx +++ b/apps/builder/app/components/Edit/EditAstNode.tsx @@ -1,6 +1,7 @@ +import { useEditorIdentifiers } from '@marble-front/builder/services/editor/identifiers'; import { type AstNode, NewAstNode } from '@marble-front/models'; import { Combobox, Select } from '@marble-front/ui/design-system'; -import { forwardRef, useState } from 'react'; +import { forwardRef, useCallback, useState } from 'react'; import { useFormContext } from 'react-hook-form'; import { useGetOperatorLabel } from '../Scenario/Formula/Operators'; @@ -56,9 +57,10 @@ const EditOperand = forwardRef< onChange: (value: AstNode | null) => void; } >(({ value, onChange, ...otherProps }, ref) => { + const getIdentifierOptions = useGetIdentifierOptions(); const [inputValue, setInputValue] = useState(''); const [selectedItem, setSelectedItem] = useState< - (typeof mockedIdentifiers)[number] | null + ReturnType[number] | null >(null); const items = getIdentifierOptions(inputValue); @@ -73,7 +75,7 @@ const EditOperand = forwardRef< }} nullable > -
+
item?.label ?? ''} @@ -82,7 +84,7 @@ const EditOperand = forwardRef< otherProps?.onBlur?.(); }} /> - + {filteredItems.map((item) => ( {item.label} - {item.node.name} ))} @@ -100,49 +101,6 @@ const EditOperand = forwardRef< }); EditOperand.displayName = 'EditOperand'; -const mockedIdentifiers: { label: string; node: AstNode }[] = [ - { - label: 'account.is_frozen', - node: NewAstNode({ - name: 'DB_FIELD_BOOL', - namedChildren: { - triggerTableName: { - name: 'STRING_CONSTANT', - constant: 'transaction', - children: [], - namedChildren: {}, - }, - path: { - name: 'STRING_LIST_CONSTANT', - constant: ['account'], - children: [], - namedChildren: {}, - }, - fieldName: { - name: 'STRING_CONSTANT', - constant: 'is_frozen', - children: [], - namedChildren: {}, - }, - }, - }), - }, - { - label: 'amount', - node: NewAstNode({ - name: 'PAYLOAD_FIELD_FLOAT', - namedChildren: { - fieldName: { - name: 'STRING_CONSTANT', - constant: 'amount', - children: [], - namedChildren: {}, - }, - }, - }), - }, -]; - function coerceToConstant(search: string) { const parsedNumber = Number(search); const isNumber = !isNaN(parsedNumber); @@ -166,9 +124,16 @@ function coerceToConstant(search: string) { }; } -function getIdentifierOptions(search: string) { - if (!search) return mockedIdentifiers; - return [...mockedIdentifiers, coerceToConstant(search)]; +function useGetIdentifierOptions() { + const identifiers = useEditorIdentifiers(); + + return useCallback( + (search: string) => { + if (!search) return identifiers; + return [...identifiers, coerceToConstant(search)]; + }, + [identifiers] + ); } const EditOperator = forwardRef< diff --git a/apps/builder/app/routes/__builder/scenarios/$scenarioId/i/$iterationId/edit.rules.$ruleId.tsx b/apps/builder/app/routes/__builder/scenarios/$scenarioId/i/$iterationId/edit.rules.$ruleId.tsx index 3d3d21db6..525afa4ea 100644 --- a/apps/builder/app/routes/__builder/scenarios/$scenarioId/i/$iterationId/edit.rules.$ruleId.tsx +++ b/apps/builder/app/routes/__builder/scenarios/$scenarioId/i/$iterationId/edit.rules.$ruleId.tsx @@ -11,9 +11,10 @@ import { } from '@marble-front/builder/components/Edit'; import { Consequence } from '@marble-front/builder/components/Scenario/Rule/Consequence'; import { authenticator } from '@marble-front/builder/services/auth/auth.server'; +import { EditorIdentifiersProvider } from '@marble-front/builder/services/editor/identifiers'; import { getServerEnv } from '@marble-front/builder/utils/environment.server'; import { fromParams, fromUUID } from '@marble-front/builder/utils/short-uuid'; -import { getScenarioIterationRule } from '@marble-front/repositories'; +import { editor, getScenarioIterationRule } from '@marble-front/repositories'; import { Button, Tag } from '@marble-front/ui/design-system'; import { json, type LoaderArgs } from '@remix-run/node'; import { Link, useLoaderData } from '@remix-run/react'; @@ -32,23 +33,33 @@ export async function loader({ request, params }: LoaderArgs) { }); const ruleId = fromParams(params, 'ruleId'); + const scenarioId = fromParams(params, 'scenarioId'); - const scenarioIterationRule = await getScenarioIterationRule({ + const scenarioIterationRule = getScenarioIterationRule({ ruleId, tokenService, baseUrl: getServerEnv('MARBLE_API_DOMAIN'), }); - return json(scenarioIterationRule); + const identifiers = editor.listIdentifiers({ + scenarioId, + tokenService, + baseUrl: getServerEnv('MARBLE_API_DOMAIN'), + }); + + return json({ + rule: await scenarioIterationRule, + identifiers: await identifiers, + }); } export default function RuleView() { - const rule = useLoaderData(); + const { rule, identifiers } = useLoaderData(); const formMethods = useForm({ - // defaultValues: { - // astNode: rule.astNode as RootAstNode, - // }, + defaultValues: { + astNode: rule.astNode, + }, }); return ( @@ -69,14 +80,16 @@ export default function RuleView() {
- - {/* } - /> */} - } - /> - + + + {/* } + /> */} + } + /> + +