saleor-dashboard/src/components/ColumnPicker/ColumnPicker.tsx

126 lines
3.3 KiB
TypeScript
Raw Normal View History

2019-08-09 10:17:04 +00:00
import ClickAwayListener from "@material-ui/core/ClickAwayListener";
import Grow from "@material-ui/core/Grow";
import Popper from "@material-ui/core/Popper";
import { fade } from "@material-ui/core/styles/colorManipulator";
2019-10-28 16:16:49 +00:00
import makeStyles from "@material-ui/core/styles/makeStyles";
2019-08-09 10:17:04 +00:00
import React from "react";
import useStateFromProps from "@saleor/hooks/useStateFromProps";
import { toggle } from "@saleor/utils/lists";
2019-08-09 10:17:04 +00:00
import ColumnPickerButton from "./ColumnPickerButton";
import ColumnPickerContent, {
ColumnPickerContentProps
} from "./ColumnPickerContent";
export interface ColumnPickerProps
extends Omit<
ColumnPickerContentProps,
"selectedColumns" | "onCancel" | "onColumnToggle" | "onReset" | "onSave"
> {
2019-08-09 10:17:04 +00:00
className?: string;
defaultColumns: string[];
initialColumns: string[];
initialOpen?: boolean;
onSave: (columns: string[]) => void;
2019-08-09 10:17:04 +00:00
}
const useStyles = makeStyles(
2019-10-28 16:16:49 +00:00
theme => ({
2019-08-09 10:17:04 +00:00
popper: {
boxShadow: `0px 5px 10px 0 ${fade(theme.palette.common.black, 0.05)}`,
2019-10-28 16:16:49 +00:00
marginTop: theme.spacing(2),
2019-08-09 10:17:04 +00:00
zIndex: 1
}
}),
{
name: "ColumnPicker"
}
);
const ColumnPicker: React.FC<ColumnPickerProps> = props => {
const {
className,
columns,
defaultColumns,
2019-08-13 09:04:52 +00:00
hasMore,
initialColumns,
initialOpen = false,
2019-08-13 09:04:52 +00:00
loading,
total,
onFetchMore,
2019-08-09 10:17:04 +00:00
onSave
} = props;
const classes = useStyles(props);
const anchor = React.useRef<HTMLDivElement>();
const [isExpanded, setExpansionState] = React.useState(false);
const [selectedColumns, setSelectedColumns] = useStateFromProps(
initialColumns
);
2019-08-09 10:17:04 +00:00
React.useEffect(() => {
setTimeout(() => setExpansionState(initialOpen), 100);
2019-08-09 10:17:04 +00:00
}, []);
2019-09-02 11:21:17 +00:00
const handleCancel = () => {
2019-08-09 10:17:04 +00:00
setExpansionState(false);
2019-09-02 11:21:17 +00:00
setSelectedColumns(initialColumns);
};
const handleColumnToggle = (column: string) =>
setSelectedColumns(toggle(column, selectedColumns, (a, b) => a === b));
const handleReset = () => setSelectedColumns(defaultColumns);
2019-08-09 10:17:04 +00:00
const handleSave = () => {
setExpansionState(false);
onSave(selectedColumns);
2019-08-09 10:17:04 +00:00
};
return (
<div ref={anchor} className={className}>
<ColumnPickerButton
active={isExpanded}
onClick={() => setExpansionState(prevState => !prevState)}
/>
<Popper
className={classes.popper}
open={isExpanded}
anchorEl={anchor.current}
transition
disablePortal
placement="bottom-end"
>
{({ TransitionProps, placement }) => (
<Grow
{...TransitionProps}
style={{
transformOrigin:
placement === "bottom" ? "right bottom" : "right top"
}}
>
<ClickAwayListener
onClickAway={() => setExpansionState(false)}
mouseEvent="onClick"
>
<ColumnPickerContent
columns={columns}
2019-08-13 09:04:52 +00:00
hasMore={hasMore}
loading={loading}
2019-08-09 10:17:04 +00:00
selectedColumns={selectedColumns}
2019-08-13 09:04:52 +00:00
total={total}
2019-08-09 10:17:04 +00:00
onCancel={handleCancel}
onColumnToggle={handleColumnToggle}
2019-08-13 09:04:52 +00:00
onFetchMore={onFetchMore}
onReset={handleReset}
2019-08-09 10:17:04 +00:00
onSave={handleSave}
/>
</ClickAwayListener>
</Grow>
)}
</Popper>
</div>
);
};
export default ColumnPicker;