1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-20 10:50:08 +03:00

F #5637: Fix minor in proptypes & cypress atributes (#1623)

This commit is contained in:
Sergio Betanzos 2021-11-30 15:58:18 +01:00 committed by GitHub
parent 1608772993
commit c4e131164d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 186 additions and 193 deletions

View File

@ -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

View File

@ -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}
/>
))}

View File

@ -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' } }}

View File

@ -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}

View File

@ -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 } }}
/>

View File

@ -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 = () => ({

View File

@ -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}

View File

@ -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 } }}
/>

View File

@ -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 } }}
/>

View File

@ -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,

View File

@ -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}

View File

@ -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}
/>

View File

@ -41,7 +41,7 @@ const Placement = () => {
<FormWithSchema
key={id}
id={EXTRA_ID}
cy={`create-vm-template-${EXTRA_ID}.${id}`}
cy={`${EXTRA_ID}.${id}`}
{...section}
/>
))}

View File

@ -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))

View File

@ -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,

View File

@ -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}

View File

@ -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}
/>
))}