import { CODE, IMAGES_TYPE_MAP } from '@/constants/images.constants'; import { getImagesList } from '@/services/images'; import { DeleteOutlined, EyeOutlined, SettingOutlined, } from '@ant-design/icons'; import type { TableProps } from 'antd'; import dayjs from 'dayjs'; import { Button, Checkbox, Input, message, Modal, Popconfirm, Popover, Space, Table, Tooltip, Tag, } from 'antd'; import React, { useEffect, useState } from 'react'; import { ImportModal, ModalDetailShow } from './components/modalShow/modalShow'; import './index.less'; import { ReactComponent as RefreshIcon } from '@/assets/icons/refresh.svg'; // 列配置定义 type ColumnConfig = { key: string; title: string; dataIndex?: string; width: number; render?: (text: any, record: any, index: number) => React.ReactNode; fixed?: 'left' | 'right'; defaultVisible: boolean; // 默认是否显示 alwaysVisible?: boolean; // 始终显示的列 }; type TableColumn = { title: string; dataIndex?: string; key: string; width: number; render?: any; fixed?: 'left' | 'right'; hidden?: boolean; }; const ImageList: React.FC = () => { const [images, setImages] = useState([]); const [loading, setLoading] = useState(false); const [selectedImage, setSelectedImage] = useState( null, ); const [searchText, setSearchText] = useState(''); const [detailVisible, setDetailVisible] = useState(false); const [importModalVisible, setImportModalVisible] = useState(false); const [tableParams, setTableParams] = useState({ pagination: { current: 1, pageSize: 10, }, }); const [columnSettingsVisible, setColumnSettingsVisible] = useState(false); // 表格参数变化 获取镜像列表 useEffect(() => { loadImages(); }, [ tableParams.pagination?.current, tableParams.pagination?.pageSize, tableParams?.sortOrder, tableParams?.sortField, JSON.stringify(tableParams.filters), JSON.stringify(tableParams.image_name), ]); // 定义所有列的配置 const columnConfigs: ColumnConfig[] = [ { key: 'index', title: '序号', width: 120, render: (text: any, row: any, index: number) => (tableParams.pagination?.current - 1) * tableParams.pagination?.pageSize + index + 1, defaultVisible: true, alwaysVisible: true, }, { key: 'image_name', title: '镜像名称', dataIndex: 'image_name', width: 120, defaultVisible: true, alwaysVisible: true, }, { key: 'image_type', title: '桌面类型', dataIndex: 'image_type', width: 80, render: (text: number) => { const key = text as keyof typeof IMAGES_TYPE_MAP; return {IMAGES_TYPE_MAP[key] || '--'}; }, defaultVisible: true, }, { key: 'storage_path', title: '模板存放路径', dataIndex: 'storage_path', width: 140, defaultVisible: true, }, { key: 'bt_path', title: 'BT路径', dataIndex: 'bt_path', width: 140, defaultVisible: true, }, { key: 'image_version', title: '镜像版本', dataIndex: 'image_version', width: 100, defaultVisible: true, }, { key: 'os_version', title: '操作系统', dataIndex: 'os_version', width: 100, defaultVisible: true, }, { key: 'image_status', title: '镜像状态', dataIndex: 'image_status', width: 80, render: (text: number) => {getStatusTag(text)}, defaultVisible: true, }, { key: 'create_time', title: '创建时间', dataIndex: 'create_time', width: 180, render: (text: string) => ( {dayjs(text).format('YYYY-MM-DD HH:mm:ss')} ), defaultVisible: true, }, { key: 'action', title: '操作', width: 100, fixed: 'right' as 'right', render: (_: any, record: IMAGES.ImageItem) => ( ); // 根据visibleColumns过滤显示的列 const filteredColumns = columnConfigs .map((config) => { // 对于始终显示的列 if (config.alwaysVisible) { return { title: config.title, dataIndex: config.dataIndex, key: config.key, width: config.width, render: config.render, fixed: config.fixed, hidden: undefined, }; } // 对于可控制显示/隐藏的列 return { title: config.title, dataIndex: config.dataIndex, key: config.key, width: config.width, render: config.render, fixed: config.fixed, ...(visibleColumns[config.key] ? {} : { hidden: true }), }; }) .filter((column) => !column.hidden) as TableColumn[]; // 处理表格分页、过滤和排序变化 const handleTableChange: TableProps['onChange'] = ( pagination, filters, sorter, ) => { setTableParams({ pagination: { current: pagination.current || 1, pageSize: pagination.pageSize || 10, }, filters, sortOrder: Array.isArray(sorter) ? undefined : sorter.order, sortField: Array.isArray(sorter) ? undefined : (sorter.field as string | number | undefined), }); if (pagination.pageSize !== tableParams.pagination?.pageSize) { setImages([]); } }; const handleRefresh = () => { loadImages(); }; // 导入镜像成功后的回调 const handleImportSuccess = () => { setTimeout(() => { loadImages(); }, 5000); }; // 自定义分页配置 const paginationConfig = { ...tableParams.pagination, showTotal: (total: number) => `共 ${total} 条记录`, showSizeChanger: true, showQuickJumper: true, pageSizeOptions: ['10', '20', '50', '100'], }; return (
setSearchText(e.target.value)} style={{ width: 300 }} onSearch={(value) => { setTableParams((prev) => ({ ...prev, pagination: { ...prev.pagination, current: 1, }, image_name: value, })); }} />
{detailVisible ? ( ) : null} {/* 导入弹窗 */} setImportModalVisible(false)} onImportSuccess={handleImportSuccess} /> ); }; export default ImageList;