From 9d8405fc3628ebc62e0244b7f64408d011707fc4 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Mon, 7 Jul 2025 17:30:39 +0300 Subject: [PATCH] F: Remove unnecessary updates and fix UI --- rsconcept/backend/apps/oss/serializers/data_access.py | 10 +++++++++- .../frontend/src/features/oss/backend/oss-loader.ts | 10 ++-------- rsconcept/frontend/src/features/oss/backend/types.ts | 1 + .../frontend/src/features/oss/backend/use-oss.tsx | 10 +++------- .../src/features/oss/components/info-operation.tsx | 2 +- .../src/features/oss/dialogs/dlg-delete-operation.tsx | 4 ++-- rsconcept/frontend/src/features/oss/models/oss.ts | 2 +- .../oss-page/editor-oss-graph/graph/node-core.tsx | 4 ++-- .../editor-oss-graph/side-panel/block-stats.tsx | 2 +- .../editor-oss-graph/side-panel/side-panel.tsx | 2 +- 10 files changed, 23 insertions(+), 24 deletions(-) diff --git a/rsconcept/backend/apps/oss/serializers/data_access.py b/rsconcept/backend/apps/oss/serializers/data_access.py index 9591ee05..fe5a644c 100644 --- a/rsconcept/backend/apps/oss/serializers/data_access.py +++ b/rsconcept/backend/apps/oss/serializers/data_access.py @@ -18,6 +18,8 @@ from .basics import NodeSerializer, SubstitutionExSerializer class OperationSerializer(serializers.ModelSerializer): ''' Serializer: Operation data. ''' + is_import = serializers.BooleanField(default=False, required=False) + class Meta: ''' serializer metadata. ''' model = Operation @@ -407,7 +409,13 @@ class OperationSchemaSerializer(serializers.ModelSerializer): result['arguments'] = [] result['substitutions'] = [] for operation in oss.operations().order_by('pk'): - result['operations'].append(OperationSerializer(operation).data) + operation_data = OperationSerializer(operation).data + operation_result = operation.result + operation_data['is_import'] = \ + operation_result is not None and \ + (operation_result.owner_id != instance.owner_id or + operation_result.location != instance.location) + result['operations'].append(operation_data) for block in oss.blocks().order_by('pk'): result['blocks'].append(BlockSerializer(block).data) for argument in oss.arguments().order_by('order'): diff --git a/rsconcept/frontend/src/features/oss/backend/oss-loader.ts b/rsconcept/frontend/src/features/oss/backend/oss-loader.ts index d9f14b4a..59ca4dab 100644 --- a/rsconcept/frontend/src/features/oss/backend/oss-loader.ts +++ b/rsconcept/frontend/src/features/oss/backend/oss-loader.ts @@ -2,8 +2,6 @@ * Module: OSS data loading and processing. */ -import { type ILibraryItem } from '@/features/library'; - import { Graph } from '@/models/graph'; import { type RO } from '@/utils/meta'; @@ -29,11 +27,9 @@ export class OssLoader { private itemByNodeID = new Map(); private blockByID = new Map(); private schemaIDs: number[] = []; - private items: RO; - constructor(input: RO, items: RO) { + constructor(input: RO) { this.oss = structuredClone(input) as IOperationSchema; - this.items = items; } produceOSS(): IOperationSchema { @@ -89,12 +85,10 @@ export class OssLoader { private inferOperationAttributes() { this.graph.topologicalOrder().forEach(operationID => { const operation = this.operationByID.get(operationID)!; - const schema = this.items.find(item => item.id === operation.result); const position = this.oss.layout.find(item => item.nodeID === operation.nodeID); operation.x = position?.x ?? 0; operation.y = position?.y ?? 0; operation.is_consolidation = this.inferConsolidation(operationID); - operation.is_owned = !schema || (schema.owner === this.oss.owner && schema.location === this.oss.location); operation.substitutions = this.oss.substitutions.filter(item => item.operation === operationID); operation.arguments = this.oss.arguments .filter(item => item.operation === operationID) @@ -132,7 +126,7 @@ export class OssLoader { count_inputs: operations.filter(item => item.operation_type === OperationType.INPUT).length, count_synthesis: operations.filter(item => item.operation_type === OperationType.SYNTHESIS).length, count_schemas: this.schemaIDs.length, - count_owned: operations.filter(item => !!item.result && item.is_owned).length, + count_owned: operations.filter(item => !!item.result && !item.is_import).length, count_block: this.oss.blocks.length }; } diff --git a/rsconcept/frontend/src/features/oss/backend/types.ts b/rsconcept/frontend/src/features/oss/backend/types.ts index 09ed7a9e..490f070c 100644 --- a/rsconcept/frontend/src/features/oss/backend/types.ts +++ b/rsconcept/frontend/src/features/oss/backend/types.ts @@ -86,6 +86,7 @@ export const schemaOperation = z.strictObject({ title: z.string(), description: z.string(), parent: z.number().nullable(), + is_import: z.boolean(), result: z.number().nullable() }); diff --git a/rsconcept/frontend/src/features/oss/backend/use-oss.tsx b/rsconcept/frontend/src/features/oss/backend/use-oss.tsx index a4cf2337..2b1fe649 100644 --- a/rsconcept/frontend/src/features/oss/backend/use-oss.tsx +++ b/rsconcept/frontend/src/features/oss/backend/use-oss.tsx @@ -1,28 +1,24 @@ import { useQuery, useSuspenseQuery } from '@tanstack/react-query'; -import { useLibrary, useLibrarySuspense } from '@/features/library/backend/use-library'; - import { queryClient } from '@/backend/query-client'; import { ossApi } from './api'; import { OssLoader } from './oss-loader'; export function useOss({ itemID }: { itemID?: number }) { - const { items: libraryItems, isLoading: libraryLoading } = useLibrary(); const { data, isLoading, error } = useQuery({ ...ossApi.getOssQueryOptions({ itemID }) }); - const schema = data && !libraryLoading ? new OssLoader(data, libraryItems).produceOSS() : undefined; - return { schema: schema, isLoading: isLoading || libraryLoading, error: error }; + const schema = data ? new OssLoader(data).produceOSS() : undefined; + return { schema: schema, isLoading: isLoading, error: error }; } export function useOssSuspense({ itemID }: { itemID: number }) { - const { items: libraryItems } = useLibrarySuspense(); const { data } = useSuspenseQuery({ ...ossApi.getOssQueryOptions({ itemID }) }); - const schema = new OssLoader(data!, libraryItems).produceOSS(); + const schema = new OssLoader(data!).produceOSS(); return { schema }; } diff --git a/rsconcept/frontend/src/features/oss/components/info-operation.tsx b/rsconcept/frontend/src/features/oss/components/info-operation.tsx index 240d300f..1928c89c 100644 --- a/rsconcept/frontend/src/features/oss/components/info-operation.tsx +++ b/rsconcept/frontend/src/features/oss/components/info-operation.tsx @@ -47,7 +47,7 @@ export function InfoOperation({ operation }: InfoOperationProps) {

Тип: {labelOperationType(operation.operation_type)}

- {!operation.is_owned ? ( + {operation.is_import ? (

КС не принадлежит ОСС

diff --git a/rsconcept/frontend/src/features/oss/dialogs/dlg-delete-operation.tsx b/rsconcept/frontend/src/features/oss/dialogs/dlg-delete-operation.tsx index a9d1205e..61b268d1 100644 --- a/rsconcept/frontend/src/features/oss/dialogs/dlg-delete-operation.tsx +++ b/rsconcept/frontend/src/features/oss/dialogs/dlg-delete-operation.tsx @@ -68,13 +68,13 @@ export function DlgDeleteOperation() { )} /> diff --git a/rsconcept/frontend/src/features/oss/models/oss.ts b/rsconcept/frontend/src/features/oss/models/oss.ts index df847245..f9e37a5c 100644 --- a/rsconcept/frontend/src/features/oss/models/oss.ts +++ b/rsconcept/frontend/src/features/oss/models/oss.ts @@ -24,7 +24,7 @@ export interface IOperation extends IOperationDTO { nodeType: typeof NodeType.OPERATION; x: number; y: number; - is_owned: boolean; + is_import: boolean; is_consolidation: boolean; // aka 'diamond synthesis' substitutions: ICstSubstituteInfo[]; arguments: number[]; diff --git a/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-graph/graph/node-core.tsx b/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-graph/graph/node-core.tsx index 6be90695..12ecde66 100644 --- a/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-graph/graph/node-core.tsx +++ b/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-graph/graph/node-core.tsx @@ -70,8 +70,8 @@ export function NodeCore({ node }: NodeCoreProps) {
) : null} - {!node.data.operation.is_owned ? ( -
+ {node.data.operation.is_import ? ( +
) : null}
item.operation_type === OperationType.INPUT).length, count_synthesis: operations.filter(item => item.operation_type === OperationType.SYNTHESIS).length, count_schemas: operations.filter(item => !!item.result).length, - count_owned: operations.filter(item => !!item.result && item.is_owned).length, + count_owned: operations.filter(item => !!item.result && !item.is_import).length, count_block: contents.length - operations.length }; diff --git a/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-graph/side-panel/side-panel.tsx b/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-graph/side-panel/side-panel.tsx index 4251e724..e02f1264 100644 --- a/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-graph/side-panel/side-panel.tsx +++ b/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-graph/side-panel/side-panel.tsx @@ -69,7 +69,7 @@ export function SidePanel({ isMounted, className }: SidePanelProps) {
Отсутствует концептуальная схема для выбранной операции
) : selectedOperation && selectedSchema && debouncedMounted ? ( }> - + ) : null} {selectedBlock ? : null}