File size: 3,914 Bytes
305487b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*

Copyright (C) 2025 QuantumNous



This program is free software: you can redistribute it and/or modify

it under the terms of the GNU Affero General Public License as

published by the Free Software Foundation, either version 3 of the

License, or (at your option) any later version.



This program is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

GNU Affero General Public License for more details.



You should have received a copy of the GNU Affero General Public License

along with this program. If not, see <https://www.gnu.org/licenses/>.



For commercial licensing, please contact support@quantumnous.com

*/

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;