add new columns, add new cell components
This commit is contained in:
parent
9af88aa139
commit
ef32c92b37
6 changed files with 127 additions and 5 deletions
|
@ -11,7 +11,9 @@ import CheckMarkRoundIcon from 'components/common/Icons/CheckMarkRoundIcon';
|
||||||
import { ColumnDef } from '@tanstack/react-table';
|
import { ColumnDef } from '@tanstack/react-table';
|
||||||
import { clusterBrokerPath } from 'lib/paths';
|
import { clusterBrokerPath } from 'lib/paths';
|
||||||
import Tooltip from 'components/common/Tooltip/Tooltip';
|
import Tooltip from 'components/common/Tooltip/Tooltip';
|
||||||
|
import ColoredCell from 'components/common/NewTable/ColoredCell';
|
||||||
|
|
||||||
|
import SkewHeader from './SkewHeader/SkewHeader';
|
||||||
import * as S from './BrokersList.styled';
|
import * as S from './BrokersList.styled';
|
||||||
|
|
||||||
const NA = 'N/A';
|
const NA = 'N/A';
|
||||||
|
@ -57,11 +59,15 @@ const BrokersList: React.FC = () => {
|
||||||
count: segmentCount || NA,
|
count: segmentCount || NA,
|
||||||
port: broker?.port,
|
port: broker?.port,
|
||||||
host: broker?.host,
|
host: broker?.host,
|
||||||
|
partitionsLeader: broker?.partitionsLeader,
|
||||||
|
partitionsSkew: broker?.partitionsSkew,
|
||||||
|
leadersSkew: broker?.leadersSkew,
|
||||||
|
inSyncPartitions: broker?.inSyncPartitions,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}, [diskUsage, brokers]);
|
}, [diskUsage, brokers]);
|
||||||
|
|
||||||
const columns = React.useMemo<ColumnDef<typeof rows>[]>(
|
const columns = React.useMemo<ColumnDef<(typeof rows)[number]>[]>(
|
||||||
() => [
|
() => [
|
||||||
{
|
{
|
||||||
header: 'Broker ID',
|
header: 'Broker ID',
|
||||||
|
@ -84,7 +90,7 @@ const BrokersList: React.FC = () => {
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
header: 'Segment Size',
|
header: 'Disk usage',
|
||||||
accessorKey: 'size',
|
accessorKey: 'size',
|
||||||
// eslint-disable-next-line react/no-unstable-nested-components
|
// eslint-disable-next-line react/no-unstable-nested-components
|
||||||
cell: ({ getValue, table, cell, column, renderValue, row }) =>
|
cell: ({ getValue, table, cell, column, renderValue, row }) =>
|
||||||
|
@ -98,10 +104,47 @@ const BrokersList: React.FC = () => {
|
||||||
cell={cell}
|
cell={cell}
|
||||||
getValue={getValue}
|
getValue={getValue}
|
||||||
renderValue={renderValue}
|
renderValue={renderValue}
|
||||||
|
renderSegments
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// eslint-disable-next-line react/no-unstable-nested-components
|
||||||
|
header: () => <SkewHeader />,
|
||||||
|
accessorKey: 'partitionsSkew',
|
||||||
|
// eslint-disable-next-line react/no-unstable-nested-components
|
||||||
|
cell: ({ getValue }) => (
|
||||||
|
<ColoredCell
|
||||||
|
value={getValue<number>() !== null ? `${getValue<number>()}%` : '-'}
|
||||||
|
warn={getValue<number>() >= 10 && getValue<number>() < 20}
|
||||||
|
attention={getValue<number>() >= 20}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{ header: 'Leaders', accessorKey: 'partitionsLeader' },
|
||||||
|
{
|
||||||
|
header: 'Leader skew',
|
||||||
|
accessorKey: 'leadersSkew',
|
||||||
|
// eslint-disable-next-line react/no-unstable-nested-components
|
||||||
|
cell: ({ getValue }) => (
|
||||||
|
<ColoredCell
|
||||||
|
value={getValue<number>() !== null ? `${getValue<number>()}%` : '-'}
|
||||||
|
warn={getValue<number>() >= 10 && getValue<number>() < 20}
|
||||||
|
attention={getValue<number>() >= 20}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: 'Online partitions',
|
||||||
|
accessorKey: 'inSyncPartitions',
|
||||||
|
// eslint-disable-next-line react/no-unstable-nested-components
|
||||||
|
cell: ({ getValue, row }) => (
|
||||||
|
<ColoredCell
|
||||||
|
value={getValue<number>()}
|
||||||
|
attention={getValue<number>() !== row.original.count}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{ header: 'Segment Count', accessorKey: 'count' },
|
|
||||||
{ header: 'Port', accessorKey: 'port' },
|
{ header: 'Port', accessorKey: 'port' },
|
||||||
{
|
{
|
||||||
header: 'Host',
|
header: 'Host',
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
export const CellWrapper = styled.div`
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
`;
|
|
@ -0,0 +1,17 @@
|
||||||
|
import React from 'react';
|
||||||
|
import Tooltip from 'components/common/Tooltip/Tooltip';
|
||||||
|
import InfoIcon from 'components/common/Icons/InfoIcon';
|
||||||
|
|
||||||
|
import * as S from './SkewHeader.styled';
|
||||||
|
|
||||||
|
const SkewHeader: React.FC = () => (
|
||||||
|
<S.CellWrapper>
|
||||||
|
Partitions skew
|
||||||
|
<Tooltip
|
||||||
|
value={<InfoIcon />}
|
||||||
|
content="The divergence from the average brokers' value"
|
||||||
|
/>
|
||||||
|
</S.CellWrapper>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default SkewHeader;
|
|
@ -0,0 +1,41 @@
|
||||||
|
import React from 'react';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
interface CellProps {
|
||||||
|
isWarning?: boolean;
|
||||||
|
isAttention?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ColoredCellProps {
|
||||||
|
value: number | string;
|
||||||
|
warn?: boolean;
|
||||||
|
attention?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Cell = styled.div<CellProps>`
|
||||||
|
color: ${(props) => {
|
||||||
|
if (props.isAttention) {
|
||||||
|
return props.theme.table.colored.color.attention;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (props.isWarning) {
|
||||||
|
return props.theme.table.colored.color.warning;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'inherit';
|
||||||
|
}};
|
||||||
|
`;
|
||||||
|
|
||||||
|
const ColoredCell: React.FC<ColoredCellProps> = ({
|
||||||
|
value,
|
||||||
|
warn,
|
||||||
|
attention,
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<Cell isWarning={warn} isAttention={attention}>
|
||||||
|
{value}
|
||||||
|
</Cell>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ColoredCell;
|
|
@ -3,8 +3,11 @@ import { CellContext } from '@tanstack/react-table';
|
||||||
import BytesFormatted from 'components/common/BytesFormatted/BytesFormatted';
|
import BytesFormatted from 'components/common/BytesFormatted/BytesFormatted';
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
const SizeCell: React.FC<CellContext<any, unknown>> = ({ getValue }) => (
|
const SizeCell: React.FC<CellContext<any, unknown> & { renderSegments?: boolean }> = ({ getValue, row, renderSegments = false }) => (
|
||||||
|
<>
|
||||||
<BytesFormatted value={getValue<string | number>()} />
|
<BytesFormatted value={getValue<string | number>()} />
|
||||||
|
{renderSegments ? `, ${row?.original.count} segment(s)` : null}
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
export default SizeCell;
|
export default SizeCell;
|
||||||
|
|
|
@ -529,6 +529,12 @@ export const theme = {
|
||||||
active: Colors.neutral[90],
|
active: Colors.neutral[90],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
colored: {
|
||||||
|
color: {
|
||||||
|
attention: Colors.red[50],
|
||||||
|
warning: Colors.yellow[20],
|
||||||
|
},
|
||||||
|
},
|
||||||
expander: {
|
expander: {
|
||||||
normal: Colors.brand[30],
|
normal: Colors.brand[30],
|
||||||
hover: Colors.brand[40],
|
hover: Colors.brand[40],
|
||||||
|
@ -924,6 +930,12 @@ export const darkTheme: ThemeType = {
|
||||||
active: Colors.neutral[0],
|
active: Colors.neutral[0],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
colored: {
|
||||||
|
color: {
|
||||||
|
attention: Colors.red[50],
|
||||||
|
warning: Colors.yellow[20],
|
||||||
|
},
|
||||||
|
},
|
||||||
expander: {
|
expander: {
|
||||||
normal: Colors.brand[30],
|
normal: Colors.brand[30],
|
||||||
hover: Colors.brand[40],
|
hover: Colors.brand[40],
|
||||||
|
|
Loading…
Add table
Reference in a new issue