mirror of https://github.com/msgbyte/tailchat
parent
bacb5b3031
commit
4f51ec4aa8
@ -0,0 +1,47 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import filesize from 'filesize';
|
||||||
|
import {
|
||||||
|
NumberFieldProps,
|
||||||
|
sanitizeFieldRestProps,
|
||||||
|
useRecordContext,
|
||||||
|
useTranslate,
|
||||||
|
} from 'react-admin';
|
||||||
|
import get from 'lodash/get';
|
||||||
|
import { Typography } from '@mui/material';
|
||||||
|
|
||||||
|
export const FilesizeField: React.FC<NumberFieldProps> = React.memo((props) => {
|
||||||
|
const { className, emptyText, source, locales, options, textAlign, ...rest } =
|
||||||
|
props;
|
||||||
|
const record = useRecordContext(props);
|
||||||
|
const translate = useTranslate();
|
||||||
|
|
||||||
|
if (!record) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const value = get(record, source!);
|
||||||
|
|
||||||
|
if (value == null) {
|
||||||
|
return emptyText ? (
|
||||||
|
<Typography
|
||||||
|
component="span"
|
||||||
|
variant="body2"
|
||||||
|
className={className}
|
||||||
|
{...sanitizeFieldRestProps(rest)}
|
||||||
|
>
|
||||||
|
{emptyText && translate(emptyText, { _: emptyText })}
|
||||||
|
</Typography>
|
||||||
|
) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Typography
|
||||||
|
component="span"
|
||||||
|
variant="body2"
|
||||||
|
className={className}
|
||||||
|
{...sanitizeFieldRestProps(rest)}
|
||||||
|
>
|
||||||
|
{filesize(value)}
|
||||||
|
</Typography>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
FilesizeField.displayName = 'FilesizeField';
|
@ -0,0 +1,28 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import {
|
||||||
|
Datagrid,
|
||||||
|
DateField,
|
||||||
|
List,
|
||||||
|
NumberField,
|
||||||
|
ReferenceField,
|
||||||
|
TextField,
|
||||||
|
UrlField,
|
||||||
|
} from 'react-admin';
|
||||||
|
import { FilesizeField } from '../components/FilesizeField';
|
||||||
|
|
||||||
|
export const FileList: React.FC = () => (
|
||||||
|
<List>
|
||||||
|
<Datagrid>
|
||||||
|
<TextField source="objectName" label="对象存储名" />
|
||||||
|
<UrlField source="url" target="__blank" label="文件路径" />
|
||||||
|
<FilesizeField source="size" noWrap={true} />
|
||||||
|
<TextField source="metaData.content-type" label="文件类型" />
|
||||||
|
<TextField source="etag" />
|
||||||
|
<ReferenceField source="userId" reference="users" label="存储用户">
|
||||||
|
<TextField source="nickname" />
|
||||||
|
(<TextField source="email" />)
|
||||||
|
</ReferenceField>
|
||||||
|
<DateField source="createdAt" label="创建时间" />
|
||||||
|
</Datagrid>
|
||||||
|
</List>
|
||||||
|
);
|
@ -0,0 +1,22 @@
|
|||||||
|
import { defaultTheme } from 'react-admin';
|
||||||
|
import { ThemeOptions } from '@mui/material';
|
||||||
|
|
||||||
|
const customRaComponents = {
|
||||||
|
RaDatagrid: {
|
||||||
|
styleOverrides: {
|
||||||
|
root: {
|
||||||
|
'& .RaDatagrid-headerCell': {
|
||||||
|
whiteSpace: 'nowrap',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const theme: ThemeOptions = {
|
||||||
|
...defaultTheme,
|
||||||
|
components: {
|
||||||
|
...defaultTheme.components,
|
||||||
|
...customRaComponents,
|
||||||
|
},
|
||||||
|
};
|
Loading…
Reference in New Issue