import { type ProFormInstance, StepsForm, useBreakpoint, } from '@ant-design/pro-components'; import { Button, Divider, Flex, Input, Modal, Space, Typography } from 'antd'; import { useMemo, useRef, useState } from 'react'; import useRichFormat from '@/hooks/useRichI18n'; import { $t } from '@/utils/i18n'; import '../style.less'; import { flushSync } from 'react-dom'; import { type SchemaType, schemaMap } from '../../ruleFormSchema'; import { handleEmptyValuesFunc } from '../../utils'; import BatchCloneModal from './comp/BatchCloneModal'; import Step1 from './comp/Step1'; import Step2 from './comp/Step2'; import { MultiCopyPopupContext } from './context'; const { Text, Title } = Typography; type MultiCopyPopupProps = { visible: boolean; ruleMeta: Record; dataSourceList: API.DataSourceListItem[]; currentRuleType: number; onDone: (refresh?: boolean) => void; }; const MultiCopyPopup = ({ visible, ruleMeta, onDone, currentRuleType, dataSourceList, }: MultiCopyPopupProps) => { const { richFormat } = useRichFormat(); const screens = useBreakpoint(); const currentSchemaMap = schemaMap[currentRuleType as unknown as SchemaType]?.({ richFormat }) || {}; const formMapRef = useRef< React.RefObject | undefined>[] >([]); const [targetDataSourceId, setTargetDataSourceId] = useState< string | number | null >(null); const [selectRules, setSelectRules] = useState([]); const [checkedIdsList, setCheckedIdsList] = useState>( [], ); const [inputValue, setInputValue] = useState(''); const [batchCloneModalVisible, setBatchCloneModalVisible] = useState(false); const [selectedRows, setSelectedRows] = useState[]>( [], ); const submitRuleList = useMemo(() => { return selectRules.filter((item) => checkedIdsList.includes(item.id)); }, [selectRules, checkedIdsList]); const targetDataSource = useMemo(() => { return dataSourceList.find((item) => item.id === targetDataSourceId); }, [targetDataSourceId, dataSourceList]); const handleCancel = () => { setBatchCloneModalVisible(false); setSelectedRows([]); setSelectRules([]); setCheckedIdsList([]); setInputValue(''); setTargetDataSourceId(null); }; return ( { handleCancel(); onDone(); }} title={$t('pages.clones.title')} footer={null} maskClosable={false} styles={{ body: { maxHeight: '90vh', overflowY: 'auto', overflowX: 'hidden', marginRight: -10, paddingRight: 8, }, }} > { const editNameRules = values?.step2 || {}; const submitValues = submitRuleList.map((item) => { const tmpValues = handleEmptyValuesFunc(item); const tmpValues2 = currentSchemaMap?.transformSubmitValue?.(tmpValues) || tmpValues; const submitValues = { ...tmpValues2, dataSourceId: targetDataSourceId, name: editNameRules[item.id] || `${item.name || ruleMeta?.title || ''} - ${targetDataSource?.sourceName || ''}`, id: void 0, groupFilter: '', }; if (currentSchemaMap?.symbolFormShow) { submitValues.param2 = ''; } if (currentSchemaMap?.assetFormShow) { submitValues.param1 = ''; } const tmp: Record = { companyId: submitValues.companyId, dataSourceId: submitValues.dataSourceId, groupFilter: submitValues.groupFilter, name: submitValues.name, type: submitValues.type, }; for (const key in submitValues) { if (key.indexOf('param') !== -1) { tmp[key] = submitValues[key]; } } return tmp; }); setSelectedRows(submitValues); setBatchCloneModalVisible(true); }} submitter={{ render: (props) => { if (props.step === 0) { return [ , , ]; } if (props.step === 1) { return [ , , ]; } return [ , , ]; }, }} > { if (sourceDataSourceId) { const curFormRef = formMapRef?.current?.[0]?.current; const curTargetId = curFormRef?.getFieldValue('targetDataSourceId'); const sourceItem = dataSourceList.find( (item) => item.id === sourceDataSourceId, ); const targetItem = dataSourceList.find( (item) => item.id === curTargetId, ); if (targetItem && sourceItem && targetItem.sourceType !== sourceItem.sourceType) { const fallback = dataSourceList.find( (item) => item.id !== sourceDataSourceId && item.sourceType === sourceItem.sourceType, )?.id || sourceDataSourceId; curFormRef?.setFieldsValue({ targetDataSourceId: fallback }); setTargetDataSourceId(fallback); } } }} >
{$t('pages.clones.step3.confirmTitle', { cloneCount: checkedIdsList.length, target: targetDataSource?.sourceName || '', })} {$t('pages.clones.step3.confirmTips')} setInputValue(e.target.value)} /> {$t('pages.clones.step3.confirmTips2')}
{ setBatchCloneModalVisible(false); cb?.(); }} onFinish={(cb) => { flushSync(() => { setBatchCloneModalVisible(false); }); cb?.(); handleCancel(); onDone?.(true); }} />
); }; export default MultiCopyPopup;