Skip to content

Commit 80d2dda

Browse files
committed
fix: unsaved changes in query editor
1 parent dbab46b commit 80d2dda

File tree

10 files changed

+19
-20
lines changed

10 files changed

+19
-20
lines changed

src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export function TopQueries({tenantName}: TopQueriesProps) {
5656
(row: any) => {
5757
const {QueryText: input} = row;
5858

59-
dispatch(changeUserInput({input}));
59+
dispatch(changeUserInput({input, isDirty: false}));
6060

6161
const queryParams = parseQuery(location);
6262

src/containers/Tenant/Diagnostics/TopQueries/TopQueries.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export const TopQueries = ({tenantName}: TopQueriesProps) => {
7171

7272
const applyRowClick = React.useCallback(
7373
(input: string) => {
74-
dispatch(changeUserInput({input}));
74+
dispatch(changeUserInput({input, isDirty: false}));
7575

7676
const queryParams = parseQuery(location);
7777

src/containers/Tenant/Query/QueriesHistory/QueriesHistory.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const b = cn('ydb-queries-history');
2727
const QUERIES_HISTORY_COLUMNS_WIDTH_LS_KEY = 'queriesHistoryTableColumnsWidth';
2828

2929
interface QueriesHistoryProps {
30-
changeUserInput: (value: {input: string}) => void;
30+
changeUserInput: (value: {input: string; isDirty?: boolean}) => void;
3131
}
3232

3333
function QueriesHistory({changeUserInput}: QueriesHistoryProps) {
@@ -38,7 +38,7 @@ function QueriesHistory({changeUserInput}: QueriesHistoryProps) {
3838
const reversedHistory = [...queriesHistory].reverse();
3939

4040
const applyQueryClick = (query: QueryInHistory) => {
41-
changeUserInput({input: query.queryText});
41+
changeUserInput({input: query.queryText, isDirty: false});
4242
dispatch(setQueryTab(TENANT_QUERY_TABS_ID.newQuery));
4343
};
4444

src/containers/Tenant/Query/Query.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export const Query = (props: QueryProps) => {
2929

3030
const {queryTab = TENANT_QUERY_TABS_ID.newQuery} = useTypedSelector((state) => state.tenant);
3131

32-
const handleUserInputChange = (value: {input: string}) => {
32+
const handleUserInputChange = (value: {input: string; isDirty?: boolean}) => {
3333
dispatch(changeUserInput(value));
3434
};
3535

src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ const initialTenantCommonInfoState = {
6666
interface QueryEditorProps {
6767
tenantName: string;
6868
path: string;
69-
changeUserInput: (arg: {input: string}) => void;
69+
changeUserInput: (arg: {input: string; isDirty?: boolean}) => void;
7070
theme: string;
7171
type?: EPathType;
7272
}

src/containers/Tenant/Query/QueryEditor/YqlEditor.tsx

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {getKeyBindings} from './keybindings';
3232
const CONTEXT_MENU_GROUP_ID = 'navigation';
3333

3434
interface YqlEditorProps {
35-
changeUserInput: (arg: {input: string}) => void;
35+
changeUserInput: (arg: {input: string; isDirty?: boolean}) => void;
3636
theme: string;
3737
handleGetExplainQueryClick: (text: string) => void;
3838
handleSendExecuteClick: (text: string, partial?: boolean) => void;
@@ -92,13 +92,7 @@ export function YqlEditor({
9292
window.ydbEditor = editor;
9393
const keybindings = getKeyBindings(monaco);
9494
monaco.editor.registerCommand('insertSnippetToEditor', (_asessor, input: string) => {
95-
//suggestController is not properly typed yet in monaco-editor package
96-
const contribution = editor.getContribution<any>('snippetController2');
97-
if (contribution) {
98-
editor.focus();
99-
editor.setValue('');
100-
contribution.insert(input);
101-
}
95+
changeUserInput({input, isDirty: false});
10296
});
10397

10498
if (window.api.codeAssist) {
@@ -185,7 +179,7 @@ export function YqlEditor({
185179

186180
const onChange = (newValue: string) => {
187181
updateErrorsHighlighting();
188-
changeUserInput({input: newValue});
182+
changeUserInput({input: newValue, isDirty: true});
189183
};
190184
return (
191185
<MonacoEditor

src/containers/Tenant/Query/SavedQueries/SavedQueries.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const DeleteDialog = ({visible, queryName, onCancelClick, onConfirmClick}: Delet
6363
const SAVED_QUERIES_COLUMNS_WIDTH_LS_KEY = 'savedQueriesTableColumnsWidth';
6464

6565
interface SavedQueriesProps {
66-
changeUserInput: (value: {input: string}) => void;
66+
changeUserInput: (value: {input: string; isDirty?: boolean}) => void;
6767
}
6868

6969
export const SavedQueries = ({changeUserInput}: SavedQueriesProps) => {
@@ -91,7 +91,7 @@ export const SavedQueries = ({changeUserInput}: SavedQueriesProps) => {
9191

9292
const applyQueryClick = React.useCallback(
9393
({queryText, queryName}: {queryText: string; queryName: string}) => {
94-
changeUserInput({input: queryText});
94+
changeUserInput({input: queryText, isDirty: false});
9595
dispatch(setQueryNameToEdit(queryName));
9696
dispatch(setQueryTab(TENANT_QUERY_TABS_ID.newQuery));
9797
},

src/store/reducers/query/query.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ const slice = createSlice({
4747
name: 'query',
4848
initialState,
4949
reducers: {
50-
changeUserInput: (state, action: PayloadAction<{input: string}>) => {
50+
changeUserInput: (state, action: PayloadAction<{input: string; isDirty?: boolean}>) => {
5151
state.input = action.payload.input;
52+
state.isDirty = action.payload.isDirty;
5253
},
5354
setQueryResult: (state, action: PayloadAction<QueryResult | undefined>) => {
5455
state.result = action.payload;
@@ -145,6 +146,7 @@ const slice = createSlice({
145146
: items;
146147
},
147148
selectUserInput: (state) => state.input,
149+
selectIsDirty: (state) => state.isDirty,
148150
selectQueriesHistoryCurrentIndex: (state) => state.history?.currentIndex,
149151
},
150152
});
@@ -172,6 +174,7 @@ export const {
172174
selectResult,
173175
selectUserInput,
174176
selectQueryDuration,
177+
selectIsDirty,
175178
} = slice.selectors;
176179

177180
interface SendQueryParams extends QueryRequestParams {

src/store/reducers/query/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export interface QueryResult {
6161
export interface QueryState {
6262
input: string;
6363
result?: QueryResult;
64+
isDirty?: boolean;
6465
history: {
6566
queries: QueryInHistory[];
6667
currentIndex: number;

src/utils/hooks/withConfirmation/useChangeInputWithConfirmation.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import NiceModal from '@ebay/nice-modal-react';
55
import {useTypedSelector} from '..';
66
import {CONFIRMATION_DIALOG} from '../../../components/ConfirmationDialog/ConfirmationDialog';
77
import {SaveQueryButton} from '../../../containers/Tenant/Query/SaveQuery/SaveQuery';
8-
import {selectUserInput} from '../../../store/reducers/query/query';
8+
import {selectIsDirty, selectUserInput} from '../../../store/reducers/query/query';
99

1010
import i18n from './i18n';
1111

@@ -66,11 +66,12 @@ export function changeInputWithConfirmation<T>(callback: (args: T) => void) {
6666

6767
export function useChangeInputWithConfirmation<T>(callback: (args: T) => void) {
6868
const userInput = useTypedSelector(selectUserInput);
69+
const isDirty = useTypedSelector(selectIsDirty);
6970
const callbackWithConfirmation = React.useMemo(
7071
() => changeInputWithConfirmation<T>(callback),
7172
[callback],
7273
);
73-
if (!userInput) {
74+
if (!userInput || !isDirty) {
7475
return callback;
7576
}
7677
return callbackWithConfirmation;

0 commit comments

Comments
 (0)