Skip to content

Commit 3066b49

Browse files
committed
feat: added field for aws account number in central instance creation modal
1 parent f15b901 commit 3066b49

File tree

4 files changed

+76
-16
lines changed

4 files changed

+76
-16
lines changed

src/components/SelectSingle.js

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ function SelectSingle({
1313
isCreatable = false,
1414
variant = null,
1515
placeholderText = '',
16+
menuAppendTo = '',
1617
}) {
1718
const [isOpen, setIsOpen] = useState(false);
1819

@@ -39,6 +40,7 @@ function SelectSingle({
3940
isCreatable={isCreatable}
4041
placeholderText={placeholderText}
4142
toggleId={id}
43+
menuAppendTo={menuAppendTo}
4244
>
4345
{children}
4446
</Select>

src/hooks/apis/useCloudAccounts.js

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { useQuery } from 'react-query';
2+
3+
import apiRequest from '../../services/apiRequest';
4+
5+
export const queryKey = 'cloud_accounts';
6+
7+
const getCloudAccounts = async () => {
8+
const { data } = await apiRequest.get(`/api/rhacs/v1/cloud_accounts`);
9+
return data;
10+
};
11+
12+
export default function useCloudAccounts() {
13+
return useQuery([queryKey], () => getCloudAccounts());
14+
}

src/routes/InstancesPage/CreateInstanceModal.js

+50-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/* eslint-disable react/prop-types */
2+
import React, { useState } from 'react';
23
import {
34
Alert,
45
Button,
@@ -12,7 +13,6 @@ import {
1213
ToggleGroup,
1314
ToggleGroupItem,
1415
} from '@patternfly/react-core';
15-
import React, { useState } from 'react';
1616

1717
import { regionOptions } from '../../utils/region';
1818
import SelectSingle from '../../components/SelectSingle';
@@ -22,9 +22,15 @@ const defaultFormValues = {
2222
cloud_provider: 'aws',
2323
region: 'us-east-1',
2424
availabilityZones: 'multi',
25+
aws_account_number: '',
2526
};
2627

27-
function CreateInstanceModal({ isOpen, onClose, onRequestCreate }) {
28+
function CreateInstanceModal({
29+
isOpen,
30+
onClose,
31+
onRequestCreate,
32+
cloudAccountIds,
33+
}) {
2834
const [errorMessage, setErrorMessage] = useState(null);
2935
const [formValues, setFormValues] = useState(defaultFormValues);
3036
const [isRequestingCreate, setIsRequestingCreate] = useState(false);
@@ -37,6 +43,19 @@ function CreateInstanceModal({ isOpen, onClose, onRequestCreate }) {
3743
onClose();
3844
}
3945

46+
async function onRequestCreateHandler() {
47+
setIsRequestingCreate(true);
48+
const result = await onRequestCreate(formValues);
49+
setIsRequestingCreate(false);
50+
if (result instanceof Error) {
51+
const errorMessage = result.response.data.reason;
52+
setErrorMessage(errorMessage);
53+
} else {
54+
setFormValues(defaultFormValues);
55+
onClose();
56+
}
57+
}
58+
4059
function onChangeAvailabilityZones(isSelected, event) {
4160
const { id } = event.currentTarget;
4261
setFormValues((prevFormValues) => ({
@@ -52,26 +71,24 @@ function CreateInstanceModal({ isOpen, onClose, onRequestCreate }) {
5271
}));
5372
}
5473

55-
function onInputChange(value) {
74+
function onChangeAWSAccountNumber(id, selection) {
5675
setFormValues((prevFormValues) => ({
5776
...prevFormValues,
58-
name: value,
77+
aws_account_number: selection,
5978
}));
6079
}
6180

62-
async function onRequestCreateHandler() {
63-
setIsRequestingCreate(true);
64-
const result = await onRequestCreate(formValues);
65-
setIsRequestingCreate(false);
66-
if (result instanceof Error) {
67-
const errorMessage = result.response.data.reason;
68-
setErrorMessage(errorMessage);
69-
} else {
70-
setFormValues(defaultFormValues);
71-
onClose();
72-
}
81+
function onInputChangeHandler(fieldName) {
82+
return function onInputChange(value) {
83+
setFormValues((prevFormValues) => ({
84+
...prevFormValues,
85+
[fieldName]: value,
86+
}));
87+
};
7388
}
7489

90+
const onNameChange = onInputChangeHandler('name');
91+
7592
return (
7693
<Modal
7794
variant={ModalVariant.small}
@@ -116,7 +133,7 @@ function CreateInstanceModal({ isOpen, onClose, onRequestCreate }) {
116133
id="name"
117134
name="name"
118135
value={formValues.name}
119-
onChange={onInputChange}
136+
onChange={onNameChange}
120137
/>
121138
</FormGroup>
122139
<FormGroup label="Cloud provider" isRequired fieldId="cloud_provider">
@@ -161,6 +178,23 @@ function CreateInstanceModal({ isOpen, onClose, onRequestCreate }) {
161178
/>
162179
</ToggleGroup>
163180
</FormGroup>
181+
<FormGroup label="AWS account number" fieldId="aws_account_number">
182+
<SelectSingle
183+
id="aws_account_number"
184+
value={formValues.aws_account_number}
185+
handleSelect={onChangeAWSAccountNumber}
186+
placeholderText="Select an AWS Account"
187+
menuAppendTo="parent"
188+
>
189+
{cloudAccountIds.map((cloudAccountId) => {
190+
return (
191+
<SelectOption key={cloudAccountId} value={cloudAccountId}>
192+
{cloudAccountId}
193+
</SelectOption>
194+
);
195+
})}
196+
</SelectSingle>
197+
</FormGroup>
164198
</Form>
165199
</Modal>
166200
);

src/routes/InstancesPage/InstancesPage.js

+10
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import usePagination from '../../hooks/usePagination';
3636
import useInstances from '../../hooks/apis/useInstances';
3737
import useCreateInstance from '../../hooks/apis/useCreateInstance';
3838
import useDeleteInstance from '../../hooks/apis/useDeleteInstance';
39+
import useCloudAccounts from '../../hooks/apis/useCloudAccounts';
3940

4041
import CreateInstanceModal from './CreateInstanceModal';
4142
import DeleteInstanceModal from './DeleteInstanceModal';
@@ -78,6 +79,13 @@ function InstancesPage() {
7879
});
7980
const [filters, setFilters] = useState({});
8081

82+
const { data: cloudAccountsData } = useCloudAccounts();
83+
const cloudAccountIds =
84+
cloudAccountsData?.cloudAccounts?.map(
85+
(cloudAccount) => cloudAccount.cloudAccountId
86+
) || [];
87+
console.log(cloudAccountIds);
88+
8189
const { data, isFetching } = useInstances({
8290
query: {
8391
page,
@@ -109,6 +117,7 @@ function InstancesPage() {
109117
cloud_provider: values.cloud_provider,
110118
name: values.name,
111119
multi_az: values.availabilityZones === 'multi',
120+
aws_account_number: values.aws_account_number,
112121
});
113122
return response.catch((error) => {
114123
return error;
@@ -332,6 +341,7 @@ function InstancesPage() {
332341
isOpen={!!creatingInstance}
333342
onClose={closeCreateInstanceModal}
334343
onRequestCreate={onRequestCreate}
344+
cloudAccountIds={cloudAccountIds}
335345
/>
336346
<DeleteInstanceModal
337347
instance={deletingInstance}

0 commit comments

Comments
 (0)