Skip to content

Commit 4cdd315

Browse files
committed
fixes
1 parent db7b22b commit 4cdd315

File tree

6 files changed

+33
-58
lines changed

6 files changed

+33
-58
lines changed

public/locales/en.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@
271271
"max25chars": "Max length is 25 characters.",
272272
"userExists": "User with this email already exists!",
273273
"atLeastOneUser": "You need to have at least one member assigned.",
274-
"notValidChargingTargetFormat": "Use lowercase letters a-f, numbers 0-9, and hyphens (-) in the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
274+
"notValidChargingTargetFormat": "Use lowercase letters a-f, numbers 0-9, and hyphens (-) in the format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
275275
},
276276
"common": {
277277
"documentation": "Documentation",

src/components/Dialogs/CreateProjectDialogContainer.tsx

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ import { useCallback, useEffect, useRef } from 'react';
22
import { useApiResourceMutation } from '../../lib/api/useApiResource';
33
import { ErrorDialogHandle } from '../Shared/ErrorMessageBox.tsx';
44
import { APIError } from '../../lib/api/error';
5-
import {
6-
CreateProjectWorkspaceDialog,
7-
OnCreatePayload,
8-
} from './CreateProjectWorkspaceDialog.tsx';
5+
import { CreateProjectWorkspaceDialog, OnCreatePayload } from './CreateProjectWorkspaceDialog.tsx';
96

107
import { useToast } from '../../context/ToastContext.tsx';
118
import { useAuthOnboarding } from '../../spaces/onboarding/auth/AuthContextOnboarding.tsx';
@@ -14,11 +11,7 @@ import { MemberRoles } from '../../lib/api/types/shared/members.ts';
1411
import { useTranslation } from 'react-i18next';
1512
import { zodResolver } from '@hookform/resolvers/zod';
1613
import { useForm } from 'react-hook-form';
17-
import {
18-
CreateProject,
19-
CreateProjectResource,
20-
CreateProjectType,
21-
} from '../../lib/api/types/crate/createProject.ts';
14+
import { CreateProject, CreateProjectResource, CreateProjectType } from '../../lib/api/types/crate/createProject.ts';
2215
import { validationSchemaProjectWorkspace } from '../../lib/api/validations/schemas.ts';
2316
import { CreateDialogProps } from './CreateWorkspaceDialogContainer.tsx';
2417

@@ -30,6 +23,7 @@ export function CreateProjectDialogContainer({
3023
setIsOpen: (isOpen: boolean) => void;
3124
}) {
3225
const {
26+
getValues,
3327
register,
3428
handleSubmit,
3529
resetField,
@@ -59,9 +53,7 @@ export function CreateProjectDialogContainer({
5953

6054
useEffect(() => {
6155
if (username) {
62-
setValue('members', [
63-
{ name: username, roles: [MemberRoles.admin], kind: 'User' },
64-
]);
56+
setValue('members', [{ name: username, roles: [MemberRoles.admin], kind: 'User' }]);
6557
}
6658
if (!isOpen) {
6759
clearForm();
@@ -70,9 +62,7 @@ export function CreateProjectDialogContainer({
7062

7163
const toast = useToast();
7264

73-
const { trigger } = useApiResourceMutation<CreateProjectType>(
74-
CreateProjectResource(),
75-
);
65+
const { trigger } = useApiResourceMutation<CreateProjectType>(CreateProjectResource());
7666

7767
const errorDialogRef = useRef<ErrorDialogHandle>(null);
7868

@@ -99,9 +89,7 @@ export function CreateProjectDialogContainer({
9989
console.error(e);
10090
if (e instanceof APIError) {
10191
if (errorDialogRef.current) {
102-
errorDialogRef.current.showErrorDialog(
103-
`${e.message}: ${JSON.stringify(e.info)}`,
104-
);
92+
errorDialogRef.current.showErrorDialog(`${e.message}: ${JSON.stringify(e.info)}`);
10593
}
10694
}
10795
return false;
@@ -110,6 +98,7 @@ export function CreateProjectDialogContainer({
11098

11199
return (
112100
<CreateProjectWorkspaceDialog
101+
getValues={getValues}
113102
isOpen={isOpen}
114103
setIsOpen={setIsOpen}
115104
errorDialogRef={errorDialogRef}

src/components/Dialogs/CreateProjectWorkspaceDialog.tsx

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { EditMembers } from '../Members/EditMembers.tsx';
1313
import { useTranslation } from 'react-i18next';
1414

1515
import { CreateDialogProps } from './CreateWorkspaceDialogContainer.tsx';
16-
import { FieldErrors, UseFormRegister, UseFormSetValue } from 'react-hook-form';
16+
import { FieldErrors, UseFormGetValues, UseFormRegister, UseFormSetValue } from 'react-hook-form';
1717
import { MetadataForm } from './MetadataForm.tsx';
1818

1919
export type OnCreatePayload = {
@@ -36,6 +36,7 @@ export interface CreateProjectWorkspaceDialogProps {
3636
setValue: UseFormSetValue<CreateDialogProps>;
3737
projectName?: string;
3838
type: 'workspace' | 'project';
39+
getValues: UseFormGetValues<CreateDialogProps>;
3940
}
4041

4142
export function CreateProjectWorkspaceDialog({
@@ -50,6 +51,7 @@ export function CreateProjectWorkspaceDialog({
5051
setValue,
5152
projectName,
5253
type,
54+
getValues,
5355
}: CreateProjectWorkspaceDialogProps) {
5456
const { t } = useTranslation();
5557
const [isKubectlDialogOpen, setIsKubectlDialogOpen] = useState(false);
@@ -71,13 +73,9 @@ export function CreateProjectWorkspaceDialog({
7173
<Bar
7274
design="Footer"
7375
endContent={
74-
<div
75-
style={{ display: 'flex', alignItems: 'center', gap: '8px' }}
76-
>
76+
<div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
7777
<KubectlInfoButton onClick={openKubectlDialog} />
78-
<Button onClick={() => setIsOpen(false)}>
79-
{t('CreateProjectWorkspaceDialog.cancelButton')}
80-
</Button>
78+
<Button onClick={() => setIsOpen(false)}>{t('CreateProjectWorkspaceDialog.cancelButton')}</Button>
8179
<Button design="Emphasized" onClick={() => onCreate()}>
8280
{t('CreateProjectWorkspaceDialog.createButton')}
8381
</Button>
@@ -88,19 +86,14 @@ export function CreateProjectWorkspaceDialog({
8886
onClose={() => setIsOpen(false)}
8987
>
9088
<MetadataForm
89+
getValues={getValues}
9190
register={register}
9291
errors={errors}
9392
setValue={setValue}
9493
requireChargingTarget={type === 'project'}
9594
sideFormContent={
96-
<FormGroup
97-
headerText={t('CreateProjectWorkspaceDialog.membersHeader')}
98-
>
99-
<EditMembers
100-
members={members}
101-
isValidationError={!!errors.members}
102-
onMemberChanged={setMembers}
103-
/>
95+
<FormGroup headerText={t('CreateProjectWorkspaceDialog.membersHeader')}>
96+
<EditMembers members={members} isValidationError={!!errors.members} onMemberChanged={setMembers} />
10497
</FormGroup>
10598
}
10699
/>
@@ -110,10 +103,7 @@ export function CreateProjectWorkspaceDialog({
110103
isOpen={isKubectlDialogOpen && !!projectName}
111104
onClose={closeKubectlDialog}
112105
/>
113-
<KubectlCreateProjectDialog
114-
isOpen={isKubectlDialogOpen && !projectName}
115-
onClose={closeKubectlDialog}
116-
/>
106+
<KubectlCreateProjectDialog isOpen={isKubectlDialogOpen && !projectName} onClose={closeKubectlDialog} />
117107
<ErrorDialog ref={errorDialogRef} />
118108
</>
119109
);

src/components/Dialogs/CreateWorkspaceDialogContainer.tsx

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
import { useCallback, useEffect, useRef } from 'react';
2-
import {
3-
useApiResourceMutation,
4-
useRevalidateApiResource,
5-
} from '../../lib/api/useApiResource';
2+
import { useApiResourceMutation, useRevalidateApiResource } from '../../lib/api/useApiResource';
63
import { ErrorDialogHandle } from '../Shared/ErrorMessageBox.tsx';
74
import { APIError } from '../../lib/api/error';
8-
import {
9-
CreateProjectWorkspaceDialog,
10-
OnCreatePayload,
11-
} from './CreateProjectWorkspaceDialog.tsx';
5+
import { CreateProjectWorkspaceDialog, OnCreatePayload } from './CreateProjectWorkspaceDialog.tsx';
126
import {
137
CreateWorkspace,
148
CreateWorkspaceResource,
@@ -50,6 +44,7 @@ export function CreateWorkspaceDialogContainer({
5044
setValue,
5145
formState: { errors },
5246
watch,
47+
getValues,
5348
} = useForm<CreateDialogProps>({
5449
resolver: zodResolver(validationSchemaProjectWorkspace),
5550
defaultValues: {
@@ -73,9 +68,7 @@ export function CreateWorkspaceDialogContainer({
7368

7469
useEffect(() => {
7570
if (username) {
76-
setValue('members', [
77-
{ name: username, roles: [MemberRoles.admin], kind: 'User' },
78-
]);
71+
setValue('members', [{ name: username, roles: [MemberRoles.admin], kind: 'User' }]);
7972
}
8073
if (!isOpen) {
8174
clearForm();
@@ -84,9 +77,7 @@ export function CreateWorkspaceDialogContainer({
8477
const namespace = projectnameToNamespace(project);
8578
const toast = useToast();
8679

87-
const { trigger } = useApiResourceMutation<CreateWorkspaceType>(
88-
CreateWorkspaceResource(namespace),
89-
);
80+
const { trigger } = useApiResourceMutation<CreateWorkspaceType>(CreateWorkspaceResource(namespace));
9081
const revalidate = useRevalidateApiResource(ListWorkspaces(project));
9182
const errorDialogRef = useRef<ErrorDialogHandle>(null);
9283

@@ -112,9 +103,7 @@ export function CreateWorkspaceDialogContainer({
112103
console.error(e);
113104
if (e instanceof APIError) {
114105
if (errorDialogRef.current) {
115-
errorDialogRef.current.showErrorDialog(
116-
`${e.message}: ${JSON.stringify(e.info)}`,
117-
);
106+
errorDialogRef.current.showErrorDialog(`${e.message}: ${JSON.stringify(e.info)}`);
118107
}
119108
}
120109
return false;
@@ -123,6 +112,7 @@ export function CreateWorkspaceDialogContainer({
123112

124113
return (
125114
<CreateProjectWorkspaceDialog
115+
getValues={getValues}
126116
isOpen={isOpen}
127117
setIsOpen={setIsOpen}
128118
errorDialogRef={errorDialogRef}

src/components/Dialogs/MetadataForm.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ export function MetadataForm({
3131
const handleChargingTargetTypeChange = (event: Ui5CustomEvent<SelectDomRef, { selectedOption: HTMLElement }>) => {
3232
const selectedOption = event.detail.selectedOption as HTMLElement;
3333
setValue('chargingTargetType', selectedOption.dataset.value);
34-
// alert('now');
3534
};
3635
const chargingTypes: SelectOption[] = [
3736
...(!requireChargingTarget ? [{ label: t('common.notSelected'), value: '' }] : []),
@@ -71,6 +70,7 @@ export function MetadataForm({
7170
className={styles.input}
7271
valueState={errors.chargingTarget ? 'Negative' : 'None'}
7372
valueStateMessage={<span>{errors.chargingTarget?.message}</span>}
73+
disabled={!getValues?.('chargingTargetType')}
7474
/>
7575
</FormGroup>
7676

src/lib/api/validations/schemas.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,18 @@ export const validationSchemaProjectWorkspace = z
1515
.regex(projectWorkspaceNameRegex, t('validationErrors.properFormatting'))
1616
.max(25, t('validationErrors.max25chars')),
1717
displayName: z.string().optional(),
18-
chargingTarget: z.string(),
18+
chargingTarget: z.string().optional(),
1919
chargingTargetType: z.string().optional(),
2020
members: z.array(member).refine((members) => members?.length > 0),
2121
})
2222
.superRefine((data, ctx) => {
23-
if (data.chargingTargetType && !data.chargingTarget) {
23+
if (data.chargingTargetType && data.chargingTarget && !btpChargingTargetRegex.test(data.chargingTarget ?? '')) {
24+
ctx.addIssue({
25+
path: ['chargingTarget'],
26+
code: z.ZodIssueCode.custom,
27+
message: t('validationErrors.notValidChargingTargetFormat'),
28+
});
29+
} else if (data.chargingTargetType && !data.chargingTarget) {
2430
ctx.addIssue({
2531
path: ['chargingTarget'],
2632
code: z.ZodIssueCode.custom,

0 commit comments

Comments
 (0)