diff --git a/package.json b/package.json
index dbb40b90..1c2db1be 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,7 @@
"@ant-design/icons": "5.5.1",
"@tanstack/react-query": "5.56.2",
"@tanstack/react-query-devtools": "5.56.2",
+ "@xyflow/react": "12.4.1",
"antd": "4.24.13",
"axios": "1.7.7",
"clsx": "2.1.1",
diff --git a/src/entities/transfer/index.ts b/src/entities/transfer/index.ts
index edf158e1..93c999ea 100644
--- a/src/entities/transfer/index.ts
+++ b/src/entities/transfer/index.ts
@@ -1,2 +1,3 @@
export * from './api';
export * from './constants';
+export * from './ui';
diff --git a/src/entities/transfer/types.ts b/src/entities/transfer/types.ts
new file mode 100644
index 00000000..74578e4b
--- /dev/null
+++ b/src/entities/transfer/types.ts
@@ -0,0 +1,5 @@
+import { TransferConnectionParamFieldName } from './api';
+
+export interface ConnectionParamFieldName {
+ name: TransferConnectionParamFieldName;
+}
diff --git a/src/features/transfer/MutateTransferForm/components/TransferConnectionClickhouse/index.tsx b/src/entities/transfer/ui/TransferConnectionClickhouse/index.tsx
similarity index 100%
rename from src/features/transfer/MutateTransferForm/components/TransferConnectionClickhouse/index.tsx
rename to src/entities/transfer/ui/TransferConnectionClickhouse/index.tsx
diff --git a/src/features/transfer/MutateTransferForm/components/TransferConnectionClickhouse/types.ts b/src/entities/transfer/ui/TransferConnectionClickhouse/types.ts
similarity index 100%
rename from src/features/transfer/MutateTransferForm/components/TransferConnectionClickhouse/types.ts
rename to src/entities/transfer/ui/TransferConnectionClickhouse/types.ts
diff --git a/src/features/transfer/MutateTransferForm/components/TransferConnectionHdfs/index.tsx b/src/entities/transfer/ui/TransferConnectionHdfs/index.tsx
similarity index 86%
rename from src/features/transfer/MutateTransferForm/components/TransferConnectionHdfs/index.tsx
rename to src/entities/transfer/ui/TransferConnectionHdfs/index.tsx
index b432a60f..4c8870fc 100644
--- a/src/features/transfer/MutateTransferForm/components/TransferConnectionHdfs/index.tsx
+++ b/src/entities/transfer/ui/TransferConnectionHdfs/index.tsx
@@ -20,6 +20,8 @@ export const TransferConnectionHdfs = ({ name }: TransferConnectionHdfsProps) =>
,
diff --git a/src/features/transfer/MutateTransferForm/components/TargetParams/constants.tsx b/src/features/transfer/MutateTransferForm/components/TargetParams/constants.tsx
index 9235db98..4085a585 100644
--- a/src/features/transfer/MutateTransferForm/components/TargetParams/constants.tsx
+++ b/src/features/transfer/MutateTransferForm/components/TargetParams/constants.tsx
@@ -1,14 +1,15 @@
import React from 'react';
import { ConnectionType } from '@shared/types';
-
-import { TransferConnectionHdfs } from '../TransferConnectionHdfs';
-import { TransferConnectionHive } from '../TransferConnectionHive';
-import { TransferConnectionOracle } from '../TransferConnectionOracle';
-import { TransferConnectionPostgres } from '../TransferConnectionPostgres';
-import { TransferConnectionS3 } from '../TransferConnectionS3';
-import { TransferConnectionClickhouse } from '../TransferConnectionClickhouse';
-import { TransferConnectionMySql } from '../TransferConnectionMySql';
-import { TransferConnectionMsSql } from '../TransferConnectionMsSql';
+import {
+ TransferConnectionHdfs,
+ TransferConnectionHive,
+ TransferConnectionOracle,
+ TransferConnectionPostgres,
+ TransferConnectionClickhouse,
+ TransferConnectionMySql,
+ TransferConnectionMsSql,
+ TransferConnectionS3,
+} from '@entities/transfer';
export const TRANSFER_TARGET_CONNECTION_TYPE_COMPONENT = {
[ConnectionType.HDFS]: ,
diff --git a/src/shared/ui/Canvas/index.tsx b/src/shared/ui/Canvas/index.tsx
new file mode 100644
index 00000000..9f7e2c16
--- /dev/null
+++ b/src/shared/ui/Canvas/index.tsx
@@ -0,0 +1,26 @@
+import { Background, BackgroundVariant, Controls, Edge, MiniMap, Node, ReactFlow } from '@xyflow/react';
+import React from 'react';
+
+import { CanvasProps } from './types';
+
+export const Canvas = (props: CanvasProps) => {
+ return (
+
+
+
+
+
+ );
+};
diff --git a/src/shared/ui/Canvas/types.ts b/src/shared/ui/Canvas/types.ts
new file mode 100644
index 00000000..43fc77dd
--- /dev/null
+++ b/src/shared/ui/Canvas/types.ts
@@ -0,0 +1,3 @@
+import { Edge, Node, ReactFlowProps } from '@xyflow/react';
+
+export interface CanvasProps extends ReactFlowProps {}
diff --git a/src/shared/ui/index.ts b/src/shared/ui/index.ts
index 6e4af9a1..9a7fb012 100644
--- a/src/shared/ui/index.ts
+++ b/src/shared/ui/index.ts
@@ -11,3 +11,4 @@ export * from './DatePicker';
export * from './TimePicker';
export * from './Calendar';
export * from './CronSelect';
+export * from './Canvas';
diff --git a/yarn.lock b/yarn.lock
index f08b505b..36b6363c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2092,6 +2092,57 @@ __metadata:
languageName: node
linkType: hard
+"@types/d3-color@npm:*":
+ version: 3.1.3
+ resolution: "@types/d3-color@npm:3.1.3"
+ checksum: 10c0/65eb0487de606eb5ad81735a9a5b3142d30bc5ea801ed9b14b77cb14c9b909f718c059f13af341264ee189acf171508053342142bdf99338667cea26a2d8d6ae
+ languageName: node
+ linkType: hard
+
+"@types/d3-drag@npm:^3.0.7":
+ version: 3.0.7
+ resolution: "@types/d3-drag@npm:3.0.7"
+ dependencies:
+ "@types/d3-selection": "npm:*"
+ checksum: 10c0/65e29fa32a87c72d26c44b5e2df3bf15af21cd128386bcc05bcacca255927c0397d0cd7e6062aed5f0abd623490544a9d061c195f5ed9f018fe0b698d99c079d
+ languageName: node
+ linkType: hard
+
+"@types/d3-interpolate@npm:*":
+ version: 3.0.4
+ resolution: "@types/d3-interpolate@npm:3.0.4"
+ dependencies:
+ "@types/d3-color": "npm:*"
+ checksum: 10c0/066ebb8da570b518dd332df6b12ae3b1eaa0a7f4f0c702e3c57f812cf529cc3500ec2aac8dc094f31897790346c6b1ebd8cd7a077176727f4860c2b181a65ca4
+ languageName: node
+ linkType: hard
+
+"@types/d3-selection@npm:*, @types/d3-selection@npm:^3.0.10":
+ version: 3.0.11
+ resolution: "@types/d3-selection@npm:3.0.11"
+ checksum: 10c0/0c512956c7503ff5def4bb32e0c568cc757b9a2cc400a104fc0f4cfe5e56d83ebde2a97821b6f2cb26a7148079d3b86a2f28e11d68324ed311cf35c2ed980d1d
+ languageName: node
+ linkType: hard
+
+"@types/d3-transition@npm:^3.0.8":
+ version: 3.0.9
+ resolution: "@types/d3-transition@npm:3.0.9"
+ dependencies:
+ "@types/d3-selection": "npm:*"
+ checksum: 10c0/4f68b9df7ac745b3491216c54203cbbfa0f117ae4c60e2609cdef2db963582152035407fdff995b10ee383bae2f05b7743493f48e1b8e46df54faa836a8fb7b5
+ languageName: node
+ linkType: hard
+
+"@types/d3-zoom@npm:^3.0.8":
+ version: 3.0.8
+ resolution: "@types/d3-zoom@npm:3.0.8"
+ dependencies:
+ "@types/d3-interpolate": "npm:*"
+ "@types/d3-selection": "npm:*"
+ checksum: 10c0/1dbdbcafddcae12efb5beb6948546963f29599e18bc7f2a91fb69cc617c2299a65354f2d47e282dfb86fec0968406cd4fb7f76ba2d2fb67baa8e8d146eb4a547
+ languageName: node
+ linkType: hard
+
"@types/eslint-scope@npm:^3.7.3":
version: 3.7.7
resolution: "@types/eslint-scope@npm:3.7.7"
@@ -2695,6 +2746,35 @@ __metadata:
languageName: node
linkType: hard
+"@xyflow/react@npm:12.4.1":
+ version: 12.4.1
+ resolution: "@xyflow/react@npm:12.4.1"
+ dependencies:
+ "@xyflow/system": "npm:0.0.49"
+ classcat: "npm:^5.0.3"
+ zustand: "npm:^4.4.0"
+ peerDependencies:
+ react: ">=17"
+ react-dom: ">=17"
+ checksum: 10c0/edc2a2a7935265920025c3f8ad04c330baf8a0a754d92390539bed66a8f1db761e1d13959bbe2f8c5e6e843c0459018ab2cdcd7e529f08eaa89e1cae5ff95337
+ languageName: node
+ linkType: hard
+
+"@xyflow/system@npm:0.0.49":
+ version: 0.0.49
+ resolution: "@xyflow/system@npm:0.0.49"
+ dependencies:
+ "@types/d3-drag": "npm:^3.0.7"
+ "@types/d3-selection": "npm:^3.0.10"
+ "@types/d3-transition": "npm:^3.0.8"
+ "@types/d3-zoom": "npm:^3.0.8"
+ d3-drag: "npm:^3.0.0"
+ d3-selection: "npm:^3.0.0"
+ d3-zoom: "npm:^3.0.0"
+ checksum: 10c0/673b399777d95e12e3e2d3feb181c1670c3780620a16e25662b6f4f0e68b0fbc3c470f6da917ca91d80115197acb22a16b58e35e37c770c72fb66a2eab32b43f
+ languageName: node
+ linkType: hard
+
"abbrev@npm:^2.0.0":
version: 2.0.0
resolution: "abbrev@npm:2.0.0"
@@ -3463,6 +3543,13 @@ __metadata:
languageName: node
linkType: hard
+"classcat@npm:^5.0.3":
+ version: 5.0.5
+ resolution: "classcat@npm:5.0.5"
+ checksum: 10c0/ff8d273055ef9b518529cfe80fd0486f7057a9917373807ff802d75ceb46e8f8e148f41fa094ee7625c8f34642cfaa98395ff182d9519898da7cbf383d4a210d
+ languageName: node
+ linkType: hard
+
"classnames@npm:2.x, classnames@npm:^2.2.1, classnames@npm:^2.2.3, classnames@npm:^2.2.5, classnames@npm:^2.2.6, classnames@npm:^2.3.1, classnames@npm:^2.3.2":
version: 2.5.1
resolution: "classnames@npm:2.5.1"
@@ -3977,6 +4064,88 @@ __metadata:
languageName: node
linkType: hard
+"d3-color@npm:1 - 3":
+ version: 3.1.0
+ resolution: "d3-color@npm:3.1.0"
+ checksum: 10c0/a4e20e1115fa696fce041fbe13fbc80dc4c19150fa72027a7c128ade980bc0eeeba4bcf28c9e21f0bce0e0dbfe7ca5869ef67746541dcfda053e4802ad19783c
+ languageName: node
+ linkType: hard
+
+"d3-dispatch@npm:1 - 3":
+ version: 3.0.1
+ resolution: "d3-dispatch@npm:3.0.1"
+ checksum: 10c0/6eca77008ce2dc33380e45d4410c67d150941df7ab45b91d116dbe6d0a3092c0f6ac184dd4602c796dc9e790222bad3ff7142025f5fd22694efe088d1d941753
+ languageName: node
+ linkType: hard
+
+"d3-drag@npm:2 - 3, d3-drag@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "d3-drag@npm:3.0.0"
+ dependencies:
+ d3-dispatch: "npm:1 - 3"
+ d3-selection: "npm:3"
+ checksum: 10c0/d2556e8dc720741a443b595a30af403dd60642dfd938d44d6e9bfc4c71a962142f9a028c56b61f8b4790b65a34acad177d1263d66f103c3c527767b0926ef5aa
+ languageName: node
+ linkType: hard
+
+"d3-ease@npm:1 - 3":
+ version: 3.0.1
+ resolution: "d3-ease@npm:3.0.1"
+ checksum: 10c0/fec8ef826c0cc35cda3092c6841e07672868b1839fcaf556e19266a3a37e6bc7977d8298c0fcb9885e7799bfdcef7db1baaba9cd4dcf4bc5e952cf78574a88b0
+ languageName: node
+ linkType: hard
+
+"d3-interpolate@npm:1 - 3":
+ version: 3.0.1
+ resolution: "d3-interpolate@npm:3.0.1"
+ dependencies:
+ d3-color: "npm:1 - 3"
+ checksum: 10c0/19f4b4daa8d733906671afff7767c19488f51a43d251f8b7f484d5d3cfc36c663f0a66c38fe91eee30f40327443d799be17169f55a293a3ba949e84e57a33e6a
+ languageName: node
+ linkType: hard
+
+"d3-selection@npm:2 - 3, d3-selection@npm:3, d3-selection@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "d3-selection@npm:3.0.0"
+ checksum: 10c0/e59096bbe8f0cb0daa1001d9bdd6dbc93a688019abc97d1d8b37f85cd3c286a6875b22adea0931b0c88410d025563e1643019161a883c516acf50c190a11b56b
+ languageName: node
+ linkType: hard
+
+"d3-timer@npm:1 - 3":
+ version: 3.0.1
+ resolution: "d3-timer@npm:3.0.1"
+ checksum: 10c0/d4c63cb4bb5461d7038aac561b097cd1c5673969b27cbdd0e87fa48d9300a538b9e6f39b4a7f0e3592ef4f963d858c8a9f0e92754db73116770856f2fc04561a
+ languageName: node
+ linkType: hard
+
+"d3-transition@npm:2 - 3":
+ version: 3.0.1
+ resolution: "d3-transition@npm:3.0.1"
+ dependencies:
+ d3-color: "npm:1 - 3"
+ d3-dispatch: "npm:1 - 3"
+ d3-ease: "npm:1 - 3"
+ d3-interpolate: "npm:1 - 3"
+ d3-timer: "npm:1 - 3"
+ peerDependencies:
+ d3-selection: 2 - 3
+ checksum: 10c0/4e74535dda7024aa43e141635b7522bb70cf9d3dfefed975eb643b36b864762eca67f88fafc2ca798174f83ca7c8a65e892624f824b3f65b8145c6a1a88dbbad
+ languageName: node
+ linkType: hard
+
+"d3-zoom@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "d3-zoom@npm:3.0.0"
+ dependencies:
+ d3-dispatch: "npm:1 - 3"
+ d3-drag: "npm:2 - 3"
+ d3-interpolate: "npm:1 - 3"
+ d3-selection: "npm:2 - 3"
+ d3-transition: "npm:2 - 3"
+ checksum: 10c0/ee2036479049e70d8c783d594c444fe00e398246048e3f11a59755cd0e21de62ece3126181b0d7a31bf37bcf32fd726f83ae7dea4495ff86ec7736ce5ad36fd3
+ languageName: node
+ linkType: hard
+
"damerau-levenshtein@npm:^1.0.8":
version: 1.0.8
resolution: "damerau-levenshtein@npm:1.0.8"
@@ -10049,6 +10218,7 @@ __metadata:
"@types/react-dom": "npm:18.2.23"
"@typescript-eslint/eslint-plugin": "npm:7.5.0"
"@typescript-eslint/parser": "npm:7.5.0"
+ "@xyflow/react": "npm:12.4.1"
antd: "npm:4.24.13"
axios: "npm:1.7.7"
clsx: "npm:2.1.1"
@@ -10480,6 +10650,15 @@ __metadata:
languageName: node
linkType: hard
+"use-sync-external-store@npm:^1.2.2":
+ version: 1.4.0
+ resolution: "use-sync-external-store@npm:1.4.0"
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ checksum: 10c0/ec011a5055962c0f6b509d6e78c0b143f8cd069890ae370528753053c55e3b360d3648e76cfaa854faa7a59eb08d6c5fb1015e60ffde9046d32f5b2a295acea5
+ languageName: node
+ linkType: hard
+
"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1":
version: 1.0.2
resolution: "util-deprecate@npm:1.0.2"
@@ -10921,3 +11100,23 @@ __metadata:
checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f
languageName: node
linkType: hard
+
+"zustand@npm:^4.4.0":
+ version: 4.5.6
+ resolution: "zustand@npm:4.5.6"
+ dependencies:
+ use-sync-external-store: "npm:^1.2.2"
+ peerDependencies:
+ "@types/react": ">=16.8"
+ immer: ">=9.0.6"
+ react: ">=16.8"
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ immer:
+ optional: true
+ react:
+ optional: true
+ checksum: 10c0/5b39aff2ef57e5a8ada647261ec1115697d397be311c51461d9ea81b5b63c6d2c498b960477ad2db72dc21db6aa229a92bdf644f6a8ecf7b1d71df5b4a5e95d3
+ languageName: node
+ linkType: hard