import BackButton from "@dashboard/components/BackButton"; import CardSpacer from "@dashboard/components/CardSpacer"; import { ConfirmButton, ConfirmButtonTransitionState, } from "@dashboard/components/ConfirmButton"; import ResponsiveTable from "@dashboard/components/ResponsiveTable"; import Skeleton from "@dashboard/components/Skeleton"; import TableRowLink from "@dashboard/components/TableRowLink"; import { UserAvatar } from "@dashboard/components/UserAvatar"; import { SearchStaffMembersQuery } from "@dashboard/graphql"; import useElementScroll, { isScrolledToBottom, } from "@dashboard/hooks/useElementScroll"; import useSearchQuery from "@dashboard/hooks/useSearchQuery"; import { buttonMessages } from "@dashboard/intl"; import { getUserInitials, getUserName, renderCollection, } from "@dashboard/misc"; import { DialogProps, FetchMoreProps, RelayToFlat, SearchPageProps, } from "@dashboard/types"; import { Checkbox, CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle, TableBody, TableCell, TextField, } from "@material-ui/core"; import { makeStyles } from "@saleor/macaw-ui"; import { Box, Text } from "@saleor/macaw-ui/next"; import clsx from "clsx"; import React from "react"; import InfiniteScroll from "react-infinite-scroll-component"; import { FormattedMessage, useIntl } from "react-intl"; import { messages } from "./messages"; const useStyles = makeStyles( theme => ({ avatarCell: { padding: 0, width: 32, }, avatarDefault: { "& div": { color: "#fff", lineHeight: 2.8, fontSize: "0.75rem", }, background: theme.palette.primary.main, height: 32, textAlign: "center", width: 32, }, avatarImage: { pointerEvents: "none", width: "100%", }, checkboxCell: { "&&:not(first-child)": { paddingLeft: 0, paddingRight: 0, width: 48, }, }, colActions: { textAlign: "right", }, colName: { paddingLeft: theme.spacing(), }, dialogPaper: { overflow: "hidden", }, dropShadow: { boxShadow: `0px -5px 10px 0px ${theme.palette.divider}`, }, inputContainer: { overflowY: "visible", }, loadMoreLoaderContainer: { alignItems: "center", display: "flex", gridColumnEnd: "span 3", height: theme.spacing(4), justifyContent: "center", }, overflow: { overflowY: "visible", }, table: { marginBottom: theme.spacing(3), }, wideCell: { width: "80%", }, }), { name: "AssignStaffMembersDialog" }, ); export interface AssignMembersDialogProps extends DialogProps, FetchMoreProps, SearchPageProps { confirmButtonState: ConfirmButtonTransitionState; disabled: boolean; staffMembers: RelayToFlat; hasMore: boolean; onFetchMore: () => void; onSubmit: (data: RelayToFlat) => void; } function handleStaffMemberAssign( member: RelayToFlat[0], isSelected: boolean, selectedMembers: RelayToFlat, setSelectedMembers: ( data: RelayToFlat, ) => void, ) { if (isSelected) { setSelectedMembers( selectedMembers.filter(selectedMember => selectedMember.id !== member.id), ); } else { setSelectedMembers([...selectedMembers, member]); } } const AssignMembersDialog: React.FC = ({ confirmButtonState, disabled, loading, onClose, onFetchMore, hasMore, onSearchChange, onSubmit, open, staffMembers, }) => { const intl = useIntl(); const classes = useStyles({}); const [query, onQueryChange] = useSearchQuery(onSearchChange); const [selectedMembers, setSelectedMembers] = React.useState< RelayToFlat >([]); const anchor = React.useRef(); const scrollPosition = useElementScroll(anchor); const dropShadow = !isScrolledToBottom(anchor, scrollPosition); return ( , }} disabled={disabled} /> {staffMembers?.length > 0 && }
} height={400} > {renderCollection( staffMembers, member => { if (!member) { return null; } const isSelected = selectedMembers.some( selectedMember => selectedMember.id === member.id, ); return ( handleStaffMemberAssign( member, isSelected, selectedMembers, setSelectedMembers, ) } /> {getUserName(member) || } {!!member ? ( member.isActive ? ( intl.formatMessage(messages.staffActive) ) : ( intl.formatMessage(messages.staffInactive) ) ) : ( )} ); }, () => !loading && ( ), )}
{ onSubmit(selectedMembers); }} >
); }; AssignMembersDialog.displayName = "AssignMembersDialog"; export default AssignMembersDialog;