From 4fbfda4eb497c350851e47b153852d7287dec023 Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Wed, 16 Aug 2023 18:32:37 +0300 Subject: [PATCH] Reimplement CstCreate and minor UI fixes --- rsconcept/backend/apps/rsform/serializers.py | 15 +++- .../backend/apps/rsform/tests/t_views.py | 22 +++++ rsconcept/backend/apps/rsform/views.py | 8 ++ .../src/components/Common/TextInput.tsx | 5 +- .../src/components/Common/TextURL.tsx | 2 +- .../src/components/Navigation/UserTools.tsx | 13 +-- .../frontend/src/components/RSInput/index.tsx | 58 ++++++++++-- .../frontend/src/context/NavSearchContext.tsx | 6 +- rsconcept/frontend/src/index.css | 4 + .../frontend/src/pages/CreateRSFormPage.tsx | 4 +- .../src/pages/LibraryPage/ViewLibrary.tsx | 90 ++++++++++--------- .../frontend/src/pages/LibraryPage/index.tsx | 4 +- rsconcept/frontend/src/pages/LoginPage.tsx | 2 +- .../src/pages/RSFormPage/DlgCreateCst.tsx | 78 +++++++++++++--- .../pages/RSFormPage/EditorConstituenta.tsx | 15 +++- .../src/pages/RSFormPage/EditorItems.tsx | 15 +++- .../pages/RSFormPage/EditorRSExpression.tsx | 40 +-------- .../src/pages/RSFormPage/EditorTermGraph.tsx | 26 +++--- .../frontend/src/pages/RSFormPage/RSTabs.tsx | 26 +++--- rsconcept/frontend/src/utils/models.ts | 3 +- rsconcept/frontend/src/utils/staticUI.ts | 2 +- 21 files changed, 282 insertions(+), 156 deletions(-) diff --git a/rsconcept/backend/apps/rsform/serializers.py b/rsconcept/backend/apps/rsform/serializers.py index fd10efd3..1e5421c5 100644 --- a/rsconcept/backend/apps/rsform/serializers.py +++ b/rsconcept/backend/apps/rsform/serializers.py @@ -69,11 +69,20 @@ class StandaloneCstSerializer(serializers.ModelSerializer): return attrs -class CstCreateSerializer(serializers.Serializer): - alias = serializers.CharField(max_length=8) - cst_type = serializers.CharField(max_length=10) +class CstCreateSerializer(serializers.ModelSerializer): insert_after = serializers.IntegerField(required=False, allow_null=True) + class Meta: + model = Constituenta + fields = 'alias', 'cst_type', 'convention', 'term_raw', 'definition_raw', 'definition_formal', 'insert_after' + + def validate(self, attrs): + if ('term_raw' in attrs): + attrs['term_resolved'] = attrs['term_raw'] + if ('definition_raw' in attrs): + attrs['definition_resolved'] = attrs['definition_raw'] + return attrs + class CstListSerlializer(serializers.Serializer): items = serializers.ListField( diff --git a/rsconcept/backend/apps/rsform/tests/t_views.py b/rsconcept/backend/apps/rsform/tests/t_views.py index d5e791a0..6041f0b1 100644 --- a/rsconcept/backend/apps/rsform/tests/t_views.py +++ b/rsconcept/backend/apps/rsform/tests/t_views.py @@ -215,6 +215,28 @@ class TestRSFormViewset(APITestCase): x4 = Constituenta.objects.get(alias=response.data['new_cst']['alias']) self.assertEqual(x4.order, 3) + def test_create_constituenta_data(self): + data = json.dumps({ + 'alias': 'X3', + 'cst_type': 'basic', + 'convention': '1', + 'term_raw': '2', + 'definition_formal': '3', + 'definition_raw': '4' + }) + schema = self.rsform_owned + response = self.client.post(f'/api/rsforms/{schema.id}/cst-create/', + data=data, content_type='application/json') + self.assertEqual(response.status_code, 201) + self.assertEqual(response.data['new_cst']['alias'], 'X3') + self.assertEqual(response.data['new_cst']['cst_type'], 'basic') + self.assertEqual(response.data['new_cst']['convention'], '1') + self.assertEqual(response.data['new_cst']['term_raw'], '2') + self.assertEqual(response.data['new_cst']['term_resolved'], '2') + self.assertEqual(response.data['new_cst']['definition_formal'], '3') + self.assertEqual(response.data['new_cst']['definition_raw'], '4') + self.assertEqual(response.data['new_cst']['definition_resolved'], '4') + def test_delete_constituenta(self): schema = self.rsform_owned data = json.dumps({'items': [{'id': 1337}]}) diff --git a/rsconcept/backend/apps/rsform/views.py b/rsconcept/backend/apps/rsform/views.py index 8eba85e7..4c8fd019 100644 --- a/rsconcept/backend/apps/rsform/views.py +++ b/rsconcept/backend/apps/rsform/views.py @@ -82,6 +82,14 @@ class RSFormViewSet(viewsets.ModelViewSet): serializer.validated_data['cst_type']) else: constituenta = schema.insert_last(serializer.validated_data['alias'], serializer.validated_data['cst_type']) + + constituenta.convention = serializer.validated_data.get('convention', '') + constituenta.term_raw = serializer.validated_data.get('term_raw', '') + constituenta.term_resolved = serializer.validated_data.get('term_resolved', '') + constituenta.definition_formal = serializer.validated_data.get('definition_formal', '') + constituenta.definition_raw = serializer.validated_data.get('definition_raw', '') + constituenta.definition_resolved = serializer.validated_data.get('definition_resolved', '') + constituenta.save() schema.refresh_from_db() outSerializer = serializers.RSFormDetailsSerlializer(schema) response = Response(status=201, data={ diff --git a/rsconcept/frontend/src/components/Common/TextInput.tsx b/rsconcept/frontend/src/components/Common/TextInput.tsx index 5e1ddbe1..75a78699 100644 --- a/rsconcept/frontend/src/components/Common/TextInput.tsx +++ b/rsconcept/frontend/src/components/Common/TextInput.tsx @@ -8,16 +8,17 @@ extends Omit, 'className'> { label: string widthClass?: string colorClass?: string + singleRow?: boolean } function TextInput({ - id, required, label, + id, required, label, singleRow, widthClass = 'w-full', colorClass = 'clr-input', ...props }: TextInputProps) { return ( -
+