saleor-dashboard/src/staff/components/StaffList/StaffList.tsx

175 lines
5 KiB
TypeScript
Raw Normal View History

2019-10-30 14:34:24 +00:00
import { makeStyles } from "@material-ui/core/styles";
2019-06-19 14:40:52 +00:00
import TableBody from "@material-ui/core/TableBody";
import TableCell from "@material-ui/core/TableCell";
import TableFooter from "@material-ui/core/TableFooter";
import TableHead from "@material-ui/core/TableHead";
import TableRow from "@material-ui/core/TableRow";
import Typography from "@material-ui/core/Typography";
2019-08-09 11:14:35 +00:00
import classNames from "classnames";
2019-08-09 10:26:22 +00:00
import React from "react";
import { FormattedMessage, useIntl } from "react-intl";
2019-06-19 14:40:52 +00:00
2019-11-04 14:25:23 +00:00
import ResponsiveTable from "@saleor/components/ResponsiveTable";
2019-06-19 14:40:52 +00:00
import Skeleton from "@saleor/components/Skeleton";
import TablePagination from "@saleor/components/TablePagination";
import {
getUserInitials,
getUserName,
maybe,
renderCollection
2019-08-09 11:14:35 +00:00
} from "@saleor/misc";
import { ListProps } from "@saleor/types";
2019-06-19 14:40:52 +00:00
import { StaffList_staffUsers_edges_node } from "../../types/StaffList";
2019-10-30 14:34:24 +00:00
const useStyles = makeStyles(theme => ({
avatar: {
alignItems: "center",
borderRadius: "100%",
display: "grid",
float: "left",
height: 47,
justifyContent: "center",
marginRight: theme.spacing(1),
overflow: "hidden",
width: 47
},
avatarDefault: {
"& p": {
color: "#fff",
lineHeight: "47px"
2019-06-19 14:40:52 +00:00
},
2019-10-30 14:34:24 +00:00
background: theme.palette.primary.main,
height: 47,
textAlign: "center",
width: 47
},
avatarImage: {
pointerEvents: "none",
width: "100%"
},
statusText: {
color: "#9E9D9D"
},
tableRow: {
cursor: "pointer"
},
wideColumn: {
width: "80%"
}
}));
2019-06-19 14:40:52 +00:00
2019-10-30 14:34:24 +00:00
interface StaffListProps extends ListProps {
2019-06-19 14:40:52 +00:00
staffMembers: StaffList_staffUsers_edges_node[];
}
2019-10-30 14:34:24 +00:00
const StaffList: React.FC<StaffListProps> = props => {
const {
2019-08-09 11:14:35 +00:00
settings,
2019-06-19 14:40:52 +00:00
disabled,
onNextPage,
onPreviousPage,
2019-08-09 11:14:35 +00:00
onUpdateListSettings,
2019-06-19 14:40:52 +00:00
onRowClick,
pageInfo,
staffMembers
2019-10-30 14:34:24 +00:00
} = props;
const classes = useStyles(props);
const intl = useIntl();
2019-10-30 14:34:24 +00:00
return (
2019-11-04 14:25:23 +00:00
<ResponsiveTable>
2019-10-30 14:34:24 +00:00
<TableHead>
<TableRow>
<TableCell className={classes.wideColumn}>
<FormattedMessage
defaultMessage="Name"
description="staff member full name"
2019-09-12 10:46:23 +00:00
/>
2019-10-30 14:34:24 +00:00
</TableCell>
<TableCell>
<FormattedMessage defaultMessage="Email Address" />
</TableCell>
</TableRow>
</TableHead>
<TableFooter>
<TableRow>
<TablePagination
colSpan={3}
settings={settings}
hasNextPage={
pageInfo && !disabled ? pageInfo.hasNextPage : undefined
}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : undefined
}
onPreviousPage={onPreviousPage}
/>
</TableRow>
</TableFooter>
<TableBody>
{renderCollection(
staffMembers,
staffMember => (
<TableRow
className={classNames({
[classes.tableRow]: !!staffMember
})}
hover={!!staffMember}
onClick={!!staffMember ? onRowClick(staffMember.id) : undefined}
key={staffMember ? staffMember.id : "skeleton"}
>
<TableCell>
<div className={classes.avatar}>
{maybe(() => staffMember.avatar.url) ? (
<img
className={classes.avatarImage}
src={maybe(() => staffMember.avatar.url)}
/>
) : (
<div className={classes.avatarDefault}>
<Typography>{getUserInitials(staffMember)}</Typography>
</div>
)}
</div>
<Typography>
{getUserName(staffMember) || <Skeleton />}
</Typography>
<Typography variant={"caption"} className={classes.statusText}>
2019-09-12 10:46:23 +00:00
{maybe<React.ReactNode>(
2019-10-30 14:34:24 +00:00
() =>
staffMember.isActive
? intl.formatMessage({
defaultMessage: "Active",
description: "staff member status"
})
: intl.formatMessage({
defaultMessage: "Inactive",
description: "staff member status"
}),
2019-09-12 10:46:23 +00:00
<Skeleton />
)}
2019-10-30 14:34:24 +00:00
</Typography>
</TableCell>
<TableCell>
{maybe<React.ReactNode>(() => staffMember.email, <Skeleton />)}
</TableCell>
</TableRow>
),
() => (
<TableRow>
<TableCell colSpan={3}>
<FormattedMessage defaultMessage="No staff members found" />
</TableCell>
</TableRow>
)
)}
</TableBody>
2019-11-04 14:25:23 +00:00
</ResponsiveTable>
2019-10-30 14:34:24 +00:00
);
};
2019-06-19 14:40:52 +00:00
StaffList.displayName = "StaffList";
export default StaffList;