3 changed files with 129 additions and 135 deletions
			
			
		- 
					42src/pages/system/menus/components/BatchButton.tsx
 - 
					144src/pages/system/menus/components/ButtonTable.tsx
 - 
					78src/pages/system/menus/components/TreeNodeRender.tsx
 
@ -1,97 +1,99 @@ | 
				
			|||
import { useTranslation } from '@/i18n.ts' | 
				
			|||
import { EditableFormInstance, EditableProTable } from '@ant-design/pro-components' | 
				
			|||
import { useMemo, useRef, useState } from 'react' | 
				
			|||
import { IDataProps } from '@/types' | 
				
			|||
import { FormInstance } from 'antd/lib' | 
				
			|||
 | 
				
			|||
type DataSourceType = { | 
				
			|||
    id: number, | 
				
			|||
    name: string, | 
				
			|||
    code: string, | 
				
			|||
  id: number, | 
				
			|||
  name: string, | 
				
			|||
  code: string, | 
				
			|||
} | 
				
			|||
 | 
				
			|||
const fixRowKey = (data: DataSourceType[]) => { | 
				
			|||
    return data.map((item, index) => ({ ...item, id: item.id ?? index+1 })) | 
				
			|||
  return data.map((item, index) => ({ ...item, id: item.id ?? index + 1 })) | 
				
			|||
} | 
				
			|||
 | 
				
			|||
const ButtonTable = (props: IDataProps & { | 
				
			|||
    form: FormInstance | 
				
			|||
  form: FormInstance | 
				
			|||
}) => { | 
				
			|||
 | 
				
			|||
    const { value, onChange  } = props | 
				
			|||
    const editorFormRef = useRef<EditableFormInstance<DataSourceType>>() | 
				
			|||
    const [ editableKeys, setEditableRowKeys ] = useState<any[]>(() => { | 
				
			|||
        return fixRowKey(value || []).map(item => item.id) | 
				
			|||
    }) | 
				
			|||
  const { t } = useTranslation() | 
				
			|||
  const { value, onChange } = props | 
				
			|||
  const editorFormRef = useRef<EditableFormInstance<DataSourceType>>() | 
				
			|||
  const [ editableKeys, setEditableRowKeys ] = useState<any[]>(() => { | 
				
			|||
    return fixRowKey(value || []).map(item => item.id) | 
				
			|||
  }) | 
				
			|||
 | 
				
			|||
    const values  = fixRowKey(value || []) | 
				
			|||
  const values = fixRowKey(value || []) | 
				
			|||
 | 
				
			|||
    const columns = useMemo(() => { | 
				
			|||
  const columns = useMemo(() => { | 
				
			|||
 | 
				
			|||
        return [ | 
				
			|||
            { | 
				
			|||
                title: 'id', | 
				
			|||
                dataIndex: 'id', | 
				
			|||
                hideInTable: true, | 
				
			|||
            }, | 
				
			|||
            { | 
				
			|||
                title: '名称', | 
				
			|||
                dataIndex: 'label', | 
				
			|||
                formItemProps: () => { | 
				
			|||
                    return { | 
				
			|||
                        rules: [ { required: true, message: '此项为必填项' } ], | 
				
			|||
                    } | 
				
			|||
                }, | 
				
			|||
            }, | 
				
			|||
            { | 
				
			|||
                title: '标识', | 
				
			|||
                dataIndex: 'code', | 
				
			|||
                formItemProps: () => { | 
				
			|||
                    return { | 
				
			|||
                        rules: [ { required: true, message: '此项为必填项' } ], | 
				
			|||
                    } | 
				
			|||
                }, | 
				
			|||
            }, | 
				
			|||
    return [ | 
				
			|||
      { | 
				
			|||
        title: 'id', | 
				
			|||
        dataIndex: 'id', | 
				
			|||
        hideInTable: true, | 
				
			|||
      }, | 
				
			|||
      { | 
				
			|||
        title: t('system.menus.form.table.columns.name', '名称'), | 
				
			|||
        dataIndex: 'label', | 
				
			|||
        formItemProps: () => { | 
				
			|||
          return { | 
				
			|||
            rules: [ { required: true, message: t('message.required') } ], | 
				
			|||
          } | 
				
			|||
        }, | 
				
			|||
      }, | 
				
			|||
      { | 
				
			|||
        title: t('system.menus.form.table.columns.code', '标识'), | 
				
			|||
        dataIndex: 'code', | 
				
			|||
        formItemProps: () => { | 
				
			|||
          return { | 
				
			|||
            rules: [ { required: true, message: t('message.required') } ], | 
				
			|||
          } | 
				
			|||
        }, | 
				
			|||
      }, | 
				
			|||
 | 
				
			|||
            { | 
				
			|||
                title: '操作', | 
				
			|||
                valueType: 'option', | 
				
			|||
                width: 80, | 
				
			|||
      { | 
				
			|||
        title: t('system.menus.form.table.columns.option', '操作'), | 
				
			|||
        valueType: 'option', | 
				
			|||
        width: 80, | 
				
			|||
 | 
				
			|||
            } | 
				
			|||
        ] | 
				
			|||
      } | 
				
			|||
    ] | 
				
			|||
 | 
				
			|||
    }, []) | 
				
			|||
  }, []) | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    return ( | 
				
			|||
  return ( | 
				
			|||
 | 
				
			|||
            <EditableProTable<DataSourceType> | 
				
			|||
                    rowKey="id" | 
				
			|||
                    value={values } | 
				
			|||
                    onChange={onChange} | 
				
			|||
                    editableFormRef={editorFormRef} | 
				
			|||
                    recordCreatorProps={ | 
				
			|||
                           { | 
				
			|||
                            newRecordType: 'dataSource', | 
				
			|||
                            record: () => { | 
				
			|||
                                return { id: ((value?? []).length + 1) } as DataSourceType | 
				
			|||
                            }, | 
				
			|||
                        } | 
				
			|||
                    } | 
				
			|||
                    editable={{ | 
				
			|||
                        type: 'multiple', | 
				
			|||
                        editableKeys, | 
				
			|||
                        actionRender: (_row, _config, defaultDoms) => { | 
				
			|||
                            return [ defaultDoms.delete ] | 
				
			|||
                        }, | 
				
			|||
                        onValuesChange: (_record, recordList) => { | 
				
			|||
                           onChange?.(recordList) | 
				
			|||
                        }, | 
				
			|||
                        onChange: setEditableRowKeys, | 
				
			|||
                    }} | 
				
			|||
                    columns={columns as any} | 
				
			|||
            /> | 
				
			|||
    ) | 
				
			|||
    <EditableProTable<DataSourceType> | 
				
			|||
      rowKey="id" | 
				
			|||
      value={values} | 
				
			|||
      onChange={onChange} | 
				
			|||
      editableFormRef={editorFormRef} | 
				
			|||
      recordCreatorProps={ | 
				
			|||
        { | 
				
			|||
          newRecordType: 'dataSource', | 
				
			|||
          record: () => { | 
				
			|||
            return { id: ((value ?? []).length + 1) } as DataSourceType | 
				
			|||
          }, | 
				
			|||
        } | 
				
			|||
      } | 
				
			|||
      editable={{ | 
				
			|||
        type: 'multiple', | 
				
			|||
        editableKeys, | 
				
			|||
        actionRender: (_row, _config, defaultDoms) => { | 
				
			|||
          return [ defaultDoms.delete ] | 
				
			|||
        }, | 
				
			|||
        onValuesChange: (_record, recordList) => { | 
				
			|||
          onChange?.(recordList) | 
				
			|||
        }, | 
				
			|||
        onChange: setEditableRowKeys, | 
				
			|||
      }} | 
				
			|||
      columns={columns as any} | 
				
			|||
    /> | 
				
			|||
  ) | 
				
			|||
} | 
				
			|||
 | 
				
			|||
export default ButtonTable | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue