Skip to content

Commit 351e4a9

Browse files
committed
Added Resizer, MultilineTag
1 parent da78eca commit 351e4a9

File tree

12 files changed

+272
-42
lines changed

12 files changed

+272
-42
lines changed

frontend/src/components/Connect/List/List.styled.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import styled from 'styled-components';
33
export const TagsWrapper = styled.div`
44
display: flex;
55
flex-wrap: wrap;
6+
word-break: break-word;
7+
white-space: pre-wrap;
68
span {
79
color: rgb(76, 76, 255) !important;
810
&:hover {

frontend/src/components/Connect/List/List.tsx

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,18 @@ const kafkaConnectColumns: ColumnDef<FullConnectorInfo>[] = [
1717
{
1818
header: 'Name',
1919
accessorKey: 'name',
20+
cell: BreakableTextCell,
21+
enableResizing: true,
2022
},
2123
{
2224
header: 'Connect',
2325
accessorKey: 'connect',
2426
cell: BreakableTextCell,
25-
meta: { filterVariant: 'multi-select' },
2627
filterFn: 'arrIncludesSome',
28+
meta: {
29+
filterVariant: 'multi-select',
30+
},
31+
enableResizing: true,
2732
},
2833
{
2934
header: 'Type',
@@ -37,6 +42,7 @@ const kafkaConnectColumns: ColumnDef<FullConnectorInfo>[] = [
3742
cell: BreakableTextCell,
3843
meta: { filterVariant: 'multi-select' },
3944
filterFn: 'arrIncludesSome',
45+
enableResizing: true,
4046
},
4147
{
4248
header: 'Topics',
@@ -45,7 +51,7 @@ const kafkaConnectColumns: ColumnDef<FullConnectorInfo>[] = [
4551
enableColumnFilter: true,
4652
meta: { filterVariant: 'multi-select' },
4753
filterFn: 'arrIncludesSome',
48-
enableSorting: false,
54+
enableResizing: true,
4955
},
5056
{
5157
header: 'Status',
@@ -54,8 +60,18 @@ const kafkaConnectColumns: ColumnDef<FullConnectorInfo>[] = [
5460
meta: { filterVariant: 'multi-select' },
5561
filterFn: 'arrIncludesSome',
5662
},
57-
{ header: 'Running Tasks', cell: RunningTasksCell },
58-
{ header: '', id: 'action', cell: ActionsCell },
63+
{
64+
id: 'running_task',
65+
header: 'Running Tasks',
66+
cell: RunningTasksCell,
67+
size: 120,
68+
},
69+
{
70+
header: '',
71+
id: 'action',
72+
cell: ActionsCell,
73+
size: 60,
74+
},
5975
];
6076

6177
const List: React.FC = () => {
@@ -67,19 +83,21 @@ const List: React.FC = () => {
6783
searchParams.get('q') || ''
6884
);
6985

70-
const persister = useQueryPersister(kafkaConnectColumns);
86+
const filterPersister = useQueryPersister(kafkaConnectColumns);
7187

7288
return (
7389
<Table
7490
data={connectors || []}
7591
columns={kafkaConnectColumns}
7692
enableSorting
93+
enableColumnResizing
94+
tableName="KafkaConnect"
7795
onRowClick={({ original: { connect, name } }) =>
7896
navigate(clusterConnectConnectorPath(clusterName, connect, name))
7997
}
8098
emptyMessage="No connectors found"
8199
setRowId={(originalRow) => `${originalRow.name}-${originalRow.connect}`}
82-
filterPersister={persister}
100+
filterPersister={filterPersister}
83101
/>
84102
);
85103
};

frontend/src/components/Connect/List/TopicsCell.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react';
22
import { FullConnectorInfo } from 'generated-sources';
33
import { CellContext } from '@tanstack/react-table';
44
import { useNavigate } from 'react-router-dom';
5-
import { Tag } from 'components/common/Tag/Tag.styled';
5+
import { MultiLineTag, Tag } from 'components/common/Tag/Tag.styled';
66
import { ClusterNameRoute, clusterTopicPath } from 'lib/paths';
77
import useAppParams from 'lib/hooks/useAppParams';
88

@@ -27,7 +27,7 @@ const TopicsCell: React.FC<CellContext<FullConnectorInfo, unknown>> = ({
2727
return (
2828
<S.TagsWrapper>
2929
{topics?.map((t) => (
30-
<Tag key={t} color="green">
30+
<MultiLineTag key={t} color="green">
3131
<span
3232
role="link"
3333
onClick={(e) => navigateToTopic(e, t)}
@@ -36,7 +36,7 @@ const TopicsCell: React.FC<CellContext<FullConnectorInfo, unknown>> = ({
3636
>
3737
{t}
3838
</span>
39-
</Tag>
39+
</MultiLineTag>
4040
))}
4141
</S.TagsWrapper>
4242
);

frontend/src/components/common/NewTable/ColumnFilter/Filter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as FilterVariant from './variants';
66
interface FilterProps<T> {
77
column: Column<T, unknown>;
88
}
9-
export const Filter = <T,>(props: FilterProps<T>) => {
9+
export const ColumnFilter = <T,>(props: FilterProps<T>) => {
1010
const { column } = props;
1111

1212
switch (column.columnDef.meta?.filterVariant) {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Filter } from './Filter';
1+
import { ColumnFilter } from './Filter';
22

33
export { type FilterableColumnDef, type KafbatFilterVariant } from './types';
44
export { type Persister, useQueryPersister } from './lib';
55
export { getFilterableColumns } from './lib/getFilterableColumns';
6-
export default Filter;
6+
export default ColumnFilter;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { Header, RowData } from '@tanstack/react-table';
2+
import React from 'react';
3+
import styled from 'styled-components';
4+
5+
const ColumnResizerStyled = styled.div`
6+
position: absolute;
7+
top: 0;
8+
right: 0;
9+
height: 100%;
10+
width: 5px;
11+
background: white;
12+
cursor: col-resize;
13+
user-select: none;
14+
touch-action: none;
15+
`;
16+
17+
const ColumnResizer = <TData extends RowData>({
18+
header,
19+
}: {
20+
header: Header<TData, unknown>;
21+
}) => {
22+
return (
23+
<ColumnResizerStyled
24+
{...{
25+
onDoubleClick: () => header.column.resetSize(),
26+
onMouseDown: header.getResizeHandler(),
27+
onTouchStart: header.getResizeHandler(),
28+
}}
29+
/>
30+
);
31+
};
32+
33+
export default styled(ColumnResizer)``;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { CellContext } from '@tanstack/react-table';
2+
import React from 'react';
3+
import getTagColor from 'components/common/Tag/getTagColor';
4+
import { MultiLineTag } from 'components/common/Tag/Tag.styled';
5+
6+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
7+
const MultiLineTagCell: React.FC<CellContext<any, unknown>> = ({
8+
getValue,
9+
}) => {
10+
const value = getValue<string>();
11+
return <MultiLineTag color={getTagColor(value)}>{value}</MultiLineTag>;
12+
};
13+
14+
export default MultiLineTagCell;

frontend/src/components/common/NewTable/Table.styled.ts

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,39 @@ const DESCMixin = (color: string) => `
7272
}
7373
`;
7474

75+
export const TableHeaderContent = styled.div`
76+
display: flex;
77+
justify-content: space-between;
78+
align-items: center;
79+
`;
80+
81+
export const ColumnResizer = styled.div<{ $isResizing?: boolean }>`
82+
${({
83+
$isResizing,
84+
theme: {
85+
table: { resizer },
86+
},
87+
}) => {
88+
return css`
89+
opacity: ${$isResizing ? 1 : 0};
90+
position: absolute;
91+
top: 8px;
92+
right: 0;
93+
height: calc(100% - 16px);
94+
width: 4px;
95+
border-radius: 2px;
96+
background-color: ${resizer.background.normal};
97+
98+
cursor: col-resize;
99+
user-select: none;
100+
touch-action: none;
101+
&:hover {
102+
background-color: ${resizer.background.hover};
103+
}
104+
`;
105+
}};
106+
`;
107+
75108
export const Th = styled.th<ThProps>(
76109
({
77110
theme: {
@@ -97,22 +130,20 @@ export const Th = styled.th<ThProps>(
97130
white-space: nowrap;
98131
position: relative;
99132
100-
& > div {
133+
& > ${TableHeaderContent} {
101134
cursor: default;
102135
color: ${th.color.normal};
103136
${sortable ? sortableMixin(th.color.sortable, th.color.hover) : ''}
104137
${sortable && sortOrder === 'asc' && ASCMixin(th.color.active)}
105138
${sortable && sortOrder === 'desc' && DESCMixin(th.color.active)}
106139
}
140+
141+
&:hover > ${ColumnResizer} {
142+
opacity: 1;
143+
}
107144
`
108145
);
109146

110-
export const TableHeaderContent = styled.div`
111-
display: flex;
112-
justify-content: space-between;
113-
align-items: center;
114-
`;
115-
116147
export const TableHeaderFilter = styled.div`
117148
padding: 4px;
118149
position: absolute;
@@ -241,7 +272,9 @@ export const Ellipsis = styled.div`
241272

242273
export const TableWrapper = styled.div<{ $disabled: boolean }>(
243274
({ $disabled }) => css`
275+
overflow: clip;
244276
overflow-x: auto;
277+
overflow-y: visible;
245278
${$disabled &&
246279
css`
247280
pointer-events: none;

0 commit comments

Comments
 (0)