@@ -6,15 +6,18 @@ import {
66 DatasetSubType ,
77 DatasetType ,
88} from "@/pages/DataManagement/dataset.model" ;
9- import { Input , Select , Form , AutoComplete } from "antd" ;
9+ import { Input , Select , Form , AutoComplete , Checkbox , Tooltip } from "antd" ;
1010import TextArea from "antd/es/input/TextArea" ;
1111import { useEffect , useState } from "react" ;
1212import { useTranslation } from "react-i18next" ;
13+ import { Lock } from "lucide-react" ;
1314
1415export default function CreateTaskStepOne ( {
1516 form,
1617 taskConfig,
1718 setTaskConfig,
19+ useSourceDataset,
20+ setUseSourceDataset,
1821} : {
1922 form : any ;
2023 taskConfig : {
@@ -24,8 +27,12 @@ export default function CreateTaskStepOne({
2427 destDatasetName : string ;
2528 type : DatasetType ;
2629 destDatasetType : DatasetSubType ;
30+ srcDatasetId ?: string ;
31+ srcDatasetName ?: string ;
2732 } ;
2833 setTaskConfig : ( config : any ) => void ;
34+ useSourceDataset : boolean ;
35+ setUseSourceDataset : ( checked : boolean ) => void ;
2936} ) {
3037 const { t } = useTranslation ( ) ;
3138 const [ datasets , setDatasets ] = useState < Dataset [ ] > ( [ ] ) ;
@@ -45,10 +52,14 @@ export default function CreateTaskStepOne({
4552 let dataset = null ;
4653 if ( key === "srcDatasetId" ) {
4754 dataset = datasets . find ( ( d ) => d . id === value ) ;
55+ // 如果勾选了"选择源数据集",自动更新目标数据集名称
56+ const newDestName = useSourceDataset ? ( dataset ?. name || "" ) : allValues . destDatasetName ;
57+ form . setFieldValue ( "destDatasetName" , newDestName ) ;
4858 setTaskConfig ( {
4959 ...taskConfig ,
5060 ...allValues ,
5161 srcDatasetName : dataset ?. name || "" ,
62+ destDatasetName : newDestName ,
5263 } ) ;
5364 } else if ( key === "destDatasetName" ) {
5465 dataset = datasets . find ( ( d ) => d . name === value ) ;
@@ -62,6 +73,36 @@ export default function CreateTaskStepOne({
6273 }
6374 } ;
6475
76+ const handleUseSourceDatasetChange = ( checked : boolean ) => {
77+ setUseSourceDataset ( checked ) ;
78+ if ( checked ) {
79+ const srcDatasetId = form . getFieldValue ( "srcDatasetId" ) ;
80+ const srcDataset = datasets . find ( ( d ) => d . id === srcDatasetId ) ;
81+ const srcName = srcDataset ?. name || "" ;
82+ form . setFieldValue ( "destDatasetName" , srcName ) ;
83+ setTaskConfig ( {
84+ ...taskConfig ,
85+ destDatasetId : srcDataset ?. id || "" ,
86+ destDatasetName : srcName ,
87+ } ) ;
88+ } else {
89+ form . setFieldValue ( "destDatasetName" , "" ) ;
90+ setTaskConfig ( {
91+ ...taskConfig ,
92+ destDatasetName : "" ,
93+ } ) ;
94+ }
95+ } ;
96+
97+ // 过滤掉当前选中的源数据集(当不勾选"选择源数据集"时)
98+ const getFilteredDatasetOptions = ( ) => {
99+ const srcDatasetId = form . getFieldValue ( "srcDatasetId" ) ;
100+ if ( useSourceDataset || ! srcDatasetId ) {
101+ return datasets ;
102+ }
103+ return datasets . filter ( ( d ) => d . id !== srcDatasetId ) ;
104+ } ;
105+
65106 return (
66107 < Form
67108 layout = "vertical"
@@ -98,9 +139,43 @@ export default function CreateTaskStepOne({
98139 } ) }
99140 />
100141 </ Form . Item >
101- < Form . Item label = { t ( "dataCleansing.task.form.destDatasetName" ) } name = "destDatasetName" required >
142+ < div className = "flex items-center gap-1 mb-1" >
143+ < span className = "text-red-500" > *</ span >
144+ < label className = "text-sm text-gray-700 mr-4" > { t ( "dataCleansing.task.form.destDatasetName" ) } </ label >
145+ < Checkbox
146+ checked = { useSourceDataset }
147+ onChange = { ( e ) => handleUseSourceDatasetChange ( e . target . checked ) }
148+ >
149+ < span className = "-ml-1" >
150+ { t ( "dataCleansing.task.form.useSourceDataset" ) }
151+ </ span >
152+ </ Checkbox >
153+ { useSourceDataset && (
154+ < Tooltip title = { t ( "dataCleansing.task.form.useSourceDatasetHint" ) } >
155+ < Lock className = "w-3.5 h-3.5 text-gray-400 -ml-2.5" />
156+ </ Tooltip >
157+ ) }
158+ </ div >
159+ < Form . Item
160+ name = "destDatasetName"
161+ className = "mb-0"
162+ rules = { [
163+ { required : true , message : t ( "dataCleansing.task.form.destDatasetNameRequired" ) } ,
164+ {
165+ validator : ( _ , value ) => {
166+ if ( useSourceDataset ) return Promise . resolve ( ) ;
167+ const srcDatasetId = form . getFieldValue ( "srcDatasetId" ) ;
168+ const srcDataset = datasets . find ( ( d ) => d . id === srcDatasetId ) ;
169+ if ( srcDataset && value === srcDataset . name ) {
170+ return Promise . reject ( new Error ( t ( "dataCleansing.task.form.cannotUseSourceDataset" ) ) ) ;
171+ }
172+ return Promise . resolve ( ) ;
173+ }
174+ }
175+ ] }
176+ >
102177 < AutoComplete
103- options = { datasets . map ( ( dataset ) => {
178+ options = { getFilteredDatasetOptions ( ) . map ( ( dataset ) => {
104179 return {
105180 label : (
106181 < div className = "flex items-center justify-between gap-3 py-2" >
@@ -118,6 +193,7 @@ export default function CreateTaskStepOne({
118193 return option . value . toLowerCase ( ) . startsWith ( inputValue . toLowerCase ( ) ) ;
119194 } }
120195 placeholder = { t ( "dataCleansing.task.form.destDatasetNamePlaceholder" ) }
196+ disabled = { useSourceDataset }
121197 />
122198 </ Form . Item >
123199 < Form . Item
0 commit comments