From 22859c16c91d0d5f25ba85ac09a29a729f54bc2c Mon Sep 17 00:00:00 2001 From: Saif Chaudhry Date: Mon, 29 Aug 2022 16:06:51 -0700 Subject: [PATCH] ROX-12152: added field for aws account number in central instance creation modal --- src/components/SelectSingle.js | 2 + src/hooks/apis/useCloudAccounts.js | 14 ++++ .../InstancesPage/CreateInstanceModal.js | 67 ++++++++++++++----- src/routes/InstancesPage/InstancesPage.js | 9 +++ 4 files changed, 76 insertions(+), 16 deletions(-) create mode 100644 src/hooks/apis/useCloudAccounts.js diff --git a/src/components/SelectSingle.js b/src/components/SelectSingle.js index 594ceb0..397834f 100644 --- a/src/components/SelectSingle.js +++ b/src/components/SelectSingle.js @@ -13,6 +13,7 @@ function SelectSingle({ isCreatable = false, variant = null, placeholderText = '', + menuAppendTo = '', }) { const [isOpen, setIsOpen] = useState(false); @@ -39,6 +40,7 @@ function SelectSingle({ isCreatable={isCreatable} placeholderText={placeholderText} toggleId={id} + menuAppendTo={menuAppendTo} > {children} diff --git a/src/hooks/apis/useCloudAccounts.js b/src/hooks/apis/useCloudAccounts.js new file mode 100644 index 0000000..6561cc9 --- /dev/null +++ b/src/hooks/apis/useCloudAccounts.js @@ -0,0 +1,14 @@ +import { useQuery } from 'react-query'; + +import apiRequest from '../../services/apiRequest'; + +export const queryKey = 'cloud_accounts'; + +const getCloudAccounts = async () => { + const { data } = await apiRequest.get(`/api/rhacs/v1/cloud_accounts`); + return data; +}; + +export default function useCloudAccounts() { + return useQuery([queryKey], () => getCloudAccounts()); +} diff --git a/src/routes/InstancesPage/CreateInstanceModal.js b/src/routes/InstancesPage/CreateInstanceModal.js index 8fac1fa..19391cf 100644 --- a/src/routes/InstancesPage/CreateInstanceModal.js +++ b/src/routes/InstancesPage/CreateInstanceModal.js @@ -1,4 +1,5 @@ /* eslint-disable react/prop-types */ +import React, { useState } from 'react'; import { Alert, Button, @@ -12,7 +13,6 @@ import { ToggleGroup, ToggleGroupItem, } from '@patternfly/react-core'; -import React, { useState } from 'react'; import { regionOptions } from '../../utils/region'; import SelectSingle from '../../components/SelectSingle'; @@ -22,9 +22,15 @@ const defaultFormValues = { cloud_provider: 'aws', region: 'us-east-1', availabilityZones: 'multi', + aws_account_number: '', }; -function CreateInstanceModal({ isOpen, onClose, onRequestCreate }) { +function CreateInstanceModal({ + isOpen, + onClose, + onRequestCreate, + cloudAccountIds, +}) { const [errorMessage, setErrorMessage] = useState(null); const [formValues, setFormValues] = useState(defaultFormValues); const [isRequestingCreate, setIsRequestingCreate] = useState(false); @@ -37,6 +43,19 @@ function CreateInstanceModal({ isOpen, onClose, onRequestCreate }) { onClose(); } + async function onRequestCreateHandler() { + setIsRequestingCreate(true); + const result = await onRequestCreate(formValues); + setIsRequestingCreate(false); + if (result instanceof Error) { + const errorMessage = result.response.data.reason; + setErrorMessage(errorMessage); + } else { + setFormValues(defaultFormValues); + onClose(); + } + } + function onChangeAvailabilityZones(isSelected, event) { const { id } = event.currentTarget; setFormValues((prevFormValues) => ({ @@ -52,24 +71,18 @@ function CreateInstanceModal({ isOpen, onClose, onRequestCreate }) { })); } - function onInputChange(value) { + function onChangeAWSAccountNumber(id, selection) { setFormValues((prevFormValues) => ({ ...prevFormValues, - name: value, + aws_account_number: selection, })); } - async function onRequestCreateHandler() { - setIsRequestingCreate(true); - const result = await onRequestCreate(formValues); - setIsRequestingCreate(false); - if (result instanceof Error) { - const errorMessage = result.response.data.reason; - setErrorMessage(errorMessage); - } else { - setFormValues(defaultFormValues); - onClose(); - } + function onNameChange(value) { + setFormValues((prevFormValues) => ({ + ...prevFormValues, + name: value, + })); } return ( @@ -116,7 +129,7 @@ function CreateInstanceModal({ isOpen, onClose, onRequestCreate }) { id="name" name="name" value={formValues.name} - onChange={onInputChange} + onChange={onNameChange} /> @@ -161,6 +174,28 @@ function CreateInstanceModal({ isOpen, onClose, onRequestCreate }) { /> + + + {cloudAccountIds.map((cloudAccountId) => { + return ( + + {cloudAccountId} + + ); + })} + + ); diff --git a/src/routes/InstancesPage/InstancesPage.js b/src/routes/InstancesPage/InstancesPage.js index 370c3fc..8539f5d 100644 --- a/src/routes/InstancesPage/InstancesPage.js +++ b/src/routes/InstancesPage/InstancesPage.js @@ -36,6 +36,7 @@ import usePagination from '../../hooks/usePagination'; import useInstances from '../../hooks/apis/useInstances'; import useCreateInstance from '../../hooks/apis/useCreateInstance'; import useDeleteInstance from '../../hooks/apis/useDeleteInstance'; +import useCloudAccounts from '../../hooks/apis/useCloudAccounts'; import CreateInstanceModal from './CreateInstanceModal'; import DeleteInstanceModal from './DeleteInstanceModal'; @@ -78,6 +79,12 @@ function InstancesPage() { }); const [filters, setFilters] = useState({}); + const { data: cloudAccountsData } = useCloudAccounts(); + const cloudAccountIds = + cloudAccountsData?.cloudAccounts?.map( + (cloudAccount) => cloudAccount.cloudAccountId + ) || []; + const { data, isFetching } = useInstances({ query: { page, @@ -109,6 +116,7 @@ function InstancesPage() { cloud_provider: values.cloud_provider, name: values.name, multi_az: values.availabilityZones === 'multi', + aws_account_number: values.aws_account_number, }); return response.catch((error) => { return error; @@ -332,6 +340,7 @@ function InstancesPage() { isOpen={!!creatingInstance} onClose={closeCreateInstanceModal} onRequestCreate={onRequestCreate} + cloudAccountIds={cloudAccountIds} />