Skip to content

Commit 3ab6811

Browse files
committed
feat: fix minor bugs and improvement
1 parent 36dc083 commit 3ab6811

File tree

11 files changed

+165
-84
lines changed

11 files changed

+165
-84
lines changed

src/renderer/components/CodeEditor/SqlCodeEditor.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,9 @@ const SqlCodeEditor = forwardRef(function SqlCodeEditor(
6060

6161
return (
6262
<CodeMirror
63+
tabIndex={0}
6364
ref={ref}
65+
autoFocus
6466
theme={theme}
6567
indentWithTab={false}
6668
basicSetup={{
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { OptimizeTableHeaderProps } from '.';
2+
import TableHeaderResizeHandler from './TableHeaderResizeHandler';
3+
import styles from './styles.module.css';
4+
import { useContextMenu } from 'renderer/contexts/ContextMenuProvider';
5+
6+
export default function TableHeader({
7+
idx,
8+
header,
9+
onHeaderResize,
10+
}: {
11+
idx: number;
12+
header: OptimizeTableHeaderProps;
13+
onHeaderResize: (idx: number, newWidth: number) => void;
14+
}) {
15+
const { menu } = header;
16+
const { handleContextMenu } = useContextMenu(() => menu ?? [], [menu]);
17+
18+
return (
19+
<th
20+
key={header.name}
21+
title={header.tooltip}
22+
onContextMenu={(e) => {
23+
handleContextMenu(e);
24+
e.stopPropagation();
25+
}}
26+
>
27+
{header.icon && (
28+
<div className={styles.tableHeaderIcon}>{header.icon}</div>
29+
)}
30+
31+
<div className={styles.tableCellContent}>{header.name}</div>
32+
33+
{header.resizable && (
34+
<TableHeaderResizeHandler idx={idx} onResize={onHeaderResize} />
35+
)}
36+
</th>
37+
);
38+
}

src/renderer/components/OptimizeTable/index.tsx

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,21 @@ import React, {
77
useMemo,
88
} from 'react';
99
import styles from './styles.module.css';
10-
import TableHeaderResizeHandler from './TableHeaderResizeHandler';
10+
import { ContextMenuItemProps } from '../ContextMenu';
11+
import TableHeader from './TableHeader';
12+
13+
export interface OptimizeTableHeaderProps {
14+
name: string;
15+
initialSize: number;
16+
resizable?: boolean;
17+
icon?: ReactElement;
18+
tooltip?: string;
19+
menu?: ContextMenuItemProps[];
20+
}
1121

1222
interface OptimizeTableProps {
1323
data: unknown[];
14-
headers: {
15-
name: string;
16-
initialSize: number;
17-
resizable?: boolean;
18-
icon?: ReactElement;
19-
}[];
24+
headers: OptimizeTableHeaderProps[];
2025
renderCell: (y: number, x: number) => ReactElement;
2126
rowHeight: number;
2227
renderAhead: number;
@@ -279,22 +284,15 @@ export default function OptimizeTable({
279284
{/* This is table header */}
280285
<thead>
281286
<tr>
282-
{headers.map((header, idx) => (
283-
<th key={header.name}>
284-
{header.icon && (
285-
<div className={styles.tableHeaderIcon}>
286-
{header.icon}
287-
</div>
288-
)}
289-
<div className={styles.tableCellContent}>{header.name}</div>
290-
{header.resizable && (
291-
<TableHeaderResizeHandler
292-
idx={idx}
293-
onResize={onHeaderResize}
294-
/>
295-
)}
296-
</th>
297-
))}
287+
{headers.map((header, idx) => {
288+
return (
289+
<TableHeader
290+
header={header}
291+
idx={idx}
292+
onHeaderResize={onHeaderResize}
293+
/>
294+
);
295+
})}
298296
</tr>
299297
</thead>
300298

src/renderer/contexts/NativeMenuProvider.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,15 @@ export default function NativeMenuProvider({ children }: PropsWithChildren) {
7070
{ label: 'Copy', role: 'copy' },
7171
{ label: 'Cut', role: 'cut' },
7272
{ label: 'Paste', role: 'paste' },
73+
{
74+
type: 'separator',
75+
},
76+
{ label: 'Undo', role: 'undo' },
77+
{ label: 'Redo', role: 'redo' },
78+
{
79+
type: 'separator',
80+
},
81+
{ label: 'Select All', role: 'selectAll' },
7382
],
7483
},
7584
],

src/renderer/screens/DatabaseScreen/QueryHeader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ export default function QueryHeader({
1111
}) {
1212
return (
1313
<div className={styles.queryHeader}>
14+
<QueryWindowNameEditor tabKey={tabKey} />
1415
<Button primary onClick={onSave}>
1516
Save
1617
</Button>
17-
<QueryWindowNameEditor tabKey={tabKey} />
1818
</div>
1919
);
2020
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ function QueryResultTable({
115115
icon: header?.schema?.primaryKey ? (
116116
<Icon.GreenKey size="sm" />
117117
) : undefined,
118+
tooltip: header.columnDefinition?.comment,
119+
menu: [
120+
{ text: 'Order by ASC', disabled: true },
121+
{ text: 'Order by DESC', disabled: true },
122+
],
118123
initialSize: Math.max(
119124
header.name.length * 10,
120125
getInitialSizeByHeaderType(idx, header)

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

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,16 @@ function QueryResultViewer({
4545
);
4646

4747
const resultWithIndex = useMemo(() => {
48-
let slicedRows = result.rows
49-
.slice(page * pageSize, (page + 1) * pageSize)
50-
.map((value, rowIndex) => {
51-
return {
52-
rowIndex: rowIndex + page * pageSize,
53-
data: value,
54-
};
55-
});
48+
let rows = result.rows.map((value, rowIndex) => {
49+
return {
50+
rowIndex: rowIndex + page * pageSize,
51+
data: value,
52+
};
53+
});
5654

5755
if (search) {
5856
const searchValue = search.toLowerCase();
59-
slicedRows = slicedRows.filter((row) => {
57+
rows = rows.filter((row) => {
6058
const values = Object.values(row.data);
6159
for (const value of values) {
6260
if (typeof value === 'string' || typeof value === 'number') {
@@ -68,16 +66,20 @@ function QueryResultViewer({
6866
});
6967
}
7068

71-
return slicedRows;
69+
return rows;
7270
}, [page, result, search]);
7371

72+
const slicedResult = useMemo(() => {
73+
return resultWithIndex.slice(page * pageSize, (page + 1) * pageSize);
74+
}, [resultWithIndex]);
75+
7476
return (
7577
<QueryResultChangeProvider key={runningIndex.toString()}>
7678
<div className={styles.result}>
7779
<TableCellManagerProvider>
7880
<QueryResultTable
7981
headers={result.headers}
80-
result={resultWithIndex}
82+
result={slicedResult}
8183
page={page}
8284
pageSize={pageSize}
8385
/>

src/renderer/screens/DatabaseScreen/QueryWindowNameEditor.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ export default function QueryWindowNameEditor({
3333
<div className={styles.queryNameEditor}>
3434
<input
3535
ref={inputRef}
36-
autoFocus
3736
type="text"
3837
value={name}
3938
onKeyDown={(e) => {

src/renderer/screens/DatabaseScreen/styles.module.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
.queryNameEditor {
3535
display: flex;
36+
flex-grow: 1;
3637
flex-direction: row;
3738
gap: 5px;
3839
align-items: center;

src/stories/Button.tsx

Lines changed: 0 additions & 48 deletions
This file was deleted.

0 commit comments

Comments
 (0)