diff --git a/src/fireedge/src/client/constants/provision.js b/src/fireedge/src/client/constants/provision.js index c17a34d57d..89a83d4eec 100644 --- a/src/fireedge/src/client/constants/provision.js +++ b/src/fireedge/src/client/constants/provision.js @@ -34,6 +34,21 @@ export const PROVISIONS_STATES = [ } ] +export const PROVISIONS_TYPES = { + metal: { + id: 'metal', + name: 'Metal' + }, + onprem: { + id: 'onprem', + name: 'On-premise' + }, + virtual: { + id: 'virtual', + name: 'Virtual' + } +} + export const PROVIDERS_TYPES = { aws: { id: 'aws', diff --git a/src/fireedge/src/client/containers/Providers/Form/Create/Steps/Template/index.js b/src/fireedge/src/client/containers/Providers/Form/Create/Steps/Template/index.js index 7ca9636b35..5db39f5595 100644 --- a/src/fireedge/src/client/containers/Providers/Form/Create/Steps/Template/index.js +++ b/src/fireedge/src/client/containers/Providers/Form/Create/Steps/Template/index.js @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect } from 'react' +import React, { useCallback, useEffect, useMemo } from 'react' import { Divider, Select, Breadcrumbs, InputLabel, FormControl } from '@material-ui/core' import ArrowIcon from '@material-ui/icons/ArrowForwardIosRounded' import Marked from 'marked' @@ -6,9 +6,9 @@ import Marked from 'marked' import { useProvision, useListForm } from 'client/hooks' import { ListCards } from 'client/components/List' import { ProvisionTemplateCard } from 'client/components/Cards' -import { sanitize } from 'client/utils' +import { sanitize, groupBy } from 'client/utils' import * as ProviderTemplateModel from 'client/models/ProviderTemplate' -import { T } from 'client/constants' +import { T, PROVISIONS_TYPES, PROVIDERS_TYPES } from 'client/constants' import { STEP_FORM_SCHEMA } from 'client/containers/Providers/Form/Create/Steps/Template/schema' @@ -24,23 +24,40 @@ const Template = () => ({ content: useCallback( ({ data, setFormData }) => { const { provisionsTemplates } = useProvision() - const templateSelected = data?.[0] const [provisionSelected, setProvision] = React.useState( - () => templateSelected?.plain?.provision_type ?? Object.keys(provisionsTemplates)?.[0] + () => templateSelected?.plain?.provision_type ) - const [providerSelected, setProvider] = React.useState(() => templateSelected?.provider) + const [providerSelected, setProvider] = React.useState( + () => templateSelected?.provider + ) - const providersTypes = provisionsTemplates?.[provisionSelected]?.providers ?? [] - const provisionSelectedDescription = provisionsTemplates?.[provisionSelected]?.description - const templatesAvailable = providersTypes?.[providerSelected] + const templatesByProvisionType = useMemo(() => ( + Object.values(provisionsTemplates) + .reduce((res, { providers }) => ({ + ...res, + ...groupBy(Object.values(providers)?.flat(), 'plain.provision_type') + }), {}) + ), []) + + const templatesByProvider = useMemo(() => ( + groupBy(templatesByProvisionType[provisionSelected] ?? [], 'provider') + ), [provisionSelected]) + + const templatesAvailable = templatesByProvider?.[providerSelected] ?? [] + const provisionDescription = provisionsTemplates?.[provisionSelected]?.description + + useEffect(() => { + const firstProvisionType = Object.keys(templatesByProvisionType)[0] + !provisionSelected && setProvision(firstProvisionType) + }, []) useEffect(() => { - // Select the first provider type if not selected if (provisionSelected && !providerSelected) { - setProvider(Object.keys(providersTypes)?.[0]) + const firstProviderType = Object.keys(templatesByProvider)[0] + setProvider(firstProviderType) } }, [provisionSelected]) @@ -75,10 +92,6 @@ const Template = () => ({ : handleSelect(template) } - const RenderOptions = ({ options = {} }) => Object.keys(options)?.map( - option => - ) ?? - const RenderDescription = ({ description = '' }) => { const renderer = new Marked.Renderer() @@ -109,7 +122,11 @@ const Template = () => ({ value={provisionSelected} variant='outlined' > - + {Object.keys(templatesByProvisionType).map(key => ( + + ))} @@ -126,15 +143,19 @@ const Template = () => ({ value={providerSelected} variant='outlined' > - + {Object.keys(templatesByProvider).map(key => ( + + ))} {/* -- DESCRIPTION -- */} - {React.useMemo(() => provisionSelectedDescription && ( - - ), [provisionSelectedDescription])} + {React.useMemo(() => provisionDescription && ( + + ), [provisionDescription])} diff --git a/src/fireedge/src/client/containers/Provisions/Form/Create/Steps/Template/index.js b/src/fireedge/src/client/containers/Provisions/Form/Create/Steps/Template/index.js index 178ff85414..836e86375f 100644 --- a/src/fireedge/src/client/containers/Provisions/Form/Create/Steps/Template/index.js +++ b/src/fireedge/src/client/containers/Provisions/Form/Create/Steps/Template/index.js @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect } from 'react' +import React, { useCallback, useEffect, useMemo } from 'react' import { Divider, Select, Breadcrumbs, InputLabel, FormControl } from '@material-ui/core' import ArrowIcon from '@material-ui/icons/ArrowForwardIosRounded' import Marked from 'marked' @@ -6,9 +6,9 @@ import Marked from 'marked' import { useProvision, useListForm } from 'client/hooks' import { ListCards } from 'client/components/List' import { ProvisionTemplateCard } from 'client/components/Cards' -import { sanitize } from 'client/utils' +import { sanitize, groupBy } from 'client/utils' import * as ProvisionTemplateModel from 'client/models/ProvisionTemplate' -import { T } from 'client/constants' +import { T, PROVISIONS_TYPES, PROVIDERS_TYPES } from 'client/constants' import { STEP_ID as PROVIDER_ID } from 'client/containers/Provisions/Form/Create/Steps/Provider' import { STEP_ID as CONFIGURATION_ID } from 'client/containers/Provisions/Form/Create/Steps/BasicConfiguration' @@ -23,23 +23,40 @@ const Template = () => ({ resolver: () => STEP_FORM_SCHEMA, content: useCallback(({ data, setFormData }) => { const { provisionsTemplates, providers } = useProvision() - const templateSelected = data?.[0] const [provisionSelected, setProvision] = React.useState( - () => templateSelected?.provision_type ?? Object.keys(provisionsTemplates)?.[0] + () => templateSelected?.provision_type ) - const [providerSelected, setProvider] = React.useState(() => templateSelected?.provider) + const [providerSelected, setProvider] = React.useState( + () => templateSelected?.provider + ) - const providersTypes = provisionsTemplates?.[provisionSelected]?.provisions ?? [] - const provisionSelectedDescription = provisionsTemplates?.[provisionSelected]?.description - const templatesAvailable = providersTypes?.[providerSelected] ?? [] + const templatesByProvisionType = useMemo(() => ( + Object.values(provisionsTemplates) + .reduce((res, { provisions }) => ({ + ...res, + ...groupBy(Object.values(provisions)?.flat(), 'provision_type') + }), {}) + ), []) + + const templatesByProvider = useMemo(() => ( + groupBy(templatesByProvisionType[provisionSelected] ?? [], 'provider') + ), [provisionSelected]) + + const templatesAvailable = templatesByProvider?.[providerSelected] ?? [] + const provisionDescription = provisionsTemplates?.[provisionSelected]?.description + + useEffect(() => { + const firstProvisionType = Object.keys(templatesByProvisionType)[0] + !provisionSelected && setProvision(firstProvisionType) + }, []) useEffect(() => { - // Select the first provider type if not selected if (provisionSelected && !providerSelected) { - setProvider(Object.keys(providersTypes)?.[0]) + const firstProviderType = Object.keys(templatesByProvider)[0] + setProvider(firstProviderType) } }, [provisionSelected]) @@ -78,10 +95,6 @@ const Template = () => ({ : handleSelect(template) } - const RenderOptions = ({ options = {} }) => Object.keys(options)?.map(option => ( - - )) - const RenderDescription = ({ description = '' }) => { const renderer = new Marked.Renderer() @@ -104,14 +117,19 @@ const Template = () => ({ @@ -120,22 +138,27 @@ const Template = () => ({ {/* -- DESCRIPTION -- */} - {React.useMemo(() => provisionSelectedDescription && ( - - ), [provisionSelectedDescription])} + {React.useMemo(() => provisionDescription && ( + + ), [provisionDescription])}