Skip to content

Commit 99131bb

Browse files
lucasgoralCopilot
andauthored
feat: Add charging target type input (#168)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 319c095 commit 99131bb

File tree

13 files changed

+92
-12
lines changed

13 files changed

+92
-12
lines changed

public/locales/en.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@
139139
"createButton": "Create",
140140
"cancelButton": "Cancel",
141141
"chargingTargetLabel": "Charging Target",
142+
"chargingTargetTypeLabel": "Charging Target Type",
142143
"displayNameLabel": "Display Name",
143144
"nameLabel": "Name",
144145
"metadataHeader": "Metadata",
@@ -282,7 +283,9 @@
282283
"name": "Name",
283284
"componentSelection": "Component Selection",
284285
"search": "Search",
285-
"components": "Components"
286+
"components": "Components",
287+
"notSelected": "Not selected",
288+
"btp": "BTP"
286289
},
287290
"buttons": {
288291
"viewResource": "View resource",

src/components/Dialogs/CreateProjectDialog.cy.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export const CreateProjectWorkspaceDialogWrapper: React.FC<{
5555
};
5656
return (
5757
<CreateProjectWorkspaceDialog
58+
type={'workspace'}
5859
isOpen={isOpen}
5960
setIsOpen={setIsOpen}
6061
titleText="Create Workspace"

src/components/Dialogs/CreateProjectDialogContainer.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,19 @@ export function CreateProjectDialogContainer({
4242
name: '',
4343
displayName: '',
4444
chargingTarget: '',
45+
chargingTargetType: 'btp',
4546
members: [],
4647
},
4748
});
4849
const { t } = useTranslation();
4950
const { user } = useAuthOnboarding();
5051

5152
const username = user?.email;
52-
5353
const clearForm = useCallback(() => {
5454
resetField('name');
5555
resetField('chargingTarget');
5656
resetField('displayName');
57+
resetField('chargingTargetType');
5758
}, [resetField]);
5859

5960
useEffect(() => {
@@ -79,6 +80,7 @@ export function CreateProjectDialogContainer({
7980
name,
8081
chargingTarget,
8182
displayName,
83+
chargingTargetType,
8284
members,
8385
}: OnCreatePayload): Promise<boolean> => {
8486
try {
@@ -87,6 +89,7 @@ export function CreateProjectDialogContainer({
8789
displayName: displayName,
8890
chargingTarget: chargingTarget,
8991
members: members,
92+
chargingTargetType: chargingTargetType,
9093
}),
9194
);
9295
setIsOpen(false);
@@ -115,6 +118,7 @@ export function CreateProjectDialogContainer({
115118
register={register}
116119
errors={errors}
117120
setValue={setValue}
121+
type={'project'}
118122
onCreate={handleSubmit(handleProjectCreate)}
119123
/>
120124
);

src/components/Dialogs/CreateProjectWorkspaceDialog.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export type OnCreatePayload = {
2020
name: string;
2121
displayName?: string;
2222
chargingTarget?: string;
23+
chargingTargetType?: string;
2324
members: Member[];
2425
};
2526

@@ -34,6 +35,7 @@ export interface CreateProjectWorkspaceDialogProps {
3435
errors: FieldErrors<CreateDialogProps>;
3536
setValue: UseFormSetValue<CreateDialogProps>;
3637
projectName?: string;
38+
type: 'workspace' | 'project';
3739
}
3840

3941
export function CreateProjectWorkspaceDialog({
@@ -47,6 +49,7 @@ export function CreateProjectWorkspaceDialog({
4749
errors,
4850
setValue,
4951
projectName,
52+
type,
5053
}: CreateProjectWorkspaceDialogProps) {
5154
const { t } = useTranslation();
5255
const [isKubectlDialogOpen, setIsKubectlDialogOpen] = useState(false);
@@ -87,6 +90,8 @@ export function CreateProjectWorkspaceDialog({
8790
<MetadataForm
8891
register={register}
8992
errors={errors}
93+
setValue={setValue}
94+
requireChargingTarget={type === 'project'}
9095
sideFormContent={
9196
<FormGroup
9297
headerText={t('CreateProjectWorkspaceDialog.membersHeader')}

src/components/Dialogs/CreateWorkspaceDialogContainer.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export type CreateDialogProps = {
2828
name: string;
2929
displayName?: string;
3030
chargingTarget?: string;
31+
chargingTargetType?: string;
3132
members: Member[];
3233
};
3334

@@ -54,17 +55,18 @@ export function CreateWorkspaceDialogContainer({
5455
displayName: '',
5556
chargingTarget: '',
5657
members: [],
58+
chargingTargetType: '',
5759
},
5860
});
5961
const { t } = useTranslation();
6062
const { user } = useAuthOnboarding();
6163

6264
const username = user?.email;
63-
6465
const clearForm = useCallback(() => {
6566
resetField('name');
6667
resetField('chargingTarget');
6768
resetField('displayName');
69+
resetField('chargingTargetType');
6870
}, [resetField]);
6971

7072
useEffect(() => {
@@ -127,6 +129,7 @@ export function CreateWorkspaceDialogContainer({
127129
register={register}
128130
errors={errors}
129131
setValue={setValue}
132+
type={'workspace'}
130133
projectName={project}
131134
onCreate={handleSubmit(handleWorkspaceCreate)}
132135
/>

src/components/Dialogs/MetadataForm.tsx

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,52 @@
1-
import { FieldErrors, UseFormRegister } from 'react-hook-form';
1+
import { FieldErrors, UseFormRegister, UseFormSetValue } from 'react-hook-form';
22
import { CreateDialogProps } from './CreateWorkspaceDialogContainer.tsx';
33
import { useTranslation } from 'react-i18next';
4-
import { Form, FormGroup, Input, Label } from '@ui5/webcomponents-react';
4+
import {
5+
Form,
6+
FormGroup,
7+
Input,
8+
Label,
9+
Option,
10+
Select,
11+
SelectDomRef,
12+
Ui5CustomEvent,
13+
} from '@ui5/webcomponents-react';
514
import styles from './CreateProjectWorkspaceDialog.module.css';
15+
import React from 'react';
616

717
export interface MetadataFormProps {
818
register: UseFormRegister<CreateDialogProps>;
919
errors: FieldErrors<CreateDialogProps>;
10-
20+
setValue: UseFormSetValue<CreateDialogProps>;
1121
sideFormContent?: React.ReactNode;
22+
requireChargingTarget?: boolean;
23+
}
24+
25+
interface SelectOption {
26+
label: string;
27+
value: string;
1228
}
1329

1430
export function MetadataForm({
1531
register,
1632
errors,
17-
33+
setValue,
1834
sideFormContent,
35+
requireChargingTarget = false,
1936
}: MetadataFormProps) {
2037
const { t } = useTranslation();
21-
38+
const handleChargingTargetTypeChange = (
39+
event: Ui5CustomEvent<SelectDomRef, { selectedOption: HTMLElement }>,
40+
) => {
41+
const selectedOption = event.detail.selectedOption as HTMLElement;
42+
setValue('chargingTargetType', selectedOption.dataset.value);
43+
};
44+
const chargingTypes: SelectOption[] = [
45+
...(!requireChargingTarget
46+
? [{ label: t('common.notSelected'), value: '' }]
47+
: []),
48+
{ label: t('common.btp'), value: 'btp' },
49+
];
2250
return (
2351
<Form>
2452
<FormGroup
@@ -36,7 +64,6 @@ export function MetadataForm({
3664
valueStateMessage={<span>{errors.name?.message}</span>}
3765
required
3866
/>
39-
4067
<Label for={'displayName'}>
4168
{t('CreateProjectWorkspaceDialog.displayNameLabel')}
4269
</Label>
@@ -45,8 +72,21 @@ export function MetadataForm({
4572
{...register('displayName')}
4673
className={styles.input}
4774
/>
48-
49-
<Label for={'chargingTarget'}>
75+
<Label for={'chargingTargetType'} required={requireChargingTarget}>
76+
{t('CreateProjectWorkspaceDialog.chargingTargetTypeLabel')}
77+
</Label>
78+
<Select
79+
id={'chargingTargetType'}
80+
className={styles.input}
81+
onChange={handleChargingTargetTypeChange}
82+
>
83+
{chargingTypes.map((option) => (
84+
<Option key={option.value} data-value={option.value}>
85+
{option.label}
86+
</Option>
87+
))}
88+
</Select>
89+
<Label for={'chargingTarget'} required={requireChargingTarget}>
5090
{t('CreateProjectWorkspaceDialog.chargingTargetLabel')}
5191
</Label>
5292
<Input
@@ -55,6 +95,7 @@ export function MetadataForm({
5595
className={styles.input}
5696
/>
5797
</FormGroup>
98+
5899
{sideFormContent ? sideFormContent : null}
59100
</Form>
60101
);

src/components/Wizards/CreateManagedControlPlaneWizardContainer.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export type CreateDialogProps = {
4545
name: string;
4646
displayName?: string;
4747
chargingTarget?: string;
48+
chargingTargetType?: string;
4849
members: Member[];
4950
};
5051

@@ -96,6 +97,7 @@ export const CreateManagedControlPlaneWizardContainer: FC<
9697
name: '',
9798
displayName: '',
9899
chargingTarget: '',
100+
chargingTargetType: '',
99101
members: [],
100102
},
101103
mode: 'onChange',
@@ -121,6 +123,7 @@ export const CreateManagedControlPlaneWizardContainer: FC<
121123
const clearFormFields = useCallback(() => {
122124
resetField('name');
123125
resetField('chargingTarget');
126+
resetField('chargingTargetType');
124127
resetField('displayName');
125128
}, [resetField]);
126129

@@ -294,7 +297,11 @@ export const CreateManagedControlPlaneWizardContainer: FC<
294297
selected={selectedStep === 'metadata'}
295298
data-step="metadata"
296299
>
297-
<MetadataForm register={register} errors={errors} />
300+
<MetadataForm
301+
setValue={setValue}
302+
register={register}
303+
errors={errors}
304+
/>
298305
</WizardStep>
299306
<WizardStep
300307
icon={'user-edit'}

src/lib/api/types/crate/createManagedControlPlane.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Resource } from '../resource';
22
import {
33
CHARGING_TARGET_LABEL,
4+
CHARGING_TARGET_TYPE_LABEL,
45
DISPLAY_NAME_ANNOTATION,
56
} from '../shared/keyNames';
67
import { Member } from '../shared/members';
@@ -59,6 +60,7 @@ export const CreateManagedControlPlane = (
5960
optional?: {
6061
displayName?: string;
6162
chargingTarget?: string;
63+
chargingTargetType?: string;
6264
members?: Member[];
6365
selectedComponents?: ComponentSelectionItem[];
6466
},
@@ -82,6 +84,7 @@ export const CreateManagedControlPlane = (
8284
[DISPLAY_NAME_ANNOTATION]: optional?.displayName ?? '',
8385
},
8486
labels: {
87+
[CHARGING_TARGET_TYPE_LABEL]: optional?.chargingTargetType ?? '',
8588
[CHARGING_TARGET_LABEL]: optional?.chargingTarget ?? '',
8689
},
8790
},

src/lib/api/types/crate/createProject.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Resource } from '../resource';
22
import {
33
CHARGING_TARGET_LABEL,
4+
CHARGING_TARGET_TYPE_LABEL,
45
DISPLAY_NAME_ANNOTATION,
56
} from '../shared/keyNames';
67
import { Member } from '../shared/members';
@@ -29,6 +30,7 @@ export const CreateProject = (
2930
optional?: {
3031
displayName?: string;
3132
chargingTarget?: string;
33+
chargingTargetType?: string;
3234
members?: Member[];
3335
},
3436
): CreateProjectType => {
@@ -41,6 +43,7 @@ export const CreateProject = (
4143
[DISPLAY_NAME_ANNOTATION]: optional?.displayName ?? '',
4244
},
4345
labels: {
46+
[CHARGING_TARGET_TYPE_LABEL]: optional?.chargingTargetType ?? '',
4447
[CHARGING_TARGET_LABEL]: optional?.chargingTarget ?? '',
4548
},
4649
},

src/lib/api/types/crate/createWorkspace.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Resource } from '../resource';
22
import {
33
CHARGING_TARGET_LABEL,
4+
CHARGING_TARGET_TYPE_LABEL,
45
DISPLAY_NAME_ANNOTATION,
56
} from '../shared/keyNames';
67
import { Member } from '../shared/members';
@@ -31,6 +32,7 @@ export const CreateWorkspace = (
3132
optional?: {
3233
displayName?: string;
3334
chargingTarget?: string;
35+
chargingTargetType?: string;
3436
members?: Member[];
3537
},
3638
): CreateWorkspaceType => {
@@ -44,6 +46,7 @@ export const CreateWorkspace = (
4446
[DISPLAY_NAME_ANNOTATION]: optional?.displayName ?? '',
4547
},
4648
labels: {
49+
[CHARGING_TARGET_TYPE_LABEL]: optional?.chargingTargetType ?? '',
4750
[CHARGING_TARGET_LABEL]: optional?.chargingTarget ?? '',
4851
},
4952
},

0 commit comments

Comments
 (0)