From 9420729a963399515847c1b297c92aa72c9b813f Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Wed, 13 Aug 2025 22:08:03 +0300 Subject: [PATCH] R: Improve dialogs persistence when data is invalidated --- .../dlg-create-block/dlg-create-block.tsx | 36 ++++++++++++------- .../dlg-create-block/tab-block-card.tsx | 16 ++++----- .../dlg-create-block/tab-block-children.tsx | 22 ++++++------ .../oss/dialogs/dlg-create-schema.tsx | 22 ++++++++---- .../dlg-create-synthesis.tsx | 26 +++++++++----- .../dlg-create-synthesis/tab-arguments.tsx | 19 +++++----- .../tab-substitutions.tsx | 11 +++--- .../oss/dialogs/dlg-delete-operation.tsx | 15 ++++---- .../oss/dialogs/dlg-delete-replica.tsx | 15 ++++---- .../features/oss/dialogs/dlg-edit-block.tsx | 16 +++++---- .../dlg-edit-operation/dlg-edit-operation.tsx | 27 ++++++++------ .../dlg-edit-operation/tab-arguments.tsx | 18 +++++----- .../dlg-edit-operation/tab-operation.tsx | 13 +++---- .../dlg-edit-operation/tab-substitutions.tsx | 11 +++--- .../oss/dialogs/dlg-import-schema.tsx | 21 +++++++---- .../oss/dialogs/dlg-relocate-constituents.tsx | 11 +++--- .../context-menu/menu-block.tsx | 6 ++-- .../context-menu/menu-operation.tsx | 17 ++++----- .../oss-page/editor-oss-graph/oss-flow.tsx | 36 ++++++++++++------- rsconcept/frontend/src/stores/dialogs.ts | 4 +-- 20 files changed, 220 insertions(+), 142 deletions(-) diff --git a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/dlg-create-block.tsx b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/dlg-create-block.tsx index 148a51e3..7a81ae0c 100644 --- a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/dlg-create-block.tsx +++ b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/dlg-create-block.tsx @@ -10,18 +10,20 @@ import { ModalForm } from '@/components/modal'; import { TabLabel, TabList, TabPanel, Tabs } from '@/components/tabs'; import { useDialogsStore } from '@/stores/dialogs'; -import { type ICreateBlockDTO, schemaCreateBlock } from '../../backend/types'; +import { type ICreateBlockDTO, type IOssLayout, schemaCreateBlock } from '../../backend/types'; import { useCreateBlock } from '../../backend/use-create-block'; -import { type IOssItem, NodeType } from '../../models/oss'; -import { type LayoutManager } from '../../models/oss-layout-api'; +import { useOssSuspense } from '../../backend/use-oss'; +import { LayoutManager } from '../../models/oss-layout-api'; import { BLOCK_NODE_MIN_HEIGHT, BLOCK_NODE_MIN_WIDTH } from '../../pages/oss-page/editor-oss-graph/graph/block-node'; import { TabBlockCard } from './tab-block-card'; import { TabBlockChildren } from './tab-block-children'; export interface DlgCreateBlockProps { - manager: LayoutManager; - initialChildren: IOssItem[]; + ossID: number; + layout: IOssLayout; + childrenBlocks: number[]; + childrenOperations: number[]; initialParent: number | null; defaultX: number; defaultY: number; @@ -37,9 +39,19 @@ export type TabID = (typeof TabID)[keyof typeof TabID]; export function DlgCreateBlock() { const { createBlock } = useCreateBlock(); - const { manager, initialChildren, initialParent, onCreate, defaultX, defaultY } = useDialogsStore( - state => state.props as DlgCreateBlockProps - ); + const { + ossID, // + layout, + childrenBlocks, + childrenOperations, + initialParent, + onCreate, + defaultX, + defaultY + } = useDialogsStore(state => state.props as DlgCreateBlockProps); + + const { schema } = useOssSuspense({ itemID: ossID }); + const manager = new LayoutManager(schema, layout); const methods = useForm({ resolver: zodResolver(schemaCreateBlock), @@ -55,8 +67,8 @@ export function DlgCreateBlock() { width: BLOCK_NODE_MIN_WIDTH, height: BLOCK_NODE_MIN_HEIGHT }, - children_blocks: initialChildren.filter(item => item.nodeType === NodeType.BLOCK).map(item => item.id), - children_operations: initialChildren.filter(item => item.nodeType === NodeType.OPERATION).map(item => item.id), + children_blocks: childrenBlocks, + children_operations: childrenOperations, layout: manager.layout }, mode: 'onChange' @@ -93,11 +105,11 @@ export function DlgCreateBlock() { - + - + diff --git a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/tab-block-card.tsx b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/tab-block-card.tsx index f5f684c3..e7e86490 100644 --- a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/tab-block-card.tsx +++ b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/tab-block-card.tsx @@ -3,17 +3,17 @@ import { Controller, useFormContext, useWatch } from 'react-hook-form'; import { TextArea, TextInput } from '@/components/input'; -import { useDialogsStore } from '@/stores/dialogs'; import { type ICreateBlockDTO } from '../../backend/types'; import { SelectParent } from '../../components/select-parent'; -import { NodeType } from '../../models/oss'; +import { type IOperationSchema, NodeType } from '../../models/oss'; import { constructNodeID } from '../../models/oss-api'; -import { type DlgCreateBlockProps } from './dlg-create-block'; +interface TabBlockCardProps { + oss: IOperationSchema; +} -export function TabBlockCard() { - const { manager } = useDialogsStore(state => state.props as DlgCreateBlockProps); +export function TabBlockCard({ oss }: TabBlockCardProps) { const { register, control, @@ -21,7 +21,7 @@ export function TabBlockCard() { } = useFormContext(); const children_blocks = useWatch({ control, name: 'children_blocks' }); const block_ids = children_blocks.map(id => constructNodeID(NodeType.BLOCK, id)); - const all_children = [...block_ids, ...manager.oss.hierarchy.expandAllOutputs(block_ids)]; + const all_children = [...block_ids, ...oss.hierarchy.expandAllOutputs(block_ids)]; return (
@@ -36,8 +36,8 @@ export function TabBlockCard() { control={control} render={({ field }) => ( !all_children.includes(block.nodeID))} - value={field.value ? manager.oss.blockByID.get(field.value) ?? null : null} + items={oss.blocks.filter(block => !all_children.includes(block.nodeID))} + value={field.value ? oss.blockByID.get(field.value) ?? null : null} placeholder='Родительский блок' onChange={value => field.onChange(value ? value.id : null)} /> diff --git a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/tab-block-children.tsx b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/tab-block-children.tsx index b350c678..f9ff102e 100644 --- a/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/tab-block-children.tsx +++ b/rsconcept/frontend/src/features/oss/dialogs/dlg-create-block/tab-block-children.tsx @@ -3,34 +3,34 @@ import { useFormContext, useWatch } from 'react-hook-form'; import { Label } from '@/components/input'; -import { useDialogsStore } from '@/stores/dialogs'; import { type ICreateBlockDTO } from '../../backend/types'; import { PickContents } from '../../components/pick-contents'; -import { type IOssItem, NodeType } from '../../models/oss'; +import { type IOperationSchema, type IOssItem, NodeType } from '../../models/oss'; -import { type DlgCreateBlockProps } from './dlg-create-block'; +interface TabBlockChildrenProps { + oss: IOperationSchema; +} -export function TabBlockChildren() { +export function TabBlockChildren({ oss }: TabBlockChildrenProps) { const { setValue, control } = useFormContext(); - const { manager } = useDialogsStore(state => state.props as DlgCreateBlockProps); const parent = useWatch({ control, name: 'item_data.parent' }); const children_blocks = useWatch({ control, name: 'children_blocks' }); const children_operations = useWatch({ control, name: 'children_operations' }); - const parentItem = parent ? manager.oss.blockByID.get(parent) : null; + const parentItem = parent ? oss.blockByID.get(parent) : null; const internalBlocks = parentItem - ? manager.oss.hierarchy + ? oss.hierarchy .expandAllInputs([parentItem.nodeID]) - .map(id => manager.oss.itemByNodeID.get(id)) + .map(id => oss.itemByNodeID.get(id)) .filter(item => item !== null && item?.nodeType === NodeType.BLOCK) : []; const exclude = parentItem ? [parentItem, ...internalBlocks] : []; const value = [ - ...children_blocks.map(id => manager.oss.blockByID.get(id)!), - ...children_operations.map(id => manager.oss.operationByID.get(id)!) + ...children_blocks.map(id => oss.blockByID.get(id)!), + ...children_operations.map(id => oss.operationByID.get(id)!) ]; function handleChangeSelected(newValue: IOssItem[]) { @@ -50,7 +50,7 @@ export function TabBlockChildren() {