import React, {
|
useState,
|
useRef,
|
useEffect,
|
useMemo,
|
useCallback,
|
} from "react";
|
import { useNavigate } from "react-router-dom";
|
import {
|
List,
|
DatagridConfigurable,
|
SearchInput,
|
TopToolbar,
|
SelectColumnsButton,
|
EditButton,
|
FilterButton,
|
CreateButton,
|
ExportButton,
|
BulkDeleteButton,
|
WrapperField,
|
useRecordContext,
|
useTranslate,
|
useListContext,
|
useCreatePath,
|
TextField,
|
NumberField,
|
DateField,
|
BooleanField,
|
ReferenceField,
|
TextInput,
|
DateTimeInput,
|
DateInput,
|
SelectInput,
|
NumberInput,
|
ReferenceInput,
|
ReferenceArrayInput,
|
AutocompleteInput,
|
DeleteButton,
|
FunctionField,
|
} from "react-admin";
|
import { Box, Typography, Card, Stack, LinearProgress } from "@mui/material";
|
import { styled } from "@mui/material/styles";
|
import UserCreate from "./UserCreate";
|
import UserPanel from "./UserPanel";
|
import EmptyData from "@/page/components/EmptyData";
|
import MyCreateButton from "@/page/components/MyCreateButton";
|
import MyExportButton from "@/page/components/MyExportButton";
|
import PageDrawer from "@/page/components/PageDrawer";
|
import MyField from "@/page/components/MyField";
|
import {
|
PAGE_DRAWER_WIDTH,
|
OPERATE_MODE,
|
DEFAULT_PAGE_SIZE,
|
} from "@/config/setting";
|
import * as Common from "@/utils/common";
|
import UserListAside from "./UserListAside";
|
import RolesField from "./RolesField";
|
|
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
|
"& .css-1vooibu-MuiSvgIcon-root": {
|
height: ".9em",
|
},
|
"& .RaDatagrid-row": {
|
cursor: "auto",
|
},
|
"& .column-username": {
|
maxWidth: "10em",
|
overflow: "hidden",
|
textOverflow: "ellipsis",
|
whiteSpace: "nowrap",
|
},
|
"& .column-nickname": {
|
maxWidth: "10em",
|
overflow: "hidden",
|
textOverflow: "ellipsis",
|
whiteSpace: "nowrap",
|
},
|
"& .column-deptId": {
|
maxWidth: "10em",
|
overflow: "hidden",
|
textOverflow: "ellipsis",
|
whiteSpace: "nowrap",
|
},
|
"& .opt": {
|
width: 200,
|
},
|
"& .column-statusBool": {
|
maxWidth: 60,
|
},
|
}));
|
|
const filters = [
|
// <SearchInput source="condition" alwaysOn />,
|
|
<TextInput source="username" label="table.field.user.username" />,
|
<TextInput source="nickname" label="table.field.user.nickname" />,
|
<TextInput source="code" label="table.field.user.code" />,
|
<SelectInput
|
source="sex"
|
label="table.field.user.sex"
|
choices={[
|
{ id: 0, name: "table.field.user.sexes.unknown" },
|
{ id: 1, name: "table.field.user.sexes.male" },
|
{ id: 2, name: "table.field.user.sexes.female" },
|
]}
|
/>,
|
<TextInput source="phone" label="table.field.user.phone" />,
|
<TextInput source="email" label="table.field.user.email" />,
|
// <ReferenceInput source="deptId" label="table.field.user.deptId" reference="dept">
|
// <AutocompleteInput label="table.field.user.deptId" optionText="name" filterToQuery={(val) => ({ name: val })} />
|
// </ReferenceInput>,
|
<TextInput source="realName" label="table.field.user.realName" />,
|
<TextInput source="idCard" label="table.field.user.idCard" />,
|
|
<TextInput label="common.field.memo" source="memo" />,
|
<SelectInput
|
label="common.field.status"
|
source="status"
|
choices={[
|
{ id: "1", name: "common.enums.statusTrue" },
|
{ id: "0", name: "common.enums.statusFalse" },
|
]}
|
/>,
|
];
|
|
const UserListContent = (props) => {
|
const translate = useTranslate();
|
const { isLoading } = useListContext();
|
|
return (
|
<Box sx={{ position: "relative" }}>
|
{isLoading && (
|
<LinearProgress
|
sx={{
|
height: "2px",
|
position: "absolute",
|
top: 0,
|
left: 0,
|
right: 0,
|
}}
|
/>
|
)}
|
<StyledDatagrid
|
preferenceKey="user"
|
bulkActionButtons={() => (
|
<BulkDeleteButton mutationMode={OPERATE_MODE} />
|
)}
|
rowClick={(id, resource, record) => false}
|
omit={[
|
"id",
|
"email",
|
"idCard",
|
"birthday",
|
"realName",
|
"updateTime",
|
"createTime",
|
"memo",
|
]}
|
>
|
<NumberField source="id" />
|
<TextField source="username" label="table.field.user.username" />
|
<ReferenceField
|
source="deptId"
|
label="table.field.user.deptId"
|
reference="dept"
|
link={false}
|
sortable={false}
|
>
|
<TextField source="name" />
|
</ReferenceField>
|
<TextField source="nickname" label="table.field.user.nickname" />
|
<TextField source="code" label="table.field.user.code" />
|
<FunctionField
|
label="table.field.user.sex"
|
sortable={false}
|
render={(record) => {
|
switch (record.sex) {
|
case 0:
|
return translate("table.field.user.sexes.unknown");
|
case 1:
|
return translate("table.field.user.sexes.male");
|
case 2:
|
return translate("table.field.user.sexes.female");
|
default:
|
return "";
|
}
|
}}
|
/>
|
<TextField source="phone" label="table.field.user.phone" />
|
<TextField source="email" label="table.field.user.email" />
|
<TextField source="realName" label="table.field.user.realName" />
|
<TextField source="idCard" label="table.field.user.idCard" />
|
<TextField source="birthday" label="table.field.user.birthday" />
|
<RolesField
|
source="roles"
|
label="table.field.user.role"
|
sortable={false}
|
/>
|
<DateField
|
source="updateTime"
|
label="common.field.updateTime"
|
showTime
|
/>
|
<DateField
|
source="createTime"
|
label="common.field.createTime"
|
showTime
|
/>
|
<BooleanField
|
source="statusBool"
|
label="common.field.status"
|
sortable={false}
|
/>
|
<TextField source="memo" label="common.field.memo" sortable={false} />
|
<WrapperField cellClassName="opt" label="common.field.opt">
|
<EditButton sx={{ padding: "1px", fontSize: ".75rem" }} />
|
<DeleteButton
|
sx={{ padding: "1px", fontSize: ".75rem" }}
|
mutationMode={OPERATE_MODE}
|
/>
|
</WrapperField>
|
</StyledDatagrid>
|
</Box>
|
);
|
};
|
|
const UserList = () => {
|
const translate = useTranslate();
|
|
const [createDialog, setCreateDialog] = useState(false);
|
const [drawerVal, setDrawerVal] = useState(false);
|
|
return (
|
<Box display="flex">
|
<List
|
sx={{
|
flexGrow: 1,
|
transition: (theme) =>
|
theme.transitions.create(["all"], {
|
duration: theme.transitions.duration.enteringScreen,
|
}),
|
marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
|
}}
|
title={"menu.user"}
|
empty={
|
<EmptyData
|
onClick={() => {
|
setCreateDialog(true);
|
}}
|
/>
|
}
|
filters={filters}
|
sort={{ field: "create_time", order: "desc" }}
|
actions={
|
<TopToolbar>
|
<FilterButton />
|
<MyCreateButton
|
onClick={() => {
|
setCreateDialog(true);
|
}}
|
/>
|
<SelectColumnsButton preferenceKey="user" />
|
<MyExportButton />
|
</TopToolbar>
|
}
|
perPage={DEFAULT_PAGE_SIZE}
|
aside={<UserListAside />}
|
>
|
<UserListContent />
|
</List>
|
<UserCreate open={createDialog} setOpen={setCreateDialog} />
|
<PageDrawer
|
title="User Detail"
|
drawerVal={drawerVal}
|
setDrawerVal={setDrawerVal}
|
></PageDrawer>
|
</Box>
|
);
|
};
|
|
export default UserList;
|