From 9a7076d5166211037ad1b64b108c867b780abb36 Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Fri, 21 Jun 2024 23:46:57 +0300 Subject: [PATCH] Revert "Improting synthesis implementation pt1" --- .vscode/settings.json | 1 - ...ph_operationnode_synthesisedge_and_more.py | 69 --- .../backend/apps/rsform/models/Synthesis.py | 149 ------ .../apps/rsform/serializers/__init__.py | 11 - .../apps/rsform/serializers/synthesis.py | 117 ----- rsconcept/backend/apps/rsform/urls.py | 5 +- rsconcept/backend/apps/rsform/utils.py | 13 - .../backend/apps/rsform/views/__init__.py | 6 - .../backend/apps/rsform/views/synthesis.py | 230 --------- rsconcept/backend/requirements-dev.txt | 17 +- rsconcept/frontend/.vscode/launch.json | 15 - rsconcept/frontend/package-lock.json | 462 ++---------------- rsconcept/frontend/package.json | 7 +- rsconcept/frontend/src/app/Router.tsx | 5 - rsconcept/frontend/src/app/backendAPI.ts | 53 +- rsconcept/frontend/src/app/urls.ts | 3 +- .../src/components/ui/Synthesis/InputNode.tsx | 61 --- .../components/ui/Synthesis/OperationNode.tsx | 80 --- .../components/ui/Synthesis/OperationUI.tsx | 21 - .../components/ui/Synthesis/SynthesisFlow.css | 18 - .../components/ui/Synthesis/SynthesisFlow.tsx | 43 -- .../DlgInlineSynthesis/SubstitutionsTab.tsx | 3 +- .../DlgOssGraph/DlgSelectInputScheme.tsx | 79 --- .../src/dialogs/DlgOssGraph/DlgSynthesis.tsx | 107 ---- rsconcept/frontend/src/hooks/useOssDetails.ts | 25 +- rsconcept/frontend/src/models/OssLoader.ts | 2 +- rsconcept/frontend/src/models/oss.ts | 54 +- .../OssPage/EditorOssGraph/EditorOssGraph.tsx | 12 +- .../src/pages/OssPage/SynthesisContext.tsx | 350 ------------- .../src/pages/OssPage/SynthesisOperation.tsx | 5 - .../OssPage/SynthesisSubstitutionsTab.tsx | 41 -- .../src/pages/OssPage/SynthesisToolbar.tsx | 45 -- .../src/pages/SynthesisPage/SynthesisPage.tsx | 165 ------- .../src/pages/SynthesisPage/index.tsx | 1 - 34 files changed, 84 insertions(+), 2191 deletions(-) delete mode 100644 rsconcept/backend/apps/rsform/migrations/0008_inputnode_synthesisgraph_operationnode_synthesisedge_and_more.py delete mode 100644 rsconcept/backend/apps/rsform/models/Synthesis.py delete mode 100644 rsconcept/backend/apps/rsform/serializers/synthesis.py delete mode 100644 rsconcept/backend/apps/rsform/views/synthesis.py delete mode 100644 rsconcept/frontend/.vscode/launch.json delete mode 100644 rsconcept/frontend/src/components/ui/Synthesis/InputNode.tsx delete mode 100644 rsconcept/frontend/src/components/ui/Synthesis/OperationNode.tsx delete mode 100644 rsconcept/frontend/src/components/ui/Synthesis/OperationUI.tsx delete mode 100644 rsconcept/frontend/src/components/ui/Synthesis/SynthesisFlow.css delete mode 100644 rsconcept/frontend/src/components/ui/Synthesis/SynthesisFlow.tsx delete mode 100644 rsconcept/frontend/src/dialogs/DlgOssGraph/DlgSelectInputScheme.tsx delete mode 100644 rsconcept/frontend/src/dialogs/DlgOssGraph/DlgSynthesis.tsx delete mode 100644 rsconcept/frontend/src/pages/OssPage/SynthesisContext.tsx delete mode 100644 rsconcept/frontend/src/pages/OssPage/SynthesisOperation.tsx delete mode 100644 rsconcept/frontend/src/pages/OssPage/SynthesisSubstitutionsTab.tsx delete mode 100644 rsconcept/frontend/src/pages/OssPage/SynthesisToolbar.tsx delete mode 100644 rsconcept/frontend/src/pages/SynthesisPage/SynthesisPage.tsx delete mode 100644 rsconcept/frontend/src/pages/SynthesisPage/index.tsx diff --git a/.vscode/settings.json b/.vscode/settings.json index 07c8043b..b666ff7a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -120,7 +120,6 @@ "pymorphy", "Quantor", "razdel", - "reactflow", "reagraph", "redef", "REDOC", diff --git a/rsconcept/backend/apps/rsform/migrations/0008_inputnode_synthesisgraph_operationnode_synthesisedge_and_more.py b/rsconcept/backend/apps/rsform/migrations/0008_inputnode_synthesisgraph_operationnode_synthesisedge_and_more.py deleted file mode 100644 index c2c381d4..00000000 --- a/rsconcept/backend/apps/rsform/migrations/0008_inputnode_synthesisgraph_operationnode_synthesisedge_and_more.py +++ /dev/null @@ -1,69 +0,0 @@ -# Generated by Django 5.0.5 on 2024-06-21 15:47 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('rsform', '0007_location_and_flags'), - ] - - operations = [ - migrations.CreateModel( - name='InputNode', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('vertical_coordinate', models.IntegerField(verbose_name='Вертикальная координата звена')), - ('horizontal_coordinate', models.IntegerField(verbose_name='Горизонтальная координата звена')), - ('rsform_id', models.IntegerField(null=True, verbose_name='Схема')), - ], - ), - migrations.CreateModel( - name='SynthesisGraph', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('status', models.CharField(choices=[('Draft', 'Draft'), ('Completed', 'Completed'), ('Warning', 'Warning'), ('Failed', 'Failed')], max_length=20, verbose_name='Статус операции слияния')), - ], - ), - migrations.CreateModel( - name='OperationNode', - fields=[ - ('inputnode_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='rsform.inputnode')), - ('name', models.CharField(max_length=20, verbose_name='Название')), - ('status', models.CharField(choices=[('Draft', 'Draft'), ('Completed', 'Completed'), ('Warning', 'Warning'), ('Failed', 'Failed')], max_length=20, verbose_name='Статус операции слияния')), - ('left_parent', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rsform_library_item_left', to='rsform.libraryitem', verbose_name='Левый предок')), - ('right_parent', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rsform_library_item_right', to='rsform.libraryitem', verbose_name='Правый предок')), - ], - bases=('rsform.inputnode',), - ), - migrations.CreateModel( - name='SynthesisEdge', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('decoded_id', models.CharField(max_length=30, verbose_name='Id ребра на фронте')), - ('source_handle', models.CharField(max_length=30, verbose_name='')), - ('node_from', models.IntegerField(verbose_name='Звено-предок')), - ('node_to', models.IntegerField(verbose_name='Звено-наследник')), - ('graph_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rsform.synthesisgraph', verbose_name='Схема синтеза')), - ], - ), - migrations.AddField( - model_name='inputnode', - name='graph_id', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rsform.synthesisgraph', verbose_name='Схема синтеза'), - ), - migrations.CreateModel( - name='SynthesisSubstitution', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('deleteRight', models.BooleanField(verbose_name='Удалить правую')), - ('takeLeftTerm', models.BooleanField(verbose_name='Использовать термин левой')), - ('graph_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rsform.synthesisgraph', verbose_name='Схема синтеза')), - ('leftCst', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='constituenta_original', to='rsform.constituenta', verbose_name='Конституента')), - ('rightCst', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='constituenta_substitution', to='rsform.constituenta', verbose_name='Подстановка')), - ('operation_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rsform.operationnode', verbose_name='Операция синтеза')), - ], - ), - ] diff --git a/rsconcept/backend/apps/rsform/models/Synthesis.py b/rsconcept/backend/apps/rsform/models/Synthesis.py deleted file mode 100644 index 8b1f0d9f..00000000 --- a/rsconcept/backend/apps/rsform/models/Synthesis.py +++ /dev/null @@ -1,149 +0,0 @@ -''' Models: Synthesis. ''' - -from django.db.models import ( - CASCADE, - SET_NULL, - BooleanField, - CharField, - ForeignKey, - IntegerField, - Model, - TextChoices -) - - -class OperationStatus(TextChoices): - ''' Operation status enumeration. ''' - DRAFT = 'Draft', - COMPLETED = 'Completed', - WARNING = 'Warning', - FAILED = 'Failed' - - -class GraphStatus(TextChoices): - ''' Graph status enumeration. ''' - DRAFT = 'Draft', - COMPLETED = 'Completed', - WARNING = 'Warning', - FAILED = 'Failed' - - -class SynthesisGraph(Model): - status: CharField = CharField( - verbose_name='Статус операции слияния', - max_length=20, - choices=GraphStatus - ) - - -class InputNode(Model): - graph_id: ForeignKey = ForeignKey( - verbose_name='Схема синтеза', - to=SynthesisGraph, - on_delete=CASCADE - ) - - vertical_coordinate: IntegerField = IntegerField( - verbose_name='Вертикальная координата звена', - ) - - horizontal_coordinate: IntegerField = IntegerField( - verbose_name='Горизонтальная координата звена', - ) - - rsform_id: IntegerField = IntegerField( - verbose_name='Схема', - null=True - ) - - -class OperationNode(InputNode): - name: CharField = CharField( - verbose_name='Название', - max_length=20 - ) - - status: CharField = CharField( - verbose_name='Статус операции слияния', - max_length=20, - choices=OperationStatus - ) - - left_parent: ForeignKey = ForeignKey( - verbose_name='Левый предок', - to='rsform.LibraryItem', - related_name='rsform_library_item_left', - on_delete=SET_NULL, - null=True - ) - - right_parent: ForeignKey = ForeignKey( - verbose_name='Правый предок', - to='rsform.LibraryItem', - related_name='rsform_library_item_right', - on_delete=SET_NULL, - null=True - ) - - -class SynthesisSubstitution(Model): - graph_id: ForeignKey = ForeignKey( - verbose_name='Схема синтеза', - to=SynthesisGraph, - on_delete=CASCADE - ) - - operation_id: ForeignKey = ForeignKey( - verbose_name='Операция синтеза', - to=OperationNode, - on_delete=CASCADE - ) - - leftCst: ForeignKey = ForeignKey( - verbose_name='Конституента', - to='Constituenta', - related_name='constituenta_original', - on_delete=SET_NULL, - null=True - ) - - rightCst: ForeignKey = ForeignKey( - verbose_name='Подстановка', - to='Constituenta', - related_name='constituenta_substitution', - on_delete=SET_NULL, - null=True - ) - - deleteRight: BooleanField = BooleanField( - verbose_name='Удалить правую' - ) - - takeLeftTerm: BooleanField = BooleanField( - verbose_name='Использовать термин левой' - ) - - -class SynthesisEdge(Model): - decoded_id: CharField = CharField( - verbose_name='Id ребра на фронте', - max_length=30, - ) - - source_handle: CharField = CharField( - verbose_name='', - max_length=30, - ) - graph_id: ForeignKey = ForeignKey( - verbose_name='Схема синтеза', - to=SynthesisGraph, - on_delete=CASCADE - ) - - node_from: IntegerField = IntegerField( - verbose_name='Звено-предок', - ) - - node_to: IntegerField = IntegerField( - verbose_name='Звено-наследник', - ) diff --git a/rsconcept/backend/apps/rsform/serializers/__init__.py b/rsconcept/backend/apps/rsform/serializers/__init__.py index 5c0aaca3..12c2a4f5 100644 --- a/rsconcept/backend/apps/rsform/serializers/__init__.py +++ b/rsconcept/backend/apps/rsform/serializers/__init__.py @@ -38,14 +38,3 @@ from .schema_typing import ( NewVersionResponse, ResultTextResponse ) - -from .io_pyconcept import PyConceptAdapter -from .io_files import ( - FileSerializer, - RSFormUploadSerializer, - RSFormTRSSerializer -) - -from .synthesis import ( - SynthesisGraphSerializer -) diff --git a/rsconcept/backend/apps/rsform/serializers/synthesis.py b/rsconcept/backend/apps/rsform/serializers/synthesis.py deleted file mode 100644 index 91df80bb..00000000 --- a/rsconcept/backend/apps/rsform/serializers/synthesis.py +++ /dev/null @@ -1,117 +0,0 @@ -''' Synthesis serializers. ''' - -from rest_framework import serializers - -from ..models.Synthesis import ( - InputNode, - OperationNode, - SynthesisEdge, - SynthesisGraph, - SynthesisSubstitution -) - - -class SynthesisGraphSerializer(serializers.ModelSerializer): - class Meta: - model = SynthesisGraph - fields = '__all__' - - def create(self, validated_data): - graph, created = SynthesisGraph.objects.update_or_create( - id=validated_data['id'], - defaults={'status': validated_data['status']} - ) - return graph - - -class InputNodeSerializer(serializers.ModelSerializer): - class Meta: - model = InputNode - fields = '__all__' - - def create(self, validated_data_list): - for validated_data in validated_data_list: - input_node, created = InputNode.objects.update_or_create( - id=validated_data['id'] if validated_data.get('id') else None, - defaults={ - 'graph_id': validated_data['graph_id'], - 'vertical_coordinate': validated_data['vertical_coordinate'], - 'horizontal_coordinate': validated_data['horizontal_coordinate'], - 'rsform_id': validated_data['rsform_id'], - } - ) - return - - -class OperationNodeSerializer(serializers.ModelSerializer): - class Meta: - model = OperationNode - fields = '__all__' - - def create(self, validated_data_list): - operations = [] - for validated_data in validated_data_list: - operation_node, created = OperationNode.objects.update_or_create( - id=validated_data['id'], - defaults={ - 'graph_id': validated_data['graph_id'], - 'vertical_coordinate': validated_data['vertical_coordinate'], - 'horizontal_coordinate': validated_data['horizontal_coordinate'], - 'rsform_id': validated_data['rsform_id'], - 'left_parent': validated_data.get('left_parent'), - 'right_parent': validated_data.get('right_parent'), - } - ) - operations.append(operation_node) - return operations - - -class SynthesisSubstitutionSerializer(serializers.ModelSerializer): - class Meta: - model = SynthesisSubstitution - fields = '__all__' - - def create(self, validated_data_list): - substitutions = [] - for validated_data in validated_data_list: - substitution, created = SynthesisSubstitution.objects.update_or_create( - id=validated_data['id'], - defaults={ - 'operation_id': validated_data['operation_id'], - 'graph_id': validated_data['graph_id'], - 'leftCst': validated_data['leftCst'], - 'rightCst': validated_data['rightCst'], - 'deleteRight': validated_data['deleteRight'], - 'takeLeftTerm': validated_data['takeLeftTerm'], - } - ) - substitutions.append(substitution) - return substitutions - - -class SynthesisEdgeSerializer(serializers.ModelSerializer): - class Meta: - model = SynthesisEdge - fields = '__all__' - - def create(self, validated_data_list): - for validated_data in validated_data_list: - substitution, created = SynthesisEdge.objects.update_or_create( - id=validated_data['id'], - defaults={ - 'graph_id': validated_data['graph_id'], - 'decoded_id': validated_data['decoded_id'], - 'source_handle': validated_data['source_handle'], - 'node_from': validated_data['node_from'], - 'node_to': validated_data['node_to'], - } - ) - return - - -class RunSingleSynthesis(serializers.Serializer): - operationId = serializers.IntegerField() - - -class RunSingleSynthesisResponse(serializers.Serializer): - rsformId = serializers.IntegerField() diff --git a/rsconcept/backend/apps/rsform/urls.py b/rsconcept/backend/apps/rsform/urls.py index fb4f258f..d4df9cb0 100644 --- a/rsconcept/backend/apps/rsform/urls.py +++ b/rsconcept/backend/apps/rsform/urls.py @@ -30,9 +30,6 @@ urlpatterns = [ path('cctext/inflect', views.inflect), path('cctext/generate-lexeme', views.generate_lexeme), path('cctext/parse', views.parse_text), - path('synthesis/run_single', views.run_synthesis_view), - path('synthesis/run_all', views.run_synthesis_graph_view), - path('synthesis/save', views.save_synthesis_graph), - path('synthesis/', views.get_synthesis_graph), + path('', include(library_router.urls)), ] diff --git a/rsconcept/backend/apps/rsform/utils.py b/rsconcept/backend/apps/rsform/utils.py index b096669d..5b3e1d80 100644 --- a/rsconcept/backend/apps/rsform/utils.py +++ b/rsconcept/backend/apps/rsform/utils.py @@ -1,5 +1,4 @@ ''' Utility functions ''' -import copy import json import re from io import BytesIO @@ -67,15 +66,3 @@ def filename_for_schema(alias: str) -> str: # are not supported by some browsers return 'Schema.trs' return alias + '.trs' - - -def clone_rsform(rsform): - rsform_copy = copy.deepcopy(rsform) - rsform_copy.item.pk = None - # rsform_copy.item.owner = "System" - rsform_copy.item.comment = "Temporary cloned rsform" - rsform_copy.item.save() - - rsform_copy.insert_copy(items=rsform.item.constituenta_set.all(), position=1) - rsform_copy.item.save() - return rsform_copy diff --git a/rsconcept/backend/apps/rsform/views/__init__.py b/rsconcept/backend/apps/rsform/views/__init__.py index 57cd8ca8..61c0a1d0 100644 --- a/rsconcept/backend/apps/rsform/views/__init__.py +++ b/rsconcept/backend/apps/rsform/views/__init__.py @@ -5,10 +5,4 @@ from .library import LibraryActiveView, LibraryAdminView, LibraryTemplatesView, from .operations import inline_synthesis from .rsforms import RSFormViewSet, TrsImportView, create_rsform from .rslang import convert_to_ascii, convert_to_math, parse_expression -from .synthesis import ( - get_synthesis_graph, - run_synthesis_graph_view, - run_synthesis_view, - save_synthesis_graph -) from .versions import VersionViewset, create_version, export_file, retrieve_version diff --git a/rsconcept/backend/apps/rsform/views/synthesis.py b/rsconcept/backend/apps/rsform/views/synthesis.py deleted file mode 100644 index 4ac74c04..00000000 --- a/rsconcept/backend/apps/rsform/views/synthesis.py +++ /dev/null @@ -1,230 +0,0 @@ -''' Endpoints for operations schema. ''' -from typing import cast - -from drf_spectacular.utils import extend_schema -from rest_framework import status -from rest_framework.decorators import api_view -from rest_framework.request import Request -from rest_framework.response import Response - -from ..models.api_RSForm import RSForm -from ..models.Constituenta import Constituenta -from ..models.LibraryItem import LibraryItem -from ..models.Synthesis import InputNode, OperationNode, SynthesisEdge, SynthesisSubstitution -from ..serializers import RSFormSerializer, SynthesisGraphSerializer -from ..serializers.data_access import CstSerializer -from ..serializers.synthesis import ( - InputNodeSerializer, - OperationNodeSerializer, - RunSingleSynthesis, - RunSingleSynthesisResponse, - SynthesisEdgeSerializer, - SynthesisSubstitutionSerializer -) -from ..utils import clone_rsform - - -@extend_schema( - summary='Get synthesis graph', - tags=['Synthesis'], - auth=None -) -@api_view(['GET']) -def get_synthesis_graph(request: Request, pk_item: int): - input_nodes = InputNode.objects.filter(graph_id=pk_item) - operation_nodes = OperationNode.objects.filter(graph_id=pk_item) - edges = SynthesisEdge.objects.filter(graph_id=pk_item) - substitutions = [] - for operation_node in operation_nodes: - substitution_batch = SynthesisSubstitution.objects.filter(operation_id=operation_node.id) - for substitution in substitution_batch: - substitutions.append(substitution) - - synthesis_graph = SynthesisGraphSerializer() - synthesis_graph.create(validated_data={'id': pk_item, 'status': 'Draft'}) - input_nodes = InputNodeSerializer(instance=input_nodes, many=True) - operation_nodes = (OperationNodeSerializer(instance=operation_nodes, many=True)) - edges = SynthesisEdgeSerializer(instance=edges, many=True) - substitutions = SynthesisSubstitutionSerializer(instance=substitutions, many=True) - for substitution in substitutions.data: - substitution['leftCst'] = CstSerializer( - instance=Constituenta.objects.get(id=substitution['leftCst']) - ).data - substitution['rightCst'] = CstSerializer( - instance=Constituenta.objects.get(id=substitution['rightCst']) - ).data - return Response(data={ - 'graph': synthesis_graph.data, - 'input_nodes': input_nodes.data, - 'operation_nodes': operation_nodes.data, - 'edges': edges.data, - 'substitutions': substitutions.data, - }) - - -@extend_schema( - summary='Save synthesis graph', - tags=['Synthesis'], - request=SynthesisGraphSerializer, - responses={status.HTTP_200_OK: RSFormSerializer}, - auth=None -) -@api_view(['POST']) -def save_synthesis_graph(request: Request): - graph_data = request.data.get('graph') - input_nodes_data = request.data.get('input_nodes') - operation_nodes_data = request.data.get('operation_nodes') - edges_data = request.data.get('edges') - substitutions_data = request.data.get('substitutions') - - synthesis_graph_serializer = SynthesisGraphSerializer() - graph = synthesis_graph_serializer.create(validated_data=graph_data) - - InputNode.objects.filter(graph_id=graph).delete() - OperationNode.objects.filter(graph_id=graph).delete() - SynthesisEdge.objects.filter(graph_id=graph).delete() - SynthesisSubstitution.objects.filter(graph_id=graph).delete() - - input_node_serializer = InputNodeSerializer() - for input_node in input_nodes_data: - input_node['graph_id'] = graph - input_node_serializer.create(validated_data_list=input_nodes_data) - - for operation_node in operation_nodes_data: - operation_node['graph_id'] = graph - operation_node['left_parent'] = LibraryItem.objects.get(id=operation_node['left_parent']) - operation_node['right_parent'] = LibraryItem.objects.get(id=operation_node['right_parent']) - operation_node_serializer = OperationNodeSerializer() - operations = operation_node_serializer.create(validated_data_list=operation_nodes_data) - - for edge in edges_data: - edge['graph_id'] = graph - - edge_serializer = SynthesisEdgeSerializer() - edge_serializer.create(validated_data_list=edges_data) - - operations_dict = {operation.id: operation for operation in operations} - for substitution_data in substitutions_data: - substitution_data['operation_id'] = operations_dict[substitution_data['operation_id']] - substitution_data['rightCst'] = Constituenta.objects.get(id=substitution_data['rightCst']['id']) - substitution_data['leftCst'] = Constituenta.objects.get(id=substitution_data['leftCst']['id']) - substitution_data['graph_id'] = graph - - substitution_serializer = SynthesisSubstitutionSerializer() - substitutions = substitution_serializer.create(validated_data_list=substitutions_data) - - return Response(synthesis_graph_serializer.data, status=status.HTTP_201_CREATED) - - -@extend_schema( - summary='Run synthesis graph', - tags=['Synthesis'], - request=RunSingleSynthesis, - responses={status.HTTP_200_OK: RunSingleSynthesisResponse}, - auth=None -) -@api_view(['POST']) -def run_synthesis_graph_view(request: Request): - serializer = RunSingleSynthesis(data=request.data) - serializer.is_valid(raise_exception=True) - for atomic_synthesis in serializer.validated_data: - run_synthesis(atomic_synthesis) - - -@extend_schema( - summary='Run synthesis operation', - tags=['Synthesis'], - request=RunSingleSynthesis, - responses={status.HTTP_200_OK: RunSingleSynthesisResponse}, - auth=None -) -@api_view(['POST']) -def run_synthesis_view(request: Request): - serializer = RunSingleSynthesis( - data=request.data - ) - serializer.is_valid(raise_exception=True) - return run_synthesis(serializer=serializer) - - -def run_synthesis(serializer: RunSingleSynthesis): - operation_id = serializer.data['operationId'] - operation = OperationNode.objects.get(id=operation_id) - - left_schema = RSForm(operation.left_parent) - right_schema = RSForm(operation.right_parent) - substitutions = SynthesisSubstitution.objects.filter(operation_id=operation_id) - - left_schema_copy = clone_rsform(left_schema) - right_constituents = right_schema.item.constituenta_set.filter() - left_schema_copy.insert_copy(right_constituents) - - for substitution in substitutions: - original = cast(Constituenta, substitution.leftCst) - replacement = cast(Constituenta, substitution.rightCst) - left_schema_copy.substitute(original, replacement, (not substitution.deleteRight) and substitution.takeLeftTerm) - - left_schema.restore_order() - return Response( - status=status.HTTP_200_OK, - data=RSFormSerializer(left_schema_copy.item).data - ) - - # right_rsform_copy = clone_rsform(right_schema) - - # serializer.is_valid(raise_exception=True) - - # try: - # mapping = serializer.validated_data['mapping'] - # left_cst_pks = [x.get("left_cst_pk") for x in mapping] - # right_cst_pks = [x.get("right_cst_pk") for x in mapping] - # directions = [x.get("mapping_direction") for x in mapping] - # left_csts = left_schema.item.constituenta_set.filter(pk__in=left_cst_pks) - # right_csts = right_schema.item.constituenta_set.filter(pk__in=right_cst_pks) - - # left_mapping_dict = {left.alias: right.alias for left, right, direction in - # zip(left_csts, right_csts, directions) if - # not direction} - # right_mapping_dict = {right.alias: left.alias for left, right, direction in - # zip(left_csts, right_csts, directions) - # if direction} - - # left_schema_copy.apply_mapping(mapping=left_mapping_dict) - # right_rsform_copy.apply_mapping(mapping=right_mapping_dict) - # left_schema_copy.resolve_all_text() - # right_rsform_copy.resolve_all_text() - # left_schema_copy.item.save() - # right_rsform_copy.item.save() - - # for left, right in zip(left_csts, right_csts): - # # left_rsform_copy.substitute(original=left, substitution=right, transfer_term=False) - # # right_rsform_copy.substitute(original=right, substitution=left, transfer_term=False) - # left_schema_copy.item.save() - # right_rsform_copy.item.save() - - # right_cst_pks = set(right_cst_pks) - # for cst in right_rsform_copy.item.constituenta_set.all(): - # if cst.pk not in right_cst_pks: - # max_idx = left_schema.get_max_index(cst.cst_type) - # left_schema_copy.insert_copy(items=[cst], position=max_idx + 1) - # left_schema_copy.item.save() - - # right_rsform_copy.item.delete() - - # serializer = RSFormParseSerializer(cast(LibraryItem, left_schema_copy.item)) - - # # TODO: remove next line - # left_schema_copy.item.delete() - - # return Response( - # status=status.HTTP_200_OK, - # data=serializer.data - # ) - # # TODO: rework 500 - # except Exception as e: - # left_schema_copy.item.delete() - # right_rsform_copy.item.delete() - # raise e - # return Response( - # status=status.HTTP_500_INTERNAL_SERVER_ERROR - # ) diff --git a/rsconcept/backend/requirements-dev.txt b/rsconcept/backend/requirements-dev.txt index ab9d5484..e3b3cb24 100644 --- a/rsconcept/backend/requirements-dev.txt +++ b/rsconcept/backend/requirements-dev.txt @@ -1,20 +1,19 @@ tzdata -Django +django djangorestframework django-cors-headers django-filter drf-spectacular -drf-spectacular-sidecar +drf-spectacular[sidecar] coreapi -django-rest-passwordreset cctext pyconcept -psycopg2-binary -gunicorn - -djangorestframework-stubs[compatible-mypy] - mypy pylint -coverage \ No newline at end of file +coverage +djangorestframework-stubs[compatible-mypy] +django-rest-passwordreset + +psycopg2-binary +gunicorn \ No newline at end of file diff --git a/rsconcept/frontend/.vscode/launch.json b/rsconcept/frontend/.vscode/launch.json deleted file mode 100644 index 2ba986f6..00000000 --- a/rsconcept/frontend/.vscode/launch.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "chrome", - "request": "launch", - "name": "Launch Chrome against localhost", - "url": "http://localhost:8080", - "webRoot": "${workspaceFolder}" - } - ] -} \ No newline at end of file diff --git a/rsconcept/frontend/package-lock.json b/rsconcept/frontend/package-lock.json index 0aefa717..3251523d 100644 --- a/rsconcept/frontend/package-lock.json +++ b/rsconcept/frontend/package-lock.json @@ -9,7 +9,6 @@ "version": "1.0.0", "dependencies": { "@lezer/lr": "^1.4.1", - "@reactflow/core": "^11.11.4", "@tanstack/react-table": "^8.17.3", "@uiw/codemirror-themes": "^4.22.2", "@uiw/react-codemirror": "^4.22.2", @@ -33,9 +32,9 @@ "use-debounce": "^10.0.1" }, "devDependencies": { - "@lezer/generator": "^1.7.1", + "@lezer/generator": "^1.7.0", "@types/jest": "^29.5.12", - "@types/node": "^20.14.7", + "@types/node": "^20.14.5", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^6.21.0", @@ -51,7 +50,7 @@ "postcss": "^8.4.38", "tailwindcss": "^3.4.4", "ts-jest": "^29.1.5", - "typescript": "^5.5.2", + "typescript": "^5.4.5", "vite": "^4.5.3" } }, @@ -655,9 +654,9 @@ "license": "MIT" }, "node_modules/@codemirror/autocomplete": { - "version": "6.16.3", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.16.3.tgz", - "integrity": "sha512-Vl/tIeRVVUCRDuOG48lttBasNQu8usGgXQawBXI7WJAiUDSFOfzflmEsZFZo48mAvAaa4FZ/4/yLLxFtdJaKYA==", + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.16.2.tgz", + "integrity": "sha512-MjfDrHy0gHKlPWsvSsikhO1+BOh+eBHNgfH1OXs1+DAf30IonQldgMM3kxLDTG9ktE7kDLaA1j/l7KMPA4KNfw==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -699,9 +698,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.1.tgz", - "integrity": "sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.0.tgz", + "integrity": "sha512-lsFofvaw0lnPRJlQylNsC4IRt/1lI4OD/yYslrSGVndOJfStc58v+8p9dgGiD90ktOfL7OhBWns1ZETYgz0EJA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -739,9 +738,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.28.2", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.28.2.tgz", - "integrity": "sha512-A3DmyVfjgPsGIjiJqM/zvODUAPQdQl3ci0ghehYNnbt5x+o76xq+dL5+mMBuysDXnI3kapgOkoeJ0sbtL/3qPw==", + "version": "6.28.1", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.28.1.tgz", + "integrity": "sha512-BUWr+zCJpMkA/u69HlJmR+YkV4yPpM81HeMkOMZuwFa8iM5uJdEPKAs1icIRZKkKmy0Ub1x9/G3PQLTXdpBxrQ==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.4.0", @@ -2540,9 +2539,9 @@ "license": "MIT" }, "node_modules/@lezer/generator": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-1.7.1.tgz", - "integrity": "sha512-MgPJN9Si+ccxzXl3OAmCeZuUKw4XiPl4y664FX/hnnyG9CTqUPq65N3/VGPA2jD23D7QgMTtNqflta+cPN+5mQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-1.7.0.tgz", + "integrity": "sha512-IJ16tx3biLKlCXUzcK4v8S10AVa2BSM2rB12rtAL6f1hL2TS/HQQlGCoWRvanlL2J4mCYEEIv9uG7n4kVMkVDA==", "dev": true, "license": "MIT", "dependencies": { @@ -2835,27 +2834,6 @@ } } }, - "node_modules/@reactflow/core": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.4.tgz", - "integrity": "sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==", - "license": "MIT", - "dependencies": { - "@types/d3": "^7.4.0", - "@types/d3-drag": "^3.0.1", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.4.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, "node_modules/@remix-run/router": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", @@ -2976,271 +2954,12 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", - "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", - "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, "node_modules/@types/draco3d": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", "license": "MIT" }, - "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", - "license": "MIT" - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -3307,9 +3026,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.7.tgz", - "integrity": "sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==", + "version": "20.14.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", + "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", "dev": true, "license": "MIT", "dependencies": { @@ -4492,12 +4211,6 @@ "dev": true, "license": "MIT" }, - "node_modules/classcat": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", - "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", - "license": "MIT" - }, "node_modules/classnames": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", @@ -4864,28 +4577,6 @@ "node": ">=12" } }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, "node_modules/d3-force-3d": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.5.tgz", @@ -4963,15 +4654,6 @@ "node": ">=12" } }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/d3-time": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", @@ -5005,41 +4687,6 @@ "node": ">=12" } }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -5236,9 +4883,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.808", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.808.tgz", - "integrity": "sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ==", + "version": "1.4.805", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.805.tgz", + "integrity": "sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==", "license": "ISC" }, "node_modules/ellipsize": { @@ -6590,15 +6237,12 @@ } }, "node_modules/is-core-module": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", - "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9220,13 +8864,6 @@ "node": ">=6" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, "node_modules/pandemonium": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-2.4.1.tgz", @@ -10158,30 +9795,6 @@ "react-dom": ">=16" } }, - "node_modules/reagraph/node_modules/zustand": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.9.tgz", - "integrity": "sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "immer": ">=9.0", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - }, "node_modules/reakeys": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/reakeys/-/reakeys-2.0.2.tgz", @@ -10775,9 +10388,9 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, "license": "ISC", "dependencies": { @@ -10785,7 +10398,6 @@ "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { @@ -11238,9 +10850,9 @@ } }, "node_modules/typescript": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", - "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -11720,9 +11332,9 @@ } }, "node_modules/zustand": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", - "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.9.tgz", + "integrity": "sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw==", "license": "MIT", "dependencies": { "use-sync-external-store": "1.2.0" @@ -11731,14 +11343,10 @@ "node": ">=12.7.0" }, "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", + "immer": ">=9.0", "react": ">=16.8" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, "immer": { "optional": true }, diff --git a/rsconcept/frontend/package.json b/rsconcept/frontend/package.json index 5f4033ce..b5bfaefd 100644 --- a/rsconcept/frontend/package.json +++ b/rsconcept/frontend/package.json @@ -13,7 +13,6 @@ }, "dependencies": { "@lezer/lr": "^1.4.1", - "@reactflow/core": "^11.11.4", "@tanstack/react-table": "^8.17.3", "@uiw/codemirror-themes": "^4.22.2", "@uiw/react-codemirror": "^4.22.2", @@ -37,9 +36,9 @@ "use-debounce": "^10.0.1" }, "devDependencies": { - "@lezer/generator": "^1.7.1", + "@lezer/generator": "^1.7.0", "@types/jest": "^29.5.12", - "@types/node": "^20.14.7", + "@types/node": "^20.14.5", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^6.21.0", @@ -55,7 +54,7 @@ "postcss": "^8.4.38", "tailwindcss": "^3.4.4", "ts-jest": "^29.1.5", - "typescript": "^5.5.2", + "typescript": "^5.4.5", "vite": "^4.5.3" }, "jest": { diff --git a/rsconcept/frontend/src/app/Router.tsx b/rsconcept/frontend/src/app/Router.tsx index 6398de00..621bc3ee 100644 --- a/rsconcept/frontend/src/app/Router.tsx +++ b/rsconcept/frontend/src/app/Router.tsx @@ -16,7 +16,6 @@ import UserProfilePage from '@/pages/UserProfilePage'; import ApplicationLayout from './ApplicationLayout'; import { routes } from './urls'; -import SynthesisPage from "@/pages/SynthesisPage"; export const Router = createBrowserRouter([ { @@ -71,10 +70,6 @@ export const Router = createBrowserRouter([ { path: routes.manuals, element: - }, - { - path: routes.synthesis, - element: } ] } diff --git a/rsconcept/frontend/src/app/backendAPI.ts b/rsconcept/frontend/src/app/backendAPI.ts index 87272819..77163451 100644 --- a/rsconcept/frontend/src/app/backendAPI.ts +++ b/rsconcept/frontend/src/app/backendAPI.ts @@ -7,10 +7,17 @@ import { toast } from 'react-toastify'; import { type ErrorData } from '@/components/info/InfoError'; import { ILexemeData, IResolutionData, ITextRequest, ITextResult, IWordFormPlain } from '@/models/language'; -import { ILibraryItem, ILibraryUpdateData, ITargetAccessPolicy, ITargetLocation, IVersionData } from '@/models/library'; +import { + AccessPolicy, + ILibraryItem, + ILibraryUpdateData, + ITargetAccessPolicy, + ITargetLocation, + IVersionData, + LibraryItemType +} from '@/models/library'; import { ILibraryCreateData } from '@/models/library'; -import { IOperationSchemaData, IRunSynthesis, IRunSynthesisResponse } from '@/models/oss'; -import { ISynthesisGraphData } from '@/models/oss.ts'; +import { IOperationSchemaData } from '@/models/oss'; import { IConstituentaList, IConstituentaMeta, @@ -78,7 +85,6 @@ interface IFrontRequest { export interface FrontPush extends IFrontRequest { data: DataType; } - export interface FrontPull extends IFrontRequest { onSuccess: DataCallback; } @@ -228,10 +234,26 @@ export function postCloneLibraryItem(target: string, request: FrontExchange) { - AxiosGet({ - endpoint: `/api/synthesis/${target}`, - request: request + request.onSuccess({ + id: Number(target), + comment: '123', + alias: 'oss1', + access_policy: AccessPolicy.PUBLIC, + editors: [], + owner: 1, + item_type: LibraryItemType.OSS, + location: '/U', + read_only: false, + subscribers: [], + time_create: '0', + time_update: '0', + title: 'TestOss', + visible: false }); + // AxiosGet({ + // endpoint: `/api/oss/${target}`, // TODO: endpoint to access OSS + // request: request + // }); } export function getRSFormDetails(target: string, version: string, request: FrontPull) { @@ -415,28 +437,13 @@ export function patchUploadTRS(target: string, request: FrontExchange) { +export function patchInlineSynthesis(request: FrontExchange) { AxiosPatch({ endpoint: `/api/operations/inline-synthesis`, request: request }); } -export function runSingleSynthesis(request: FrontExchange) { - AxiosPost({ - endpoint: `/api/synthesis/run_single`, - request: request - }); -} - -export function postSynthesisGraph(request: FrontExchange) { - AxiosPost({ - endpoint: `/api/synthesis/save`, - request: request - }); -} - export function postResolveText(schema: string, request: FrontExchange) { AxiosPost({ endpoint: `/api/rsforms/${schema}/resolve`, diff --git a/rsconcept/frontend/src/app/urls.ts b/rsconcept/frontend/src/app/urls.ts index 733c0bae..d7ff7432 100644 --- a/rsconcept/frontend/src/app/urls.ts +++ b/rsconcept/frontend/src/app/urls.ts @@ -19,8 +19,7 @@ export const routes = { help: 'manuals', rsforms: 'rsforms', oss: 'oss', - icons: 'icons', - synthesis: 'synthesis' + icons: 'icons' }; interface SchemaProps { diff --git a/rsconcept/frontend/src/components/ui/Synthesis/InputNode.tsx b/rsconcept/frontend/src/components/ui/Synthesis/InputNode.tsx deleted file mode 100644 index 94dae743..00000000 --- a/rsconcept/frontend/src/components/ui/Synthesis/InputNode.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { Handle, Position } from '@reactflow/core'; -import { type FC, memo } from 'react'; -import { CiSquareRemove } from 'react-icons/ci'; -import { PiPlugsConnected } from 'react-icons/pi'; - -import MiniButton from '@/components/ui/MiniButton.tsx'; -import { useSynthesis } from '@/pages/OssPage/SynthesisContext.tsx'; - -interface InputNodeProps { - id: string; - data: { - label: string; - onDelete: (nodeId: string) => void; - }; -} - -const InputNode: FC = ({ id, data }) => { - const controller = useSynthesis(); - - const handleDelete = () => { - data.onDelete(id); - }; - - const handleClick = () => { - controller.selectNode(id); - controller.showSelectInput(); - }; - - return ( - <> - -
- } - title='Удалить' - onClick={handleDelete} - color={'red'} - /> -
- Тип: Ввод -
-
- Схема:{controller.getBind(id) === undefined ? '' : controller.getBind(id)} - - } - title='Привязать схему' - onClick={() => { - handleClick(); - }} - /> - -
-
- - ); -}; - -export default memo(InputNode); diff --git a/rsconcept/frontend/src/components/ui/Synthesis/OperationNode.tsx b/rsconcept/frontend/src/components/ui/Synthesis/OperationNode.tsx deleted file mode 100644 index b3ffc99e..00000000 --- a/rsconcept/frontend/src/components/ui/Synthesis/OperationNode.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { Handle, Position } from '@reactflow/core'; -import { type CSSProperties, type FC, memo } from 'react'; -import { CiSquareRemove } from 'react-icons/ci'; -import { IoGitNetworkSharp } from 'react-icons/io5'; -import { VscDebugStart } from 'react-icons/vsc'; - -import MiniButton from '@/components/ui/MiniButton.tsx'; -import { useSynthesis } from '@/pages/OssPage/SynthesisContext.tsx'; - -const sourceHandleStyleA: CSSProperties = { left: 50 }; -const sourceHandleStyleB: CSSProperties = { - right: 50, - left: 'auto' -}; - -interface OperationNodeProps { - id: string; - data: { - label: string; - onDelete: (nodeId: string) => void; - }; - xPos: number; - yPos: number; -} - -const OperationNode: FC = ({ id, data, xPos, yPos }) => { - const controller = useSynthesis(); - const { label, onDelete } = data; - - const handleDelete = () => { - onDelete(id); - }; - - const handleSubstitution = () => { - controller.selectNode(id); - controller.showSynthesis(); - }; - - const handleSynthesis = () => { - controller.singleSynthesis(id); - }; - - return ( - <> - -
- } - title='Удалить' - onClick={handleDelete} - color={'red'} - /> -
- Тип: Отождествление -
-
- Схема: - } - title='Синтез' - onClick={() => handleSynthesis()} - /> - } - title='Отождествления' - onClick={() => handleSubstitution()} - /> -
-
- - - - - ); -}; - -export default memo(OperationNode); diff --git a/rsconcept/frontend/src/components/ui/Synthesis/OperationUI.tsx b/rsconcept/frontend/src/components/ui/Synthesis/OperationUI.tsx deleted file mode 100644 index 71eb33ec..00000000 --- a/rsconcept/frontend/src/components/ui/Synthesis/OperationUI.tsx +++ /dev/null @@ -1,21 +0,0 @@ -// Reexporting reaOperation types to wrap in 'use client'. -'use client'; - -import { GraphCanvas as OperationUI } from 'reagraph'; - -export { - type GraphEdge, - type GraphNode, - type GraphCanvasRef, - Sphere, - useSelection, - type CollapseProps -} from 'reagraph'; -export { type LayoutTypes as OperationLayout } from 'reagraph'; - -import { ThreeEvent } from '@react-three/fiber'; - -export type OperationMouseEvent = ThreeEvent; -export type OperationPointerEvent = ThreeEvent; - -export default OperationUI; diff --git a/rsconcept/frontend/src/components/ui/Synthesis/SynthesisFlow.css b/rsconcept/frontend/src/components/ui/Synthesis/SynthesisFlow.css deleted file mode 100644 index 72fdcd19..00000000 --- a/rsconcept/frontend/src/components/ui/Synthesis/SynthesisFlow.css +++ /dev/null @@ -1,18 +0,0 @@ -.Flow { - flex-grow: 1; - font-size: 12px; -} - -.react-flow__node-input { - border: 1px solid #555; - padding: 10px; - width: 150px; - border-radius: 5px; -} - -.react-flow__node-custom { - border: 1px solid #555; - padding: 10px; - width: 250px; - border-radius: 5px; -} diff --git a/rsconcept/frontend/src/components/ui/Synthesis/SynthesisFlow.tsx b/rsconcept/frontend/src/components/ui/Synthesis/SynthesisFlow.tsx deleted file mode 100644 index 2d47cf55..00000000 --- a/rsconcept/frontend/src/components/ui/Synthesis/SynthesisFlow.tsx +++ /dev/null @@ -1,43 +0,0 @@ -// this is important! You need to import the styles from the lib to make it work -import '@reactflow/core/dist/style.css'; -import './SynthesisFlow.css'; - -import { NodeTypes, ReactFlow } from '@reactflow/core'; -import { useMemo } from 'react'; - -import { useConceptOptions } from '@/context/OptionsContext.tsx'; -import { useSynthesis } from '@/pages/OssPage/SynthesisContext.tsx'; - -import InputNode from './InputNode'; -import OperationNode from './OperationNode'; - -const nodeTypes: NodeTypes = { - custom: OperationNode, - input: InputNode -}; - -function Flow() { - const controller = useSynthesis(); - const { calculateHeight } = useConceptOptions(); - const canvasWidth = useMemo(() => { - return 'calc(100vw - 1rem)'; - }, []); - - const canvasHeight = useMemo(() => calculateHeight('1.75rem + 4px'), [calculateHeight]); - return ( -
- -
- ); -} - -export default Flow; diff --git a/rsconcept/frontend/src/dialogs/DlgInlineSynthesis/SubstitutionsTab.tsx b/rsconcept/frontend/src/dialogs/DlgInlineSynthesis/SubstitutionsTab.tsx index 568fb105..2225c448 100644 --- a/rsconcept/frontend/src/dialogs/DlgInlineSynthesis/SubstitutionsTab.tsx +++ b/rsconcept/frontend/src/dialogs/DlgInlineSynthesis/SubstitutionsTab.tsx @@ -6,7 +6,6 @@ import { ConstituentaID, IRSForm, ISubstitution } from '@/models/rsform'; import { prefixes } from '@/utils/constants'; import PickSubstitutions from '../../components/select/PickSubstitutions'; -import { ISynthesisSubstitution } from '@/models/oss.ts'; interface SubstitutionsTabProps { receiver?: IRSForm; @@ -17,7 +16,7 @@ interface SubstitutionsTabProps { error?: ErrorData; substitutions: ISubstitution[]; - setSubstitutions: React.Dispatch>; + setSubstitutions: React.Dispatch>; } function SubstitutionsTab({ diff --git a/rsconcept/frontend/src/dialogs/DlgOssGraph/DlgSelectInputScheme.tsx b/rsconcept/frontend/src/dialogs/DlgOssGraph/DlgSelectInputScheme.tsx deleted file mode 100644 index 437d76d0..00000000 --- a/rsconcept/frontend/src/dialogs/DlgOssGraph/DlgSelectInputScheme.tsx +++ /dev/null @@ -1,79 +0,0 @@ -'use client'; - -import clsx from 'clsx'; -import { useMemo, useState } from 'react'; -import { TabList, TabPanel, Tabs } from 'react-tabs'; -import { toast } from 'react-toastify'; - -import Modal, { ModalProps } from '@/components/ui/Modal.tsx'; -import TabLabel from '@/components/ui/TabLabel.tsx'; -import SchemaTab from '@/dialogs/DlgInlineSynthesis/SchemaTab.tsx'; -import { LibraryItemID } from '@/models/library.ts'; -import { ISubstitution } from '@/models/rsform.ts'; -import { useSynthesis } from '@/pages/OssPage/SynthesisContext.tsx'; - -interface DlgCreateSynthesisProps extends Pick { - nodeId: string; -} - -export enum SynthesisTabID { - SCHEMA = 0, - SUBSTITUTIONS = 1 -} - -function DlgSelectInputScheme({ nodeId, hideWindow }: DlgCreateSynthesisProps) { - const controller = useSynthesis(); - - const [activeTab, setActiveTab] = useState(SynthesisTabID.SCHEMA); - const [selected, setSelected] = useState([]); - const [substitutions, setSubstitutions] = useState([]); - const [donorID, setDonorID] = useState(undefined); - - const schemaPanel = useMemo( - () => ( - - - - ), - [donorID] - ); - - function handleSubmit() { - if (donorID !== undefined) { - controller.updateBounds(nodeId, donorID); - } - } - - function validate() { - if (donorID === undefined) { - toast.error('Выберите источник конституент'); - return false; - } - return true; - } - - return ( - - - - - - {schemaPanel} - - - ); -} - -export default DlgSelectInputScheme; diff --git a/rsconcept/frontend/src/dialogs/DlgOssGraph/DlgSynthesis.tsx b/rsconcept/frontend/src/dialogs/DlgOssGraph/DlgSynthesis.tsx deleted file mode 100644 index 7f773882..00000000 --- a/rsconcept/frontend/src/dialogs/DlgOssGraph/DlgSynthesis.tsx +++ /dev/null @@ -1,107 +0,0 @@ -'use client'; - -import clsx from 'clsx'; -import { useCallback, useMemo, useState } from 'react'; -import { TabList, TabPanel, Tabs } from 'react-tabs'; - -import Modal, { ModalProps } from '@/components/ui/Modal.tsx'; -import TabLabel from '@/components/ui/TabLabel.tsx'; -import useRSFormDetails from '@/hooks/useRSFormDetails.ts'; -import { ISynthesisSubstitution } from '@/models/oss.ts'; -import { useSynthesis } from '@/pages/OssPage/SynthesisContext.tsx'; -import SynthesisSubstitutionsTab from '@/pages/OssPage/SynthesisSubstitutionsTab.tsx'; - -interface DlgCreateSynthesisProps extends Pick { - nodeId: string; - onSynthesis: (data: ISynthesisSubstitution[]) => void; -} - -export enum SynthesisTabID { - SCHEMA = 0, - SUBSTITUTIONS = 1 -} - -function DlgSynthesis({ hideWindow, nodeId, onSynthesis }: DlgCreateSynthesisProps) { - const controller = useSynthesis(); - - const [activeTab, setActiveTab] = useState(SynthesisTabID.SCHEMA); - - const sourceLeft = useRSFormDetails({ - target: controller.getNodeParentsRsform(nodeId)[0] ? String(controller.getNodeParentsRsform(nodeId)[0]) : undefined - }); - - const sourceRight = useRSFormDetails({ - target: controller.getNodeParentsRsform(nodeId)[1] ? String(controller.getNodeParentsRsform(nodeId)[1]) : undefined - }); - - const validated = useMemo(() => controller.getNodeParentsRsform(nodeId).length == 2, [controller, nodeId]); - - function handleSubmit() { - const parents = controller.getNodeParentsRsform(nodeId); - - if (parents.length != 2) { - return; - } - const data: ISynthesisSubstitution[] = controller.substitutions.map(item => ({ - id: null, - operation_id: nodeId, - leftCst: item.leftCst, - rightCst: item.rightCst, - deleteRight: item.deleteRight, - takeLeftTerm: item.takeLeftTerm - })); - controller.setSubstitutions(data); - } - - const schemaPanel = useMemo(() => , []); - - const selectedSubstitutions = useMemo(() => controller.getSubstitution(nodeId), [controller, nodeId]); - - const setSelectedSubstitutions = useCallback( - (newElement: ISynthesisSubstitution[]) => { - controller.updateSubstitution(nodeId, newElement); - }, - [controller, nodeId] - ); - - const substitutesPanel = useMemo( - () => ( - - - - ), - [sourceLeft.schema, sourceRight.schema, selectedSubstitutions, setSelectedSubstitutions] - ); - - return ( - - - - - - - {schemaPanel} - {substitutesPanel} - - - ); -} - -export default DlgSynthesis; diff --git a/rsconcept/frontend/src/hooks/useOssDetails.ts b/rsconcept/frontend/src/hooks/useOssDetails.ts index ee807ca4..ae2184f8 100644 --- a/rsconcept/frontend/src/hooks/useOssDetails.ts +++ b/rsconcept/frontend/src/hooks/useOssDetails.ts @@ -4,7 +4,6 @@ import { useCallback, useEffect, useState } from 'react'; import { getOssDetails } from '@/app/backendAPI'; import { type ErrorData } from '@/components/info/InfoError'; -import { AccessPolicy, LibraryItemType } from '@/models/library.ts'; import { IOperationSchema, IOperationSchemaData } from '@/models/oss'; import { OssLoader } from '@/models/OssLoader'; @@ -28,24 +27,6 @@ function useOssDetails({ target }: { target?: string }) { if (!target) { return; } - - const staticData = { - id: Number(target), - comment: '123', - alias: 'oss1', - access_policy: AccessPolicy.PUBLIC, - editors: [], - owner: 1, - item_type: LibraryItemType.OSS, - location: '/U', - read_only: false, - subscribers: [], - time_create: '0', - time_update: '0', - title: 'TestOss', - visible: false - }; - getOssDetails(target, { showError: true, setLoading: setCustomLoading ?? setLoading, @@ -54,11 +35,7 @@ function useOssDetails({ target }: { target?: string }) { setError(error); }, onSuccess: schema => { - const combinedData = { - ...staticData, - ...schema - }; - setSchema(combinedData); + setSchema(schema); if (callback) callback(); } }); diff --git a/rsconcept/frontend/src/models/OssLoader.ts b/rsconcept/frontend/src/models/OssLoader.ts index 23549640..2e3d0a09 100644 --- a/rsconcept/frontend/src/models/OssLoader.ts +++ b/rsconcept/frontend/src/models/OssLoader.ts @@ -17,7 +17,7 @@ export class OssLoader { produceOSS(): IOperationSchema { const result = this.schema as IOperationSchema; - // TODO: put data processing here + result.producedData = [1, 2, 3]; // TODO: put data processing here return result; } } diff --git a/rsconcept/frontend/src/models/oss.ts b/rsconcept/frontend/src/models/oss.ts index 8d763dfe..9c426f8b 100644 --- a/rsconcept/frontend/src/models/oss.ts +++ b/rsconcept/frontend/src/models/oss.ts @@ -2,68 +2,18 @@ * Module: Schema of Synthesis Operations. */ -import { ISubstitution } from '@/models/rsform.ts'; - import { ILibraryItemData } from './library'; -import { UserID } from './user'; /** * Represents backend data for Schema of Synthesis Operations. */ export interface IOperationSchemaData extends ILibraryItemData { - input_nodes: IInputNode[]; - operation_nodes: ISynthesisNode[]; - edges: ISynthesisEdge[]; - substitutions: ISynthesisSubstitution[]; - graph: ISynthesisGraph; -} - -interface ISynthesisGraph { - id: number; - status: string; -} - -interface IInputNode { - id: number | null; - graph_id: number; - vertical_coordinate: number; - horizontal_coordinate: number; - rsform_id: number; -} - -interface ISynthesisNode extends IInputNode { - id: number | null; - name: string; - status: string; -} - -interface ISynthesisEdge { - id: number | null; - decoded_id: string; - source_handle: string; - graph_id: number; - node_from: string; - node_to: string; -} - -export interface ISynthesisSubstitution extends ISubstitution { - id: number | null; - graph_id: number; - operation_id: string; -} - -export interface IRunSynthesis { - operationId: number; -} - -export interface IRunSynthesisResponse { - rsformId: number; + additional_data?: number[]; } /** * Represents Schema of Synthesis Operations. */ export interface IOperationSchema extends IOperationSchemaData { - subscribers: UserID[]; - editors: UserID[]; + producedData: number[]; // TODO: modify this to store calculated state on load } diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/EditorOssGraph.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/EditorOssGraph.tsx index eef62e28..a42d4e6e 100644 --- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/EditorOssGraph.tsx +++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/EditorOssGraph.tsx @@ -1,23 +1,13 @@ 'use client'; -import { ReactFlowProvider } from '@reactflow/core'; - -import SynthesisFlow from '@/components/ui/Synthesis/SynthesisFlow.tsx'; import AnimateFade from '@/components/wrap/AnimateFade'; -import { SynthesisState } from '@/pages/OssPage/SynthesisContext.tsx'; -import SynthesisToolbar from '@/pages/OssPage/SynthesisToolbar.tsx'; function EditorOssGraph() { // TODO: Implement OSS editing UI here return ( - - - - - - +
Реализация графического интерфейса
); } diff --git a/rsconcept/frontend/src/pages/OssPage/SynthesisContext.tsx b/rsconcept/frontend/src/pages/OssPage/SynthesisContext.tsx deleted file mode 100644 index 1ca5e0db..00000000 --- a/rsconcept/frontend/src/pages/OssPage/SynthesisContext.tsx +++ /dev/null @@ -1,350 +0,0 @@ -import { - addEdge, - type Connection, - Edge, - EdgeChange, - Node, - NodeChange, - useEdgesState, - useNodesState -} from '@reactflow/core'; -import { createContext, useCallback, useContext, useEffect, useState } from 'react'; -import { toast } from 'react-toastify'; - -import { postSynthesisGraph, runSingleSynthesis } from '@/app/backendAPI.ts'; -import { useOSS } from '@/context/OssContext.tsx'; -import DlgSelectInputScheme from '@/dialogs/DlgOssGraph/DlgSelectInputScheme.tsx'; -import DlgSynthesis from '@/dialogs/DlgOssGraph/DlgSynthesis.tsx'; -import { IOperationSchemaData, IRunSynthesis, ISynthesisSubstitution } from '@/models/oss.ts'; -import { ISubstitution } from '@/models/rsform.ts'; - -interface ISynthesisContext { - synthesisSchemaID: string; - singleSynthesis: (nodeId: number) => void; - showSynthesis: () => void; - showSelectInput: () => void; - selectNode: (nodeId: string) => void; - getSelectedNode: () => string | undefined; - - addLibrarySchema: () => void; - addSynthesisOperation: () => void; - removeItem: () => void; - runSynthesisLayer: () => void; - - getNodes: () => Node[]; - getEdges: () => Edge[]; - - setNodes: (nodes: Node[]) => void; - setEdges: (nodes: Edge[]) => void; - - onNodesChange: (changes: NodeChange[]) => void; - onEdgesChange: (changes: EdgeChange[]) => void; - onNodesDelete: (nodes: Node[]) => void; - onConnect: (connection: Connection) => void; - addBind: () => void; - - updateBounds: (nodeId: string, newRsform: number) => void; - getBind: (nodeId: string) => number | undefined; - getNodeParentsRsform: (nodeId: string) => number[]; - saveGraph: () => void; - - substitutions: ISynthesisSubstitution[]; - setSubstitutions: React.Dispatch>; - getSubstitution: (id: string) => ISynthesisSubstitution[]; - updateSubstitution: (id: string, substitution: ISubstitution[]) => void; -} - -interface IBoundMap { - nodeId: string; - rsformId: number; -} - -const SynthesisContext = createContext(null); - -interface SynthesisStateProps { - synthesisSchemaID: string; - children: React.ReactNode; -} - -export const useSynthesis = () => { - const context = useContext(SynthesisContext); - if (context === null) { - throw new Error('useSynthesis has to be used within '); - } - return context; -}; - -export const SynthesisState = ({ synthesisSchemaID, children }: SynthesisStateProps) => { - const [showSynthesisModal, setShowSynthesisModal] = useState(false); - const [showSelectInputModal, setShowSelectInputModal] = useState(false); - const [selectedNode, setSelectedNode] = useState(null); - - const [nodes, setNodes, onNodesChange] = useNodesState([]); - const [edges, setEdges, onEdgesChange] = useEdgesState([]); - - const [bounds, setBounds] = useState([]); - // const [substitutionBounds, setSubstitutionBounds] = useState([]); - const [substitutions, setSubstitutions] = useState([]); - - const ossSchema = useOSS(); - - const getSubstitution = (operation_id: string): ISynthesisSubstitution[] => { - return substitutions.filter(substitution => substitution.operation_id === operation_id); - }; - - const updateSubstitution = (operation_id: string, newElements: ISubstitution[]) => { - // TODO: Call backend API and reload OSS or use returned data for - console.log(operation_id); - console.log(newElements); - toast('Saving substitution table not supported'); - return; - - // if (!Array.isArray(newElements)) { - // console.error('newElements should be an array.'); - // return; - // } - - // setSubstitutions(prevSubstitutions => { - // // Обновление существующих элементов - // const updatedSubstitutions = prevSubstitutions.map(substitution => { - // const newElement = newElements.find(el => el.id === substitution.id); - // if (newElement) { - // // Обновляем только соответствующие элементы - // return { ...substitution, ...newElement, operation_id: substitution.operation_id }; - // } - // return substitution; - // }); - - // // Добавление новых элементов с присвоением operation_id - // const newSubstitutions = newElements - // .filter(newElement => !prevSubstitutions.some(sub => sub.id === newElement.id)) - // .map(newElement => ({ ...newElement, operation_id })); - - // return [...updatedSubstitutions, ...newSubstitutions]; - // }); - }; - - const extractEdgeId = (edgeId: string) => { - const matches = edgeId.match(/\d+/g); - const combined = matches ? matches.join('') : ''; - return Number(combined); - }; - - const getBind = useCallback( - (nodeId: string) => { - const bound = bounds.find(item => item.nodeId == nodeId); - return bound ? bound.rsformId : undefined; - }, - [bounds] - ); - - const getBounds = useCallback( - (nodeId: string[]) => { - const parentBounds = bounds.filter(item => item.nodeId in nodeId); - return parentBounds.map(item => item.rsformId); - }, - [bounds] - ); - - const getNodeParentsRsform = useCallback( - (nodeId: string) => { - const parentEdges = edges.filter(edge => edge.source === nodeId); - const parentNodeIds = parentEdges.map(edge => edge.target); - return getBounds(parentNodeIds); - }, - [getBounds, edges] - ); - - const saveGraph = useCallback(() => { - if (!ossSchema.schema) { - return; - } - const data: IOperationSchemaData = { - graph: { - id: ossSchema.schema?.id, - status: 'Draft' - }, - input_nodes: nodes - .filter(node => node.type == 'input') - .map(item => ({ - id: item.id, - vertical_coordinate: item.position.y, - horizontal_coordinate: item.position.x, - rsform_id: getBind(item.id) - })), - operation_nodes: nodes - .filter(node => node.type == 'custom') - .map(item => ({ - id: item.id, - vertical_coordinate: item.position.y, - horizontal_coordinate: item.position.x, - left_parent: getNodeParentsRsform(item.id)[0], - right_parent: getNodeParentsRsform(item.id)[1], - rsform_id: getBind(item.id), - name: 'name', - status: 'status' - })), - edges: edges.map(item => ({ - id: extractEdgeId(item.id), - decoded_id: item.id, - source_handle: item.sourceHandle, - node_from: item.source, - node_to: item.target - })), - substitutions: substitutions - }; - - postSynthesisGraph({ - data: data - }); - }, [ossSchema, edges, nodes, getBind, substitutions, getNodeParentsRsform]); - - useEffect(() => { - if (ossSchema.schema !== undefined) { - const initialNodes = [ - ...ossSchema.schema.input_nodes.map(node => ({ - id: node.id?.toString() || 'null', - data: { label: '123' }, - position: { x: node.horizontal_coordinate, y: node.vertical_coordinate }, - type: 'input' - })), - ...ossSchema.schema.operation_nodes.map(node => ({ - id: node.id?.toString() || 'null', - data: { label: '123' }, - position: { x: node.horizontal_coordinate, y: node.vertical_coordinate }, - type: 'custom' - })) - ]; - - const initialEdges = ossSchema.schema.edges.map(edge => ({ - id: edge.decoded_id, - source: String(edge.node_from), - sourceHandle: edge.source_handle, - target: String(edge.node_to) - })); - // const initialEdges = [ - // { id: 'reactflow__edge-2a-0', source: '2', target: '0' }, - // { id: 'reactflow__edge-2b-1', sourceHandle: 'b', source: '2', target: '1' } - // ]; - - setNodes(initialNodes); - setEdges(initialEdges); - setSubstitutions(ossSchema.schema.substitutions); - [...ossSchema.schema.input_nodes, ...ossSchema.schema.operation_nodes].forEach(node => { - const nodeId = node.id?.toString() || 'null'; - const rsformId = node.rsform_id; // Предполагаем, что rsform_id есть в данных нод - updateBounds(nodeId, rsformId); - }); - } - }, [ossSchema, setEdges, setNodes]); - - const updateBounds = (nodeId: string, newRsform: number) => { - setBounds(prevItems => { - const existingItem = prevItems.find(item => item.nodeId === nodeId); - - if (existingItem) { - return prevItems.map(item => (item.nodeId === nodeId ? { ...item, rsformId: newRsform } : item)); - } else { - return [...prevItems, { nodeId: nodeId, rsformId: newRsform }]; - } - }); - }; - - const onConnect = useCallback((params: Connection | Edge) => setEdges(eds => addEdge(params, eds)), [setEdges]); - - const onNodeDelete = useCallback( - (nodeId: string) => { - setNodes(nodes => nodes.filter(node => node.id !== nodeId)); - setEdges(edges => edges.filter(edge => edge.source !== nodeId && edge.target !== nodeId)); - }, - [setEdges, setNodes] - ); - - const singleSynthesis = useCallback((operationId: number) => { - const data: IRunSynthesis = { - operationId: Number(operationId) - }; - runSingleSynthesis({ data: data }); - }, []); - - const newLibrarySchema = { - id: String(nodes.length > 0 ? 1 + Math.max(...nodes.map(item => Number(item.id))) : 0), - type: 'input', - position: { x: 250, y: 5 }, - data: { - label: 'Node 1', - onDelete: onNodeDelete - } - }; - - const newOperation = { - id: String(nodes.length > 0 ? 1 + Math.max(...nodes.map(item => Number(item.id))) : 0), - type: 'custom', - position: { x: 350, y: 20 }, - data: { - label: 'Node 1', - onDelete: onNodeDelete - } - }; - - const selectNode = useCallback( - (nodeId: string) => { - for (const node of nodes) { - if (node.id === nodeId) { - setSelectedNode(node); - return; - } - } - }, - [nodes] - ); - return ( - setShowSynthesisModal(true), - showSelectInput: () => setShowSelectInputModal(true), - selectNode: nodeId => selectNode(nodeId), - getSelectedNode: () => selectedNode?.id, - addLibrarySchema: () => { - setNodes([...nodes, newLibrarySchema]); - }, - addSynthesisOperation: () => { - setNodes([...nodes, newOperation]); - }, - setNodes: (nodes: Node[]) => { - setNodes(nodes); - }, - setEdges: (edges: Edge[]) => { - setEdges(edges); - }, - getNodes: () => nodes, - getEdges: () => edges, - onNodesChange: onNodesChange, - onEdgesChange: onEdgesChange, - onConnect: onConnect, - updateBounds: updateBounds, - getNodeParentsRsform: getNodeParentsRsform, - getBind: getBind, - saveGraph: saveGraph, - setSubstitutions: setSubstitutions, - substitutions: substitutions, - updateSubstitution: updateSubstitution, - getSubstitution: getSubstitution - }} - > - {showSynthesisModal ? ( - setShowSynthesisModal(false)} - nodeId={selectedNode!.id} - onSynthesis={() => singleSynthesis} - /> - ) : null} - {showSelectInputModal ? ( - setShowSelectInputModal(false)} /> - ) : null} - {children} - - ); -}; diff --git a/rsconcept/frontend/src/pages/OssPage/SynthesisOperation.tsx b/rsconcept/frontend/src/pages/OssPage/SynthesisOperation.tsx deleted file mode 100644 index b9a8b9d3..00000000 --- a/rsconcept/frontend/src/pages/OssPage/SynthesisOperation.tsx +++ /dev/null @@ -1,5 +0,0 @@ -function SynthesisOperation() { - return
; -} - -export default SynthesisOperation; diff --git a/rsconcept/frontend/src/pages/OssPage/SynthesisSubstitutionsTab.tsx b/rsconcept/frontend/src/pages/OssPage/SynthesisSubstitutionsTab.tsx deleted file mode 100644 index eddf2c3c..00000000 --- a/rsconcept/frontend/src/pages/OssPage/SynthesisSubstitutionsTab.tsx +++ /dev/null @@ -1,41 +0,0 @@ -'use client'; - -import { ErrorData } from '@/components/info/InfoError.tsx'; -import DataLoader from '@/components/wrap/DataLoader.tsx'; -import { IRSForm, ISubstitution } from '@/models/rsform.ts'; -import { prefixes } from '@/utils/constants.ts'; - -import PickSubstitutions from '../../components/select/PickSubstitutions'; - -interface SynthesisSubstitutionsTabProps { - receiver?: IRSForm; - source?: IRSForm; - - error?: ErrorData; - - substitutions: ISubstitution[]; - setSubstitutions: React.Dispatch>; -} - -function SynthesisSubstitutionsTab({ - source, - receiver, - error, - substitutions, - setSubstitutions -}: SynthesisSubstitutionsTabProps) { - return ( - - - - ); -} - -export default SynthesisSubstitutionsTab; diff --git a/rsconcept/frontend/src/pages/OssPage/SynthesisToolbar.tsx b/rsconcept/frontend/src/pages/OssPage/SynthesisToolbar.tsx deleted file mode 100644 index 3ebb530f..00000000 --- a/rsconcept/frontend/src/pages/OssPage/SynthesisToolbar.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { useSynthesis } from '@/pages/OssPage/SynthesisContext.tsx'; -import Button from '@/components/ui/Button.tsx'; -import { IoMdAdd, IoMdRemove } from 'react-icons/io'; -import { MdCallMerge } from 'react-icons/md'; -import Overlay from '@/components/ui/Overlay.tsx'; -import { MdLibraryAdd } from 'react-icons/md'; - -import { VscRunAll, VscSave } from 'react-icons/vsc'; - -function SynthesisToolbar() { - const controller = useSynthesis(); - - return ( - -