Skip to content

Commit f2cd0c9

Browse files
committed
Resolves: MTV-3738 | Address more feedback
Signed-off-by: Jeff Puzzo <[email protected]>
1 parent 8d74e6d commit f2cd0c9

File tree

9 files changed

+45
-46
lines changed

9 files changed

+45
-46
lines changed

locales/en/plugin__forklift-console-plugin.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,7 @@
844844
"Select a network": "Select a network",
845845
"Select a network map:": "Select a network map:",
846846
"Select a project": "Select a project",
847+
"Select a provider type": "Select a provider type",
847848
"Select a source provider to list available source networks": "Select a source provider to list available source networks",
848849
"Select a source provider to list available source storages": "Select a source provider to list available source storages",
849850
"Select a storage map:": "Select a storage map:",

src/components/common/Select.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type SelectOption = {
2828

2929
type SelectProps = Pick<PfSelectProps, 'onSelect' | 'className' | 'children'> & {
3030
id: string;
31-
value: string;
31+
value: string | undefined;
3232
options?: SelectOption[];
3333
status?: MenuToggleStatus;
3434
placeholder?: string;

src/providers/create-new/CreateProviderForm.tsx

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { type FC, useCallback, useState } from 'react';
2-
import { FormProvider, useWatch } from 'react-hook-form';
2+
import { FormProvider, useForm, useWatch } from 'react-hook-form';
33
import { useNavigate } from 'react-router-dom-v5-compat';
44
import { createProvider } from 'src/providers/create/utils/createProvider';
55
import { createProviderSecret } from 'src/providers/create/utils/createProviderSecret';
@@ -26,7 +26,6 @@ import NfsDirectoryField from './fields/NfsDirectoryField';
2626
import ProviderNameField from './fields/ProviderNameField';
2727
import ProviderProjectField from './fields/ProviderProjectField';
2828
import ProviderTypeField from './fields/ProviderTypeField';
29-
import { useCreateProviderForm } from './hooks/useCreateProviderForm';
3029
import { buildOvaProviderResources } from './utils/buildProviderResources';
3130
import { getDefaultFormValues } from './utils/getDefaultFormValues';
3231
import CreateProviderFormContextProvider from './CreateProviderFormContextProvider';
@@ -40,7 +39,7 @@ const CreateProviderForm: FC = () => {
4039
const { trackEvent } = useForkliftAnalytics();
4140
const [apiError, setApiError] = useState<Error | null>(null);
4241

43-
const form = useCreateProviderForm({
42+
const form = useForm<CreateProviderFormData>({
4443
defaultValues: getDefaultFormValues(''),
4544
mode: 'onChange',
4645
});
@@ -71,16 +70,19 @@ const CreateProviderForm: FC = () => {
7170
try {
7271
const { provider: newProvider, secret: newSecret } = buildOvaProviderResources(formData);
7372
const secret = await createProviderSecret(newProvider, newSecret);
74-
const provider = await createProvider(newProvider, secret!);
75-
await patchProviderSecretOwner(provider, secret);
7673

77-
trackEvent(TELEMETRY_EVENTS.PROVIDER_CREATE_COMPLETED, {
78-
namespace,
79-
providerType: provider?.spec?.type,
80-
});
74+
if (secret) {
75+
const provider = await createProvider(newProvider, secret);
76+
await patchProviderSecretOwner(provider, secret);
77+
78+
trackEvent(TELEMETRY_EVENTS.PROVIDER_CREATE_COMPLETED, {
79+
namespace,
80+
providerType: provider?.spec?.type,
81+
});
8182

82-
const providerURL = getProviderDetailsPageUrl(provider);
83-
navigate(providerURL);
83+
const providerURL = getProviderDetailsPageUrl(provider);
84+
navigate(providerURL);
85+
}
8486
} catch (err) {
8587
trackEvent(TELEMETRY_EVENTS.PROVIDER_CREATE_FAILED, {
8688
error: err instanceof Error ? err.message : 'Unknown error',

src/providers/create-new/fields/NfsDirectoryField.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
import type { FC } from 'react';
2-
import { useController, useFormContext } from 'react-hook-form';
2+
import { useController } from 'react-hook-form';
33

44
import { FormGroupWithHelpText } from '@components/common/FormGroupWithHelpText/FormGroupWithHelpText';
55
import { TextInput } from '@patternfly/react-core';
6+
import { getInputValidated } from '@utils/form';
67
import { useForkliftTranslation } from '@utils/i18n';
78

9+
import { useCreateProviderFormContext } from '../hooks/useCreateProviderFormContext';
810
import { NFS_PATH_REGEX } from '../utils/validationPatterns';
911

1012
import { ProviderFormFieldId } from './constants';
1113

1214
const NfsDirectoryField: FC = () => {
1315
const { t } = useForkliftTranslation();
14-
const { control } = useFormContext();
16+
const { control } = useCreateProviderFormContext();
1517

1618
const {
1719
field: { onChange, value },
@@ -22,8 +24,8 @@ const NfsDirectoryField: FC = () => {
2224
rules: {
2325
required: t('NFS shared directory is required'),
2426
validate: {
25-
pattern: async (val: string) => {
26-
if (!NFS_PATH_REGEX.test(val)) {
27+
pattern: async (val: string | undefined) => {
28+
if (!val || !NFS_PATH_REGEX.test(val)) {
2729
return t('NFS path must be in format: host:/path (e.g., 10.10.0.10:/ova)');
2830
}
2931

@@ -38,18 +40,18 @@ const NfsDirectoryField: FC = () => {
3840
label={t('NFS shared directory')}
3941
isRequired
4042
fieldId={ProviderFormFieldId.NfsDirectory}
41-
validated={error ? 'error' : 'default'}
43+
validated={getInputValidated(error)}
4244
helperText={t('For example: 10.10.0.10:/ova')}
4345
helperTextInvalid={error?.message}
4446
>
4547
<TextInput
4648
id={ProviderFormFieldId.NfsDirectory}
4749
type="text"
48-
value={value ?? ''}
50+
value={value}
4951
onChange={(_event, val) => {
5052
onChange(val);
5153
}}
52-
validated={error ? 'error' : 'default'}
54+
validated={getInputValidated(error)}
5355
data-testid="nfs-directory-input"
5456
/>
5557
</FormGroupWithHelpText>

src/providers/create-new/fields/ProviderNameField.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import type { FC } from 'react';
2-
import { useController, useFormContext } from 'react-hook-form';
2+
import { useController } from 'react-hook-form';
33

44
import { FormGroupWithHelpText } from '@components/common/FormGroupWithHelpText/FormGroupWithHelpText';
55
import { TextInput } from '@patternfly/react-core';
66
import { getInputValidated } from '@utils/form';
77
import { useForkliftTranslation } from '@utils/i18n';
88
import { validateProviderName } from '@utils/validation/providerNameValidation';
99

10-
import { useCreateProviderDataContext } from '../hooks/useCreateProviderFormContext';
10+
import { useCreateProviderDataContext } from '../hooks/useCreateProviderDataContext';
11+
import { useCreateProviderFormContext } from '../hooks/useCreateProviderFormContext';
1112

1213
import { ProviderFormFieldId } from './constants';
1314

1415
const ProviderNameField: FC = () => {
1516
const { t } = useForkliftTranslation();
16-
const { control } = useFormContext();
17+
const { control } = useCreateProviderFormContext();
1718
const { providerNames } = useCreateProviderDataContext();
1819

1920
const {
@@ -32,7 +33,7 @@ const ProviderNameField: FC = () => {
3233
label={t('Provider name')}
3334
isRequired
3435
fieldId={ProviderFormFieldId.ProviderName}
35-
validated={error ? 'error' : 'default'}
36+
validated={getInputValidated(error)}
3637
helperTextInvalid={error?.message}
3738
>
3839
<TextInput

src/providers/create-new/fields/ProviderTypeField.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import type { FC } from 'react';
2-
import { useController, useFormContext } from 'react-hook-form';
2+
import { useController } from 'react-hook-form';
33

44
import { FormGroupWithHelpText } from '@components/common/FormGroupWithHelpText/FormGroupWithHelpText';
55
import Select from '@components/common/Select';
66
import { SelectList, SelectOption } from '@patternfly/react-core';
7+
import { getInputValidated } from '@utils/form';
78
import { useIsDarkTheme } from '@utils/hooks/useIsDarkTheme';
89
import { useForkliftTranslation } from '@utils/i18n';
910

11+
import { useCreateProviderFormContext } from '../hooks/useCreateProviderFormContext';
1012
import { getProviderTypeOptions } from '../utils/getProviderTypeOptions';
1113

1214
import { ProviderFormFieldId } from './constants';
@@ -16,7 +18,7 @@ import './ProviderTypeField.style.scss';
1618
const ProviderTypeField: FC = () => {
1719
const { t } = useForkliftTranslation();
1820
const isDarkTheme = useIsDarkTheme();
19-
const { control } = useFormContext();
21+
const { control } = useCreateProviderFormContext();
2022

2123
const {
2224
field: { onChange, value },
@@ -42,7 +44,7 @@ const ProviderTypeField: FC = () => {
4244
label={t('Provider type')}
4345
isRequired
4446
fieldId={ProviderFormFieldId.ProviderType}
45-
validated={error ? 'error' : 'default'}
47+
validated={getInputValidated(error)}
4648
helperTextInvalid={error?.message}
4749
>
4850
<Select
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { useContext } from 'react';
2+
3+
import { CreateProviderFormContext } from '../constants';
4+
5+
/**
6+
* Hook to access the Create Provider data context
7+
* @returns Context containing provider names for validation
8+
*/
9+
export const useCreateProviderDataContext = () => useContext(CreateProviderFormContext);

src/providers/create-new/hooks/useCreateProviderForm.ts

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
1-
import { useContext } from 'react';
21
import { useFormContext } from 'react-hook-form';
32

4-
import { CreateProviderFormContext } from '../constants';
53
import type { CreateProviderFormData } from '../types';
64

75
/**
8-
* Typed wrapper around useFormContext for Create Provider form
9-
* Provides type safety when accessing form context in components
6+
* Custom wrapper around react-hook-form's useFormContext hook
7+
* Provides typed access to form context for the provider creation form
108
*/
119
export const useCreateProviderFormContext = () => useFormContext<CreateProviderFormData>();
12-
13-
/**
14-
* Hook to access the Create Provider form data fetching context
15-
* Provides centralized data like provider names for validation
16-
*/
17-
export const useCreateProviderDataContext = () => useContext(CreateProviderFormContext);

0 commit comments

Comments
 (0)