import { Button as MuiButton } from '@mui/material'; import { styled } from '@mui/material/styles'; import { Button as RaButton, ButtonProps as RaButtonProps, useTranslate } from 'react-admin'; import { Path } from 'react-router'; type ButtonProps = RaButtonProps & { /** * Disable icon only in small screens. */ disableIconOnly?: boolean; }; const PREFIX = 'RaButton'; function getLinkParams(locationDescriptor?: LocationDescriptor | string) { // eslint-disable-next-line eqeqeq if (locationDescriptor == undefined) { return undefined; } if (typeof locationDescriptor === 'string') { return { to: locationDescriptor }; } const { redirect, replace, state, ...to } = locationDescriptor; return { to, redirect, replace, state }; } const StyledButton = styled(MuiButton, { name: PREFIX, overridesResolver: (_props, styles) => styles.root })({ '&.MuiButton-sizeSmall': { // fix for icon misalignment on small buttons, see https://github.com/mui/material-ui/pull/30240 lineHeight: 1.5 } }); /** * A button that can be displayed as a floating button on small screens. * @param props The component props. * @returns The component. */ function Button(props: ButtonProps): JSX.Element { const { disableIconOnly = false, label, children, className, color, size, disabled, alignIcon, to: locationDescriptor, ...rest } = props; const translate = useTranslate(); const linkParams = getLinkParams(locationDescriptor); if (disableIconOnly) { const translatedLabel = label ? translate(label, { _: label }) : undefined; return ( {translatedLabel} ); } return ; } type LocationDescriptor = Partial & { redirect?: boolean; state?: any; replace?: boolean; }; export { Button }; export type { ButtonProps, LocationDescriptor };