Skip to content

Commit 165db0d

Browse files
committed
feat: smarter result header size
1 parent f3e4f80 commit 165db0d

File tree

2 files changed

+44
-11
lines changed

2 files changed

+44
-11
lines changed

src/renderer/components/ResizableTable/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
import styles from './styles.module.scss';
99

1010
interface ResizableTableProps {
11-
headers: { name: string; icon?: ReactElement }[];
11+
headers: { name: string; icon?: ReactElement; initialSize?: number }[];
1212
}
1313

1414
function ResizeHandler({ idx }: { idx: number }) {
@@ -72,7 +72,11 @@ export default function ResizableTable({
7272
useEffect(() => {
7373
if (tableRef.current) {
7474
tableRef.current.style.gridTemplateColumns =
75-
headers.map(() => '150px').join(' ') || '';
75+
headers
76+
.map((header) =>
77+
header.initialSize ? header.initialSize + 'px' : '150px'
78+
)
79+
.join(' ') || '';
7680
setGridCSSPrepared(true);
7781
}
7882
}, [tableRef, setGridCSSPrepared]);

src/renderer/screens/DatabaseScreen/QueryResultViewer/QueryResultTable.tsx

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { useMemo } from 'react';
22
import styles from './styles.module.scss';
33
import TableCell from 'renderer/screens/DatabaseScreen/QueryResultViewer/TableCell/TableCell';
44
import Icon from 'renderer/components/Icon';
5-
import { QueryResult } from 'types/SqlResult';
5+
import { QueryResult, QueryResultHeader } from 'types/SqlResult';
66
import { getUpdatableTable } from 'libs/GenerateSqlFromChanges';
77
import { useSchmea } from 'renderer/contexts/SchemaProvider';
88
import { useContextMenu } from 'renderer/contexts/ContextMenuProvider';
@@ -82,19 +82,48 @@ function QueryResultTable({ result, page, pageSize }: QueryResultTableProps) {
8282
return list;
8383
}, [result, page, pageSize]);
8484

85+
const headerMemo = useMemo(() => {
86+
function getInitialSizeByHeaderType(
87+
idx: number,
88+
header: QueryResultHeader
89+
) {
90+
if (header.type.type === 'number') {
91+
return 100;
92+
} else if (
93+
header.type.type === 'string' ||
94+
header.type.type === 'decimal'
95+
) {
96+
// Check the last 100 records
97+
const maxLength = Math.max(
98+
...result.rows.slice(0, 100).map((row) => {
99+
if (typeof row[idx] === 'string')
100+
return (row[idx] as string).length;
101+
return 10;
102+
})
103+
);
104+
105+
return Math.max(150, Math.min(500, maxLength * 8));
106+
}
107+
108+
return 150;
109+
}
110+
111+
return result.headers.map((header, idx) => ({
112+
name: header.name || '',
113+
icon: header?.schema?.primaryKey ? <Icon.GreenKey /> : undefined,
114+
initialSize: Math.max(
115+
header.name.length * 10,
116+
getInitialSizeByHeaderType(idx, header)
117+
),
118+
}));
119+
}, [result]);
120+
85121
return (
86122
<div
87123
className={`${styles.container} scroll`}
88124
onContextMenu={handleContextMenu}
89125
>
90-
<ResizableTable
91-
headers={result.headers.map((header) => ({
92-
name: header.name || '',
93-
icon: header?.schema?.primaryKey ? <Icon.GreenKey /> : undefined,
94-
}))}
95-
>
96-
{RowList}
97-
</ResizableTable>
126+
<ResizableTable headers={headerMemo}>{RowList}</ResizableTable>
98127
</div>
99128
);
100129
}

0 commit comments

Comments
 (0)