From 72fe4a461fabac136a9417ac43b01bf923b93a39 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Sat, 17 Aug 2024 12:17:13 +0300 Subject: [PATCH] F: Improve OSS UI --- .../src/components/info/TooltipOperation.tsx | 5 ++++ rsconcept/frontend/src/models/OssLoader.ts | 14 +++++++++++ rsconcept/frontend/src/models/oss.ts | 1 + .../pages/LibraryPage/TableLibraryItems.tsx | 2 +- .../ManualsPage/items/HelpConceptOSS.tsx | 23 ++++++++++++++---- .../items/HelpConceptSynthesis.tsx | 4 ++-- .../pages/ManualsPage/items/HelpLibrary.tsx | 12 +++++++++- .../pages/ManualsPage/items/HelpOssGraph.tsx | 15 ++++++++---- .../OssPage/EditorOssGraph/InputNode.tsx | 5 ++-- .../EditorOssGraph/NodeContextMenu.tsx | 4 ++-- .../OssPage/EditorOssGraph/OperationNode.tsx | 24 +++++++++++++++---- .../pages/OssPage/EditorOssGraph/OssFlow.tsx | 8 +++++-- .../EditorRSFormCard/EditorLibraryItem.tsx | 18 +++++++------- 13 files changed, 102 insertions(+), 33 deletions(-) diff --git a/rsconcept/frontend/src/components/info/TooltipOperation.tsx b/rsconcept/frontend/src/components/info/TooltipOperation.tsx index acb6c9bc..3e704cb9 100644 --- a/rsconcept/frontend/src/components/info/TooltipOperation.tsx +++ b/rsconcept/frontend/src/components/info/TooltipOperation.tsx @@ -72,6 +72,11 @@ function TooltipOperation({ node, anchor }: TooltipOperationProps) { КС не принадлежит ОСС

) : null} + {node.data.operation.is_consolidation ? ( +

+ Ромбовидный синтез +

+ ) : null} {node.data.operation.title ? (

Название: diff --git a/rsconcept/frontend/src/models/OssLoader.ts b/rsconcept/frontend/src/models/OssLoader.ts index dd00e791..b865dadf 100644 --- a/rsconcept/frontend/src/models/OssLoader.ts +++ b/rsconcept/frontend/src/models/OssLoader.ts @@ -62,6 +62,7 @@ export class OssLoader { this.graph.topologicalOrder().forEach(operationID => { const operation = this.operationByID.get(operationID)!; const schema = this.items.find(item => item.id === operation.result); + 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 @@ -70,6 +71,19 @@ export class OssLoader { }); } + private inferConsolidation(operationID: OperationID): boolean { + const inputs = this.graph.expandInputs([operationID]); + if (inputs.length === 0) { + return false; + } + const ancestors = [...inputs]; + inputs.forEach(input => { + ancestors.push(...this.graph.expandAllInputs([input])); + }); + const unique = new Set(ancestors); + return unique.size < ancestors.length; + } + private calculateStats(): IOperationSchemaStats { const items = this.oss.items; return { diff --git a/rsconcept/frontend/src/models/oss.ts b/rsconcept/frontend/src/models/oss.ts index ae0f7137..5d8e9ded 100644 --- a/rsconcept/frontend/src/models/oss.ts +++ b/rsconcept/frontend/src/models/oss.ts @@ -37,6 +37,7 @@ export interface IOperation { result: LibraryItemID | null; is_owned: boolean; + is_consolidation: boolean; // aka 'diamond synthesis' substitutions: ICstSubstituteEx[]; arguments: OperationID[]; } diff --git a/rsconcept/frontend/src/pages/LibraryPage/TableLibraryItems.tsx b/rsconcept/frontend/src/pages/LibraryPage/TableLibraryItems.tsx index 4dd86b03..cbdfba8a 100644 --- a/rsconcept/frontend/src/pages/LibraryPage/TableLibraryItems.tsx +++ b/rsconcept/frontend/src/pages/LibraryPage/TableLibraryItems.tsx @@ -148,7 +148,7 @@ function TableLibraryItems({ items, resetQuery, folderMode, toggleFolderMode }: { when: (item: ILibraryItem) => item.item_type === LibraryItemType.OSS, style: { - backgroundColor: colors.bgGreen50 + color: colors.fgGreen } } ], diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptOSS.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptOSS.tsx index bf7940a3..5ea58e4d 100644 --- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptOSS.tsx +++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptOSS.tsx @@ -1,24 +1,37 @@ +import { IconOSS, IconPredecessor } from '@/components/Icons'; import LinkTopic from '@/components/ui/LinkTopic'; import { HelpTopic } from '@/models/miscellaneous'; function HelpConceptOSS() { return ( -

+

Операционная схема синтеза

Работа со сложными предметными областями требует многократного{' '} для построения целевых понятий. Последовательность - синтезов концептуальных схем задается с помощью Операционной схемы синтеза (ОСС) в форме Графа синтеза. + синтезов задается с помощью{' '} + + Операционной схемы синтеза (ОСС) + {' '} + и отображается в форме .

Отдельные операции в рамках ОСС задаются таблицами отождествлений понятий из синтезируемых схем. Таким - образом в каждой КС разделяются на - наследованные, отождествленные и дописанные. + образом в каждой КС разделяются на исходные + (дописанные), наследованные, отождествленные (удаляемые).

Портал поддерживает сквозные изменения в рамках ОСС. Изменения, внесенные в исходные концептуальные схемы автоматически проносятся через граф синтеза (путем обновления наследованных конституент). Формальные определения - наследованных конституент можно редактировать только путем изменения исходных конституент. + наследованных конституент можно редактировать только путем изменения{' '} + + исходных конституент. + +

+

+ Ромбовидным синтезом называется операция, где используются КС, имеющие общих предков. При таком синтезе + могут возникать дубликаты и неоднозначности в результате. Необходимо внимательно формировать таблицу + отождествлений, добавляя дублирующиеся понятия из синтезируемых схем.

); diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptSynthesis.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptSynthesis.tsx index 595ad14b..22f0509b 100644 --- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptSynthesis.tsx +++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptSynthesis.tsx @@ -40,8 +40,8 @@ function HelpConceptSynthesis() {

- Для управления совокупностью синтезов используются операционные схемы синтеза. В данный момент этот - функционал еще не реализован в Портале. + Для управления совокупностью синтезов используются{' '} + .

); diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpLibrary.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpLibrary.tsx index c95465fd..622a99c6 100644 --- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpLibrary.tsx +++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpLibrary.tsx @@ -5,18 +5,28 @@ import { IconFolderEmpty, IconFolderOpened, IconFolderTree, + IconOSS, + IconRSForm, IconSearch, IconShow, IconSortAsc, IconSortDesc } from '@/components/Icons'; +import { useConceptOptions } from '@/context/ConceptOptionsContext'; function HelpLibrary() { + const { colors } = useConceptOptions(); return (

Библиотека схем

-

В библиотеке собраны концептуальные схемы, эксплицированные в родоструктурном аппарате

+

+ В библиотеке собраны системы определений (КС)
и + операционные схемы синтеза (ОСС). +

+
  • + зеленым текстом выделены ОСС +
  • клик по строке - переход к редактированию схемы
  • Ctrl + клик по строке откроет схему в новой вкладке
  • Фильтры атрибутов три позиции: да/нет/не применять
  • diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpOssGraph.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpOssGraph.tsx index d76d3cb5..7752220c 100644 --- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpOssGraph.tsx +++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpOssGraph.tsx @@ -1,4 +1,5 @@ import { + IconAlert, IconAnimation, IconAnimationOff, IconConnect, @@ -23,7 +24,7 @@ import { HelpTopic } from '@/models/miscellaneous'; function HelpOssGraph() { return (
    -

    Граф синтеза

    +

    Граф синтеза

    Настройка графа

    @@ -50,7 +51,10 @@ function HelpOssGraph() {
  • Клик на операцию – выделение
  • Esc – сбросить выделение
  • - Двойной клик – редактирование + Двойной клик – переход к связанной +
  • +
  • + Редактирование операции
  • Новая операция @@ -73,7 +77,7 @@ function HelpOssGraph() { Сохранить положения
  • - Сохранить в формат SVG + Сохранить в SVG
  • @@ -82,9 +86,12 @@ function HelpOssGraph() {

    Контекстное меню

  • - Переход к связанной{' '} + Статус связанной{' '}
  • +
  • + +
  • Создать пустую КС для загрузки
  • diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/InputNode.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/InputNode.tsx index 4c019f35..ac63fd96 100644 --- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/InputNode.tsx +++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/InputNode.tsx @@ -21,11 +21,12 @@ function InputNode(node: OssNodeInternal) { <> - + } noHover - title='Связанная КС' + noPadding + title={hasFile ? 'Связанная КС' : 'Нет связанной КС'} hideTitle={!controller.showTooltip} onClick={() => { handleOpenSchema(); diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx index af936100..9e866b26 100644 --- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx +++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx @@ -105,7 +105,7 @@ function NodeContextMenu({ = window.innerWidth - PARAMETER.ossContextMenuWidth}> } disabled={controller.isProcessing} onClick={handleEditOperation} @@ -113,7 +113,7 @@ function NodeContextMenu({ {operation.result ? ( } disabled={controller.isProcessing} diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OperationNode.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OperationNode.tsx index 5b928104..1e5c8b14 100644 --- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OperationNode.tsx +++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OperationNode.tsx @@ -1,6 +1,6 @@ import { Handle, Position } from 'reactflow'; -import { IconRSForm } from '@/components/Icons'; +import { IconAlert, IconRSForm } from '@/components/Icons'; import TooltipOperation from '@/components/info/TooltipOperation'; import MiniButton from '@/components/ui/MiniButton.tsx'; import Overlay from '@/components/ui/Overlay'; @@ -22,15 +22,31 @@ function OperationNode(node: OssNodeInternal) { <> - + } + icon={ + + } noHover - title='Связанная КС' + noPadding + title={hasFile ? 'Связанная КС' : 'Нет связанной КС'} hideTitle={!controller.showTooltip} onClick={handleOpenSchema} disabled={!hasFile} /> + {node.data.operation.is_consolidation ? ( + } + disabled + noPadding + noHover + title='Внимание! Ромбовидный синтез' + hideTitle={!controller.showTooltip} + /> + ) : null} {!node.data.operation.is_owned ? ( diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx index c35ce23a..00d72463 100644 --- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx +++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx @@ -299,9 +299,13 @@ function OssFlow({ isModified, setIsModified }: OssFlowProps) { (event: CProps.EventMouse, node: OssNode) => { event.preventDefault(); event.stopPropagation(); - handleEditOperation(Number(node.id)); + if (node.data.operation.result) { + controller.openOperationSchema(Number(node.id)); + } else { + handleEditOperation(Number(node.id)); + } }, - [handleEditOperation] + [handleEditOperation, controller.openOperationSchema] ); function handleKeyDown(event: React.KeyboardEvent) { diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorLibraryItem.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorLibraryItem.tsx index 443919ac..b6daa4b0 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorLibraryItem.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorLibraryItem.tsx @@ -89,16 +89,14 @@ function EditorLibraryItem({ item, isModified, controller }: EditorLibraryItemPr /> {accessLevel >= UserLevel.OWNER ? ( - -
    - controller.promptEditors()} - icon={} - disabled={isModified || controller.isProcessing} - /> -
    + + controller.promptEditors()} + icon={} + disabled={isModified || controller.isProcessing} + /> ) : null}