Skip to content

Commit

Permalink
fix availability zone display errors
Browse files Browse the repository at this point in the history
Signed-off-by: swaroopar <[email protected]>
  • Loading branch information
swaroopar committed Apr 11, 2024
1 parent 48a92fe commit f5d9447
Show file tree
Hide file tree
Showing 13 changed files with 348 additions and 93 deletions.
5 changes: 2 additions & 3 deletions src/components/content/order/common/AvailabilityZoneInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ export const AvailabilityZoneInfo = ({
? availabilityZoneConfigs.map((availabilityZone) => (
<Form.Item
key={availabilityZone.varName}
name={availabilityZone.displayName}
label={availabilityZone.displayName}
label={<p style={{ fontWeight: 'bold' }}>{availabilityZone.displayName}</p>}
rules={[
{
required: availabilityZone.mandatory,
Expand Down Expand Up @@ -69,7 +68,7 @@ export const AvailabilityZoneInfo = ({
onChange={(e) => {
onAvailabilityZoneChange(availabilityZone.varName, e);
}}
value={selectAvailabilityZones[availabilityZone.varName]}
//value={selectAvailabilityZones[availabilityZone.varName]}
>
<Radio.Button name={availabilityZone.displayName} value={''}>
{'Not Selected'}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/*
* SPDX-License-Identifier: Apache-2.0
* SPDX-FileCopyrightText: Huawei Inc.
*/

import { AvailabilityZoneConfig } from '../../../../../xpanse-api/generated';
import { Alert, Flex, Radio } from 'antd';
import React from 'react';

export function AvailabilityZoneButton({
availabilityZoneConfig,
availabilityZones,
selectRegion,
onAvailabilityZoneChange,
selectAvailabilityZones,
}: {
availabilityZoneConfig: AvailabilityZoneConfig;
availabilityZones: string[] | undefined;
selectRegion: string;
onAvailabilityZoneChange: (varName: string, availabilityZone: string | undefined) => void;
selectAvailabilityZones: Record<string, string | undefined>;
}) {
const DEFAULT_OPTIONAL_AZ = 'Not Selected';
function onChange(varName: string, availabilityZone: string) {
onAvailabilityZoneChange(varName, availabilityZone !== DEFAULT_OPTIONAL_AZ ? availabilityZone : undefined);
}

return (
<>
<Flex vertical gap='middle'>
{availabilityZoneConfig.mandatory ? (
availabilityZones && availabilityZones.length > 0 ? (
<Radio.Group
buttonStyle='solid'
onChange={(e) => {
onChange(availabilityZoneConfig.varName, e.target.value as string);
}}
value={selectAvailabilityZones[availabilityZoneConfig.varName]}
>
{availabilityZones.map((availabilityZonesVariable) => (
<Radio.Button
name={availabilityZoneConfig.displayName}
key={availabilityZonesVariable}
value={availabilityZonesVariable}
>
{availabilityZonesVariable}
</Radio.Button>
))}
</Radio.Group>
) : (
<Alert
message={'No availability zones found for region ' + selectRegion}
description={'Mandatory field. Cannot proceed.'}
type={'error'}
closable={false}
/>
)
) : (
<Radio.Group
buttonStyle='solid'
onChange={(e) => {
onChange(availabilityZoneConfig.varName, e.target.value as string);
}}
value={selectAvailabilityZones[availabilityZoneConfig.varName] ?? DEFAULT_OPTIONAL_AZ}
>
{availabilityZones && availabilityZones.length > 0 ? (
<>
<Radio.Button name={availabilityZoneConfig.displayName} value={DEFAULT_OPTIONAL_AZ}>
{DEFAULT_OPTIONAL_AZ}
</Radio.Button>
{availabilityZones.map((availabilityZonesVariable) => (
<Radio.Button
name={availabilityZoneConfig.displayName}
key={availabilityZonesVariable}
value={availabilityZonesVariable}
>
{availabilityZonesVariable}
</Radio.Button>
))}
;
</>
) : (
<Alert
message={'No availability zones found for region ' + selectRegion}
description={'Optional field. Can proceed.'}
type={'success'}
closable={false}
/>
)}
</Radio.Group>
)}
</Flex>
</>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* SPDX-License-Identifier: Apache-2.0
* SPDX-FileCopyrightText: Huawei Inc.
*/

import { ApiError, Response } from '../../../../../xpanse-api/generated';
import { Alert } from 'antd';
import { convertStringArrayToUnorderedList } from '../../../../utils/generateUnorderedList';
import React from 'react';

export function AvailabilityZoneError({ error }: { error: Error }) {
if (error instanceof ApiError && error.body && 'details' in error.body) {
const response: Response = error.body as Response;
return (
<Alert
message={response.resultType.valueOf()}
description={convertStringArrayToUnorderedList(response.details)}
type={'error'}
closable={false}
/>
);
} else {
return (
<Alert
message='Fetching Availability Regions Failed'
description={error.message}
type={'error'}
closable={false}
/>
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* SPDX-License-Identifier: Apache-2.0
* SPDX-FileCopyrightText: Huawei Inc.
*/

import { AvailabilityZoneConfig, UserOrderableServiceVo } from '../../../../../xpanse-api/generated';
import { Form } from 'antd';
import React from 'react';
import { AvailabilityZoneButton } from './AvailabilityZoneButton';
import useGetAvailabilityZonesForRegionQuery from '../utils/useGetAvailabilityZonesForRegionQuery';
import { AvailabilityZoneLoading } from './AvailabilityZoneLoading';
import { AvailabilityZoneError } from './AvailabilityZoneError';

export function AvailabilityZoneFormItem({
availabilityZoneConfig,
selectRegion,
onAvailabilityZoneChange,
selectAvailabilityZones,
selectCsp,
}: {
availabilityZoneConfig: AvailabilityZoneConfig;
selectRegion: string;
onAvailabilityZoneChange: (varName: string, availabilityZone: string | undefined) => void;
selectAvailabilityZones: Record<string, string | undefined>;
selectCsp: UserOrderableServiceVo.csp;
}) {
const availabilityZonesVariableRequest = useGetAvailabilityZonesForRegionQuery(selectCsp, selectRegion);

function getFormContent() {
if (availabilityZonesVariableRequest.isLoading || availabilityZonesVariableRequest.isFetching) {
return <AvailabilityZoneLoading key={availabilityZoneConfig.varName} />;
}
if (availabilityZonesVariableRequest.isError) {
return (
<AvailabilityZoneError
error={availabilityZonesVariableRequest.error}
key={availabilityZoneConfig.varName}
/>
);
}
if (availabilityZonesVariableRequest.data) {
return (
<AvailabilityZoneButton
availabilityZoneConfig={availabilityZoneConfig}
selectRegion={selectRegion}
availabilityZones={availabilityZonesVariableRequest.data}
onAvailabilityZoneChange={onAvailabilityZoneChange}
selectAvailabilityZones={selectAvailabilityZones}
/>
);
}
return null;
}
return (
<Form.Item
key={availabilityZoneConfig.varName}
label={<p style={{ fontWeight: 'bold' }}>{availabilityZoneConfig.displayName}</p>}
required={availabilityZoneConfig.mandatory}
rules={[
{
required: availabilityZoneConfig.mandatory,
message: availabilityZoneConfig.displayName + 'is required',
},
{ type: 'string' },
]}
>
{getFormContent()}
</Form.Item>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/*
* SPDX-License-Identifier: Apache-2.0
* SPDX-FileCopyrightText: Huawei Inc.
*/

import { Skeleton } from 'antd';
import React from 'react';

export function AvailabilityZoneLoading() {
return <Skeleton active={true} loading={true} paragraph={{ rows: 1, width: ['20%'] }} />;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
*/

import { useQuery } from '@tanstack/react-query';
import { DeployRequest, ServiceService } from '../../../../../xpanse-api/generated';
import { ServiceService, UserOrderableServiceVo } from '../../../../../xpanse-api/generated';

export default function useAvailabilityZonesVariableQuery(csp: DeployRequest.csp, region: string) {
export default function useGetAvailabilityZonesForRegionQuery(csp: UserOrderableServiceVo.csp, region: string) {
return useQuery({
queryKey: ['getExistingResourceNamesWithKind', csp, region],
queryFn: () => ServiceService.getAvailabilityZones(csp, region),
gcTime: 60000,
staleTime: Infinity,
});
}
7 changes: 2 additions & 5 deletions src/components/content/order/create/CreateService.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import React from 'react';
import { useSearchParams } from 'react-router-dom';
import { UserOrderableServiceVo } from '../../../../xpanse-api/generated';
import { DeployedService } from '../../../../xpanse-api/generated';
import { Skeleton } from 'antd';
import ServicesLoadingError from '../query/ServicesLoadingError';
import userOrderableServicesQuery from '../query/userOrderableServicesQuery';
Expand All @@ -16,10 +16,7 @@ function CreateService(): React.JSX.Element {
const [urlParams] = useSearchParams();
const serviceName = decodeURI(urlParams.get('serviceName') ?? '');
const categoryName = decodeURI(urlParams.get('catalog') ?? '');
const orderableServicesQuery = userOrderableServicesQuery(
categoryName as UserOrderableServiceVo.category,
serviceName
);
const orderableServicesQuery = userOrderableServicesQuery(categoryName as DeployedService.category, serviceName);

if (orderableServicesQuery.isSuccess) {
return <SelectServiceForm services={orderableServicesQuery.data} />;
Expand Down
7 changes: 5 additions & 2 deletions src/components/content/order/create/GoToSubmit.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { useNavigate } from 'react-router-dom';
import React from 'react';
import { orderPageRoute } from '../../../utils/constants';
import { OrderSubmitProps } from '../common/utils/OrderSubmitProps';
import useGetAvailabilityZonesForRegionQuery from '../common/utils/useGetAvailabilityZonesForRegionQuery';

export default function GoToSubmit({
selectedVersion,
Expand All @@ -20,6 +21,7 @@ export default function GoToSubmit({
selectedServiceHostingType,
currentServiceProviderContactDetails,
availabilityZones,
isDisableNextButton,
}: {
selectedVersion: string;
selectedCsp: UserOrderableServiceVo.csp;
Expand All @@ -29,9 +31,10 @@ export default function GoToSubmit({
versionMapper: Map<string, UserOrderableServiceVo[]>;
currentServiceProviderContactDetails: ServiceProviderContactDetails | undefined;
availabilityZones: Record<string, string> | undefined;
isDisableNextButton: boolean;
}): React.JSX.Element {
const navigate = useNavigate();

useGetAvailabilityZonesForRegionQuery(selectedCsp, region.name);
const gotoOrderSubmit = function () {
const orderSubmitParams: OrderSubmitProps = getDeployParams(
versionMapper.get(selectedVersion) ?? [],
Expand Down Expand Up @@ -59,7 +62,7 @@ export default function GoToSubmit({
<div className={'order-param-item-row'}>
<div className={'order-param-item-left'} />
<div className={'order-param-submit'}>
<Button type='primary' onClick={gotoOrderSubmit}>
<Button type='primary' onClick={gotoOrderSubmit} disabled={isDisableNextButton}>
&nbsp;&nbsp;Next&nbsp;&nbsp;
</Button>
</div>
Expand Down
Loading

0 comments on commit f5d9447

Please sign in to comment.