From 4f76b1fda42e528e8842f80f8b79043c1de9f099 Mon Sep 17 00:00:00 2001 From: Chaim Lev-Ari Date: Sun, 11 Jan 2026 17:01:28 +0000 Subject: [PATCH] refactor(environments): prepare common fields for edit env form BE-12531 (#1641) Co-authored-by: Claude Sonnet 4.5 --- .../EdgeScriptSettingsFieldset.tsx | 2 +- .../AzureEndpointConfigSection.tsx | 3 - .../EnvironmentFormActions.test.tsx | 66 ++++++++++++++++++ .../EnvironmentFormActions.tsx | 42 ++++++++++++ .../EnvironmentUrlField.tsx | 17 ++++- .../MetadataFieldset/GroupsField.tsx | 0 .../MetadataFieldset/MetadataFieldset.tsx | 0 .../MetadataFieldset/index.ts | 0 .../MetadataFieldset/validation.ts | 0 .../shared => common/NameField}/NameField.tsx | 11 +-- .../PublicUrlField/PublicUrlField.test.tsx | 67 +++++++++++++++++++ .../common/PublicUrlField/PublicUrlField.tsx | 25 +++++++ .../portainer/environments/utils/index.ts | 4 ++ .../WizardAzure/WizardAzure.tsx | 7 +- .../WizardDocker/APITab/APIForm.tsx | 2 +- .../APITab/APIForm.validation.tsx | 5 +- .../WizardDocker/SocketTab/SocketForm.tsx | 2 +- .../SocketTab/SocketForm.validation.tsx | 4 +- .../WizardPodman/SocketTab/SocketForm.tsx | 2 +- .../SocketTab/SocketForm.validation.tsx | 4 +- .../shared/AgentForm/AgentForm.tsx | 4 +- .../shared/AgentForm/AgentForm.validation.tsx | 5 +- .../EdgeAgentForm/EdgeAgentFieldset.tsx | 3 +- .../EdgeAgentForm/EdgeAgentForm.validation.ts | 5 +- .../shared/MoreSettingsSection.tsx | 4 +- 25 files changed, 249 insertions(+), 35 deletions(-) create mode 100644 app/react/portainer/environments/ItemView/EnvironmentFormActions/EnvironmentFormActions.test.tsx create mode 100644 app/react/portainer/environments/ItemView/EnvironmentFormActions/EnvironmentFormActions.tsx rename app/react/portainer/environments/{wizard/EnvironmentsCreationView/shared/AgentForm => common/EnvironmentUrlField}/EnvironmentUrlField.tsx (57%) rename app/react/portainer/environments/{wizard/EnvironmentsCreationView/shared => common}/MetadataFieldset/GroupsField.tsx (100%) rename app/react/portainer/environments/{wizard/EnvironmentsCreationView/shared => common}/MetadataFieldset/MetadataFieldset.tsx (100%) rename app/react/portainer/environments/{wizard/EnvironmentsCreationView/shared => common}/MetadataFieldset/index.ts (100%) rename app/react/portainer/environments/{wizard/EnvironmentsCreationView/shared => common}/MetadataFieldset/validation.ts (100%) rename app/react/portainer/environments/{wizard/EnvironmentsCreationView/shared => common/NameField}/NameField.tsx (83%) create mode 100644 app/react/portainer/environments/common/PublicUrlField/PublicUrlField.test.tsx create mode 100644 app/react/portainer/environments/common/PublicUrlField/PublicUrlField.tsx diff --git a/app/react/edge/components/EdgeScriptForm/EdgeScriptSettingsFieldset.tsx b/app/react/edge/components/EdgeScriptForm/EdgeScriptSettingsFieldset.tsx index cab25a0af..bd8e2ad16 100644 --- a/app/react/edge/components/EdgeScriptForm/EdgeScriptSettingsFieldset.tsx +++ b/app/react/edge/components/EdgeScriptForm/EdgeScriptSettingsFieldset.tsx @@ -1,6 +1,6 @@ import { useFormikContext, Field } from 'formik'; -import { GroupField } from '@/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MetadataFieldset/GroupsField'; +import { GroupField } from '@/react/portainer/environments/common/MetadataFieldset/GroupsField'; import { FormControl } from '@@/form-components/FormControl'; import { Input } from '@@/form-components/Input'; diff --git a/app/react/portainer/environments/ItemView/AzureEndpointConfigSection/AzureEndpointConfigSection.tsx b/app/react/portainer/environments/ItemView/AzureEndpointConfigSection/AzureEndpointConfigSection.tsx index 578d01758..36fb90567 100644 --- a/app/react/portainer/environments/ItemView/AzureEndpointConfigSection/AzureEndpointConfigSection.tsx +++ b/app/react/portainer/environments/ItemView/AzureEndpointConfigSection/AzureEndpointConfigSection.tsx @@ -31,7 +31,6 @@ export function AzureEndpointConfigSection({ values, setValues }: Props) { }) } placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - required data-cy="azure-credential-appid-input" /> @@ -47,7 +46,6 @@ export function AzureEndpointConfigSection({ values, setValues }: Props) { }) } placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - required data-cy="azure-credential-tenantid-input" /> @@ -67,7 +65,6 @@ export function AzureEndpointConfigSection({ values, setValues }: Props) { }) } placeholder="cOrXoK/1D35w8YQ8nH1/8ZGwzz45JIYD5jxHKXEQknk=" - required data-cy="azure-credential-authkey-input" /> diff --git a/app/react/portainer/environments/ItemView/EnvironmentFormActions/EnvironmentFormActions.test.tsx b/app/react/portainer/environments/ItemView/EnvironmentFormActions/EnvironmentFormActions.test.tsx new file mode 100644 index 000000000..702f9c7d4 --- /dev/null +++ b/app/react/portainer/environments/ItemView/EnvironmentFormActions/EnvironmentFormActions.test.tsx @@ -0,0 +1,66 @@ +import { render, screen } from '@testing-library/react'; +import { describe, expect, it } from 'vitest'; + +import { withTestRouter } from '@/react/test-utils/withRouter'; + +import { EnvironmentFormActions } from './EnvironmentFormActions'; + +describe('EnvironmentFormActions', () => { + it('should render update and cancel buttons', async () => { + renderComponent({ isLoading: false }); + + expect( + await screen.findByRole('button', { name: 'Update environment' }) + ).toBeVisible(); + expect(screen.getByText('Cancel')).toBeVisible(); + }); + + it('should disable update button when form is not dirty', () => { + renderComponent({ isDirty: false }); + + const updateButton = screen.getByRole('button', { + name: 'Update environment', + }); + expect(updateButton).toBeDisabled(); + }); + + it('should disable update button when form is invalid', () => { + renderComponent({ isValid: false, isDirty: true }); + + const updateButton = screen.getByRole('button', { + name: 'Update environment', + }); + expect(updateButton).toBeDisabled(); + }); + + it('should enable update button when form is valid and dirty', () => { + renderComponent({ isValid: true, isDirty: true }); + + const updateButton = screen.getByRole('button', { + name: 'Update environment', + }); + expect(updateButton).toBeEnabled(); + }); + + it('should disable submit button when loading', () => { + renderComponent({ isLoading: true }); + + const updateButton = screen.getByText('Updating environment...'); + + expect(updateButton).toBeDisabled(); + }); +}); + +function renderComponent( + props?: Partial> +) { + const defaultProps: React.ComponentProps = { + isLoading: false, + isValid: true, + isDirty: false, + }; + + const Wrapper = withTestRouter(EnvironmentFormActions); + + return render(); +} diff --git a/app/react/portainer/environments/ItemView/EnvironmentFormActions/EnvironmentFormActions.tsx b/app/react/portainer/environments/ItemView/EnvironmentFormActions/EnvironmentFormActions.tsx new file mode 100644 index 000000000..9518af10c --- /dev/null +++ b/app/react/portainer/environments/ItemView/EnvironmentFormActions/EnvironmentFormActions.tsx @@ -0,0 +1,42 @@ +import { Save } from 'lucide-react'; + +import { LoadingButton } from '@@/buttons/LoadingButton'; +import { Button } from '@@/buttons'; +import { Link } from '@@/Link'; + +interface Props { + isLoading: boolean; + isValid: boolean; + isDirty: boolean; +} + +export function EnvironmentFormActions({ isLoading, isValid, isDirty }: Props) { + return ( +
+
+ + Update environment + + + +
+
+ ); +} diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/EnvironmentUrlField.tsx b/app/react/portainer/environments/common/EnvironmentUrlField/EnvironmentUrlField.tsx similarity index 57% rename from app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/EnvironmentUrlField.tsx rename to app/react/portainer/environments/common/EnvironmentUrlField/EnvironmentUrlField.tsx index 1b5bd7a17..fad051fb6 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/EnvironmentUrlField.tsx +++ b/app/react/portainer/environments/common/EnvironmentUrlField/EnvironmentUrlField.tsx @@ -5,18 +5,28 @@ import { Input } from '@@/form-components/Input'; export function EnvironmentUrlField({ placeholderPort = '9001', + isAgent, + disabled, + optional, }: { placeholderPort?: string; + isAgent?: boolean; + disabled?: boolean; + optional?: boolean; }) { const [, meta] = useField('environmentUrl'); return ( : or :' + : 'URL or IP address of a Docker host. The Docker API must be exposed over a TCP port. Please refer to the Docker documentation to configure it.' + } > ); diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MetadataFieldset/GroupsField.tsx b/app/react/portainer/environments/common/MetadataFieldset/GroupsField.tsx similarity index 100% rename from app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MetadataFieldset/GroupsField.tsx rename to app/react/portainer/environments/common/MetadataFieldset/GroupsField.tsx diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MetadataFieldset/MetadataFieldset.tsx b/app/react/portainer/environments/common/MetadataFieldset/MetadataFieldset.tsx similarity index 100% rename from app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MetadataFieldset/MetadataFieldset.tsx rename to app/react/portainer/environments/common/MetadataFieldset/MetadataFieldset.tsx diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MetadataFieldset/index.ts b/app/react/portainer/environments/common/MetadataFieldset/index.ts similarity index 100% rename from app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MetadataFieldset/index.ts rename to app/react/portainer/environments/common/MetadataFieldset/index.ts diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MetadataFieldset/validation.ts b/app/react/portainer/environments/common/MetadataFieldset/validation.ts similarity index 100% rename from app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MetadataFieldset/validation.ts rename to app/react/portainer/environments/common/MetadataFieldset/validation.ts diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/NameField.tsx b/app/react/portainer/environments/common/NameField/NameField.tsx similarity index 83% rename from app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/NameField.tsx rename to app/react/portainer/environments/common/NameField/NameField.tsx index 527becfe1..68f76f072 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/NameField.tsx +++ b/app/react/portainer/environments/common/NameField/NameField.tsx @@ -46,7 +46,7 @@ export function NameField({ ); } -export async function isNameUnique(name = '') { +export async function isNameUnique(name = '', envId?: number) { if (!name) { return true; } @@ -57,7 +57,8 @@ export async function isNameUnique(name = '') { query: { name, excludeSnapshots: true }, }); return ( - result.totalCount === 0 || result.value.every((e) => e.Name !== name) + result.totalCount === 0 || + result.value.every((e) => e.Name !== name || e.Id === envId) ); } catch (e) { // if backend fails to respond, assume name is unique, name validation happens also in the backend @@ -65,8 +66,10 @@ export async function isNameUnique(name = '') { } } -export function useNameValidation() { - const uniquenessTest = useCachedValidation(isNameUnique); +export function useNameValidation(envId?: number) { + const uniquenessTest = useCachedValidation((name: string | undefined) => + isNameUnique(name || '', envId) + ); return string() .required('Name is required') diff --git a/app/react/portainer/environments/common/PublicUrlField/PublicUrlField.test.tsx b/app/react/portainer/environments/common/PublicUrlField/PublicUrlField.test.tsx new file mode 100644 index 000000000..05725e6a5 --- /dev/null +++ b/app/react/portainer/environments/common/PublicUrlField/PublicUrlField.test.tsx @@ -0,0 +1,67 @@ +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { Form, Formik } from 'formik'; +import { describe, expect, it } from 'vitest'; + +import { PublicUrlField } from './PublicUrlField'; + +describe('PublicUrlField', () => { + it('should render the public URL field', () => { + renderComponent(); + + const input = screen.getByLabelText('Public IP'); + expect(input).toBeVisible(); + }); + + it('should display placeholder text', () => { + renderComponent(); + + const input = screen.getByPlaceholderText( + 'e.g. 10.0.0.10 or mydocker.mydomain.com' + ); + expect(input).toBeVisible(); + }); + + it('should update value on user input', async () => { + const { publicUrl } = renderComponent(); + + const input = screen.getByLabelText('Public IP'); + await userEvent.clear(input); + await userEvent.type(input, '10.0.0.10'); + + expect(publicUrl()).toBe('10.0.0.10'); + }); + + it('should display error message when field has error', () => { + renderComponent({ initialErrors: { publicUrl: 'Invalid URL' } }); + + expect(screen.getByText('Invalid URL')).toBeVisible(); + }); +}); + +function renderComponent(options?: { initialErrors?: { publicUrl?: string } }) { + const initialValues = { publicUrl: '' }; + let formValues = initialValues; + + const result = render( + {}} + > + {({ values }) => { + formValues = values; + return ( +
+ + + ); + }} +
+ ); + + return { + ...result, + publicUrl: () => formValues.publicUrl, + }; +} diff --git a/app/react/portainer/environments/common/PublicUrlField/PublicUrlField.tsx b/app/react/portainer/environments/common/PublicUrlField/PublicUrlField.tsx new file mode 100644 index 000000000..203de5f17 --- /dev/null +++ b/app/react/portainer/environments/common/PublicUrlField/PublicUrlField.tsx @@ -0,0 +1,25 @@ +import { Field, useField } from 'formik'; + +import { FormControl } from '@@/form-components/FormControl'; +import { Input } from '@@/form-components/Input'; + +export function PublicUrlField() { + const [, meta] = useField('publicUrl'); + + return ( + + + + ); +} diff --git a/app/react/portainer/environments/utils/index.ts b/app/react/portainer/environments/utils/index.ts index 35fc4982c..9673e3e0f 100644 --- a/app/react/portainer/environments/utils/index.ts +++ b/app/react/portainer/environments/utils/index.ts @@ -89,6 +89,10 @@ export function isDockerAPIEnvironment(environment: Environment) { ); } +export function isAzureEnvironment(envType: EnvironmentType) { + return envType === EnvironmentType.Azure; +} + export function getDashboardRoute(environment: Environment) { if (isEdgeEnvironment(environment.Type)) { if (!environment.EdgeID) { diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardAzure/WizardAzure.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardAzure/WizardAzure.tsx index 4df2b6fc4..7e3bb5b90 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardAzure/WizardAzure.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardAzure/WizardAzure.tsx @@ -7,6 +7,11 @@ import { useCreateAzureEnvironmentMutation } from '@/react/portainer/environment import { notifySuccess } from '@/portainer/services/notifications'; import { Environment } from '@/react/portainer/environments/types'; import { EnvironmentMetadata } from '@/react/portainer/environments/environment.service/create'; +import { + NameField, + useNameValidation, +} from '@/react/portainer/environments/common/NameField/NameField'; +import { metadataValidation } from '@/react/portainer/environments/common/MetadataFieldset/validation'; import { LoadingButton } from '@@/buttons/LoadingButton'; import { Input } from '@@/form-components/Input'; @@ -14,9 +19,7 @@ import { FormControl } from '@@/form-components/FormControl'; import { BoxSelector, BoxSelectorOption } from '@@/BoxSelector'; import { BadgeIcon } from '@@/BadgeIcon'; -import { NameField, useNameValidation } from '../shared/NameField'; import { AnalyticsStateKey } from '../types'; -import { metadataValidation } from '../shared/MetadataFieldset/validation'; import { MoreSettingsSection } from '../shared/MoreSettingsSection'; interface FormValues { diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/APITab/APIForm.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/APITab/APIForm.tsx index a88fc33de..34511c340 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/APITab/APIForm.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/APITab/APIForm.tsx @@ -9,12 +9,12 @@ import { EnvironmentCreationTypes, } from '@/react/portainer/environments/types'; import { TLSFieldset } from '@/react/components/TLSFieldset/TLSFieldset'; +import { NameField } from '@/react/portainer/environments/common/NameField/NameField'; import { LoadingButton } from '@@/buttons/LoadingButton'; import { FormControl } from '@@/form-components/FormControl'; import { Input } from '@@/form-components/Input'; -import { NameField } from '../../shared/NameField'; import { MoreSettingsSection } from '../../shared/MoreSettingsSection'; import { useValidation } from './APIForm.validation'; diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/APITab/APIForm.validation.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/APITab/APIForm.validation.tsx index 786129eb3..9c05b9de0 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/APITab/APIForm.validation.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/APITab/APIForm.validation.tsx @@ -1,9 +1,8 @@ import { object, SchemaOf, string } from 'yup'; import { tlsConfigValidation } from '@/react/components/TLSFieldset/TLSFieldset'; - -import { metadataValidation } from '../../shared/MetadataFieldset/validation'; -import { useNameValidation } from '../../shared/NameField'; +import { useNameValidation } from '@/react/portainer/environments/common/NameField/NameField'; +import { metadataValidation } from '@/react/portainer/environments/common/MetadataFieldset/validation'; import { FormValues } from './types'; diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/SocketTab/SocketForm.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/SocketTab/SocketForm.tsx index f8344ea96..a21bcca30 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/SocketTab/SocketForm.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/SocketTab/SocketForm.tsx @@ -8,13 +8,13 @@ import { ContainerEngine, Environment, } from '@/react/portainer/environments/types'; +import { NameField } from '@/react/portainer/environments/common/NameField/NameField'; import { LoadingButton } from '@@/buttons/LoadingButton'; import { FormControl } from '@@/form-components/FormControl'; import { Input } from '@@/form-components/Input'; import { SwitchField } from '@@/form-components/SwitchField'; -import { NameField } from '../../shared/NameField'; import { MoreSettingsSection } from '../../shared/MoreSettingsSection'; import { useValidation } from './SocketForm.validation'; diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/SocketTab/SocketForm.validation.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/SocketTab/SocketForm.validation.tsx index f8b48cf0d..841fbe25c 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/SocketTab/SocketForm.validation.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardDocker/SocketTab/SocketForm.validation.tsx @@ -1,7 +1,7 @@ import { boolean, object, SchemaOf, string } from 'yup'; -import { metadataValidation } from '../../shared/MetadataFieldset/validation'; -import { useNameValidation } from '../../shared/NameField'; +import { useNameValidation } from '@/react/portainer/environments/common/NameField/NameField'; +import { metadataValidation } from '@/react/portainer/environments/common/MetadataFieldset/validation'; import { FormValues } from './types'; diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardPodman/SocketTab/SocketForm.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardPodman/SocketTab/SocketForm.tsx index 00824f318..a1d0036f3 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardPodman/SocketTab/SocketForm.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardPodman/SocketTab/SocketForm.tsx @@ -8,13 +8,13 @@ import { ContainerEngine, Environment, } from '@/react/portainer/environments/types'; +import { NameField } from '@/react/portainer/environments/common/NameField/NameField'; import { LoadingButton } from '@@/buttons/LoadingButton'; import { FormControl } from '@@/form-components/FormControl'; import { Input } from '@@/form-components/Input'; import { SwitchField } from '@@/form-components/SwitchField'; -import { NameField } from '../../shared/NameField'; import { MoreSettingsSection } from '../../shared/MoreSettingsSection'; import { useValidation } from './SocketForm.validation'; diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardPodman/SocketTab/SocketForm.validation.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardPodman/SocketTab/SocketForm.validation.tsx index f8b48cf0d..841fbe25c 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardPodman/SocketTab/SocketForm.validation.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/WizardPodman/SocketTab/SocketForm.validation.tsx @@ -1,7 +1,7 @@ import { boolean, object, SchemaOf, string } from 'yup'; -import { metadataValidation } from '../../shared/MetadataFieldset/validation'; -import { useNameValidation } from '../../shared/NameField'; +import { useNameValidation } from '@/react/portainer/environments/common/NameField/NameField'; +import { metadataValidation } from '@/react/portainer/environments/common/MetadataFieldset/validation'; import { FormValues } from './types'; diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/AgentForm.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/AgentForm.tsx index 86505ec8c..bc11a1e25 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/AgentForm.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/AgentForm.tsx @@ -9,13 +9,13 @@ import { Environment, } from '@/react/portainer/environments/types'; import { CreateAgentEnvironmentValues } from '@/react/portainer/environments/environment.service/create'; +import { NameField } from '@/react/portainer/environments/common/NameField/NameField'; +import { EnvironmentUrlField } from '@/react/portainer/environments/common/EnvironmentUrlField/EnvironmentUrlField'; import { LoadingButton } from '@@/buttons/LoadingButton'; -import { NameField } from '../NameField'; import { MoreSettingsSection } from '../MoreSettingsSection'; -import { EnvironmentUrlField } from './EnvironmentUrlField'; import { useValidation } from './AgentForm.validation'; interface Props { diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/AgentForm.validation.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/AgentForm.validation.tsx index 090b03165..d39d9cc90 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/AgentForm.validation.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/AgentForm/AgentForm.validation.tsx @@ -1,9 +1,8 @@ import { mixed, object, SchemaOf, string } from 'yup'; import { CreateAgentEnvironmentValues } from '@/react/portainer/environments/environment.service/create'; - -import { metadataValidation } from '../MetadataFieldset/validation'; -import { useNameValidation } from '../NameField'; +import { useNameValidation } from '@/react/portainer/environments/common/NameField/NameField'; +import { metadataValidation } from '@/react/portainer/environments/common/MetadataFieldset/validation'; export function useValidation(): SchemaOf { return object({ diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentForm/EdgeAgentFieldset.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentForm/EdgeAgentFieldset.tsx index a85bf0c49..d51988192 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentForm/EdgeAgentFieldset.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentForm/EdgeAgentFieldset.tsx @@ -1,8 +1,7 @@ import { isBE } from '@/react/portainer/feature-flags/feature-flags.service'; import { PortainerTunnelAddrField } from '@/react/portainer/common/PortainerTunnelAddrField'; import { PortainerUrlField } from '@/react/portainer/common/PortainerUrlField'; - -import { NameField } from '../../NameField'; +import { NameField } from '@/react/portainer/environments/common/NameField/NameField'; interface EdgeAgentFormProps { readonly?: boolean; diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentForm/EdgeAgentForm.validation.ts b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentForm/EdgeAgentForm.validation.ts index 09fb72517..a67b103f6 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentForm/EdgeAgentForm.validation.ts +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentForm/EdgeAgentForm.validation.ts @@ -6,9 +6,8 @@ import { } from '@/react/edge/components/EdgeAsyncIntervalsForm'; import { validation as urlValidation } from '@/react/portainer/common/PortainerTunnelAddrField'; import { isBE } from '@/react/portainer/feature-flags/feature-flags.service'; - -import { metadataValidation } from '../../MetadataFieldset/validation'; -import { useNameValidation } from '../../NameField'; +import { useNameValidation } from '@/react/portainer/environments/common/NameField/NameField'; +import { metadataValidation } from '@/react/portainer/environments/common/MetadataFieldset/validation'; import { FormValues } from './types'; diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MoreSettingsSection.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MoreSettingsSection.tsx index 089d37672..b1fac053f 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MoreSettingsSection.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/MoreSettingsSection.tsx @@ -1,8 +1,8 @@ import { PropsWithChildren } from 'react'; -import { FormSection } from '@@/form-components/FormSection'; +import { MetadataFieldset } from '@/react/portainer/environments/common/MetadataFieldset/MetadataFieldset'; -import { MetadataFieldset } from './MetadataFieldset'; +import { FormSection } from '@@/form-components/FormSection'; export function MoreSettingsSection({ children }: PropsWithChildren) { return (