Skip to content

Commit a34530f

Browse files
committed
fix: switch conditions
1 parent 0e2148d commit a34530f

File tree

9 files changed

+84
-31
lines changed

9 files changed

+84
-31
lines changed

src/containers/Tenant/ObjectSummary/SchemaTree/SchemaTree.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export function SchemaTree(props: SchemaTreeProps) {
4848
{currentData: actionsSchemaData, isFetching: isActionsDataFetching},
4949
] = tableSchemaDataApi.useLazyGetTableSchemaDataQuery();
5050

51-
const [querySettings, setQueryExecutionSettings] = useQueryExecutionSettings();
51+
const [querySettings] = useQueryExecutionSettings();
5252
const [createDirectoryOpen, setCreateDirectoryOpen] = React.useState(false);
5353
const [parentPath, setParentPath] = React.useState('');
5454
const setSchemaTreeKey = useDispatchTreeKey();
@@ -128,8 +128,6 @@ export function SchemaTree(props: SchemaTreeProps) {
128128
dispatch,
129129
{
130130
setActivePath: onActivePathUpdate,
131-
updateQueryExecutionSettings: (settings) =>
132-
setQueryExecutionSettings({...querySettings, ...settings}),
133131
showCreateDirectoryDialog: createDirectoryFeatureAvailable
134132
? handleOpenCreateDirectoryDialog
135133
: undefined,
@@ -149,7 +147,6 @@ export function SchemaTree(props: SchemaTreeProps) {
149147
onActivePathUpdate,
150148
querySettings,
151149
rootPath,
152-
setQueryExecutionSettings,
153150
]);
154151

155152
return (

src/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsDialog.tsx

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
useTypedDispatch,
1919
useTypedSelector,
2020
} from '../../../../utils/hooks';
21-
import {DEFAULT_QUERY_SETTINGS, querySettingsValidationSchema} from '../../../../utils/query';
21+
import {QUERY_MODES, querySettingsValidationSchema} from '../../../../utils/query';
2222

2323
import {QuerySettingsSelect} from './QuerySettingsSelect';
2424
import {QuerySettingsTimeout} from './QuerySettingsTimeout';
@@ -74,6 +74,8 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
7474
const {
7575
control,
7676
handleSubmit,
77+
setValue,
78+
watch,
7779
formState: {errors},
7880
} = useForm<QuerySettings>({
7981
defaultValues: initialValues,
@@ -83,6 +85,9 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
8385
const [useShowPlanToSvg] = useSetting<boolean>(USE_SHOW_PLAN_SVG_KEY);
8486
const enableTracingLevel = useTracingLevelOptionAvailable();
8587

88+
const timeout = watch('timeout');
89+
const queryMode = watch('queryMode');
90+
8691
return (
8792
<form onSubmit={handleSubmit(onSubmit)}>
8893
<Dialog.Body className={b('dialog-body')}>
@@ -98,7 +103,15 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
98103
<QuerySettingsSelect
99104
id="queryMode"
100105
setting={field.value}
101-
onUpdateSetting={field.onChange}
106+
onUpdateSetting={(mode) => {
107+
field.onChange(mode);
108+
109+
if (mode !== 'query' && timeout === null) {
110+
setValue('timeout', '');
111+
} else if (mode === 'query') {
112+
setValue('timeout', null);
113+
}
114+
}}
102115
settingOptions={QUERY_SETTINGS_FIELD_SETTINGS.queryMode.options}
103116
/>
104117
)}
@@ -214,14 +227,12 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
214227
render={({field}) => (
215228
<QuerySettingsTimeout
216229
id="timeout"
217-
value={field.value}
230+
value={typeof field.value === 'string' ? undefined : field.value}
218231
onChange={field.onChange}
219-
isEnabled={Boolean(field.value)}
220-
onToggle={(enabled) =>
221-
field.onChange(enabled ? DEFAULT_QUERY_SETTINGS.timeout : '')
222-
}
232+
onToggle={(enabled) => field.onChange(enabled ? '' : null)}
223233
validationState={errors.timeout ? 'invalid' : undefined}
224234
errorMessage={errors.timeout?.message}
235+
isDisabled={queryMode !== QUERY_MODES.query}
225236
/>
226237
)}
227238
/>

src/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsTimeout.scss

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,24 @@
1515
color: var(--g-color-text-secondary);
1616
}
1717

18+
&__switch {
19+
align-items: center;
20+
21+
height: var(--g-text-header-2-line-height);
22+
margin-right: var(--g-spacing-1);
23+
}
24+
1825
&__title {
1926
flex: 4;
2027
align-items: center;
2128

22-
height: var(--g-text-header-2-line-height);
2329
margin-right: var(--g-spacing-3);
2430

2531
font-weight: 500;
2632
white-space: nowrap;
2733
}
34+
35+
&__question-icon {
36+
color: var(--g-color-text-secondary);
37+
}
2838
}

src/containers/Tenant/Query/QuerySettingsDialog/QuerySettingsTimeout.tsx

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
22

3-
import {Switch, TextInput} from '@gravity-ui/uikit';
3+
import {CircleQuestion} from '@gravity-ui/icons';
4+
import {Icon, Popover, Switch, TextInput} from '@gravity-ui/uikit';
45

56
import {cn} from '../../../../utils/cn';
67

@@ -13,22 +14,22 @@ const b = cn('ydb-query-settings-timeout');
1314

1415
interface QuerySettingsTimeoutProps {
1516
id?: string;
16-
value: number | undefined;
17+
value: number | null | undefined;
1718
onChange: (value: number | undefined) => void;
18-
isEnabled: boolean;
1919
onToggle: (enabled: boolean) => void;
2020
validationState?: 'invalid';
2121
errorMessage?: string;
22+
isDisabled?: boolean;
2223
}
2324

2425
export function QuerySettingsTimeout({
2526
id,
2627
value,
2728
onChange,
28-
isEnabled,
2929
onToggle,
3030
validationState,
3131
errorMessage,
32+
isDisabled,
3233
}: QuerySettingsTimeoutProps) {
3334
const handleValueChange = React.useCallback(
3435
(event: React.ChangeEvent<HTMLInputElement>) => {
@@ -38,12 +39,30 @@ export function QuerySettingsTimeout({
3839
[onChange],
3940
);
4041

42+
const isChecked = value !== null;
43+
4144
return (
4245
<React.Fragment>
43-
<Switch checked={isEnabled} onUpdate={onToggle} className={b('title')}>
44-
{QUERY_SETTINGS_FIELD_SETTINGS.timeout.title}
45-
</Switch>
46-
{isEnabled ? (
46+
<div className={b('title')}>
47+
<Switch
48+
disabled={isDisabled}
49+
checked={isChecked}
50+
onUpdate={onToggle}
51+
className={b('switch')}
52+
content={QUERY_SETTINGS_FIELD_SETTINGS.timeout.title}
53+
/>
54+
{isDisabled ? (
55+
<Popover
56+
content={i18n('form.timeout.disabled')}
57+
placement={'bottom-start'}
58+
hasArrow={false}
59+
size="s"
60+
>
61+
<Icon className={b('question-icon')} data={CircleQuestion} />
62+
</Popover>
63+
) : null}
64+
</div>
65+
{isChecked && (
4766
<div className={b('control-wrapper')}>
4867
<TextInput
4968
id={id}
@@ -60,7 +79,7 @@ export function QuerySettingsTimeout({
6079
}
6180
/>
6281
</div>
63-
) : null}
82+
)}
6483
</React.Fragment>
6584
);
6685
}

src/containers/Tenant/Query/QuerySettingsDialog/i18n/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"button-cancel": "Cancel",
1212
"form.timeout.seconds": "sec",
1313
"form.limit.rows": "rows",
14+
"form.timeout.disabled": "Not available to turn off in this query type",
1415
"form.validation.timeout": "Must be positive",
1516
"form.validation.limitRows": "Must be between 1 and 100000",
1617
"description.default": " (default)",

src/containers/Tenant/Query/QuerySettingsDialog/i18n/ru.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"button-cancel": "Отменить",
1212
"form.timeout.seconds": "сек",
1313
"form.limit.rows": "строк",
14+
"form.timeout.disabled": "Невозможно выключить для текущего типа запроса",
1415
"form.validation.timeout": "Таймаут должен быть положительным",
1516
"form.validation.limitRows": "Лимит строк должен быть между 1 и 100000",
1617
"description.default": " (default)",

src/containers/Tenant/utils/schemaActions.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import type {SnippetParams} from '../../../components/ConnectToDB/types';
77
import type {AppDispatch} from '../../../store';
88
import {TENANT_PAGES_IDS, TENANT_QUERY_TABS_ID} from '../../../store/reducers/tenant/constants';
99
import {setQueryTab, setTenantPage} from '../../../store/reducers/tenant/tenant';
10-
import type {QuerySettings} from '../../../types/store/query';
1110
import createToast from '../../../utils/createToast';
1211
import {insertSnippetToEditor} from '../../../utils/monaco/insertSnippet';
1312
import {transformPath} from '../ObjectSummary/transformPath';
@@ -42,7 +41,6 @@ import {
4241
} from './schemaQueryTemplates';
4342

4443
interface ActionsAdditionalParams {
45-
updateQueryExecutionSettings: (settings?: Partial<QuerySettings>) => void;
4644
setActivePath: (path: string) => void;
4745
showCreateDirectoryDialog?: (path: string) => void;
4846
getConfirmation?: () => Promise<boolean>;

src/utils/hooks/useQueryExecutionSettings.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,17 @@ import React from 'react';
22

33
import {useTracingLevelOptionAvailable} from '../../store/reducers/capabilities/hooks';
44
import type {QuerySettings} from '../../types/store/query';
5-
import {QUERY_EXECUTION_SETTINGS_KEY, USE_SHOW_PLAN_SVG_KEY} from '../constants';
6-
import {DEFAULT_QUERY_SETTINGS, STATISTICS_MODES, querySettingsRestoreSchema} from '../query';
5+
import {
6+
ENABLE_QUERY_STREAMING,
7+
QUERY_EXECUTION_SETTINGS_KEY,
8+
USE_SHOW_PLAN_SVG_KEY,
9+
} from '../constants';
10+
import {
11+
DEFAULT_QUERY_SETTINGS,
12+
QUERY_MODES,
13+
STATISTICS_MODES,
14+
querySettingsRestoreSchema,
15+
} from '../query';
716

817
import {useSetting} from './useSetting';
918

@@ -13,6 +22,7 @@ export const useQueryExecutionSettings = () => {
1322

1423
const validatedSettings = querySettingsRestoreSchema.parse(storageSettings);
1524
const [useShowPlanToSvg] = useSetting<boolean>(USE_SHOW_PLAN_SVG_KEY);
25+
const [enableQueryStreaming] = useSetting<boolean>(ENABLE_QUERY_STREAMING);
1626

1727
const setQueryExecutionSettings = React.useCallback(
1828
(settings: QuerySettings) => {
@@ -28,6 +38,10 @@ export const useQueryExecutionSettings = () => {
2838

2939
const settings: QuerySettings = {
3040
...validatedSettings,
41+
timeout:
42+
enableQueryStreaming && validatedSettings.queryMode === QUERY_MODES.query
43+
? validatedSettings.timeout || null
44+
: validatedSettings.timeout || undefined,
3145
statisticsMode: useShowPlanToSvg ? STATISTICS_MODES.full : validatedSettings.statisticsMode,
3246
tracingLevel: enableTracingLevel
3347
? validatedSettings.tracingLevel

src/utils/query.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ export const parseQueryErrorToString = (error: unknown) => {
300300
export const DEFAULT_QUERY_SETTINGS = {
301301
queryMode: QUERY_MODES.query,
302302
transactionMode: TRANSACTION_MODES.implicit,
303-
timeout: 60,
303+
timeout: null,
304304
limitRows: 10000,
305305
statisticsMode: STATISTICS_MODES.none,
306306
tracingLevel: TRACING_LEVELS.off,
@@ -311,10 +311,12 @@ export const transactionModeSchema = z.nativeEnum(TRANSACTION_MODES);
311311
export const statisticsModeSchema = z.nativeEnum(STATISTICS_MODES);
312312
export const tracingLevelSchema = z.nativeEnum(TRACING_LEVELS);
313313
export const querySettingsValidationSchema = z.object({
314-
timeout: z.preprocess(
315-
(val) => (val === '' ? undefined : val),
316-
z.coerce.number().positive().or(z.undefined()),
317-
),
314+
timeout: z
315+
.preprocess(
316+
(val) => (val === '' ? undefined : val),
317+
z.coerce.number().positive().or(z.undefined()).or(z.null()),
318+
)
319+
.or(z.string()),
318320
limitRows: z.preprocess(
319321
(val) => (val === '' ? undefined : val),
320322
z.coerce.number().gt(0).lte(100_000).or(z.undefined()),
@@ -329,7 +331,7 @@ export const querySettingsRestoreSchema = z
329331
.object({
330332
timeout: z.preprocess(
331333
(val) => (val === '' ? undefined : val),
332-
z.coerce.number().positive().optional(),
334+
z.coerce.number().positive().or(z.null()).optional(),
333335
),
334336
limitRows: z.preprocess(
335337
(val) => (val === '' ? undefined : val),

0 commit comments

Comments
 (0)