diff --git a/src/i18n/locales/ar.ts b/src/i18n/locales/ar.ts index 08cdad9b..63da0271 100644 --- a/src/i18n/locales/ar.ts +++ b/src/i18n/locales/ar.ts @@ -201,6 +201,7 @@ export const ar: LanguageTranslation = { delete_relationship: 'حذف', relationship_actions: { title: 'إجراءات', + switch_tables: 'تبديل الجداول', delete_relationship: 'حذف', }, }, diff --git a/src/i18n/locales/bn.ts b/src/i18n/locales/bn.ts index 171d0902..d0a8104b 100644 --- a/src/i18n/locales/bn.ts +++ b/src/i18n/locales/bn.ts @@ -203,6 +203,7 @@ export const bn: LanguageTranslation = { delete_relationship: 'মুছুন', relationship_actions: { title: 'কর্ম', + switch_tables: 'টেবিল পরিবর্তন করুন', delete_relationship: 'মুছুন', }, }, diff --git a/src/i18n/locales/de.ts b/src/i18n/locales/de.ts index cb5bed24..386fbdb0 100644 --- a/src/i18n/locales/de.ts +++ b/src/i18n/locales/de.ts @@ -203,6 +203,7 @@ export const de: LanguageTranslation = { delete_relationship: 'Löschen', relationship_actions: { title: 'Aktionen', + switch_tables: 'Tabellen tauschen', delete_relationship: 'Löschen', }, }, diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts index f4fda3c7..3677e47b 100644 --- a/src/i18n/locales/en.ts +++ b/src/i18n/locales/en.ts @@ -197,6 +197,7 @@ export const en = { delete_relationship: 'Delete', relationship_actions: { title: 'Actions', + switch_tables: 'Switch Tables', delete_relationship: 'Delete', }, }, diff --git a/src/i18n/locales/es.ts b/src/i18n/locales/es.ts index 8b8058e4..dcfd2a7b 100644 --- a/src/i18n/locales/es.ts +++ b/src/i18n/locales/es.ts @@ -202,6 +202,7 @@ export const es: LanguageTranslation = { delete_relationship: 'Eliminar', relationship_actions: { title: 'Acciones', + switch_tables: 'Intercambiar Tablas', delete_relationship: 'Eliminar', }, }, diff --git a/src/i18n/locales/fr.ts b/src/i18n/locales/fr.ts index bd756c79..3faf307f 100644 --- a/src/i18n/locales/fr.ts +++ b/src/i18n/locales/fr.ts @@ -200,6 +200,7 @@ export const fr: LanguageTranslation = { delete_relationship: 'Supprimer', relationship_actions: { title: 'Actions', + switch_tables: 'Inverser les Tables', delete_relationship: 'Supprimer', }, }, diff --git a/src/i18n/locales/gu.ts b/src/i18n/locales/gu.ts index 7887287a..97761e93 100644 --- a/src/i18n/locales/gu.ts +++ b/src/i18n/locales/gu.ts @@ -204,6 +204,7 @@ export const gu: LanguageTranslation = { delete_relationship: 'કાઢી નાખો', relationship_actions: { title: 'ક્રિયાઓ', + switch_tables: 'ટેબલ્સ બદલો', delete_relationship: 'કાઢી નાખો', }, }, diff --git a/src/i18n/locales/hi.ts b/src/i18n/locales/hi.ts index e6f18a8d..49ae72d8 100644 --- a/src/i18n/locales/hi.ts +++ b/src/i18n/locales/hi.ts @@ -203,6 +203,7 @@ export const hi: LanguageTranslation = { delete_relationship: 'हटाएँ', relationship_actions: { title: 'क्रियाएँ', + switch_tables: 'टेबल्स बदलें', delete_relationship: 'हटाएँ', }, }, diff --git a/src/i18n/locales/hr.ts b/src/i18n/locales/hr.ts index b399afed..7840e604 100644 --- a/src/i18n/locales/hr.ts +++ b/src/i18n/locales/hr.ts @@ -198,6 +198,7 @@ export const hr: LanguageTranslation = { delete_relationship: 'Izbriši', relationship_actions: { title: 'Radnje', + switch_tables: 'Zamijeni Tablice', delete_relationship: 'Izbriši', }, }, diff --git a/src/i18n/locales/id_ID.ts b/src/i18n/locales/id_ID.ts index 62f918fb..46f4730a 100644 --- a/src/i18n/locales/id_ID.ts +++ b/src/i18n/locales/id_ID.ts @@ -202,6 +202,7 @@ export const id_ID: LanguageTranslation = { delete_relationship: 'Hapus', relationship_actions: { title: 'Aksi', + switch_tables: 'Tukar Tabel', delete_relationship: 'Hapus', }, }, diff --git a/src/i18n/locales/ja.ts b/src/i18n/locales/ja.ts index 274b89da..824bf3b1 100644 --- a/src/i18n/locales/ja.ts +++ b/src/i18n/locales/ja.ts @@ -205,6 +205,7 @@ export const ja: LanguageTranslation = { delete_relationship: '削除', relationship_actions: { title: '操作', + switch_tables: 'テーブルを入れ替え', delete_relationship: '削除', }, }, diff --git a/src/i18n/locales/ko_KR.ts b/src/i18n/locales/ko_KR.ts index 36dc6f2d..e680c87b 100644 --- a/src/i18n/locales/ko_KR.ts +++ b/src/i18n/locales/ko_KR.ts @@ -202,6 +202,7 @@ export const ko_KR: LanguageTranslation = { delete_relationship: '제거', relationship_actions: { title: '연관 관계 작업', + switch_tables: '테이블 전환', delete_relationship: '연관 관계 삭제', }, }, diff --git a/src/i18n/locales/mr.ts b/src/i18n/locales/mr.ts index 77fbebdb..f13e1b47 100644 --- a/src/i18n/locales/mr.ts +++ b/src/i18n/locales/mr.ts @@ -206,6 +206,7 @@ export const mr: LanguageTranslation = { delete_relationship: 'हटवा', relationship_actions: { title: 'क्रिया', + switch_tables: 'सारण्या बदला', delete_relationship: 'हटवा', }, }, diff --git a/src/i18n/locales/ne.ts b/src/i18n/locales/ne.ts index 256813cd..2a6bc700 100644 --- a/src/i18n/locales/ne.ts +++ b/src/i18n/locales/ne.ts @@ -203,6 +203,7 @@ export const ne: LanguageTranslation = { delete_relationship: 'हटाउनुहोस्', relationship_actions: { title: 'कार्यहरू', + switch_tables: 'तालिकाहरू स्विच गर्नुहोस्', delete_relationship: 'हटाउनुहोस्', }, }, diff --git a/src/i18n/locales/pt_BR.ts b/src/i18n/locales/pt_BR.ts index 7de18c30..9e5c4728 100644 --- a/src/i18n/locales/pt_BR.ts +++ b/src/i18n/locales/pt_BR.ts @@ -203,6 +203,7 @@ export const pt_BR: LanguageTranslation = { delete_relationship: 'Excluir', relationship_actions: { title: 'Ações', + switch_tables: 'Trocar Tabelas', delete_relationship: 'Excluir', }, }, diff --git a/src/i18n/locales/ru.ts b/src/i18n/locales/ru.ts index 5dadc4f6..12869aad 100644 --- a/src/i18n/locales/ru.ts +++ b/src/i18n/locales/ru.ts @@ -199,6 +199,7 @@ export const ru: LanguageTranslation = { delete_relationship: 'Удалить', relationship_actions: { title: 'Действия', + switch_tables: 'Поменять таблицы', delete_relationship: 'Удалить', }, }, diff --git a/src/i18n/locales/te.ts b/src/i18n/locales/te.ts index a4af8778..0344a317 100644 --- a/src/i18n/locales/te.ts +++ b/src/i18n/locales/te.ts @@ -204,6 +204,7 @@ export const te: LanguageTranslation = { delete_relationship: 'సంబంధం తొలగించు', relationship_actions: { title: 'చర్యలు', + switch_tables: 'టేబుల్‌లను మార్చు', delete_relationship: 'సంబంధం తొలగించు', }, }, diff --git a/src/i18n/locales/tr.ts b/src/i18n/locales/tr.ts index daf03538..8a981450 100644 --- a/src/i18n/locales/tr.ts +++ b/src/i18n/locales/tr.ts @@ -203,6 +203,7 @@ export const tr: LanguageTranslation = { delete_relationship: 'Sil', relationship_actions: { title: 'İşlemler', + switch_tables: 'Tabloları Değiştir', delete_relationship: 'Sil', }, }, diff --git a/src/i18n/locales/uk.ts b/src/i18n/locales/uk.ts index cf4b48a7..2f94ed61 100644 --- a/src/i18n/locales/uk.ts +++ b/src/i18n/locales/uk.ts @@ -201,6 +201,7 @@ export const uk: LanguageTranslation = { delete_relationship: 'Видалити', relationship_actions: { title: 'Дії', + switch_tables: 'Поміняти таблиці', delete_relationship: 'Видалити', }, }, diff --git a/src/i18n/locales/vi.ts b/src/i18n/locales/vi.ts index 80d6d3e6..2c768d0d 100644 --- a/src/i18n/locales/vi.ts +++ b/src/i18n/locales/vi.ts @@ -202,6 +202,7 @@ export const vi: LanguageTranslation = { delete_relationship: 'Xóa', relationship_actions: { title: 'Hành động', + switch_tables: 'Đổi Bảng', delete_relationship: 'Xóa', }, }, diff --git a/src/i18n/locales/zh_CN.ts b/src/i18n/locales/zh_CN.ts index 352a2667..49bbfc99 100644 --- a/src/i18n/locales/zh_CN.ts +++ b/src/i18n/locales/zh_CN.ts @@ -199,6 +199,7 @@ export const zh_CN: LanguageTranslation = { delete_relationship: '删除', relationship_actions: { title: '操作', + switch_tables: '交换表', delete_relationship: '删除', }, }, diff --git a/src/i18n/locales/zh_TW.ts b/src/i18n/locales/zh_TW.ts index 288d0741..90f3008d 100644 --- a/src/i18n/locales/zh_TW.ts +++ b/src/i18n/locales/zh_TW.ts @@ -199,6 +199,7 @@ export const zh_TW: LanguageTranslation = { delete_relationship: '刪除', relationship_actions: { title: '操作', + switch_tables: '交換表', delete_relationship: '刪除', }, }, diff --git a/src/pages/editor-page/canvas/relationship-edge/edit-relationship-popover.tsx b/src/pages/editor-page/canvas/relationship-edge/edit-relationship-popover.tsx index ae2a3d69..8135afee 100644 --- a/src/pages/editor-page/canvas/relationship-edge/edit-relationship-popover.tsx +++ b/src/pages/editor-page/canvas/relationship-edge/edit-relationship-popover.tsx @@ -1,5 +1,5 @@ import React, { useRef } from 'react'; -import { Trash2, ArrowLeftRight } from 'lucide-react'; +import { Trash2, ArrowLeftRight, CircleDotDashed } from 'lucide-react'; import { Button } from '@/components/button/button'; import type { Cardinality } from '@/lib/domain/db-relationship'; import { cn } from '@/lib/utils'; @@ -16,6 +16,7 @@ export interface EditRelationshipPopoverProps { ) => void; onSwitch: () => void; onDelete: () => void; + onLocate: () => void; } type RelationshipTypeOption = { @@ -39,6 +40,7 @@ export const EditRelationshipPopover: React.FC< onCardinalityChange, onSwitch, onDelete, + onLocate, }) => { const popoverRef = useRef(null); const { closeRelationshipPopover } = useCanvas(); @@ -55,6 +57,20 @@ export const EditRelationshipPopover: React.FC< }} >
+ +
{relationshipTypes.map((type) => { const isActive = type.sourceCardinality === sourceCardinality && diff --git a/src/pages/editor-page/canvas/relationship-edge/relationship-edge.tsx b/src/pages/editor-page/canvas/relationship-edge/relationship-edge.tsx index 54609f36..90b26c81 100644 --- a/src/pages/editor-page/canvas/relationship-edge/relationship-edge.tsx +++ b/src/pages/editor-page/canvas/relationship-edge/relationship-edge.tsx @@ -10,6 +10,7 @@ import { getCardinalityMarkerId } from '../canvas-utils'; import { useDiff } from '@/context/diff-context/use-diff'; import { useLocalConfig } from '@/hooks/use-local-config'; import { useCanvas } from '@/hooks/use-canvas'; +import { useLayout } from '@/hooks/use-layout'; import { EditRelationshipPopover } from './edit-relationship-popover'; import { EllipsisIcon } from 'lucide-react'; @@ -46,6 +47,7 @@ export const RelationshipEdge: React.FC> = openRelationshipPopover, closeRelationshipPopover, } = useCanvas(); + const { openRelationshipFromSidebar } = useLayout(); const relationship = data?.relationship; @@ -138,6 +140,11 @@ export const RelationshipEdge: React.FC> = closeRelationshipPopover(); }, [id, removeRelationship, closeRelationshipPopover]); + const handleLocate = useCallback(() => { + openRelationshipFromSidebar(id); + closeRelationshipPopover(); + }, [id, openRelationshipFromSidebar, closeRelationshipPopover]); + const edgeNumber = useMemo(() => { let index = 0; for (const rel of relationships) { @@ -380,6 +387,7 @@ export const RelationshipEdge: React.FC> = onCardinalityChange={handleCardinalityChange} onSwitch={handleSwitchTables} onDelete={handleDelete} + onLocate={handleLocate} />, document.body )} diff --git a/src/pages/editor-page/side-panel/refs-section/refs-list/relationship-list-item/relationship-list-item-content/relationship-list-item-content.tsx b/src/pages/editor-page/side-panel/refs-section/refs-list/relationship-list-item/relationship-list-item-content/relationship-list-item-content.tsx index 61fa4479..4357f6b3 100644 --- a/src/pages/editor-page/side-panel/refs-section/refs-list/relationship-list-item/relationship-list-item-content/relationship-list-item-content.tsx +++ b/src/pages/editor-page/side-panel/refs-section/refs-list/relationship-list-item/relationship-list-item-content/relationship-list-item-content.tsx @@ -22,12 +22,7 @@ import { determineRelationshipType, } from '@/lib/domain/db-relationship'; import { useReactFlow } from '@xyflow/react'; -import { - FileMinus2, - FileOutput, - Trash2, - ChevronsLeftRightEllipsis, -} from 'lucide-react'; +import { Trash2, ChevronsLeftRightEllipsis } from 'lucide-react'; import React, { useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -92,13 +87,8 @@ export const RelationshipListItemContent: React.FC<
-
- -
- {t( - 'side_panel.refs_section.relationship.primary' - )} -
+
+ {t('side_panel.refs_section.relationship.primary')}
@@ -118,13 +108,8 @@ export const RelationshipListItemContent: React.FC<
-
- -
- {t( - 'side_panel.refs_section.relationship.foreign' - )} -
+
+ {t('side_panel.refs_section.relationship.foreign')}
diff --git a/src/pages/editor-page/side-panel/refs-section/refs-list/relationship-list-item/relationship-list-item-header/relationship-list-item-header.tsx b/src/pages/editor-page/side-panel/refs-section/refs-list/relationship-list-item/relationship-list-item-header/relationship-list-item-header.tsx index 94ff7011..c47f4d4d 100644 --- a/src/pages/editor-page/side-panel/refs-section/refs-list/relationship-list-item/relationship-list-item-header/relationship-list-item-header.tsx +++ b/src/pages/editor-page/side-panel/refs-section/refs-list/relationship-list-item/relationship-list-item-header/relationship-list-item-header.tsx @@ -5,6 +5,7 @@ import { CircleDotDashed, Trash2, Check, + ArrowLeftRight, } from 'lucide-react'; import { ListItemHeaderButton } from '../../../../list-item-header-button/list-item-header-button'; import type { DBRelationship } from '@/lib/domain/db-relationship'; @@ -92,6 +93,25 @@ export const RelationshipListItemHeader: React.FC< }); }, [relationship.id, removeRelationship, deleteElements]); + const switchTablesHandler = useCallback( + (e: React.MouseEvent) => { + e.stopPropagation(); + updateRelationship( + relationship.id, + { + sourceTableId: relationship.targetTableId, + targetTableId: relationship.sourceTableId, + sourceFieldId: relationship.targetFieldId, + targetFieldId: relationship.sourceFieldId, + sourceCardinality: relationship.targetCardinality, + targetCardinality: relationship.sourceCardinality, + }, + { updateHistory: true } + ); + }, + [relationship, updateRelationship] + ); + const renderDropDownMenu = useCallback( () => ( @@ -107,6 +127,18 @@ export const RelationshipListItemHeader: React.FC< )} + + + {t( + 'side_panel.refs_section.relationship.relationship_actions.switch_tables' + )} + + + + ), - [deleteRelationshipHandler, t] + [deleteRelationshipHandler, switchTablesHandler, t] ); return (