| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | 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;
|
| |
|