Local modifications to ClusterLabs/Anvil by Alteeve
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.0 KiB

import {
FormControl as MUIFormControl,
FormControlLabel as MUIFormControlLabel,
FormLabel as MUIFormLabel,
Radio as MUIRadio,
radioClasses as muiRadioClasses,
RadioGroup as MUIRadioGroup,
} from '@mui/material';
import { FC, useMemo } from 'react';
import { GREY } from '../lib/consts/DEFAULT_THEME';
import { BodyText } from './Text';
const RadioGroupWithLabel: FC<RadioGroupWithLabelProps> = ({
formControlProps,
formControlLabelProps,
formLabelProps,
id,
label,
name,
onChange: onRadioGroupChange,
radioItems,
radioProps: { sx: radioSx, ...restRadioProps } = {},
radioGroupProps,
value,
}) => {
const labelElement = useMemo(
() => (typeof label === 'string' ? <BodyText>{label}</BodyText> : label),
[label],
);
const itemElements = useMemo(() => {
const items = Object.entries(radioItems);
return items.map(([itemId, { label: itemLabel, value: itemValue }]) => {
const itemLabelElement =
typeof itemLabel === 'string' ? (
<BodyText>{itemLabel}</BodyText>
) : (
itemLabel
);
return (
<MUIFormControlLabel
control={
<MUIRadio
{...restRadioProps}
sx={{
[`&.${muiRadioClasses.root}`]: {
color: GREY,
},
...radioSx,
}}
/>
}
key={`${id}-${itemId}`}
value={itemValue}
label={itemLabelElement}
{...formControlLabelProps}
/>
);
});
}, [formControlLabelProps, id, radioItems, radioSx, restRadioProps]);
return (
<MUIFormControl {...formControlProps}>
<MUIFormLabel {...formLabelProps}>{labelElement}</MUIFormLabel>
<MUIRadioGroup
id={id}
name={name}
onChange={onRadioGroupChange}
row
value={value}
{...radioGroupProps}
>
{itemElements}
</MUIRadioGroup>
</MUIFormControl>
);
};
export default RadioGroupWithLabel;