| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| import React, { useMemo } from 'react';
|
| import { Modal, Button, Checkbox } from '@douyinfe/semi-ui';
|
|
|
| const ColumnSelectorModal = ({
|
| visible,
|
| onCancel,
|
| visibleColumns,
|
| onVisibleColumnsChange,
|
| columnKeys,
|
| t,
|
| }) => {
|
| const columnOptions = useMemo(
|
| () => [
|
| { key: columnKeys.container_name, label: t('容器名称'), required: true },
|
| { key: columnKeys.status, label: t('状态') },
|
| { key: columnKeys.time_remaining, label: t('剩余时间') },
|
| { key: columnKeys.hardware_info, label: t('硬件配置') },
|
| { key: columnKeys.created_at, label: t('创建时间') },
|
| { key: columnKeys.actions, label: t('操作'), required: true },
|
| ],
|
| [columnKeys, t],
|
| );
|
|
|
| const handleColumnVisibilityChange = (key, checked) => {
|
| const column = columnOptions.find((option) => option.key === key);
|
| if (column?.required) return;
|
| onVisibleColumnsChange({
|
| ...visibleColumns,
|
| [key]: checked,
|
| });
|
| };
|
|
|
| const handleSelectAll = (checked) => {
|
| const updated = { ...visibleColumns };
|
| columnOptions.forEach(({ key, required }) => {
|
| updated[key] = required ? true : checked;
|
| });
|
| onVisibleColumnsChange(updated);
|
| };
|
|
|
| const handleReset = () => {
|
| const defaults = columnOptions.reduce((acc, { key }) => {
|
| acc[key] = true;
|
| return acc;
|
| }, {});
|
| onVisibleColumnsChange({
|
| ...visibleColumns,
|
| ...defaults,
|
| });
|
| };
|
|
|
| const allSelected = columnOptions.every(
|
| ({ key, required }) => required || visibleColumns[key],
|
| );
|
| const indeterminate =
|
| columnOptions.some(
|
| ({ key, required }) => !required && visibleColumns[key],
|
| ) && !allSelected;
|
|
|
| const handleConfirm = () => onCancel();
|
|
|
| return (
|
| <Modal
|
| title={t('列设置')}
|
| visible={visible}
|
| onCancel={onCancel}
|
| footer={
|
| <div className='flex justify-end gap-2'>
|
| <Button onClick={handleReset}>{t('重置')}</Button>
|
| <Button onClick={onCancel}>{t('取消')}</Button>
|
| <Button type='primary' onClick={handleConfirm}>
|
| {t('确定')}
|
| </Button>
|
| </div>
|
| }
|
| >
|
| <div style={{ marginBottom: 20 }}>
|
| <Checkbox
|
| checked={allSelected}
|
| indeterminate={indeterminate}
|
| onChange={(e) => handleSelectAll(e.target.checked)}
|
| >
|
| {t('全选')}
|
| </Checkbox>
|
| </div>
|
| <div
|
| className='flex flex-wrap max-h-96 overflow-y-auto rounded-lg p-4'
|
| style={{ border: '1px solid var(--semi-color-border)' }}
|
| >
|
| {columnOptions.map(({ key, label, required }) => (
|
| <div key={key} className='w-1/2 mb-4 pr-2'>
|
| <Checkbox
|
| checked={!!visibleColumns[key]}
|
| disabled={required}
|
| onChange={(e) =>
|
| handleColumnVisibilityChange(key, e.target.checked)
|
| }
|
| >
|
| {label}
|
| </Checkbox>
|
| </div>
|
| ))}
|
| </div>
|
| </Modal>
|
| );
|
| };
|
|
|
| export default ColumnSelectorModal;
|
|
|