最近有一个需求, 做资产的批量属性更新
所以在前端的呈现就是, 用户可以自己选择某个属性,然后根据选择的属性, 渲染出这个属性可以输入的值
下面视频就是实际效果
下面是代码
export default ({ data }) => {
const [form] = Form.useForm();
const [editableKeys, setEditableRowKeys] = useState([]);
const [dataSource, setDataSource] = useState([]);
const [fliedMap, setFliedMap] = useState({})
const formRef = useRef()
const editFormRef = useRef()
const columns = [
{
title: <FormattedMessage id="DMT63" />,
dataIndex: 'Name',
width: '40%',
renderFormItem: (record,_) => {
return (
<Select onSelect={(v) => {
let newData = fliedMap
newData[record.index] = v
setFliedMap(newData)
editFormRef?.current?.setRowData(record.entity.id, { Value: undefined })
}} showSearch style={{ width: "150px" }} options={deviceFliedOptions} allowClear />
)
},
render: (v) => {
return SMaxDeviceFeildNamei18Map[v]
},
formItemProps: {
rules: [
{
required: true,
message: <FormattedMessage id="CR1" />,
},
],
},
},
{
title: <FormattedMessage id="wt_value" />,
dataIndex: 'Value',
width: '40%',
formItemProps: {
rules: [
{
required: true,
message: <FormattedMessage id="CR1" />,
},
],
},
renderFormItem: (v) => {
switch (fliedMap[v.index]) {
case "Status":
return <ProFormSelect showSearch options={DeviceStatusOptions} />
case "Type":
return <ProFormSelect showSearch options={[{ label: <FormattedMessage id="DMT5" />, value: 0 }, { label: <FormattedMessage id="DMT6" />, value: 1 }]} />
case "Model":
return <ProFormSelect showSearch request={async () => { return await options.options("SMaxModel") }} debounceTime={500000} />
case "Role":
return <ProFormSelect showSearch options={DeviceRoleOptions} />
case "InvoicingEntity":
return <ProFormSelect showSearch request={async () => { return await options.options("SMaxInvoicingEntity") }} debounceTime={500000} />
case "Location":
return <ProFormSelect showSearch request={async () => { return await options.options("SMaxLocation") }} debounceTime={500000} />
case "CostCenter":
return <ProFormSelect showSearch request={async () => { return await options.options("SMaxCostCenter") }} debounceTime={500000} />
case "PersonProfile":
return <ProFormSelect showSearch request={async () => { return await options.options("SMaxPerson") }} debounceTime={500000} />
case "WarrantyEndDate":
return <ProFormDatePicker />
case "ProductLifetime":
return <ProFormSelect showSearch options={[{ label: 3, value: 3 }, { label: 5, value: 5 }]} />
case "Comments":
return <ProFormTextArea />
default:
return <Input disabled={true}/>
}
},
render: (v) => {
return v
},
},
{
title: <FormattedMessage id="AT45" />,
valueType: 'option',
width: '20%',
render: (text, record, dom, action) => [
<a
key="editable"
onClick={() => {
action?.startEditable?.(record.id);
}}
>
<FormattedMessage id="AT48" />
</a>,
<a key="delete" onClick={() => {
const newD = dataSource.filter((item) => item.id !== record.id)
setDataSource(newD);
formRef?.current?.setFieldsValue({ fields: newD })
}}>
<FormattedMessage id="AT49" />
</a>,
],
},
]
return (<ModalForm
formRef={formRef}
title={<FormattedMessage id="DMT29" />}
trigger={
<Button type='link'><FormattedMessage id="DMT29" /></Button>
}
form={form}
modalProps={{
destroyOnClose: true,
onCancel: () => console.log('run'),
}}
onFinish={(values)=> {
let l = []
for (let i of values.fields){
let flag = false
for (let x of l){
if (i.Name === x){
showError("Please do not repeat the same field")
return
}
flag = true
}
if(!flag){
l.push(i.Name)
}
}
}}
autoFocusFirstInput
submitTimeout={2000}
>
<ProFormItem name="fields">
<EditableProTable
editableFormRef={editFormRef}
columns={columns}
rowKey='id'
recordCreatorProps={{
position: 'bottom',
record: () => ({ id: (Math.random() * 1000000).toFixed(0) })
}}
onChange={setDataSource}
editable={{
type: 'multiple',
editableKeys,
onChange: setEditableRowKeys,
}}
>
</EditableProTable>
</ProFormItem>
</ModalForm>)
}
简单来说,我们有一个叫fliedMap的字典,当我们在A列选择的时候, 会把这一行的索引作为key, 选择的值作为value存进去,然后B列的渲染就会根据fliedMap里面value的值,去渲染不同的组件,当然 我们也需要在每一次选择的时候清除掉B列的值.否则会造成错误的属性值
发表回复