优化FormItemsRenderer和Table
parent
aab815bd27
commit
f2dcf2c87b
|
|
@ -38,6 +38,7 @@ const FormBuilder = (props) => {
|
||||||
onFinish={onFinish}
|
onFinish={onFinish}
|
||||||
initialValues={values}
|
initialValues={values}
|
||||||
form={form}
|
form={form}
|
||||||
|
style={{ width: `calc(100% - ${gutter * 2}px)`, margin: `0 auto` }}
|
||||||
{...restProps}
|
{...restProps}
|
||||||
>
|
>
|
||||||
<Row gutter={gutter}>
|
<Row gutter={gutter}>
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ function TablePro(props) {
|
||||||
columns = [],
|
columns = [],
|
||||||
showIndex = true,
|
showIndex = true,
|
||||||
useAlignCenter = true,
|
useAlignCenter = true,
|
||||||
|
rowKey = 'id',
|
||||||
...restProps
|
...restProps
|
||||||
} = props;
|
} = props;
|
||||||
const storeIndex = props.storeIndex || `${window.process.env.app.antd["ant-prefix"]}_${Math.random().toString(36).substring(2)}`;
|
const storeIndex = props.storeIndex || `${window.process.env.app.antd["ant-prefix"]}_${Math.random().toString(36).substring(2)}`;
|
||||||
|
|
@ -13,7 +14,7 @@ function TablePro(props) {
|
||||||
showIndex && columns.unshift(getIndexColumn(props.pagination));
|
showIndex && columns.unshift(getIndexColumn(props.pagination));
|
||||||
return columns.map(item => ({ align: useAlignCenter ? "center" : "left", ...item }));
|
return columns.map(item => ({ align: useAlignCenter ? "center" : "left", ...item }));
|
||||||
}
|
}
|
||||||
return <Table storeIndex={storeIndex} columns={calcColumns()} {...restProps} />;
|
return <Table rowKey={rowKey} storeIndex={storeIndex} columns={calcColumns()} {...restProps} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default TablePro;
|
export default TablePro;
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
"@ant-design/icons": "^6.1.0",
|
"@ant-design/icons": "^6.1.0",
|
||||||
"@ant-design/pro-components": "^2.8.10",
|
"@ant-design/pro-components": "^2.8.10",
|
||||||
"@cqsjjb/jjb-common-lib": "latest",
|
"@cqsjjb/jjb-common-lib": "latest",
|
||||||
|
"@cqsjjb/jjb-react-admin-component": "latest",
|
||||||
"ahooks": "^3.9.5",
|
"ahooks": "^3.9.5",
|
||||||
"antd": "^5.27.6",
|
"antd": "^5.27.6",
|
||||||
"dayjs": "^1.11.18",
|
"dayjs": "^1.11.18",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
export interface DeleteFileItem {
|
||||||
|
/** 文件ID */
|
||||||
|
id: string;
|
||||||
|
[key: string]: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DeleteFileOptions {
|
||||||
|
/** 要删除的文件列表 */
|
||||||
|
files: DeleteFileItem[];
|
||||||
|
/** 额外的参数 */
|
||||||
|
params?: Record<string, any>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export type DeleteFileFunction = (options: DeleteFileOptions) => Promise<any>;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除文件
|
||||||
|
*/
|
||||||
|
export default function useDeleteFile(): [boolean, DeleteFileFunction];
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
import { request } from "@cqsjjb/jjb-common-lib/http";
|
||||||
|
import { useState } from "react";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除文件 TODO
|
||||||
|
*/
|
||||||
|
function useDeleteFile() {
|
||||||
|
// loading状态
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
|
||||||
|
// 删除文件
|
||||||
|
const deleteFile = (options) => {
|
||||||
|
setLoading(true);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const { files = [], params = {} } = options;
|
||||||
|
|
||||||
|
// 构建参数
|
||||||
|
const actualParams = {
|
||||||
|
id: files.map(file => file.id),
|
||||||
|
...params,
|
||||||
|
};
|
||||||
|
|
||||||
|
// 发送请求
|
||||||
|
request("", "post", actualParams)
|
||||||
|
.then((res) => {
|
||||||
|
resolve(res.data);
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
reject(err);
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
setLoading(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return [loading, deleteFile];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useDeleteFile;
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
export interface UploadFile {
|
||||||
|
/** 原始文件对象 */
|
||||||
|
originFileObj?: File;
|
||||||
|
[key: string]: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SingleUploadFileOptions {
|
||||||
|
/** 要上传的文件 */
|
||||||
|
files: UploadFile;
|
||||||
|
/** 是否单文件上传 */
|
||||||
|
single?: true;
|
||||||
|
/** 上传的参数 */
|
||||||
|
params?: Record<string, string | number>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MultipleUploadFileOptions {
|
||||||
|
/** 要上传的文件 */
|
||||||
|
files: UploadFile[];
|
||||||
|
/** 是否单文件上传 */
|
||||||
|
single: false;
|
||||||
|
/** 上传的参数 */
|
||||||
|
params?: Record<string, string | number>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MultipleFileResponse {
|
||||||
|
/** 文件列表 */
|
||||||
|
files: string[];
|
||||||
|
/** 文件ID */
|
||||||
|
id: string;
|
||||||
|
[key: string]: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface UploadFileFunction {
|
||||||
|
(options: SingleUploadFileOptions): Promise<string>;
|
||||||
|
(options: MultipleUploadFileOptions): Promise<MultipleFileResponse>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上传文件
|
||||||
|
*/
|
||||||
|
export default function useUploadFile(): [boolean, UploadFileFunction];
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
import { request } from "@cqsjjb/jjb-common-lib/http";
|
||||||
|
import { useState } from "react";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上传文件 TODO
|
||||||
|
*/
|
||||||
|
function useUploadFile() {
|
||||||
|
// loading状态
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
|
||||||
|
// 上传文件
|
||||||
|
const uploadFile = (options) => {
|
||||||
|
setLoading(true);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const { files = [], single = true, params = {} } = options;
|
||||||
|
const formData = new FormData();
|
||||||
|
|
||||||
|
// 将文件添加到formData中
|
||||||
|
files.forEach((f) => {
|
||||||
|
f.originFileObj && formData.append("files", f.originFileObj);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 将额外携带的参数添加到formData中
|
||||||
|
Object.keys(params).forEach((key) => {
|
||||||
|
formData.append(key, params[key]);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 获取待上传的文件
|
||||||
|
const filesLength = formData.getAll("files").length;
|
||||||
|
|
||||||
|
// 如果没有文件则返回老文件
|
||||||
|
if (filesLength === 0) {
|
||||||
|
setLoading(false);
|
||||||
|
resolve(
|
||||||
|
single
|
||||||
|
? files?.[0]?.url || ""
|
||||||
|
: { files: files.map(f => f.url), id: "" },
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送请求
|
||||||
|
request(single ? "单文件上传的接口" : "多文件上传的接口", "post", formData, { "Content-Type": "multipart/form-data" })
|
||||||
|
.then((res) => {
|
||||||
|
resolve(
|
||||||
|
single
|
||||||
|
? res.data.url
|
||||||
|
: {
|
||||||
|
files: [...res.data.files.map(f => f.url), ...files.filter(f => !f.originFileObj).map(f => f.url)],
|
||||||
|
id: res.data.id,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
reject(err);
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
setLoading(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return [loading, uploadFile];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useUploadFile;
|
||||||
Loading…
Reference in New Issue