import KFIcon from '@/components/KFIcon'; import ParameterInput from '@/components/ParameterInput'; import SubAreaTitle from '@/components/SubAreaTitle'; import { getComputingResourceReq } from '@/services/pipeline'; import { openAntdModal } from '@/utils/modal'; import { to } from '@/utils/promise'; import { Button, Drawer, Form, Input, Select } from 'antd'; import { pick } from 'lodash'; import { forwardRef, useEffect, useImperativeHandle, useState } from 'react'; import PropsLabel from '../components/PropsLabel'; import ResourceSelectorModal, { ResourceSelectorType } from '../components/ResourceSelectorModal'; import styles from './props.less'; import { canInput, createMenuItems } from './utils'; const { TextArea } = Input; const Props = forwardRef(({ onParentChange }, ref) => { const [form] = Form.useForm(); const [stagingItem, setStagingItem] = useState({}); const [open, setOpen] = useState(false); const [selectedModel, setSelectedModel] = useState(undefined); // 选择的模型,为了再次打开时恢复原来的选择 const [selectedDataset, setSelectedDataset] = useState(undefined); // 选择的数据集,为了再次打开时恢复原来的选择 const [resourceStandardList, setResourceStandardList] = useState([]); // 资源规模列表 const [menuItems, setMenuItems] = useState([]); useEffect(() => { getComputingResource(); }, []); // 获取资源规格列表数据 const getComputingResource = async () => { const params = { page: 0, size: 1000, resource_type: '', }; const [res] = await to(getComputingResourceReq(params)); if (res && res.data && res.data.content) { setResourceStandardList(res.data.content); } }; const afterOpenChange = () => { if (!open) { console.log('zzzzz', form.getFieldsValue()); const control_strategy = form.getFieldValue('control_strategy'); const in_parameters = form.getFieldValue('in_parameters'); const out_parameters = form.getFieldValue('out_parameters'); onParentChange({ ...stagingItem, ...form.getFieldsValue(), control_strategy: JSON.stringify(control_strategy), in_parameters: JSON.stringify(in_parameters), out_parameters: JSON.stringify(out_parameters), }); } }; const onClose = () => { setOpen(false); }; useImperativeHandle(ref, () => ({ getFieldsValue: async () => { const [propsRes, propsError] = await to(form.validateFields()); if (propsRes && !propsError) { const values = form.getFieldsValue(); return values; } else { return Promise.reject(propsError); } }, showDrawer(e, params, parentNodes) { if (e.item && e.item.getModel()) { form.resetFields(); const model = e.item.getModel(); try { const nodeData = { ...model, in_parameters: JSON.parse(model.in_parameters), out_parameters: JSON.parse(model.out_parameters), control_strategy: JSON.parse(model.control_strategy), }; console.log('model', nodeData); setStagingItem({ ...nodeData, }); form.setFieldsValue({ ...nodeData, }); } catch (error) { console.log(error); } setSelectedModel(undefined); setSelectedDataset(undefined); setOpen(true); // 参数下拉菜单 setMenuItems(createMenuItems(params, parentNodes)); } }, propClose: () => { onClose(); }, })); // 选择数据集、模型、镜像 const selectResource = (name, item) => { let type; let resource; switch (item.item_type) { case 'dataset': type = ResourceSelectorType.Dataset; resource = selectedDataset; break; case 'model': type = ResourceSelectorType.Model; resource = selectedModel; break; default: type = ResourceSelectorType.Mirror; break; } const { close } = openAntdModal(ResourceSelectorModal, { type, defaultExpandedKeys: resource ? [resource.id] : [], defaultCheckedKeys: resource ? [`${resource.id}-${resource.version}`] : [], defaultActiveTab: resource?.activeTab, onOk: (res) => { if (res) { if (type === ResourceSelectorType.Mirror) { form.setFieldValue(name, res); } else { const jsonObj = pick(res, ['id', 'version', 'path']); const value = JSON.stringify(jsonObj); const showValue = `${res.name}:${res.version}`; form.setFieldValue(name, { ...item, value, showValue, fromSelect: true }); if (type === ResourceSelectorType.Dataset) { setSelectedDataset(res); } else if (type === ResourceSelectorType.Model) { setSelectedModel(res); } } } else { if (type === ResourceSelectorType.Dataset) { setSelectedDataset(undefined); } else if (type === ResourceSelectorType.Model) { setSelectedModel(undefined); } form.setFieldValue(name, ''); } close(); }, }); }; // 获取选择数据集、模型后面按钮 icon const getSelectBtnIcon = (item) => { const type = item.item_type; if (type === 'dataset') { return ; } else if (type === 'model') { return ; } else { return ; } }; // 筛选资源规格 const filterResourceStandard = (input, { computing_resource = '' }) => { return computing_resource.toLocaleLowerCase().includes(input.toLocaleLowerCase()); }; // 参数回填 const handleParameterClick = (name, value) => { form.setFieldValue(name, value); }; // 控制策略 const controlStrategyList = Object.entries(stagingItem.control_strategy ?? {}).map( ([key, value]) => ({ key, value }), ); // 输入参数 const inParametersList = Object.entries(stagingItem.in_parameters ?? {}).map(([key, value]) => ({ key, value, })); // 输出参数 const outParametersList = Object.entries(stagingItem.out_parameters ?? {}).map( ([key, value]) => ({ key, value }), ); return ( selectResource('image', { item_type: 'image' })} className={styles['pipeline-drawer__ref-row__select-button']} > 选择镜像 { handleParameterClick('working_directory', value); }} /> } > { handleParameterClick('command', value); }} /> } > { handleParameterClick('mount_path', value); }} /> } > { handleParameterClick('env_variables', value); }} /> } > {controlStrategyList.map((item) => ( { handleParameterClick(['control_strategy', item.key], { ...item.value, value, fromSelect: true, showValue: value, }); }} /> } // getValueProps={(e) => { // return { value: e.value }; // }} // getValueFromEvent={(e) => { // return { // ...item.value, // value: e.target.value, // }; // }} > ))} {inParametersList.map((item) => ( { handleParameterClick(['in_parameters', item.key], { ...item.value, value, fromSelect: true, showValue: value, }); }} /> } required={item.value.require ? true : false} > {item.value.type === 'ref' && ( selectResource(['in_parameters', item.key], item.value)} className={styles['pipeline-drawer__ref-row__select-button']} > {item.value.label} )} ))} {outParametersList.map((item) => ( { handleParameterClick(['out_parameters', item.key], { ...item.value, value, fromSelect: true, showValue: value, }); }} /> } rules={[{ required: item.value.require ? true : false }]} // getValueProps={(e) => { // return { value: e.value }; // }} // getValueFromEvent={(e) => { // return { // ...item.value, // value: e.target.value, // }; // }} > ))} ); }); export default Props;