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