Skip to content

Commit a45d38c

Browse files
committed
make myServices table can be selectable.
1 parent 69c7048 commit a45d38c

File tree

10 files changed

+307
-17
lines changed

10 files changed

+307
-17
lines changed

package-lock.json

+43-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"rc-tabs": "^15.5.1",
1616
"react": "^19.0.0",
1717
"react-dom": "^19.0.0",
18+
"react-responsive": "^10.0.1",
1819
"react-router-dom": "^7.2.0",
1920
"react-timer-hook": "^3.0.8",
2021
"yaml": "^2.6.1",

src/components/content/deployedServices/myServices/MyServices.tsx

+98-3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
PoweroffOutlined,
1919
RedoOutlined,
2020
RiseOutlined,
21+
SettingOutlined,
2122
SyncOutlined,
2223
} from '@ant-design/icons';
2324
import { useQueryClient } from '@tanstack/react-query';
@@ -34,9 +35,10 @@ import {
3435
TablePaginationConfig,
3536
Tooltip,
3637
} from 'antd';
37-
import type { ColumnsType } from 'antd/es/table';
38+
import type { ColumnsType, ColumnType } from 'antd/es/table';
3839
import { ColumnFilterItem, FilterValue, SorterResult } from 'antd/es/table/interface';
3940
import React, { useEffect, useMemo, useState } from 'react';
41+
import { useMediaQuery } from 'react-responsive';
4042
import { useLocation, useNavigate } from 'react-router-dom';
4143
import { v4 } from 'uuid';
4244
import myServicesStyles from '../../../../styles/my-services.module.css';
@@ -94,6 +96,7 @@ import { LocksTitle } from './LocksTitle.tsx';
9496
import { MyServiceDetails } from './MyServiceDetails';
9597
import { MyServiceHistory } from './MyServiceHistory';
9698
import {
99+
getDefaultColumns,
97100
isDisableDestroyBtn,
98101
isDisableDetails,
99102
isDisabledStopOrRestartBtn,
@@ -104,6 +107,9 @@ import {
104107
isDisableServiceConfigBtn,
105108
isDisableServicePortingBtn,
106109
isDisableStartBtn,
110+
Option,
111+
showForMediumScreenColumn,
112+
showForSmallScreenColumn,
107113
updateBillingModeFilters,
108114
updateCategoryFilters,
109115
updateCspFilters,
@@ -120,6 +126,7 @@ import useGetOrderableServiceDetailsByServiceIdQuery from './query/useGetOrderab
120126
import useListDeployedServicesDetailsQuery, {
121127
getListDeployedServicesDetailsQueryKey,
122128
} from './query/useListDeployedServicesDetailsQuery';
129+
import { SelectMyServicesColumns } from './SelectMyServicesColumns.tsx';
123130
import { TooltipWhenDetailsDisabled } from './TooltipWhenDetailsDisabled.tsx';
124131

125132
function MyServices(): React.JSX.Element {
@@ -226,6 +233,9 @@ function MyServices(): React.JSX.Element {
226233
const [isLocksModalOpen, setIsLocksModalOpen] = useState<boolean>(false);
227234

228235
const [uniqueRequestId, setUniqueRequestId] = useState<string>(v4());
236+
const [isColumnSelectorVisible, setIsColumnSelectorVisible] = useState(false);
237+
const isLargeScreen = useMediaQuery({ minWidth: 1200 });
238+
const isMediumScreen = useMediaQuery({ minWidth: 768, maxWidth: 1199 });
229239

230240
const serviceDestroyQuery = useDestroyRequestSubmitQuery();
231241
const servicePurgeQuery = usePurgeRequestSubmitQuery();
@@ -1027,6 +1037,8 @@ function MyServices(): React.JSX.Element {
10271037
},
10281038
];
10291039

1040+
const [selectedColumns, setSelectedColumns] = useState<ColumnsType<DeployedService>>(columns);
1041+
const [checkedValues, setCheckedValues] = useState<string[]>(getDefaultColumns(selectedColumns));
10301042
const closeDestroyResultAlert = (isClose: boolean) => {
10311043
if (isClose) {
10321044
setActiveRecord(undefined);
@@ -1327,6 +1339,61 @@ function MyServices(): React.JSX.Element {
13271339
});
13281340
};
13291341

1342+
const handleColumnsSelectAll = () => {
1343+
setCheckedValues(columnOptions.map((option) => option.value));
1344+
};
1345+
1346+
const handleColumnsSelectNone = () => {
1347+
setCheckedValues([]);
1348+
};
1349+
1350+
const columnOptions: Option[] = columns.map((column) => ({
1351+
label: column.title as string,
1352+
value: (column as ColumnType<DeployedService>).dataIndex as string,
1353+
}));
1354+
1355+
const handleColumnChange = (checkedValues: string[]) => {
1356+
setCheckedValues(checkedValues);
1357+
};
1358+
1359+
const handleColumnSelectorOpen = () => {
1360+
setIsColumnSelectorVisible(true);
1361+
};
1362+
1363+
const handleColumnSelectorSubmit = () => {
1364+
setIsColumnSelectorVisible(false);
1365+
if (checkedValues.length > 0) {
1366+
const selectedColumns = columns.filter((column) =>
1367+
checkedValues.includes((column as ColumnType<DeployedService>).dataIndex as string)
1368+
);
1369+
setSelectedColumns(selectedColumns);
1370+
}
1371+
};
1372+
1373+
const handleColumnSelectorClose = () => {
1374+
setIsColumnSelectorVisible(false);
1375+
};
1376+
1377+
useEffect(() => {
1378+
let defaultColumns;
1379+
1380+
if (isLargeScreen) {
1381+
defaultColumns = columns;
1382+
} else if (isMediumScreen) {
1383+
defaultColumns = columns.filter((col) =>
1384+
showForMediumScreenColumn.includes((col as ColumnType<DeployedService>).dataIndex as string)
1385+
);
1386+
} else {
1387+
defaultColumns = columns.filter((col) =>
1388+
showForSmallScreenColumn.includes((col as ColumnType<DeployedService>).dataIndex as string)
1389+
);
1390+
}
1391+
setSelectedColumns(defaultColumns);
1392+
setCheckedValues(getDefaultColumns(defaultColumns));
1393+
1394+
// eslint-disable-next-line react-hooks/exhaustive-deps
1395+
}, [isLargeScreen, isMediumScreen]);
1396+
13301397
return (
13311398
<div className={tableStyles.genericTableContainer}>
13321399
{isDestroyRequestSubmitted && activeRecord ? (
@@ -1535,17 +1602,45 @@ function MyServices(): React.JSX.Element {
15351602
</Modal>
15361603
) : null}
15371604

1538-
<div>
1605+
<Modal
1606+
title={'Select Columns'}
1607+
open={isColumnSelectorVisible}
1608+
onCancel={handleColumnSelectorClose}
1609+
onOk={handleColumnSelectorSubmit}
1610+
width={800}
1611+
destroyOnClose={true}
1612+
>
1613+
<SelectMyServicesColumns
1614+
checkedValues={checkedValues}
1615+
columnOptions={columnOptions}
1616+
handleColumnChange={handleColumnChange}
1617+
handleColumnsSelectAll={handleColumnsSelectAll}
1618+
handleColumnsSelectNone={handleColumnsSelectNone}
1619+
/>
1620+
</Modal>
1621+
1622+
<div className={myServicesStyles.refreshBtnContainer}>
15391623
<Button
15401624
disabled={activeRecord !== undefined}
15411625
type='primary'
15421626
icon={<SyncOutlined />}
15431627
onClick={() => {
15441628
refreshData();
15451629
}}
1630+
block={false}
1631+
className={myServicesStyles.refreshBtnClass}
15461632
>
15471633
refresh
15481634
</Button>
1635+
<Button
1636+
type='primary'
1637+
icon={<SettingOutlined />}
1638+
onClick={handleColumnSelectorOpen}
1639+
block={false}
1640+
className={myServicesStyles.selectColumnsClass}
1641+
>
1642+
Select Columns
1643+
</Button>
15491644
</div>
15501645
{listDeployedServicesQuery.isError ? (
15511646
<>
@@ -1562,7 +1657,7 @@ function MyServices(): React.JSX.Element {
15621657
<Row>
15631658
<div className={myServicesStyles.serviceInstanceList}>
15641659
<Table
1565-
columns={columns}
1660+
columns={selectedColumns}
15661661
dataSource={serviceVoList}
15671662
loading={listDeployedServicesQuery.isPending || listDeployedServicesQuery.isRefetching}
15681663
rowKey={'id'}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* SPDX-FileCopyrightText: Huawei Inc.
4+
*/
5+
6+
import { CheckCircleOutlined, CloseCircleOutlined } from '@ant-design/icons';
7+
import { Button, Checkbox, Col, Row } from 'antd';
8+
import React from 'react';
9+
import myServicesStyles from '../../../../styles/my-services.module.css';
10+
import { Option } from './myServiceProps.tsx';
11+
12+
export const SelectMyServicesColumns = ({
13+
checkedValues,
14+
columnOptions,
15+
handleColumnChange,
16+
handleColumnsSelectAll,
17+
handleColumnsSelectNone,
18+
}: {
19+
checkedValues: string[];
20+
columnOptions: Option[];
21+
handleColumnChange: (checkedValues: string[]) => void;
22+
handleColumnsSelectAll: () => void;
23+
handleColumnsSelectNone: () => void;
24+
}): React.JSX.Element => {
25+
return (
26+
<div>
27+
<div className={myServicesStyles.selectColumnsButton}>
28+
<Button type='primary' onClick={handleColumnsSelectAll}>
29+
<CheckCircleOutlined />
30+
Select All
31+
</Button>
32+
&nbsp;&nbsp;
33+
<Button type='default' onClick={handleColumnsSelectNone}>
34+
<CloseCircleOutlined /> Cancel
35+
</Button>
36+
</div>
37+
<div className={myServicesStyles.columnsContainer}>
38+
<Checkbox.Group
39+
className={myServicesStyles.selectColumns}
40+
onChange={handleColumnChange}
41+
value={checkedValues}
42+
>
43+
<Row gutter={[16, 0]}>
44+
{columnOptions.map((option, index) => (
45+
<Col xs={12} md={8} key={index}>
46+
<Checkbox value={option.value}>{option.label}</Checkbox>
47+
</Col>
48+
))}
49+
</Row>
50+
</Checkbox.Group>
51+
</div>
52+
</div>
53+
);
54+
};

0 commit comments

Comments
 (0)