Skip to content

Commit 5469b74

Browse files
committed
fix: review fixes
1 parent 60b550e commit 5469b74

File tree

7 files changed

+119
-12
lines changed

7 files changed

+119
-12
lines changed

package-lock.json

Lines changed: 53 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@gravity-ui/table": "^0.5.0",
2525
"@gravity-ui/uikit": "^6.20.1",
2626
"@gravity-ui/websql-autocomplete": "^9.1.0",
27+
"@hookform/resolvers": "^3.9.0",
2728
"@reduxjs/toolkit": "^2.2.3",
2829
"@tanstack/react-table": "^8.19.3",
2930
"axios": "^1.7.3",
@@ -52,6 +53,7 @@
5253
"uuid": "^10.0.0",
5354
"web-vitals": "^1.1.2",
5455
"ydb-ui-components": "^4.2.0",
56+
"yup": "^1.4.0",
5557
"zod": "^3.23.8"
5658
},
5759
"scripts": {

src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettingsDescription.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ export default function getChangedQueryExecutionSettingsDescription({
2121
const content = settings.options.find((option) => option.value === currentValue)
2222
?.content as string;
2323

24-
result[settings.title] = content;
25-
} else {
24+
if (content) {
25+
result[settings.title] = content;
26+
}
27+
} else if (currentValue) {
2628
result[settings.title] = currentValue;
2729
}
2830
});

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

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
import React from 'react';
22

33
import {Dialog, Link as ExternalLink, Flex, TextInput} from '@gravity-ui/uikit';
4+
import {yupResolver} from '@hookform/resolvers/yup';
45
import {Controller, useForm} from 'react-hook-form';
6+
import * as yup from 'yup';
57

68
import {useTracingLevelOptionAvailable} from '../../../../store/reducers/capabilities/hooks';
79
import {
810
selectQueryAction,
911
setQueryAction,
1012
} from '../../../../store/reducers/queryActions/queryActions';
11-
import type {QuerySettings} from '../../../../types/store/query';
13+
import type {
14+
QueryMode,
15+
QuerySettings,
16+
StatisticsMode,
17+
TracingLevel,
18+
TransactionMode,
19+
} from '../../../../types/store/query';
1220
import {cn} from '../../../../utils/cn';
1321
import {
1422
useQueryExecutionSettings,
@@ -24,6 +32,27 @@ import './QuerySettingsDialog.scss';
2432

2533
const b = cn('ydb-query-settings-dialog');
2634

35+
const validationSchema = yup.object().shape({
36+
timeout: yup.string().test('is-within-range', i18n('form.validation.timeout'), (value) => {
37+
if (!value) {
38+
return true;
39+
}
40+
const num = Number(value);
41+
return !isNaN(num) && num > 0;
42+
}),
43+
limitRows: yup.string().test('is-within-range', i18n('form.validation.limitRows'), (value) => {
44+
if (!value) {
45+
return true;
46+
}
47+
const num = Number(value);
48+
return !isNaN(num) && num > 0 && num <= 100000;
49+
}),
50+
queryMode: yup.mixed<QueryMode>().required(),
51+
transactionMode: yup.mixed<TransactionMode>().required(),
52+
statisticsMode: yup.mixed<StatisticsMode>(),
53+
tracingLevel: yup.mixed<TracingLevel>(),
54+
});
55+
2756
export function QuerySettingsDialog() {
2857
const dispatch = useTypedDispatch();
2958
const queryAction = useTypedSelector(selectQueryAction);
@@ -66,8 +95,13 @@ interface QuerySettingsFormProps {
6695
}
6796

6897
function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsFormProps) {
69-
const {control, handleSubmit} = useForm<QuerySettings>({
98+
const {
99+
control,
100+
handleSubmit,
101+
formState: {errors},
102+
} = useForm<QuerySettings>({
70103
defaultValues: initialValues,
104+
resolver: yupResolver<QuerySettings>(validationSchema),
71105
});
72106

73107
const enableTracingLevel = useTracingLevelOptionAvailable();
@@ -85,6 +119,7 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
85119
control={control}
86120
render={({field}) => (
87121
<QuerySettingsSelect
122+
id="queryMode"
88123
setting={field.value}
89124
onUpdateSetting={field.onChange}
90125
settingOptions={QUERY_SETTINGS_FIELD_SETTINGS.queryMode.options}
@@ -104,10 +139,14 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
104139
render={({field}) => (
105140
<React.Fragment>
106141
<TextInput
142+
id="timeout"
107143
type="number"
108144
{...field}
109145
className={b('timeout')}
110146
placeholder="60"
147+
validationState={errors.timeout ? 'invalid' : undefined}
148+
errorMessage={errors.timeout?.message}
149+
errorPlacement="inside"
111150
/>
112151
<span className={b('timeout-suffix')}>
113152
{i18n('form.timeout.seconds')}
@@ -128,6 +167,7 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
128167
control={control}
129168
render={({field}) => (
130169
<QuerySettingsSelect
170+
id="tracingLevel"
131171
setting={field.value}
132172
onUpdateSetting={field.onChange}
133173
settingOptions={
@@ -149,6 +189,7 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
149189
control={control}
150190
render={({field}) => (
151191
<QuerySettingsSelect
192+
id="transactionMode"
152193
setting={field.value}
153194
onUpdateSetting={field.onChange}
154195
settingOptions={
@@ -169,6 +210,7 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
169210
control={control}
170211
render={({field}) => (
171212
<QuerySettingsSelect
213+
id="statisticsMode"
172214
setting={field.value}
173215
onUpdateSetting={field.onChange}
174216
settingOptions={
@@ -188,14 +230,16 @@ function QuerySettingsForm({initialValues, onSubmit, onClose}: QuerySettingsForm
188230
name="limitRows"
189231
control={control}
190232
render={({field}) => (
191-
<React.Fragment>
192-
<TextInput
193-
type="number"
194-
{...field}
195-
className={b('limit-rows')}
196-
placeholder="10000"
197-
/>
198-
</React.Fragment>
233+
<TextInput
234+
id="limitRows"
235+
type="number"
236+
{...field}
237+
className={b('limit-rows')}
238+
placeholder="10000"
239+
validationState={errors.limitRows ? 'invalid' : undefined}
240+
errorMessage={errors.limitRows?.message}
241+
errorPlacement="inside"
242+
/>
199243
)}
200244
/>
201245
</div>

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type SelectType = QueryMode | TransactionMode | StatisticsMode | TracingLevel;
2323
type QuerySettingSelectOption<T> = SelectOption<T> & {isDefault?: boolean};
2424

2525
interface QuerySettingsSelectProps<T extends SelectType> {
26+
id?: string;
2627
setting: T;
2728
settingOptions: QuerySettingSelectOption<T>[];
2829
onUpdateSetting: (mode: T) => void;
@@ -32,6 +33,7 @@ export function QuerySettingsSelect<T extends SelectType>(props: QuerySettingsSe
3233
return (
3334
<div className={b('selector')}>
3435
<Select<T>
36+
id={props.id}
3537
options={props.settingOptions}
3638
value={[props.setting]}
3739
onUpdate={(value) => {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
"button-done": "Save",
1010
"button-cancel": "Cancel",
1111
"form.timeout.seconds": "sec",
12+
"form.validation.timeout": "Must be positive",
13+
"form.validation.limitRows": "Must be between 1 and 100000",
1214
"description.default": " (default)",
1315
"docs": "Documentation"
1416
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
"button-done": "Готово",
1010
"button-cancel": "Отменить",
1111
"form.timeout.seconds": "сек",
12+
"form.validation.timeout": "Таймаут должен быть положительным",
13+
"form.validation.limitRows": "Лимит строк должен быть между 1 и 100000",
1214
"description.default": " (default)",
1315
"docs": "Документация"
1416
}

0 commit comments

Comments
 (0)