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

develop
zhoux 1 year ago
parent bd2c1ede98
commit 4fc102c7d6

@ -2,7 +2,7 @@
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-13 14:19:57
* @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
* @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 formItemGap = 16
// Small 560
export const proFormSmallModelWidth: number = 560;
export const proFormSmallItemStyleProps: Record<string, any> = {
@ -25,12 +25,12 @@ export const proFormSmallItemStyleProps: Record<string, any> = {
export const proFormModelWidth: number = 804;
export const proFormItemStyleProps: Record<string, any> = {
width: proFormModelWidth - formBoxMargin, // 一列
column2Width: (proFormModelWidth - formBoxMargin - 32)/2 , // 两列
column2Width: (proFormModelWidth - formBoxMargin - formItemGap)/2 , // 两列
};
// max 968
export const proFormMaxModelWidth: number = 968;
export const proFormMaxItemStyleProps: Record<string, any> = {
width: proFormMaxModelWidth - formBoxMargin,
column2Width: (proFormMaxModelWidth - formBoxMargin - 32)/2 , // 两列
column2Width: (proFormMaxModelWidth - formBoxMargin - formItemGap)/2 , // 两列
};

@ -2,11 +2,12 @@
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-13 11:32:26
* @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
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { ProColumns } from "@ant-design/pro-components";
import { PaginationProps } from "antd";
// 通用列表配置
export const proTableCommonOptions: Record<string,any> = {
scrollX: 'max-content', // 保证左右侧列的固定,并能保证没列标题不换行
@ -24,6 +25,13 @@ export const proTableActionColumnOptions: Record<string,any> = {
fixed: 'right',
}
// 分页器配置
export const proTablePaginationOptions: PaginationProps = {
showSizeChanger: true,
// showQuickJumper: true,
showTotal: (total) => `${total}`,
}
// 默认索引列配置
// export const proTableIndexColumnOptions : ProColumns = {
// 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 { Badge } from 'antd';
import { FormattedMessage } from 'react-intl';
@ -12,7 +20,7 @@ const IsEnableBox: React.FC<IsEnableBoxProps> = (props) => {
const currentItem = isEnableEnum[isEnable ? '1' : '0']
return (
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
<div style={{ display: 'flex', alignItems: 'center'}}>
<Badge status={isEnable ? 'success' : 'default'}></Badge>
<span style={{color: currentItem.color, padding: 4 }}>
<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
* @Date: 2023-11-14 15:49:36
* @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
* @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';
//TODO 表单的操作按钮集合 key的报错未解决
type TableActionItemProps = {
renderActions: any[];
type actionsProps = {
key: string;
renderDom: any
}
export type TableActionItemProps = {
renderActions: actionsProps[];
};
const TableActionCard: React.FC<TableActionItemProps> = (props) => {
@ -41,14 +46,14 @@ const TableActionCard: React.FC<TableActionItemProps> = (props) => {
<div>
{prevActions.map((item) => {
return (
<span style={{ padding: 4 }} key={item.key}>
<span style={{ paddingRight: 8 }} key={item.key}>
{item.renderDom}
</span>
);
})}
{moreActions.length ? (
<Dropdown menu={{ items: moreActions }}>
<a style={{ paddingLeft: 4 }}>
<a>
<DownOutlined />
</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 React from 'react';

@ -115,13 +115,20 @@ ol {
.theme_bg_color {
background-color: #155BD4;
}
.ant-btn-link.ant-btn-dangerous {
.ant-btn-link.ant-btn-dangerous,
.ant-btn-default.ant-btn-dangerous {
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 {
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 {
margin-bottom: 16px;
@ -130,6 +137,9 @@ ol {
background-color: rgba(21, 91, 212, 0.1);
border-color: #155BD4;
}
.ant-pro-form-group-container {
gap: 0px 16px !important;
}
.flex-cc {
display: flex;
align-items: center;
@ -143,3 +153,5 @@ ol {
.w100 {
width: 100%;
}
/* UI // TODO 11-17
*/

@ -139,14 +139,19 @@ ol {
background-color: #155BD4;
}
.ant-btn-link.ant-btn-dangerous {
.ant-btn-link.ant-btn-dangerous, .ant-btn-default.ant-btn-dangerous {
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 {
// color: red;
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);
border-color: #155BD4;
}
// 表单项之间间距
.ant-pro-form-group-container{
gap: 0px 16px !important;
}
// .gn .ant-steps-item-finish .ant-steps-item-icon
.flex-cc{
@ -175,4 +184,20 @@ ol {
.w100{
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 IsDelete from '@/components/TableActionCard/isDelete';
import { ColumnDrawer as ModelCategoryColumnDrawer } from '@/pages/Resource/ModelCategoryList/components/ColumnDrawer';
import { ModelCategoryColumns } from '@/pages/Resource/ModelCategoryList/components/Columns';
import {
@ -11,13 +13,13 @@ import {
postModelCategoryGetModelCategoryFkSelect,
postModelCategoryGetModelCategoryNames,
} 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 { PageContainer, ProFormSelect, ProTable } from '@ant-design/pro-components';
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 { proTableCommonOptions } from '../../../../config/defaultTable';
import { proTableCommonOptions, proTablePaginationOptions } from '../../../../config/defaultTable';
import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm';
// import TablePaginationCard, { TablePaginationCardProps } from '@/components/TablePaginationCard';
@ -256,14 +258,9 @@ const AlgorithmModelList: React.FC = () => {
valueType: 'option',
fixed: 'right',
key: 'option',
// width: 140,
render: (_, record) => [
// <Access
// accessible={access.canUpdate(history.location.pathname)}
// key={`${history.location.pathname}-add`}
// >
// eslint-disable-next-line react/jsx-key
<TableActionCard
key="TableActionCardRef"
renderActions={[
{
key: 'detail',
@ -301,29 +298,15 @@ const AlgorithmModelList: React.FC = () => {
{
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={() => {
<IsDelete
deleteApi={() => {
handleDestroy(record).then(() => {});
}}
>
<Button type="link" size="small" danger>
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" />
</Button>
</Popconfirm>
></IsDelete>
),
},
]}
></TableActionCard>,
// </Access>,
],
},
];
@ -348,14 +331,9 @@ const AlgorithmModelList: React.FC = () => {
setCategoryFkIdIds(CategoryFkIdIds);
}}
pagination={{
showSizeChanger: true,
// showQuickJumper: true,
...proTablePaginationOptions,
pageSize: currentPageSize,
onChange: (page, pageSize) => setCurrentPageSize(pageSize),
showTotal: (total) => `${total}`,
// pageSize: 10,
// showSizeChanger: true,
// pageSizeOptions: ['10', '20', '30', '40'],
}}
// components={{
// pagination: TablePaginationCard as React.FC<TablePaginationCardProps>,
@ -368,42 +346,17 @@ const AlgorithmModelList: React.FC = () => {
return (
<>
{selectedRowsState?.length > 0 && (
<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: '$$$',
<IsBatchDelete
deleteApi={() => {
deleteAlgorithmModelDeleteAlgorithmModelByIds({
ids: selectedRowsState.map((v: API.AlgorithmModel) => {
return v.id as number;
}),
okText: intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' }),
cancelText: intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' }),
onOk() {
// TODO 未对接批量删除接口
deleteAlgorithmModelDeleteAlgorithmModelByIds({
ids: selectedRowsState.map((v: API.AlgorithmModel) => {
return v.id as number;
}),
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
},
onCancel() {
console.log('Cancel');
},
}).then(() => {
actionRef.current?.reloadAndRest?.();
});
}}
>
<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 { ProjectColumns } from '@/pages/Project/ProjectList/components/Columns';
import {
@ -7,19 +10,18 @@ import {
} from '@/services/project/Project';
import {
deleteBusinessImageDeleteBusinessImage,
deleteBusinessImageDeleteBusinessImageByIds,
postBusinessImageGetBusinessImageList,
} from '@/services/resource/BusinessImage';
import { PlusOutlined } from '@ant-design/icons';
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 { Button, Popconfirm, message } from 'antd';
import { Button, message } from 'antd';
import React, { useRef, useState } from 'react';
import { proTableCommonOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer';
import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm';
import { proTableCommonOptions } from '../../../../config/defaultTable';
const BusinessImageList: React.FC = () => {
/**
* @en-US Pop-up window of new window
@ -268,39 +270,37 @@ const BusinessImageList: React.FC = () => {
valueType: 'option',
fixed: 'right',
render: (_, record) => [
<Access
accessible={access.canUpdate(history.location.pathname)}
key={`${history.location.pathname}-add`}
>
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
</Button>
<Popconfirm
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 key="destroy" type="link" size="small" danger>
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" />
</Button>
</Popconfirm>
</Access>,
<TableActionCard
key="TableActionCardRef"
renderActions={[
{
key: 'update',
renderDom: (
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
</Button>
),
},
{
key: 'destroy',
renderDom: (
<IsDelete
deleteApi={() => {
handleDestroy(record).then(() => {});
}}
></IsDelete>
),
},
]}
></TableActionCard>,
],
},
];
@ -319,7 +319,6 @@ const BusinessImageList: React.FC = () => {
}}
search={{
labelWidth: 'auto',
}}
onDataSourceChange={(data) => {
let ProjectFkIdIds: any = data.map((v) => {
@ -335,7 +334,19 @@ const BusinessImageList: React.FC = () => {
persistenceKey: 'business_image_list',
persistenceType: 'localStorage',
}}
// TODO 此处需要补一个批量删除
tableAlertOptionRender={() => {
return (
<>
{selectedRowsState?.length > 0 && (
<IsBatchDelete
deleteApi={() => {
// TODO 未对接批量删除接口
}}
/>
)}
</>
);
}}
toolBarRender={() => [
<Access
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
createModalOpen={createModalOpen}
values={currentRow || {}}

@ -1,3 +1,6 @@
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TableActionCard from '@/components/TableActionCard';
import IsDelete from '@/components/TableActionCard/isDelete';
import {
deleteModelCategoryDeleteModelCategory,
deleteModelCategoryDeleteModelCategoryByIds,
@ -5,14 +8,14 @@ import {
} from '@/services/resource/ModelCategory';
import { PlusOutlined } from '@ant-design/icons';
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 { Button, Popconfirm, message } from 'antd';
import { Button, message } from 'antd';
import React, { useRef, useState } from 'react';
import { proTableCommonOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer';
import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm';
import { proTableCommonOptions } from '../../../../config/defaultTable';
const ModelCategoryList: React.FC = () => {
/**
* @en-US Pop-up window of new window
@ -135,39 +138,37 @@ const ModelCategoryList: React.FC = () => {
valueType: 'option',
fixed: 'right',
render: (_, record) => [
<Access
accessible={access.canUpdate(history.location.pathname)}
key={`${history.location.pathname}-add`}
>
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
</Button>
<Popconfirm
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 key="destroy" type="link" size="small" danger>
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" />
</Button>
</Popconfirm>
</Access>,
<TableActionCard
key="TableActionCardRef"
renderActions={[
{
key: 'update',
renderDom: (
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
</Button>
),
},
{
key: 'destroy',
renderDom: (
<IsDelete
deleteApi={() => {
handleDestroy(record).then(() => {});
}}
></IsDelete>
),
},
]}
></TableActionCard>,
],
},
];
@ -193,6 +194,26 @@ const ModelCategoryList: React.FC = () => {
persistenceKey: 'model_category_list',
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={() => [
<Access
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
createModalOpen={createModalOpen}
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 { ModelVersionColumns } from '@/pages/Resource/ModelVersionList/components/Columns';
import {
@ -12,14 +15,14 @@ import {
} from '@/services/resource/ModelVersion';
import { PlusOutlined } from '@ant-design/icons';
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 { Button, Popconfirm, message } from 'antd';
import { Button, message } from 'antd';
import React, { useRef, useState } from 'react';
import { proTableCommonOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer';
import CreateForm from './components/CreateForm';
import UpdateForm from './components/UpdateForm';
import { proTableCommonOptions } from '../../../../config/defaultTable';
const ModelImageList: React.FC = () => {
/**
@ -111,6 +114,13 @@ const ModelImageList: React.FC = () => {
};
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" />,
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: (
<FormattedMessage
@ -240,39 +244,37 @@ const ModelImageList: React.FC = () => {
valueType: 'option',
fixed: 'right',
render: (_, record) => [
<Access
accessible={access.canUpdate(history.location.pathname)}
key={`${history.location.pathname}-add`}
>
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
</Button>
<Popconfirm
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 key="destroy" type="link" size="small" danger>
<FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" />
</Button>
</Popconfirm>
</Access>,
<TableActionCard
key="TableActionCardRef"
renderActions={[
{
key: 'update',
renderDom: (
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
</Button>
),
},
{
key: 'destroy',
renderDom: (
<IsDelete
deleteApi={() => {
handleDestroy(record).then(() => {});
}}
></IsDelete>
),
},
]}
></TableActionCard>,
],
},
];
@ -304,6 +306,26 @@ const ModelImageList: React.FC = () => {
persistenceKey: 'model_image_list',
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={() => [
<Access
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
createModalOpen={createModalOpen}
values={currentRow || {}}

@ -2,7 +2,7 @@
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-01 13:56:33
* @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
* @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
name="params"
label="模型参数"
actionRef={actionFormListRef}
itemContainerRender={(doms) => {
return <ProForm.Group>{doms}</ProForm.Group>;
return <ProForm.Group >{doms}</ProForm.Group>;
}}
alwaysShowItemLabel
>

@ -13,11 +13,14 @@ import {
} from '@/services/resource/ModelVersion';
import { PlusOutlined } from '@ant-design/icons';
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 { Button, Popconfirm, message } from 'antd';
import { Button, message } from 'antd';
// import { MenuProps } from 'rc-menu';
import IsBatchDelete from '@/components/BatchOperation/isBatchDelete';
import TableActionCard from '@/components/TableActionCard';
import IsConfirmAction from '@/components/TableActionCard/isConfirmAction';
import IsDelete from '@/components/TableActionCard/isDelete';
import React, { useRef, useState } from 'react';
import { proTableCommonOptions } from '../../../../config/defaultTable';
import { ColumnDrawer } from './components/ColumnDrawer';
@ -281,117 +284,77 @@ const ModelVersionList: React.FC = () => {
valueType: 'option',
fixed: 'right',
render: (_, record) => [
<Access
accessible={access.canUpdate(history.location.pathname)}
key={`${history.location.pathname}-add`}
>
<TableActionCard
renderActions={[
{
key: 'update',
renderDom: (
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
</Button>
),
},
{
key: 'setDefault',
renderDom: (
<Popconfirm
key="setDefault"
title="设为默认"
description="确认设置为默认版本吗?"
onConfirm={() => {
putAlgorithmModelUpdateAlgorithmModel({
id: record.modelFkId,
defaultVersionFkId: record.id,
<TableActionCard
key="TableActionCardRef"
renderActions={[
{
key: 'update',
renderDom: (
<Button
key="update"
type="link"
size="small"
onClick={() => {
setUpdateModalOpen(true);
setCurrentRow(record);
}}
>
<FormattedMessage id="pages.searchTable.update" defaultMessage="Update" />
</Button>
),
},
{
key: 'setDefault',
renderDom: (
<IsConfirmAction
title="设为默认"
buttonText="设为默认"
confirmAction={() => {
// setPublishModalOpen(true);
putAlgorithmModelUpdateAlgorithmModel({
id: record.modelFkId,
defaultVersionFkId: record.id,
})
.then(() => {
message.success(
intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }),
);
})
.then(() => {
message.success(
intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }),
);
})
.catch(() => {
message.error(
intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }),
);
});
}}
onCancel={() => {}}
okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })}
cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })}
>
<Button key="set_default" type="link" size="small">
{/* <FormattedMessage id="common.set_default" defaultMessage="$$$" /> */}
</Button>
</Popconfirm>
),
},
{
key: 'publishModel',
renderDom: (
<Popconfirm
key="publishModel"
title="发布模型"
description="确认发布模型吗?"
onConfirm={() => {}}
onCancel={() => {}}
okText="Yes"
cancelText="No"
>
<Button
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>,
.catch(() => {
message.error(
intl.formatMessage({ id: 'common.failure', defaultMessage: '$$$' }),
);
});
}}
></IsConfirmAction>
),
},
{
key: 'publishModel',
renderDom: (
<IsConfirmAction
title="发布模型"
buttonFormatText={'common.confirm_publish'}
confirmAction={() => {
// setPublishModalOpen(true);
// TODO 对接发布模型方法
setCurrentRow(record);
}}
></IsConfirmAction>
),
},
{
key: 'destroy',
renderDom: (
<IsDelete
deleteApi={() => {
handleDestroy(record).then(() => {});
}}
></IsDelete>
),
},
]}
></TableActionCard>,
],
},
];
@ -423,6 +386,25 @@ const ModelVersionList: React.FC = () => {
persistenceKey: 'model_version_list',
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={() => [
<Access
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
createModalOpen={createModalOpen}
values={currentRow || {}}
@ -534,7 +488,6 @@ const ModelVersionList: React.FC = () => {
{/* values={currentRow || {}}*/}
{/* reload={actionRef.current?.reload}*/}
{/*></PublishForm>*/}
<ColumnDrawer
handleDrawer={handleColumnDrawer}
isShowDetail={showDetail}

Loading…
Cancel
Save