Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix availability zone display errors #699

Merged
merged 1 commit into from
Apr 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 0 additions & 96 deletions src/components/content/order/common/AvailabilityZoneInfo.tsx

This file was deleted.

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
Loading