feat: 新增确认单个操作、批量操作的全局交互组件,统一修改资源管理列表模块

develop
zhoux 1 year ago
parent bd2c1ede98
commit 4fc102c7d6

@ -2,7 +2,7 @@
* @Author: zhoux zhouxia@supervision.ltd * @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-13 14:19:57 * @Date: 2023-11-13 14:19:57
* @LastEditors: zhoux zhouxia@supervision.ltd * @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-15 17:22:54 * @LastEditTime: 2023-11-16 16:30:31
* @FilePath: \general-ai-platform-web\config\defaultForm.ts * @FilePath: \general-ai-platform-web\config\defaultForm.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE2 * @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE2
*/ */
@ -13,7 +13,7 @@ export const proFormCommonOptions: Record<string,any> = {
} }
const formBoxMargin = 2 * 24 const formBoxMargin = 2 * 24
const formItemGap = 16
// Small 560 // Small 560
export const proFormSmallModelWidth: number = 560; export const proFormSmallModelWidth: number = 560;
export const proFormSmallItemStyleProps: Record<string, any> = { export const proFormSmallItemStyleProps: Record<string, any> = {
@ -25,12 +25,12 @@ export const proFormSmallItemStyleProps: Record<string, any> = {
export const proFormModelWidth: number = 804; export const proFormModelWidth: number = 804;
export const proFormItemStyleProps: Record<string, any> = { export const proFormItemStyleProps: Record<string, any> = {
width: proFormModelWidth - formBoxMargin, // 一列 width: proFormModelWidth - formBoxMargin, // 一列
column2Width: (proFormModelWidth - formBoxMargin - 32)/2 , // 两列 column2Width: (proFormModelWidth - formBoxMargin - formItemGap)/2 , // 两列
}; };
// max 968 // max 968
export const proFormMaxModelWidth: number = 968; export const proFormMaxModelWidth: number = 968;
export const proFormMaxItemStyleProps: Record<string, any> = { export const proFormMaxItemStyleProps: Record<string, any> = {
width: proFormMaxModelWidth - formBoxMargin, width: proFormMaxModelWidth - formBoxMargin,
column2Width: (proFormMaxModelWidth - formBoxMargin - 32)/2 , // 两列 column2Width: (proFormMaxModelWidth - formBoxMargin - formItemGap)/2 , // 两列
}; };

@ -2,11 +2,12 @@
* @Author: zhoux zhouxia@supervision.ltd * @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-13 11:32:26 * @Date: 2023-11-13 11:32:26
* @LastEditors: zhoux zhouxia@supervision.ltd * @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-14 16:20:49 * @LastEditTime: 2023-11-16 13:30:09
* @FilePath: \general-ai-platform-web\config\defaultTable.ts * @FilePath: \general-ai-platform-web\config\defaultTable.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
import { ProColumns } from "@ant-design/pro-components"; import { ProColumns } from "@ant-design/pro-components";
import { PaginationProps } from "antd";
// 通用列表配置 // 通用列表配置
export const proTableCommonOptions: Record<string,any> = { export const proTableCommonOptions: Record<string,any> = {
scrollX: 'max-content', // 保证左右侧列的固定,并能保证没列标题不换行 scrollX: 'max-content', // 保证左右侧列的固定,并能保证没列标题不换行
@ -24,6 +25,13 @@ export const proTableActionColumnOptions: Record<string,any> = {
fixed: 'right', fixed: 'right',
} }
// 分页器配置
export const proTablePaginationOptions: PaginationProps = {
showSizeChanger: true,
// showQuickJumper: true,
showTotal: (total) => `${total}`,
}
// 默认索引列配置 // 默认索引列配置
// export const proTableIndexColumnOptions : ProColumns = { // export const proTableIndexColumnOptions : ProColumns = {
// title: '序号', // title: '序号',

@ -0,0 +1,54 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-16 14:30:15
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-16 14:35:20
* @FilePath: \general-ai-platform-web\src\components\BatchOperation\isBatchDelete.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { ExclamationCircleOutlined } from '@ant-design/icons';
// import { useIntl } from '@ant-design/pro-components';
import { useIntl } from '@umijs/max';
import { Button, Modal } from 'antd';
import { FormattedMessage } from 'react-intl';
type IsBatchDeleteProps = {
// eslint-disable-next-line @typescript-eslint/ban-types
deleteApi: Function;
};
const IsBatchDelete: React.FC<IsBatchDeleteProps> = (props) => {
const intl = useIntl();
return (
<Button
danger
onClick={async () => {
Modal.confirm({
icon: <ExclamationCircleOutlined />,
title: intl.formatMessage({
id: 'common.modal.table.delete.title',
defaultMessage: '$$$',
}),
content: intl.formatMessage({
id: 'common.modal.table.delete.content',
defaultMessage: '$$$',
}),
okText: intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' }),
cancelText: intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' }),
onOk() {
// TODO 未对接批量删除接口
props.deleteApi();
},
onCancel() {
console.log('Cancel');
},
});
}}
>
<FormattedMessage id="pages.searchTable.batchDeletion" defaultMessage="Batch deletion" />
</Button>
);
};
export default IsBatchDelete;

@ -1,3 +1,11 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-15 15:01:34
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-16 17:22:16
* @FilePath: \general-ai-platform-web\src\components\DictionaryBox\isEnable.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { isEnableEnum } from '@/enums/common'; import { isEnableEnum } from '@/enums/common';
import { Badge } from 'antd'; import { Badge } from 'antd';
import { FormattedMessage } from 'react-intl'; import { FormattedMessage } from 'react-intl';
@ -12,7 +20,7 @@ const IsEnableBox: React.FC<IsEnableBoxProps> = (props) => {
const currentItem = isEnableEnum[isEnable ? '1' : '0'] const currentItem = isEnableEnum[isEnable ? '1' : '0']
return ( return (
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}> <div style={{ display: 'flex', alignItems: 'center'}}>
<Badge status={isEnable ? 'success' : 'default'}></Badge> <Badge status={isEnable ? 'success' : 'default'}></Badge>
<span style={{color: currentItem.color, padding: 4 }}> <span style={{color: currentItem.color, padding: 4 }}>
<FormattedMessage id={isEnable ? 'common.enable' : 'common.disable'} defaultMessage="$$$" /> <FormattedMessage id={isEnable ? 'common.enable' : 'common.disable'} defaultMessage="$$$" />

@ -1,15 +0,0 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-13 15:05:27
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-13 15:05:35
* @FilePath: \general-ai-platform-web\src\components\OperateConfirm\delete.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
// TODO 统一设置确实删除弹框,抛出确认的方法参数供业务层使用
// const DeleteConfirm

@ -2,7 +2,7 @@
* @Author: zhoux zhouxia@supervision.ltd * @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-14 15:49:36 * @Date: 2023-11-14 15:49:36
* @LastEditors: zhoux zhouxia@supervision.ltd * @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-15 16:47:40 * @LastEditTime: 2023-11-16 15:10:41
* @FilePath: \general-ai-platform-web\src\components\TableActionCard\index.tsx * @FilePath: \general-ai-platform-web\src\components\TableActionCard\index.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
@ -12,8 +12,13 @@ import { Dropdown } from 'antd';
import React from 'react'; import React from 'react';
//TODO 表单的操作按钮集合 key的报错未解决 //TODO 表单的操作按钮集合 key的报错未解决
type TableActionItemProps = { type actionsProps = {
renderActions: any[]; key: string;
renderDom: any
}
export type TableActionItemProps = {
renderActions: actionsProps[];
}; };
const TableActionCard: React.FC<TableActionItemProps> = (props) => { const TableActionCard: React.FC<TableActionItemProps> = (props) => {
@ -41,14 +46,14 @@ const TableActionCard: React.FC<TableActionItemProps> = (props) => {
<div> <div>
{prevActions.map((item) => { {prevActions.map((item) => {
return ( return (
<span style={{ padding: 4 }} key={item.key}> <span style={{ paddingRight: 8 }} key={item.key}>
{item.renderDom} {item.renderDom}
</span> </span>
); );
})} })}
{moreActions.length ? ( {moreActions.length ? (
<Dropdown menu={{ items: moreActions }}> <Dropdown menu={{ items: moreActions }}>
<a style={{ paddingLeft: 4 }}> <a>
<DownOutlined /> <DownOutlined />
</a> </a>

@ -0,0 +1,55 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-16 14:30:15
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-16 16:22:15
* @FilePath: \general-ai-platform-web\src\components\BatchOperation\isBatchDelete.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
// import { useIntl } from '@ant-design/pro-components';
import { useIntl } from '@umijs/max';
import { Button, Popconfirm } from 'antd';
import { FormattedMessage } from 'react-intl';
type isConfirmActionProps = {
// eslint-disable-next-line @typescript-eslint/ban-types
confirmAction: Function;
title: string;
description?: string;
buttonText?: string;
buttonFormatText?: string;
};
const IsConfirmAction: React.FC<isConfirmActionProps> = (props) => {
const intl = useIntl();
const description = props.description || `确认${props.title}吗?`;
return (
<Popconfirm
title={props.title}
description={description}
onConfirm={() => {
props.confirmAction();
}}
onCancel={() => {}}
okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })}
cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })}
>
<Button
type="link"
size="small"
onClick={() => {
// setPublishModalOpen(true);
}}
>
{/* 自定义文案优先 */}
{props.buttonText ? (
props.buttonText
) : (
<FormattedMessage id={props.buttonFormatText} defaultMessage="$$$" />
)}
</Button>
</Popconfirm>
);
};
export default IsConfirmAction;

@ -0,0 +1,44 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-16 14:30:15
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-16 14:56:27
* @FilePath: \general-ai-platform-web\src\components\BatchOperation\isBatchDelete.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
// import { useIntl } from '@ant-design/pro-components';
import { useIntl } from '@umijs/max';
import { Button, Popconfirm } from 'antd';
import { FormattedMessage } from 'react-intl';
type IsDeleteProps = {
// eslint-disable-next-line @typescript-eslint/ban-types
deleteApi: Function;
};
const IsDelete: React.FC<IsDeleteProps> = (props) => {
const intl = useIntl();
return (
<Popconfirm
key="destroy"
placement="topLeft"
title={intl.formatMessage({ id: 'common.tip.title', defaultMessage: '$$$' })}
description={intl.formatMessage({
id: 'common.modal.table.delete.content',
defaultMessage: '$$$',
})}
okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })}
cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })}
onConfirm={() => {
props.deleteApi();
}}
>
<Button type="link" size="small" danger>
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" />
</Button>
</Popconfirm>
);
};
export default IsDelete;

@ -1,10 +1,5 @@
/* /**
* @Author: zhoux zhouxia@supervision.ltd * 使
* @Date: 2023-11-14 17:03:13
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-15 13:27:35
* @FilePath: \general-ai-platform-web\src\components\TablePaginationCard\index.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
import { TableDropdown } from '@ant-design/pro-components'; import { TableDropdown } from '@ant-design/pro-components';
import React from 'react'; import React from 'react';

@ -115,13 +115,20 @@ ol {
.theme_bg_color { .theme_bg_color {
background-color: #155BD4; background-color: #155BD4;
} }
.ant-btn-link.ant-btn-dangerous { .ant-btn-link.ant-btn-dangerous,
.ant-btn-default.ant-btn-dangerous {
color: #E80D0D; color: #E80D0D;
} }
.ant-btn-default.ant-btn-dangerous {
border-color: #E80D0D;
}
.ant-menu-light .ant-menu-item-selected, .ant-menu-light .ant-menu-item-selected,
.ant-menu-light > .ant-menu .ant-menu-item-selected { .ant-menu-light > .ant-menu .ant-menu-item-selected {
background-color: rgba(21, 91, 212, 0.1); background-color: rgba(21, 91, 212, 0.1);
} }
.ant-select-dropdown .ant-select-item-option-active:not(.ant-select-item-option-disabled) {
background-color: rgba(21, 91, 212, 0.1);
}
/* 表单 */ /* 表单 */
.ant-form-item { .ant-form-item {
margin-bottom: 16px; margin-bottom: 16px;
@ -130,6 +137,9 @@ ol {
background-color: rgba(21, 91, 212, 0.1); background-color: rgba(21, 91, 212, 0.1);
border-color: #155BD4; border-color: #155BD4;
} }
.ant-pro-form-group-container {
gap: 0px 16px !important;
}
.flex-cc { .flex-cc {
display: flex; display: flex;
align-items: center; align-items: center;
@ -143,3 +153,5 @@ ol {
.w100 { .w100 {
width: 100%; width: 100%;
} }
/* UI // TODO 11-17
*/

@ -139,14 +139,19 @@ ol {
background-color: #155BD4; background-color: #155BD4;
} }
.ant-btn-link.ant-btn-dangerous { .ant-btn-link.ant-btn-dangerous, .ant-btn-default.ant-btn-dangerous {
color: #E80D0D; color: #E80D0D;
} }
.ant-btn-default.ant-btn-dangerous{
border-color: #E80D0D;
}
.ant-menu-light .ant-menu-item-selected, .ant-menu-light>.ant-menu .ant-menu-item-selected { .ant-menu-light .ant-menu-item-selected, .ant-menu-light>.ant-menu .ant-menu-item-selected {
// color: red;
background-color: rgba(#155BD4, 0.1); background-color: rgba(#155BD4, 0.1);
}
.ant-select-dropdown .ant-select-item-option-active:not(.ant-select-item-option-disabled) {
background-color: rgba(#155BD4, 0.1);
} }
@ -159,6 +164,10 @@ ol {
background-color: rgba(#155BD4, 0.1); background-color: rgba(#155BD4, 0.1);
border-color: #155BD4; border-color: #155BD4;
} }
// 表单项之间间距
.ant-pro-form-group-container{
gap: 0px 16px !important;
}
// .gn .ant-steps-item-finish .ant-steps-item-icon // .gn .ant-steps-item-finish .ant-steps-item-icon
.flex-cc{ .flex-cc{
@ -175,4 +184,20 @@ ol {
.w100{ .w100{
width: 100%; width: 100%;
} }
/* UI 规范表 // TODO 11-17启动
*/
.gn {
.p1 {
// line-height: ;
}
}
// .p1{
// }

@ -1,4 +1,6 @@
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TableActionCard from '@/components/TableActionCard'; import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete';
import { ColumnDrawer as ModelCategoryColumnDrawer } from '@/pages/Resource/ModelCategoryList/components/ColumnDrawer'; import { ColumnDrawer as ModelCategoryColumnDrawer } from '@/pages/Resource/ModelCategoryList/components/ColumnDrawer';
import { ModelCategoryColumns } from '@/pages/Resource/ModelCategoryList/components/Columns'; import { ModelCategoryColumns } from '@/pages/Resource/ModelCategoryList/components/Columns';
import { import {
@ -11,13 +13,13 @@ import {
postModelCategoryGetModelCategoryFkSelect, postModelCategoryGetModelCategoryFkSelect,
postModelCategoryGetModelCategoryNames, postModelCategoryGetModelCategoryNames,
} from '@/services/resource/ModelCategory'; } from '@/services/resource/ModelCategory';
import { ExclamationCircleOutlined, PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components'; import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { PageContainer, ProFormSelect, ProTable } from '@ant-design/pro-components'; import { PageContainer, ProFormSelect, ProTable } from '@ant-design/pro-components';
import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max'; import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max';
import { Button, Modal, Popconfirm, message } from 'antd'; import { Button, message } from 'antd';
import React, { useRef, useState } from 'react'; import React, { useRef, useState } from 'react';
import { proTableCommonOptions } from '../../../../config/defaultTable'; import { proTableCommonOptions, proTablePaginationOptions } from '../../../../config/defaultTable';
import CreateForm from './components/CreateForm'; import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm'; import UpdateForm from './components/UpdateForm';
// import TablePaginationCard, { TablePaginationCardProps } from '@/components/TablePaginationCard'; // import TablePaginationCard, { TablePaginationCardProps } from '@/components/TablePaginationCard';
@ -256,14 +258,9 @@ const AlgorithmModelList: React.FC = () => {
valueType: 'option', valueType: 'option',
fixed: 'right', fixed: 'right',
key: 'option', key: 'option',
// width: 140,
render: (_, record) => [ render: (_, record) => [
// <Access
// accessible={access.canUpdate(history.location.pathname)}
// key={`${history.location.pathname}-add`}
// >
// eslint-disable-next-line react/jsx-key
<TableActionCard <TableActionCard
key="TableActionCardRef"
renderActions={[ renderActions={[
{ {
key: 'detail', key: 'detail',
@ -301,29 +298,15 @@ const AlgorithmModelList: React.FC = () => {
{ {
key: 'destroy', key: 'destroy',
renderDom: ( renderDom: (
<Popconfirm <IsDelete
key="destroy" deleteApi={() => {
placement="topLeft"
title={intl.formatMessage({ id: 'common.tip.title', defaultMessage: '$$$' })}
description={intl.formatMessage({
id: 'common.modal.table.delete.content',
defaultMessage: '$$$',
})}
okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })}
cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })}
onConfirm={() => {
handleDestroy(record).then(() => {}); handleDestroy(record).then(() => {});
}} }}
> ></IsDelete>
<Button type="link" size="small" danger>
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" />
</Button>
</Popconfirm>
), ),
}, },
]} ]}
></TableActionCard>, ></TableActionCard>,
// </Access>,
], ],
}, },
]; ];
@ -348,14 +331,9 @@ const AlgorithmModelList: React.FC = () => {
setCategoryFkIdIds(CategoryFkIdIds); setCategoryFkIdIds(CategoryFkIdIds);
}} }}
pagination={{ pagination={{
showSizeChanger: true, ...proTablePaginationOptions,
// showQuickJumper: true,
pageSize: currentPageSize, pageSize: currentPageSize,
onChange: (page, pageSize) => setCurrentPageSize(pageSize), onChange: (page, pageSize) => setCurrentPageSize(pageSize),
showTotal: (total) => `${total}`,
// pageSize: 10,
// showSizeChanger: true,
// pageSizeOptions: ['10', '20', '30', '40'],
}} }}
// components={{ // components={{
// pagination: TablePaginationCard as React.FC<TablePaginationCardProps>, // pagination: TablePaginationCard as React.FC<TablePaginationCardProps>,
@ -368,42 +346,17 @@ const AlgorithmModelList: React.FC = () => {
return ( return (
<> <>
{selectedRowsState?.length > 0 && ( {selectedRowsState?.length > 0 && (
<Button <IsBatchDelete
danger deleteApi={() => {
onClick={async () => { deleteAlgorithmModelDeleteAlgorithmModelByIds({
Modal.confirm({ ids: selectedRowsState.map((v: API.AlgorithmModel) => {
icon: <ExclamationCircleOutlined />, return v.id as number;
title: intl.formatMessage({
id: 'common.modal.table.delete.title',
defaultMessage: '$$$',
}),
content: intl.formatMessage({
id: 'common.modal.table.delete.content',
defaultMessage: '$$$',
}), }),
okText: intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' }), }).then(() => {
cancelText: intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' }), actionRef.current?.reloadAndRest?.();
onOk() {
// TODO 未对接批量删除接口
deleteAlgorithmModelDeleteAlgorithmModelByIds({
ids: selectedRowsState.map((v: API.AlgorithmModel) => {
return v.id as number;
}),
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
},
onCancel() {
console.log('Cancel');
},
}); });
}} }}
> />
<FormattedMessage
id="pages.searchTable.batchDeletion"
defaultMessage="Batch deletion"
/>
</Button>
)} )}
</> </>
); );
@ -496,4 +449,4 @@ const AlgorithmModelList: React.FC = () => {
); );
}; };
export default AlgorithmModelList; export default AlgorithmModelList;

@ -1,3 +1,6 @@
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete';
import { ColumnDrawer as ProjectColumnDrawer } from '@/pages/Project/ProjectList/components/ColumnDrawer'; import { ColumnDrawer as ProjectColumnDrawer } from '@/pages/Project/ProjectList/components/ColumnDrawer';
import { ProjectColumns } from '@/pages/Project/ProjectList/components/Columns'; import { ProjectColumns } from '@/pages/Project/ProjectList/components/Columns';
import { import {
@ -7,19 +10,18 @@ import {
} from '@/services/project/Project'; } from '@/services/project/Project';
import { import {
deleteBusinessImageDeleteBusinessImage, deleteBusinessImageDeleteBusinessImage,
deleteBusinessImageDeleteBusinessImageByIds,
postBusinessImageGetBusinessImageList, postBusinessImageGetBusinessImageList,
} from '@/services/resource/BusinessImage'; } from '@/services/resource/BusinessImage';
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components'; import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { FooterToolbar, PageContainer, ProFormSelect, ProTable } from '@ant-design/pro-components'; import { PageContainer, ProFormSelect, ProTable } from '@ant-design/pro-components';
import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max'; import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max';
import { Button, Popconfirm, message } from 'antd'; import { Button, message } from 'antd';
import React, { useRef, useState } from 'react'; import React, { useRef, useState } from 'react';
import { proTableCommonOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer'; import { ColumnDrawer } from './components/ColumnDrawer';
import CreateForm from './components/CreateForm'; import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm'; import UpdateForm from './components/UpdateForm';
import { proTableCommonOptions } from '../../../../config/defaultTable';
const BusinessImageList: React.FC = () => { const BusinessImageList: React.FC = () => {
/** /**
* @en-US Pop-up window of new window * @en-US Pop-up window of new window
@ -268,39 +270,37 @@ const BusinessImageList: React.FC = () => {
valueType: 'option', valueType: 'option',
fixed: 'right', fixed: 'right',
render: (_, record) => [ render: (_, record) => [
<Access <TableActionCard
accessible={access.canUpdate(history.location.pathname)} key="TableActionCardRef"
key={`${history.location.pathname}-add`} renderActions={[
> {
<Button key: 'update',
key="update" renderDom: (
type="link" <Button
size="small" key="update"
onClick={() => { type="link"
setUpdateModalOpen(true); size="small"
setCurrentRow(record); onClick={() => {
}} setUpdateModalOpen(true);
> setCurrentRow(record);
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" /> }}
</Button> >
<Popconfirm <FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
placement="topLeft" </Button>
title={intl.formatMessage({ id: 'common.tip.title', defaultMessage: '$$$' })} ),
description={intl.formatMessage({ },
id: 'common.modal.table.delete.content', {
defaultMessage: '$$$', key: 'destroy',
})} renderDom: (
okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })} <IsDelete
cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })} deleteApi={() => {
onConfirm={() => { handleDestroy(record).then(() => {});
handleDestroy(record).then(() => {}); }}
}} ></IsDelete>
> ),
<Button key="destroy" type="link" size="small" danger> },
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" /> ]}
</Button> ></TableActionCard>,
</Popconfirm>
</Access>,
], ],
}, },
]; ];
@ -319,7 +319,6 @@ const BusinessImageList: React.FC = () => {
}} }}
search={{ search={{
labelWidth: 'auto', labelWidth: 'auto',
}} }}
onDataSourceChange={(data) => { onDataSourceChange={(data) => {
let ProjectFkIdIds: any = data.map((v) => { let ProjectFkIdIds: any = data.map((v) => {
@ -335,7 +334,19 @@ const BusinessImageList: React.FC = () => {
persistenceKey: 'business_image_list', persistenceKey: 'business_image_list',
persistenceType: 'localStorage', persistenceType: 'localStorage',
}} }}
// TODO 此处需要补一个批量删除 tableAlertOptionRender={() => {
return (
<>
{selectedRowsState?.length > 0 && (
<IsBatchDelete
deleteApi={() => {
// TODO 未对接批量删除接口
}}
/>
)}
</>
);
}}
toolBarRender={() => [ toolBarRender={() => [
<Access <Access
accessible={access.canUpdate(history.location.pathname)} accessible={access.canUpdate(history.location.pathname)}
@ -401,34 +412,6 @@ const BusinessImageList: React.FC = () => {
}, },
}} }}
/> />
{/* {selectedRowsState?.length > 0 && (
<FooterToolbar
extra={
<div>
<FormattedMessage id="pages.searchTable.chosen" defaultMessage="Chosen" />{' '}
<a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{' '}
<FormattedMessage id="pages.searchTable.item" defaultMessage="$$$" />
</div>
}
>
<Button
onClick={async () => {
deleteBusinessImageDeleteBusinessImageByIds({
ids: selectedRowsState.map((v: API.BusinessImage) => {
return v.id as number;
}),
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
}}
>
<FormattedMessage
id="pages.searchTable.batchDeletion"
defaultMessage="Batch deletion"
/>
</Button>
</FooterToolbar>
)} */}
<CreateForm <CreateForm
createModalOpen={createModalOpen} createModalOpen={createModalOpen}
values={currentRow || {}} values={currentRow || {}}

@ -1,3 +1,6 @@
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete';
import { import {
deleteModelCategoryDeleteModelCategory, deleteModelCategoryDeleteModelCategory,
deleteModelCategoryDeleteModelCategoryByIds, deleteModelCategoryDeleteModelCategoryByIds,
@ -5,14 +8,14 @@ import {
} from '@/services/resource/ModelCategory'; } from '@/services/resource/ModelCategory';
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components'; import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { FooterToolbar, PageContainer, ProTable } from '@ant-design/pro-components'; import { PageContainer, ProTable } from '@ant-design/pro-components';
import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max'; import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max';
import { Button, Popconfirm, message } from 'antd'; import { Button, message } from 'antd';
import React, { useRef, useState } from 'react'; import React, { useRef, useState } from 'react';
import { proTableCommonOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer'; import { ColumnDrawer } from './components/ColumnDrawer';
import CreateForm from './components/CreateForm'; import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm'; import UpdateForm from './components/UpdateForm';
import { proTableCommonOptions } from '../../../../config/defaultTable';
const ModelCategoryList: React.FC = () => { const ModelCategoryList: React.FC = () => {
/** /**
* @en-US Pop-up window of new window * @en-US Pop-up window of new window
@ -135,39 +138,37 @@ const ModelCategoryList: React.FC = () => {
valueType: 'option', valueType: 'option',
fixed: 'right', fixed: 'right',
render: (_, record) => [ render: (_, record) => [
<Access <TableActionCard
accessible={access.canUpdate(history.location.pathname)} key="TableActionCardRef"
key={`${history.location.pathname}-add`} renderActions={[
> {
<Button key: 'update',
key="update" renderDom: (
type="link" <Button
size="small" key="update"
onClick={() => { type="link"
setUpdateModalOpen(true); size="small"
setCurrentRow(record); onClick={() => {
}} setUpdateModalOpen(true);
> setCurrentRow(record);
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" /> }}
</Button> >
<Popconfirm <FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
placement="topLeft" </Button>
title={intl.formatMessage({ id: 'common.tip.title', defaultMessage: '$$$' })} ),
description={intl.formatMessage({ },
id: 'common.modal.table.delete.content', {
defaultMessage: '$$$', key: 'destroy',
})} renderDom: (
okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })} <IsDelete
cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })} deleteApi={() => {
onConfirm={() => { handleDestroy(record).then(() => {});
handleDestroy(record).then(() => {}); }}
}} ></IsDelete>
> ),
<Button key="destroy" type="link" size="small" danger> },
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" /> ]}
</Button> ></TableActionCard>,
</Popconfirm>
</Access>,
], ],
}, },
]; ];
@ -193,6 +194,26 @@ const ModelCategoryList: React.FC = () => {
persistenceKey: 'model_category_list', persistenceKey: 'model_category_list',
persistenceType: 'localStorage', persistenceType: 'localStorage',
}} }}
tableAlertOptionRender={() => {
return (
<>
{selectedRowsState?.length > 0 && (
<IsBatchDelete
deleteApi={() => {
// TODO 需要联调批量删除
deleteModelCategoryDeleteModelCategoryByIds({
ids: selectedRowsState.map((v: API.ModelCategory) => {
return v.id as number;
}),
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
}}
/>
)}
</>
);
}}
toolBarRender={() => [ toolBarRender={() => [
<Access <Access
accessible={access.canUpdate(history.location.pathname)} accessible={access.canUpdate(history.location.pathname)}
@ -240,34 +261,7 @@ const ModelCategoryList: React.FC = () => {
}, },
}} }}
/> />
{selectedRowsState?.length > 0 && (
<FooterToolbar
extra={
<div>
<FormattedMessage id="pages.searchTable.chosen" defaultMessage="Chosen" />{' '}
<a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{' '}
<FormattedMessage id="pages.searchTable.item" defaultMessage="$$$" />
</div>
}
>
<Button
onClick={async () => {
deleteModelCategoryDeleteModelCategoryByIds({
ids: selectedRowsState.map((v: API.ModelCategory) => {
return v.id as number;
}),
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
}}
>
<FormattedMessage
id="pages.searchTable.batchDeletion"
defaultMessage="Batch deletion"
/>
</Button>
</FooterToolbar>
)}
<CreateForm <CreateForm
createModalOpen={createModalOpen} createModalOpen={createModalOpen}
values={currentRow || {}} values={currentRow || {}}

@ -1,3 +1,6 @@
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete';
import { ColumnDrawer as ModelVersionColumnDrawer } from '@/pages/Resource/ModelVersionList/components/ColumnDrawer'; import { ColumnDrawer as ModelVersionColumnDrawer } from '@/pages/Resource/ModelVersionList/components/ColumnDrawer';
import { ModelVersionColumns } from '@/pages/Resource/ModelVersionList/components/Columns'; import { ModelVersionColumns } from '@/pages/Resource/ModelVersionList/components/Columns';
import { import {
@ -12,14 +15,14 @@ import {
} from '@/services/resource/ModelVersion'; } from '@/services/resource/ModelVersion';
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components'; import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { FooterToolbar, PageContainer, ProFormSelect, ProTable } from '@ant-design/pro-components'; import { PageContainer, ProFormSelect, ProTable } from '@ant-design/pro-components';
import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max'; import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max';
import { Button, Popconfirm, message } from 'antd'; import { Button, message } from 'antd';
import React, { useRef, useState } from 'react'; import React, { useRef, useState } from 'react';
import { proTableCommonOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer'; import { ColumnDrawer } from './components/ColumnDrawer';
import CreateForm from './components/CreateForm'; import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm'; import UpdateForm from './components/UpdateForm';
import { proTableCommonOptions } from '../../../../config/defaultTable';
const ModelImageList: React.FC = () => { const ModelImageList: React.FC = () => {
/** /**
@ -111,6 +114,13 @@ const ModelImageList: React.FC = () => {
}; };
const columns: ProColumns<API.ModelImage>[] = [ const columns: ProColumns<API.ModelImage>[] = [
{
title: <FormattedMessage id="resource.model_image.table.list.name" defaultMessage="$$$" />,
dataIndex: 'name',
hideInSearch: true,
key: 'fixedName',
fixed: 'left',
},
{ {
title: <FormattedMessage id="resource.model_image.table.list.id" defaultMessage="id" />, title: <FormattedMessage id="resource.model_image.table.list.id" defaultMessage="id" />,
dataIndex: 'id', dataIndex: 'id',
@ -129,12 +139,6 @@ const ModelImageList: React.FC = () => {
}, },
}, },
{
title: <FormattedMessage id="resource.model_image.table.list.name" defaultMessage="$$$" />,
dataIndex: 'name',
hideInSearch: true,
},
{ {
title: ( title: (
<FormattedMessage <FormattedMessage
@ -240,39 +244,37 @@ const ModelImageList: React.FC = () => {
valueType: 'option', valueType: 'option',
fixed: 'right', fixed: 'right',
render: (_, record) => [ render: (_, record) => [
<Access <TableActionCard
accessible={access.canUpdate(history.location.pathname)} key="TableActionCardRef"
key={`${history.location.pathname}-add`} renderActions={[
> {
<Button key: 'update',
key="update" renderDom: (
type="link" <Button
size="small" key="update"
onClick={() => { type="link"
setUpdateModalOpen(true); size="small"
setCurrentRow(record); onClick={() => {
}} setUpdateModalOpen(true);
> setCurrentRow(record);
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" /> }}
</Button> >
<Popconfirm <FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
placement="topLeft" </Button>
title={intl.formatMessage({ id: 'common.tip.title', defaultMessage: '$$$' })} ),
description={intl.formatMessage({ },
id: 'common.modal.table.delete.content', {
defaultMessage: '$$$', key: 'destroy',
})} renderDom: (
okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })} <IsDelete
cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })} deleteApi={() => {
onConfirm={() => { handleDestroy(record).then(() => {});
handleDestroy(record).then(() => {}); }}
}} ></IsDelete>
> ),
<Button key="destroy" type="link" size="small" danger> },
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" /> ]}
</Button> ></TableActionCard>,
</Popconfirm>
</Access>,
], ],
}, },
]; ];
@ -304,6 +306,26 @@ const ModelImageList: React.FC = () => {
persistenceKey: 'model_image_list', persistenceKey: 'model_image_list',
persistenceType: 'localStorage', persistenceType: 'localStorage',
}} }}
tableAlertOptionRender={() => {
return (
<>
{selectedRowsState?.length > 0 && (
<IsBatchDelete
deleteApi={() => {
// TODO 需要;联调删除接口
deleteModelImageDeleteModelImageByIds({
ids: selectedRowsState.map((v: API.ModelImage) => {
return v.id as number;
}),
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
}}
/>
)}
</>
);
}}
toolBarRender={() => [ toolBarRender={() => [
<Access <Access
accessible={access.canUpdate(history.location.pathname)} accessible={access.canUpdate(history.location.pathname)}
@ -369,34 +391,6 @@ const ModelImageList: React.FC = () => {
}, },
}} }}
/> />
{selectedRowsState?.length > 0 && (
<FooterToolbar
extra={
<div>
<FormattedMessage id="pages.searchTable.chosen" defaultMessage="Chosen" />{' '}
<a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{' '}
<FormattedMessage id="pages.searchTable.item" defaultMessage="$$$" />
</div>
}
>
<Button
onClick={async () => {
deleteModelImageDeleteModelImageByIds({
ids: selectedRowsState.map((v: API.ModelImage) => {
return v.id as number;
}),
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
}}
>
<FormattedMessage
id="pages.searchTable.batchDeletion"
defaultMessage="Batch deletion"
/>
</Button>
</FooterToolbar>
)}
<CreateForm <CreateForm
createModalOpen={createModalOpen} createModalOpen={createModalOpen}
values={currentRow || {}} values={currentRow || {}}

@ -2,7 +2,7 @@
* @Author: zhoux zhouxia@supervision.ltd * @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-01 13:56:33 * @Date: 2023-11-01 13:56:33
* @LastEditors: zhoux zhouxia@supervision.ltd * @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-15 17:39:37 * @LastEditTime: 2023-11-16 17:20:17
* @FilePath: \general-ai-platform-web\src\pages\Resource\ModelVersionList\components\MyCreateForm.tsx * @FilePath: \general-ai-platform-web\src\pages\Resource\ModelVersionList\components\MyCreateForm.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
@ -338,13 +338,13 @@ const MyCreateForm: React.FC<MyCreateFormProps> = (props) => {
}, },
}} }}
/> />
{/* // TODO label字重与上面统一, 操作按钮需要与输入框对齐 */}
<ProFormList <ProFormList
name="params" name="params"
label="模型参数" label="模型参数"
actionRef={actionFormListRef} actionRef={actionFormListRef}
itemContainerRender={(doms) => { itemContainerRender={(doms) => {
return <ProForm.Group>{doms}</ProForm.Group>; return <ProForm.Group >{doms}</ProForm.Group>;
}} }}
alwaysShowItemLabel alwaysShowItemLabel
> >

@ -13,11 +13,14 @@ import {
} from '@/services/resource/ModelVersion'; } from '@/services/resource/ModelVersion';
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components'; import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { FooterToolbar, PageContainer, ProFormSelect, ProTable } from '@ant-design/pro-components'; import { PageContainer, ProFormSelect, ProTable } from '@ant-design/pro-components';
import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max'; import { Access, FormattedMessage, history, useAccess, useIntl } from '@umijs/max';
import { Button, Popconfirm, message } from 'antd'; import { Button, message } from 'antd';
// import { MenuProps } from 'rc-menu'; // import { MenuProps } from 'rc-menu';
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TableActionCard from '@/components/TableActionCard'; import TableActionCard from '@/components/TableActionCard';
import IsConfirmAction from '@/components/TableActionCard/isConfirmAction';
import IsDelete from '@/components/TableActionCard/isDelete';
import React, { useRef, useState } from 'react'; import React, { useRef, useState } from 'react';
import { proTableCommonOptions } from '../../../../config/defaultTable'; import { proTableCommonOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer'; import { ColumnDrawer } from './components/ColumnDrawer';
@ -281,117 +284,77 @@ const ModelVersionList: React.FC = () => {
valueType: 'option', valueType: 'option',
fixed: 'right', fixed: 'right',
render: (_, record) => [ render: (_, record) => [
<Access <TableActionCard
accessible={access.canUpdate(history.location.pathname)} key="TableActionCardRef"
key={`${history.location.pathname}-add`} renderActions={[
> {
<TableActionCard key: 'update',
renderActions={[ renderDom: (
{ <Button
key: 'update', key="update"
renderDom: ( type="link"
<Button size="small"
key="update" onClick={() => {
type="link" setUpdateModalOpen(true);
size="small" setCurrentRow(record);
onClick={() => { }}
setUpdateModalOpen(true); >
setCurrentRow(record); <FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
}} </Button>
> ),
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" /> },
</Button> {
), key: 'setDefault',
}, renderDom: (
{ <IsConfirmAction
key: 'setDefault', title="设为默认"
renderDom: ( buttonText="设为默认"
<Popconfirm confirmAction={() => {
key="setDefault" // setPublishModalOpen(true);
title="设为默认" putAlgorithmModelUpdateAlgorithmModel({
description="确认设置为默认版本吗?" id: record.modelFkId,
onConfirm={() => { defaultVersionFkId: record.id,
putAlgorithmModelUpdateAlgorithmModel({ })
id: record.modelFkId, .then(() => {
defaultVersionFkId: record.id, message.success(
intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }),
);
}) })
.then(() => { .catch(() => {
message.success( message.error(
intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }), intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }),
); );
}) });
.catch(() => { }}
message.error( ></IsConfirmAction>
intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }), ),
); },
}); {
}} key: 'publishModel',
onCancel={() => {}} renderDom: (
okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })} <IsConfirmAction
cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })} title="发布模型"
> buttonFormatText={'common.confirm_publish'}
<Button key="set_default" type="link" size="small"> confirmAction={() => {
// setPublishModalOpen(true);
{/* <FormattedMessage id="common.set_default" defaultMessage="$$$" /> */} // TODO 对接发布模型方法
</Button> setCurrentRow(record);
</Popconfirm> }}
), ></IsConfirmAction>
}, ),
{ },
key: 'publishModel', {
renderDom: ( key: 'destroy',
<Popconfirm renderDom: (
key="publishModel" <IsDelete
title="发布模型" deleteApi={() => {
description="确认发布模型吗?" handleDestroy(record).then(() => {});
onConfirm={() => {}} }}
onCancel={() => {}} ></IsDelete>
okText="Yes" ),
cancelText="No" },
> ]}
<Button ></TableActionCard>,
key="confirm_publish"
type="link"
size="small"
onClick={() => {
// setPublishModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage
id="common.confirm_publish"
defaultMessage="confirm_publish"
/>
</Button>
</Popconfirm>
),
},
{
key: 'destroy',
renderDom: (
<Popconfirm
key="destroy"
placement="topLeft"
title={intl.formatMessage({ id: 'common.tip.title', defaultMessage: '$$$' })}
description={intl.formatMessage({
id: 'common.modal.table.delete.content',
defaultMessage: '$$$',
})}
okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })}
cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })}
onConfirm={() => {
handleDestroy(record).then(() => {});
}}
>
<Button type="link" size="small" danger>
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" />
</Button>
</Popconfirm>
),
},
]}
></TableActionCard>
</Access>,
], ],
}, },
]; ];
@ -423,6 +386,25 @@ const ModelVersionList: React.FC = () => {
persistenceKey: 'model_version_list', persistenceKey: 'model_version_list',
persistenceType: 'localStorage', persistenceType: 'localStorage',
}} }}
tableAlertOptionRender={() => {
return (
<>
{selectedRowsState?.length > 0 && (
<IsBatchDelete
deleteApi={() => {
deleteModelVersionDeleteModelVersionByIds({
ids: selectedRowsState.map((v: API.ModelVersion) => {
return v.id as number;
}),
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
}}
/>
)}
</>
);
}}
toolBarRender={() => [ toolBarRender={() => [
<Access <Access
accessible={access.canUpdate(history.location.pathname)} accessible={access.canUpdate(history.location.pathname)}
@ -488,34 +470,6 @@ const ModelVersionList: React.FC = () => {
}, },
}} }}
/> />
{selectedRowsState?.length > 0 && (
<FooterToolbar
extra={
<div>
<FormattedMessage id="pages.searchTable.chosen" defaultMessage="Chosen" />{' '}
<a style={{ fontWeight: 600 }}>{selectedRowsState.length}</a>{' '}
<FormattedMessage id="pages.searchTable.item" defaultMessage="$$$" />
</div>
}
>
<Button
onClick={async () => {
deleteModelVersionDeleteModelVersionByIds({
ids: selectedRowsState.map((v: API.ModelVersion) => {
return v.id as number;
}),
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
}}
>
<FormattedMessage
id="pages.searchTable.batchDeletion"
defaultMessage="Batch deletion"
/>
</Button>
</FooterToolbar>
)}
<MyCreateForm <MyCreateForm
createModalOpen={createModalOpen} createModalOpen={createModalOpen}
values={currentRow || {}} values={currentRow || {}}
@ -534,7 +488,6 @@ const ModelVersionList: React.FC = () => {
{/* values={currentRow || {}}*/} {/* values={currentRow || {}}*/}
{/* reload={actionRef.current?.reload}*/} {/* reload={actionRef.current?.reload}*/}
{/*></PublishForm>*/} {/*></PublishForm>*/}
<ColumnDrawer <ColumnDrawer
handleDrawer={handleColumnDrawer} handleDrawer={handleColumnDrawer}
isShowDetail={showDetail} isShowDetail={showDetail}

Loading…
Cancel
Save