Skip to content

Commit a0ce82c

Browse files
committed
feat: add commit in the table list
1 parent 432520f commit a0ce82c

4 files changed

Lines changed: 244 additions & 151 deletions

File tree

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import applyQueryResultChanges from 'libs/ApplyQueryResultChanges';
2+
import generateSqlFromChanges from 'libs/GenerateSqlFromChanges';
3+
import generateSqlFromPlan from 'libs/GenerateSqlFromPlan';
4+
import { useCallback, useEffect, useState } from 'react';
5+
import Toolbar from 'renderer/components/Toolbar';
6+
import { useDialog } from 'renderer/contexts/DialogProvider';
7+
import { useEditableResult } from 'renderer/contexts/EditableQueryResultProvider';
8+
import { useSchema } from 'renderer/contexts/SchemaProvider';
9+
import { useSqlExecute } from 'renderer/contexts/SqlExecuteProvider';
10+
import { QueryResult } from 'types/SqlResult';
11+
12+
interface CommitChangeToolbarItemProps {
13+
result: QueryResult;
14+
onResultChange: React.Dispatch<React.SetStateAction<QueryResult>>;
15+
onRequestRefetch: () => void;
16+
}
17+
18+
export default function CommitChangeToolbarItem({
19+
result,
20+
onResultChange,
21+
onRequestRefetch,
22+
}: CommitChangeToolbarItemProps) {
23+
const { showErrorDialog } = useDialog();
24+
const [changeCount, setChangeCount] = useState(0);
25+
const { clearChange, collector } = useEditableResult();
26+
const { schema, currentDatabase } = useSchema();
27+
const { runner } = useSqlExecute();
28+
29+
useEffect(() => {
30+
const cb = (count: number) => {
31+
setChangeCount(count);
32+
};
33+
34+
collector.registerChange(cb);
35+
return () => collector.unregisterChange(cb);
36+
}, [collector, setChangeCount]);
37+
38+
const onCommit = useCallback(() => {
39+
if (schema) {
40+
const currentDatabaseSchema = schema[currentDatabase || ''];
41+
42+
if (currentDatabaseSchema && result) {
43+
const plans = generateSqlFromChanges(
44+
currentDatabaseSchema,
45+
result,
46+
collector.getChanges()
47+
);
48+
49+
const rawSql = plans.map((plan) => ({
50+
sql: generateSqlFromPlan(plan),
51+
}));
52+
53+
runner
54+
.execute(rawSql, { insideTransaction: true })
55+
.then(() => {
56+
const changes = collector.getChanges();
57+
58+
if (changes.new.length === 0 && changes.remove.length === 0) {
59+
onResultChange((prev) => {
60+
clearChange();
61+
return applyQueryResultChanges(prev, changes.changes);
62+
});
63+
} else {
64+
onRequestRefetch();
65+
}
66+
})
67+
.catch((e) => {
68+
if (e.message) {
69+
showErrorDialog(e.message);
70+
}
71+
});
72+
}
73+
}
74+
}, [
75+
collector,
76+
schema,
77+
currentDatabase,
78+
clearChange,
79+
onResultChange,
80+
onRequestRefetch,
81+
]);
82+
83+
return (
84+
<Toolbar.Item
85+
text="Commit"
86+
badge={changeCount}
87+
onClick={onCommit}
88+
disabled={!changeCount}
89+
/>
90+
);
91+
}

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

Lines changed: 8 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,15 @@
1-
import { useCallback, useState, useEffect } from 'react';
2-
import applyQueryResultChanges from 'libs/ApplyQueryResultChanges';
3-
import generateSqlFromChanges from 'libs/GenerateSqlFromChanges';
4-
import generateSqlFromPlan from 'libs/GenerateSqlFromPlan';
5-
import { useSchema } from 'renderer/contexts/SchemaProvider';
6-
import { useSqlExecute } from 'renderer/contexts/SqlExecuteProvider';
1+
import { useState } from 'react';
72
import { QueryResult } from 'types/SqlResult';
83
import styles from './styles.module.scss';
94
import ExportModal from '../ExportModal';
10-
import { useDialog } from 'renderer/contexts/DialogProvider';
115
import Toolbar from 'renderer/components/Toolbar';
126
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
137
import {
148
faChevronLeft,
159
faChevronRight,
1610
} from '@fortawesome/free-solid-svg-icons';
1711
import { useDebounceEffect } from 'hooks/useDebounce';
18-
import { useEditableResult } from 'renderer/contexts/EditableQueryResultProvider';
12+
import CommitChangeToolbarItem from './CommitChangeToolbarItem';
1913

2014
interface QueryResultActionProps {
2115
result: QueryResult;
@@ -40,13 +34,8 @@ export default function QueryResultAction({
4034
onSearchChange,
4135
time,
4236
}: QueryResultActionProps) {
43-
const { showErrorDialog } = useDialog();
44-
const [changeCount, setChangeCount] = useState(0);
4537
const [showExportModal, setShowExportModal] = useState(false);
46-
const { clearChange, collector } = useEditableResult();
47-
const { schema, currentDatabase } = useSchema();
4838
const [search, setSearch] = useState('');
49-
const { runner } = useSqlExecute();
5039

5140
const rowStart = page * pageSize;
5241
const rowEnd = Math.min(resultAfterFilter.length, rowStart + pageSize);
@@ -59,71 +48,18 @@ export default function QueryResultAction({
5948
1000
6049
);
6150

62-
useEffect(() => {
63-
const cb = (count: number) => {
64-
setChangeCount(count);
65-
};
66-
67-
collector.registerChange(cb);
68-
return () => collector.unregisterChange(cb);
69-
}, [collector, setChangeCount]);
70-
71-
const onCommit = useCallback(() => {
72-
if (schema) {
73-
const currentDatabaseSchema = schema[currentDatabase || ''];
74-
75-
if (currentDatabaseSchema && result) {
76-
const plans = generateSqlFromChanges(
77-
currentDatabaseSchema,
78-
result,
79-
collector.getChanges()
80-
);
81-
82-
const rawSql = plans.map((plan) => ({
83-
sql: generateSqlFromPlan(plan),
84-
}));
85-
86-
runner
87-
.execute(rawSql, { insideTransaction: true })
88-
.then(() => {
89-
const changes = collector.getChanges();
90-
91-
if (changes.new.length === 0 && changes.remove.length === 0) {
92-
onResultChange((prev) => {
93-
clearChange();
94-
return applyQueryResultChanges(prev, changes.changes);
95-
});
96-
} else {
97-
onRequestRefetch();
98-
}
99-
})
100-
.catch((e) => {
101-
if (e.message) {
102-
showErrorDialog(e.message);
103-
}
104-
});
105-
}
106-
}
107-
}, [
108-
collector,
109-
schema,
110-
currentDatabase,
111-
clearChange,
112-
onResultChange,
113-
onRequestRefetch,
114-
]);
115-
11651
return (
11752
<div className={styles.footer}>
11853
<Toolbar>
11954
<Toolbar.Text>Took {Math.round(time / 1000)}s</Toolbar.Text>
12055
<Toolbar.Separator />
121-
<Toolbar.Item
122-
text="Commit"
123-
badge={changeCount}
124-
onClick={onCommit}
125-
disabled={!changeCount}
56+
57+
<CommitChangeToolbarItem
58+
onRequestRefetch={onRequestRefetch}
59+
onResultChange={onResultChange}
60+
result={result}
12661
/>
62+
12763
<Toolbar.Item text="Export" onClick={() => setShowExportModal(true)} />
12864

12965
<Toolbar.Separator />

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ function QueryResultViewer({
4444
);
4545

4646
const resultWithIndex = useMemo(() => {
47-
let rows = result.rows.map((value, rowIndex) => {
47+
let rows = cacheResult.rows.map((value, rowIndex) => {
4848
return {
4949
rowIndex: rowIndex + page * pageSize,
5050
data: value,
@@ -66,7 +66,7 @@ function QueryResultViewer({
6666
}
6767

6868
return rows;
69-
}, [page, result, search]);
69+
}, [page, cacheResult, search]);
7070

7171
const slicedResult = useMemo(() => {
7272
return resultWithIndex.slice(page * pageSize, (page + 1) * pageSize);

0 commit comments

Comments
 (0)