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";
|
|
|
|
|
2019-08-28 14:41:17 +00:00
|
|
|
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";
|
|
|
|
|
2019-08-28 14:41:17 +00:00
|
|
|
export interface ColumnPickerProps
|
|
|
|
extends Omit<
|
|
|
|
ColumnPickerContentProps,
|
|
|
|
"selectedColumns" | "onCancel" | "onColumnToggle" | "onReset" | "onSave"
|
|
|
|
> {
|
2019-08-09 10:17:04 +00:00
|
|
|
className?: string;
|
2019-08-28 14:41:17 +00:00
|
|
|
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,
|
2019-08-28 14:41:17 +00:00
|
|
|
defaultColumns,
|
2019-08-13 09:04:52 +00:00
|
|
|
hasMore,
|
2019-08-28 14:41:17 +00:00
|
|
|
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);
|
2019-08-28 14:41:17 +00:00
|
|
|
const [selectedColumns, setSelectedColumns] = useStateFromProps(
|
|
|
|
initialColumns
|
|
|
|
);
|
2019-08-09 10:17:04 +00:00
|
|
|
|
|
|
|
React.useEffect(() => {
|
2019-08-28 14:41:17 +00:00
|
|
|
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);
|
|
|
|
};
|
2019-08-28 14:41:17 +00:00
|
|
|
|
|
|
|
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);
|
2019-08-28 14:41:17 +00:00
|
|
|
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}
|
2019-08-28 14:41:17 +00:00
|
|
|
onColumnToggle={handleColumnToggle}
|
2019-08-13 09:04:52 +00:00
|
|
|
onFetchMore={onFetchMore}
|
2019-08-28 14:41:17 +00:00
|
|
|
onReset={handleReset}
|
2019-08-09 10:17:04 +00:00
|
|
|
onSave={handleSave}
|
|
|
|
/>
|
|
|
|
</ClickAwayListener>
|
|
|
|
</Grow>
|
|
|
|
)}
|
|
|
|
</Popper>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default ColumnPicker;
|