import { useAppState } from '@/components/AppStateProvider';
import { useSx } from '@/hooks';
import { InputLabel, Tooltip, Typography } from '@mui/material';
import { styled } from '@mui/material/styles';
import { get } from 'lodash';
import React, { Children, PropsWithChildren, useMemo } from 'react';
import { FieldTitle, useRecordContext, useResourceContext } from 'react-admin';
type StyledFieldProps = {
theme?: any;
fullWidth?: boolean;
};
const StyledField = styled('div')(({ theme, fullWidth }: StyledFieldProps) => ({
borderBottom: `1px solid ${theme.palette.divider}`,
paddingTop: theme.spacing(1),
paddingBottom: theme.spacing(1),
marginBottom: theme.spacing(1),
whiteSpace: 'nowrap',
overflow: 'hidden',
textOverflow: 'ellipsis',
width: fullWidth ? '100%' : 'auto',
[theme.breakpoints.down('sm')]: {
whiteSpace: 'normal',
overflow: 'visible',
textOverflow: 'inherit'
}
}));
type BasicFieldProps = {
source: string;
defaultValue: any;
record: any;
};
function BasicField({ source, defaultValue = ' ', ...props }: BasicFieldProps): JSX.Element {
const record = useRecordContext(props);
const value = get(record, source, defaultValue);
return ;
}
type ContentWrapperProps = PropsWithChildren<{
title: string | boolean;
}>;
function ContentWrapper({ title, children }: ContentWrapperProps): JSX.Element | null {
if (children === null || children === undefined) return null;
if (typeof title === 'string' || title === true) {
return (
{children as React.ReactElement}
);
}
return children as React.ReactElement;
}
function ReadonlyField({
label,
source,
defaultValue = ' ',
children = ,
tooltip: _tooltip,
...props
}: ReadonlyFieldProps): JSX.Element {
const Child = Children.only(children);
const { getCurrentDialog } = useAppState();
const record = useRecordContext(props);
const resource = useResourceContext(props as any);
// WARN: This is a hack to get the resource from the dialog, but it's not the best way to do it.
const dialogResource = getCurrentDialog();
const tooltip = useMemo(() => {
if (_tooltip === false) return false;
if (typeof _tooltip === 'function') return _tooltip(record);
if (typeof _tooltip === 'string') {
return get(record, _tooltip, _tooltip);
}
return _tooltip;
}, [record, _tooltip]);
const sx = useSx(props, { width: props?.fullWidth ? '100%' : 'auto' });
return (
<>
{React.isValidElement(Child)
? React.cloneElement(Child, {
...Child.props,
source,
record,
defaultValue,
resource: dialogResource || resource,
sx
})
: null}
>
);
}
type ReadonlyFieldProps = PropsWithChildren<{
defaultValue: any;
tooltip: string | boolean | ((record: any) => string);
source: string;
label: string;
name: string;
fullWidth?: boolean;
}>;
export { ReadonlyField };
export type { ReadonlyFieldProps };