mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-20 10:50:08 +03:00
parent
1608772993
commit
c4e131164d
@ -14,7 +14,6 @@
|
||||
* limitations under the License. *
|
||||
* ------------------------------------------------------------------------- */
|
||||
import { useMemo, useState, JSXElementConstructor } from 'react'
|
||||
import PropTypes from 'prop-types'
|
||||
import { useFormContext } from 'react-hook-form'
|
||||
|
||||
import { NetworkAlt as NetworkIcon, BoxIso as ImageIcon } from 'iconoir-react'
|
||||
@ -224,13 +223,6 @@ const BootOrder = () => {
|
||||
)
|
||||
}
|
||||
|
||||
BootOrder.propTypes = {
|
||||
data: PropTypes.any,
|
||||
setFormData: PropTypes.func,
|
||||
hypervisor: PropTypes.string,
|
||||
control: PropTypes.object,
|
||||
}
|
||||
|
||||
BootOrder.displayName = 'BootOrder'
|
||||
|
||||
export default BootOrder
|
||||
|
@ -53,14 +53,14 @@ const Booting = ({ hypervisor, ...props }) => {
|
||||
sx={{ width: '100%', gridColumn: '1 / -1' }}
|
||||
>
|
||||
<Legend title={T.BootOrder} tooltip={T.BootOrderConcept} />
|
||||
<BootOrder {...props} />
|
||||
<BootOrder />
|
||||
</FormControl>
|
||||
)}
|
||||
{sections.map(({ id, ...section }) => (
|
||||
<FormWithSchema
|
||||
key={id}
|
||||
id={EXTRA_ID}
|
||||
cy={`create-vm-template-${EXTRA_ID}.${id}`}
|
||||
cy={`${EXTRA_ID}.${id}`}
|
||||
{...section}
|
||||
/>
|
||||
))}
|
||||
|
@ -51,13 +51,13 @@ const ConfigurationSection = () => {
|
||||
sx={{ gridTemplateColumns: { sm: '1fr', md: '1fr 1fr' } }}
|
||||
>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.context-configuration-others`}
|
||||
cy={`${EXTRA_ID}.context-configuration-others`}
|
||||
fields={OTHER_FIELDS}
|
||||
id={EXTRA_ID}
|
||||
/>
|
||||
<div>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.context-ssh-public-key`}
|
||||
cy={`${EXTRA_ID}.context-ssh-public-key`}
|
||||
fields={[SSH_PUBLIC_KEY]}
|
||||
id={EXTRA_ID}
|
||||
/>
|
||||
@ -71,7 +71,7 @@ const ConfigurationSection = () => {
|
||||
</Stack>
|
||||
</div>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.context-script`}
|
||||
cy={`${EXTRA_ID}.context-script`}
|
||||
fields={SCRIPT_FIELDS}
|
||||
id={EXTRA_ID}
|
||||
rootProps={{ sx: { width: '100%', gridColumn: '1 / -1' } }}
|
||||
|
@ -31,7 +31,7 @@ export const SECTION_ID = 'CONTEXT'
|
||||
*/
|
||||
const FilesSection = ({ hypervisor }) => (
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.context-files`}
|
||||
cy={`${EXTRA_ID}.context-files`}
|
||||
legend={T.Files}
|
||||
fields={() => FILES_FIELDS(hypervisor)}
|
||||
id={EXTRA_ID}
|
||||
|
@ -157,7 +157,7 @@ const UserInputsSection = () => {
|
||||
onSubmit={methods.handleSubmit(onSubmit)}
|
||||
>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.context-user-input`}
|
||||
cy={`${EXTRA_ID}.context-user-input`}
|
||||
fields={USER_INPUT_FIELDS}
|
||||
rootProps={{ sx: { m: 0 } }}
|
||||
/>
|
||||
|
@ -21,7 +21,7 @@ import PropTypes from 'prop-types'
|
||||
import { useFormContext, FieldErrors } from 'react-hook-form'
|
||||
|
||||
import { useAuth } from 'client/features/Auth'
|
||||
import { Tr, Translate } from 'client/components/HOC'
|
||||
import { Translate } from 'client/components/HOC'
|
||||
|
||||
import Tabs from 'client/components/Tabs'
|
||||
import Storage from 'client/components/Forms/VmTemplate/CreateForm/Steps/ExtraConfiguration/storage'
|
||||
@ -96,7 +96,7 @@ const Content = ({ data, setFormData }) => {
|
||||
[totalErrors, view, control]
|
||||
)
|
||||
|
||||
return tabs.length > 0 ? <Tabs tabs={tabs} /> : <span>{Tr(T.Empty)}</span>
|
||||
return <Tabs tabs={tabs} />
|
||||
}
|
||||
|
||||
const ExtraConfiguration = () => ({
|
||||
|
@ -42,7 +42,7 @@ const InputOutput = ({ hypervisor }) => {
|
||||
sx={{ gridTemplateColumns: { sm: '1fr', md: '1fr 1fr' } }}
|
||||
>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.io-graphics`}
|
||||
cy={`${EXTRA_ID}.io-graphics`}
|
||||
fields={GRAPHICS_FIELDS(hypervisor)}
|
||||
legend={T.Graphics}
|
||||
id={EXTRA_ID}
|
||||
|
@ -68,7 +68,7 @@ const InputsSection = ({ fields }) => {
|
||||
onSubmit={methods.handleSubmit(onSubmit)}
|
||||
>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.io-inputs`}
|
||||
cy={`${EXTRA_ID}.io-inputs`}
|
||||
fields={fields}
|
||||
rootProps={{ sx: { m: 0 } }}
|
||||
/>
|
||||
|
@ -79,7 +79,7 @@ const PciDevicesSection = ({ fields }) => {
|
||||
onSubmit={methods.handleSubmit(onSubmit)}
|
||||
>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.io-pci-devices`}
|
||||
cy={`${EXTRA_ID}.io-pci-devices`}
|
||||
fields={fields}
|
||||
rootProps={{ sx: { m: 0 } }}
|
||||
/>
|
||||
|
@ -33,67 +33,64 @@ import { T } from 'client/constants'
|
||||
* @param {string} props.handleUpdate - Update function
|
||||
* @returns {JSXElementConstructor} - NIC card
|
||||
*/
|
||||
const NicItem = memo(
|
||||
({ item, nics, handleRemove, handleUpdate }) => {
|
||||
const { id, NAME, RDP, SSH, NETWORK, PARENT, EXTERNAL } = item
|
||||
const hasAlias = nics?.some((nic) => nic.PARENT === NAME)
|
||||
const NicItem = memo(({ item, nics, handleRemove, handleUpdate }) => {
|
||||
const { id, NAME, RDP, SSH, NETWORK, PARENT, EXTERNAL } = item
|
||||
const hasAlias = nics?.some((nic) => nic.PARENT === NAME)
|
||||
|
||||
return (
|
||||
<SelectCard
|
||||
key={id ?? NAME}
|
||||
title={[NAME, NETWORK].filter(Boolean).join(' - ')}
|
||||
subheader={
|
||||
<>
|
||||
{Object.entries({
|
||||
RDP: stringToBoolean(RDP),
|
||||
SSH: stringToBoolean(SSH),
|
||||
EXTERNAL: stringToBoolean(EXTERNAL),
|
||||
[`PARENT: ${PARENT}`]: PARENT,
|
||||
})
|
||||
.map(([k, v]) => (v ? `${k}` : ''))
|
||||
.filter(Boolean)
|
||||
.join(' | ')}
|
||||
</>
|
||||
}
|
||||
action={
|
||||
<>
|
||||
{!hasAlias && (
|
||||
<Action
|
||||
data-cy={`remove-${NAME}`}
|
||||
tooltip={<Translate word={T.Remove} />}
|
||||
handleClick={handleRemove}
|
||||
color="error"
|
||||
icon={<Trash />}
|
||||
/>
|
||||
)}
|
||||
<ButtonToTriggerForm
|
||||
buttonProps={{
|
||||
'data-cy': `edit-${NAME}`,
|
||||
icon: <Edit />,
|
||||
tooltip: <Translate word={T.Edit} />,
|
||||
}}
|
||||
options={[
|
||||
{
|
||||
dialogProps: {
|
||||
title: (
|
||||
<Translate
|
||||
word={T.EditSomething}
|
||||
values={[`${NAME} - ${NETWORK}`]}
|
||||
/>
|
||||
),
|
||||
},
|
||||
form: () => AttachNicForm({ nics }, item),
|
||||
onSubmit: handleUpdate,
|
||||
},
|
||||
]}
|
||||
return (
|
||||
<SelectCard
|
||||
key={id ?? NAME}
|
||||
title={[NAME, NETWORK].filter(Boolean).join(' - ')}
|
||||
subheader={
|
||||
<>
|
||||
{Object.entries({
|
||||
RDP: stringToBoolean(RDP),
|
||||
SSH: stringToBoolean(SSH),
|
||||
EXTERNAL: stringToBoolean(EXTERNAL),
|
||||
[`PARENT: ${PARENT}`]: PARENT,
|
||||
})
|
||||
.map(([k, v]) => (v ? `${k}` : ''))
|
||||
.filter(Boolean)
|
||||
.join(' | ')}
|
||||
</>
|
||||
}
|
||||
action={
|
||||
<>
|
||||
{!hasAlias && (
|
||||
<Action
|
||||
data-cy={`remove-${NAME}`}
|
||||
tooltip={<Translate word={T.Remove} />}
|
||||
handleClick={handleRemove}
|
||||
color="error"
|
||||
icon={<Trash />}
|
||||
/>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
)
|
||||
},
|
||||
(prev, next) => prev.item?.NAME === next.item?.NAME
|
||||
)
|
||||
)}
|
||||
<ButtonToTriggerForm
|
||||
buttonProps={{
|
||||
'data-cy': `edit-${NAME}`,
|
||||
icon: <Edit />,
|
||||
tooltip: <Translate word={T.Edit} />,
|
||||
}}
|
||||
options={[
|
||||
{
|
||||
dialogProps: {
|
||||
title: (
|
||||
<Translate
|
||||
word={T.EditSomething}
|
||||
values={[`${NAME} - ${NETWORK}`]}
|
||||
/>
|
||||
),
|
||||
},
|
||||
form: () => AttachNicForm({ nics }, item),
|
||||
onSubmit: handleUpdate,
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
)
|
||||
})
|
||||
|
||||
NicItem.propTypes = {
|
||||
index: PropTypes.number,
|
||||
|
@ -109,7 +109,7 @@ const Networking = () => {
|
||||
))}
|
||||
</Stack>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.network-options`}
|
||||
cy={`${EXTRA_ID}.network-options`}
|
||||
fields={FIELDS}
|
||||
legend={T.NetworkDefaults}
|
||||
legendTooltip={T.NetworkDefaultsConcept}
|
||||
|
@ -32,12 +32,12 @@ const Numa = ({ hypervisor }) => {
|
||||
return (
|
||||
<>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.vcpu`}
|
||||
cy={`${EXTRA_ID}.vcpu`}
|
||||
fields={[VCPU_FIELD]}
|
||||
id={GENERAL_ID}
|
||||
/>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.numa`}
|
||||
cy={`${EXTRA_ID}.numa`}
|
||||
fields={NUMA_FIELDS(hypervisor)}
|
||||
id={EXTRA_ID}
|
||||
/>
|
||||
|
@ -41,7 +41,7 @@ const Placement = () => {
|
||||
<FormWithSchema
|
||||
key={id}
|
||||
id={EXTRA_ID}
|
||||
cy={`create-vm-template-${EXTRA_ID}.${id}`}
|
||||
cy={`${EXTRA_ID}.${id}`}
|
||||
{...section}
|
||||
/>
|
||||
))}
|
||||
|
@ -13,18 +13,24 @@
|
||||
* See the License for the specific language governing permissions and *
|
||||
* limitations under the License. *
|
||||
* ------------------------------------------------------------------------- */
|
||||
/* eslint-disable jsdoc/require-jsdoc */
|
||||
import { array, object } from 'yup'
|
||||
import { array, object, ObjectSchema } from 'yup'
|
||||
|
||||
import { FIELDS as PLACEMENT_FIELDS } from 'client/components/Forms/VmTemplate/CreateForm/Steps/ExtraConfiguration/placement/schema'
|
||||
import { FIELDS as OS_FIELDS } from 'client/components/Forms/VmTemplate/CreateForm/Steps/ExtraConfiguration/booting/schema'
|
||||
import { FIELDS as NUMA_FIELDS } from 'client/components/Forms/VmTemplate/CreateForm/Steps/ExtraConfiguration/numa/schema'
|
||||
import { SCHEMA as IO_SCHEMA } from 'client/components/Forms/VmTemplate/CreateForm/Steps/ExtraConfiguration/inputOutput/schema'
|
||||
import { SCHEMA as CONTEXT_SCHEMA } from 'client/components/Forms/VmTemplate/CreateForm/Steps/ExtraConfiguration/context/schema'
|
||||
import { SCHEMA as STORAGE_SCHEMA } from 'client/components/Forms/VmTemplate/CreateForm/Steps/ExtraConfiguration/storage/schema'
|
||||
import { SCHEMA as NETWORK_SCHEMA } from 'client/components/Forms/VmTemplate/CreateForm/Steps/ExtraConfiguration/networking/schema'
|
||||
import { HYPERVISORS } from 'client/constants'
|
||||
import { getObjectSchemaFromFields } from 'client/utils'
|
||||
import { FIELDS as PLACEMENT_FIELDS } from './placement/schema'
|
||||
import { FIELDS as OS_FIELDS } from './booting/schema'
|
||||
import { FIELDS as NUMA_FIELDS } from './numa/schema'
|
||||
import { SCHEMA as IO_SCHEMA } from './inputOutput/schema'
|
||||
import { SCHEMA as CONTEXT_SCHEMA } from './context/schema'
|
||||
import { SCHEMA as STORAGE_SCHEMA } from './storage/schema'
|
||||
import { SCHEMA as NETWORK_SCHEMA } from './networking/schema'
|
||||
|
||||
/**
|
||||
* Map name attribute if not exists.
|
||||
*
|
||||
* @param {string} prefixName - Prefix to add in name
|
||||
* @returns {object[]} Resource object
|
||||
*/
|
||||
export const mapNameByIndex = (prefixName) => (resource, idx) => ({
|
||||
...resource,
|
||||
NAME:
|
||||
@ -33,14 +39,19 @@ export const mapNameByIndex = (prefixName) => (resource, idx) => ({
|
||||
: resource?.NAME,
|
||||
})
|
||||
|
||||
export const SCHED_ACTION_SCHEMA = array()
|
||||
.ensure()
|
||||
.transform((actions) => actions.map(mapNameByIndex('SCHED_ACTION')))
|
||||
export const SCHED_ACTION_SCHEMA = object({
|
||||
SCHED_ACTION: array()
|
||||
.ensure()
|
||||
.transform((actions) => actions.map(mapNameByIndex('SCHED_ACTION'))),
|
||||
})
|
||||
|
||||
/**
|
||||
* @param {HYPERVISORS} hypervisor - VM hypervisor
|
||||
* @returns {ObjectSchema} Extra configuration schema
|
||||
*/
|
||||
export const SCHEMA = (hypervisor) =>
|
||||
object({
|
||||
SCHED_ACTION: SCHED_ACTION_SCHEMA,
|
||||
})
|
||||
object()
|
||||
.concat(SCHED_ACTION_SCHEMA)
|
||||
.concat(NETWORK_SCHEMA)
|
||||
.concat(STORAGE_SCHEMA)
|
||||
.concat(CONTEXT_SCHEMA(hypervisor))
|
||||
|
@ -21,7 +21,7 @@ import { Edit, Trash } from 'iconoir-react'
|
||||
import ButtonToTriggerForm from 'client/components/Forms/ButtonToTriggerForm'
|
||||
import SelectCard, { Action } from 'client/components/Cards/SelectCard'
|
||||
import { ImageSteps, VolatileSteps } from 'client/components/Forms/Vm'
|
||||
import { StatusCircle, StatusChip } from 'client/components/Status'
|
||||
import { StatusCircle } from 'client/components/Status'
|
||||
import { Translate } from 'client/components/HOC'
|
||||
|
||||
import { getState, getDiskType } from 'client/models/Image'
|
||||
@ -40,102 +40,95 @@ import { T } from 'client/constants'
|
||||
* @param {string} props.handleUpdate - Update function
|
||||
* @returns {JSXElementConstructor} - Disk card
|
||||
*/
|
||||
const DiskItem = memo(
|
||||
({ item, hypervisor, handleRemove, handleUpdate }) => {
|
||||
const {
|
||||
NAME,
|
||||
TYPE,
|
||||
IMAGE,
|
||||
IMAGE_ID,
|
||||
IMAGE_STATE,
|
||||
ORIGINAL_SIZE,
|
||||
SIZE = ORIGINAL_SIZE,
|
||||
READONLY,
|
||||
DATASTORE,
|
||||
PERSISTENT,
|
||||
} = item
|
||||
const DiskItem = memo(({ item, hypervisor, handleRemove, handleUpdate }) => {
|
||||
const {
|
||||
NAME,
|
||||
TYPE,
|
||||
IMAGE,
|
||||
IMAGE_ID,
|
||||
IMAGE_STATE,
|
||||
ORIGINAL_SIZE,
|
||||
SIZE = ORIGINAL_SIZE,
|
||||
READONLY,
|
||||
DATASTORE,
|
||||
PERSISTENT,
|
||||
} = item
|
||||
|
||||
const isVolatile = !IMAGE && !IMAGE_ID
|
||||
const isPersistent = stringToBoolean(PERSISTENT)
|
||||
const state = !isVolatile && getState({ STATE: IMAGE_STATE })
|
||||
const type = isVolatile ? TYPE : getDiskType(item)
|
||||
const originalSize = +ORIGINAL_SIZE
|
||||
? prettyBytes(+ORIGINAL_SIZE, 'MB')
|
||||
: '-'
|
||||
const size = prettyBytes(+SIZE, 'MB')
|
||||
const isVolatile = !IMAGE && !IMAGE_ID
|
||||
const state = !isVolatile && getState({ STATE: IMAGE_STATE })
|
||||
const type = isVolatile ? TYPE : getDiskType(item)
|
||||
const originalSize = +ORIGINAL_SIZE ? prettyBytes(+ORIGINAL_SIZE, 'MB') : '-'
|
||||
const size = prettyBytes(+SIZE, 'MB')
|
||||
|
||||
return (
|
||||
<SelectCard
|
||||
title={
|
||||
isVolatile ? (
|
||||
<>
|
||||
{`${NAME} - `}
|
||||
<Translate word={T.VolatileDisk} />
|
||||
</>
|
||||
) : (
|
||||
<Stack
|
||||
component="span"
|
||||
direction="row"
|
||||
alignItems="center"
|
||||
gap="0.5em"
|
||||
>
|
||||
<StatusCircle color={state?.color} tooltip={state?.name} />
|
||||
{`${NAME}: ${IMAGE}`}
|
||||
{isPersistent && <StatusChip text="PERSISTENT" />}
|
||||
</Stack>
|
||||
)
|
||||
}
|
||||
subheader={
|
||||
return (
|
||||
<SelectCard
|
||||
title={
|
||||
isVolatile ? (
|
||||
<>
|
||||
{Object.entries({
|
||||
[DATASTORE]: DATASTORE,
|
||||
READONLY: stringToBoolean(READONLY),
|
||||
PERSISTENT: stringToBoolean(PERSISTENT),
|
||||
[isVolatile || ORIGINAL_SIZE === SIZE
|
||||
? size
|
||||
: `${originalSize}/${size}`]: true,
|
||||
[type]: type,
|
||||
})
|
||||
.map(([k, v]) => (v ? `${k}` : ''))
|
||||
.filter(Boolean)
|
||||
.join(' | ')}
|
||||
{`${NAME} - `}
|
||||
<Translate word={T.VolatileDisk} />
|
||||
</>
|
||||
}
|
||||
action={
|
||||
<>
|
||||
<Action
|
||||
data-cy={`remove-${NAME}`}
|
||||
tooltip={<Translate word={T.Remove} />}
|
||||
handleClick={handleRemove}
|
||||
color="error"
|
||||
icon={<Trash />}
|
||||
/>
|
||||
<ButtonToTriggerForm
|
||||
buttonProps={{
|
||||
'data-cy': `edit-${NAME}`,
|
||||
icon: <Edit />,
|
||||
tooltip: <Translate word={T.Edit} />,
|
||||
}}
|
||||
options={[
|
||||
{
|
||||
dialogProps: {
|
||||
title: <Translate word={T.EditSomething} values={[NAME]} />,
|
||||
},
|
||||
form: () =>
|
||||
isVolatile
|
||||
? VolatileSteps({ hypervisor }, item)
|
||||
: ImageSteps({ hypervisor }, item),
|
||||
onSubmit: handleUpdate,
|
||||
) : (
|
||||
<Stack
|
||||
component="span"
|
||||
direction="row"
|
||||
alignItems="center"
|
||||
gap="0.5em"
|
||||
>
|
||||
<StatusCircle color={state?.color} tooltip={state?.name} />
|
||||
{`${NAME}: ${IMAGE}`}
|
||||
</Stack>
|
||||
)
|
||||
}
|
||||
subheader={
|
||||
<>
|
||||
{Object.entries({
|
||||
[DATASTORE]: DATASTORE,
|
||||
READONLY: stringToBoolean(READONLY),
|
||||
PERSISTENT: stringToBoolean(PERSISTENT),
|
||||
[isVolatile || ORIGINAL_SIZE === SIZE
|
||||
? size
|
||||
: `${originalSize}/${size}`]: true,
|
||||
[type]: type,
|
||||
})
|
||||
.map(([k, v]) => (v ? `${k}` : ''))
|
||||
.filter(Boolean)
|
||||
.join(' | ')}
|
||||
</>
|
||||
}
|
||||
action={
|
||||
<>
|
||||
<Action
|
||||
data-cy={`remove-${NAME}`}
|
||||
tooltip={<Translate word={T.Remove} />}
|
||||
handleClick={handleRemove}
|
||||
color="error"
|
||||
icon={<Trash />}
|
||||
/>
|
||||
<ButtonToTriggerForm
|
||||
buttonProps={{
|
||||
'data-cy': `edit-${NAME}`,
|
||||
icon: <Edit />,
|
||||
tooltip: <Translate word={T.Edit} />,
|
||||
}}
|
||||
options={[
|
||||
{
|
||||
dialogProps: {
|
||||
title: <Translate word={T.EditSomething} values={[NAME]} />,
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
)
|
||||
},
|
||||
(prev, next) => prev.item?.NAME === next.item?.NAME
|
||||
)
|
||||
form: () =>
|
||||
isVolatile
|
||||
? VolatileSteps({ hypervisor }, item)
|
||||
: ImageSteps({ hypervisor }, item),
|
||||
onSubmit: handleUpdate,
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
)
|
||||
})
|
||||
|
||||
DiskItem.propTypes = {
|
||||
index: PropTypes.number,
|
||||
|
@ -117,7 +117,7 @@ const Storage = ({ hypervisor }) => {
|
||||
))}
|
||||
</Stack>
|
||||
<FormWithSchema
|
||||
cy={`create-vm-template-${EXTRA_ID}.storage-options`}
|
||||
cy={`${EXTRA_ID}.storage-options`}
|
||||
fields={FIELDS}
|
||||
legend={T.StorageOptions}
|
||||
id={EXTRA_ID}
|
||||
|
@ -49,7 +49,7 @@ const Content = ({ isUpdate }) => {
|
||||
return (
|
||||
<div className={classes.root}>
|
||||
<FormWithSchema
|
||||
cy={'create-vm-template-general.hypervisor'}
|
||||
cy={`${STEP_ID}.hypervisor`}
|
||||
fields={[HYPERVISOR_FIELD]}
|
||||
legend={T.Hypervisor}
|
||||
id={STEP_ID}
|
||||
@ -59,7 +59,7 @@ const Content = ({ isUpdate }) => {
|
||||
key={id}
|
||||
id={STEP_ID}
|
||||
className={classes[id]}
|
||||
cy={`create-vm-template-${STEP_ID}.${id}`}
|
||||
cy={`${STEP_ID}.${id}`}
|
||||
{...section}
|
||||
/>
|
||||
))}
|
||||
|
Loading…
x
Reference in New Issue
Block a user