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

120 lines
2.9 KiB
TypeScript
Raw Normal View History

import { TableCell } from "@material-ui/core";
import { TableCellProps } from "@material-ui/core/TableCell";
import { makeStyles } from "@saleor/theme";
2019-09-02 09:02:56 +00:00
import classNames from "classnames";
import React from "react";
import ArrowSort from "../../icons/ArrowSort";
2019-12-03 15:28:40 +00:00
const useStyles = makeStyles(
theme => ({
arrow: {
transition: theme.transitions.duration.short + "ms"
},
arrowLeft: {
marginLeft: -24
},
arrowUp: {
transform: "rotate(180deg)"
},
disabled: {
opacity: 0.7,
2019-12-17 17:13:56 +00:00
"&&": {
cursor: "unset"
}
},
2019-12-03 15:28:40 +00:00
label: {
alignSelf: "center",
display: "inline-block"
},
labelContainer: {
"&:hover": {
color: theme.palette.text.primary
},
display: "flex",
height: 24
},
labelContainerActive: {
2019-09-16 13:33:24 +00:00
color: theme.palette.text.primary
},
2019-12-03 15:28:40 +00:00
labelContainerCenter: {
justifyContent: "center"
},
labelContainerRight: {
justifyContent: "flex-end"
},
root: {
cursor: "pointer"
}
}),
{ name: "TableCellHeader" }
);
2019-09-02 09:02:56 +00:00
export type TableCellHeaderArrowDirection = "asc" | "desc";
export type TableCellHeaderArrowPosition = "left" | "right";
2019-09-13 11:33:42 +00:00
export interface TableCellHeaderProps extends TableCellProps {
2019-09-02 09:02:56 +00:00
arrowPosition?: TableCellHeaderArrowPosition;
direction?: TableCellHeaderArrowDirection;
2019-09-13 11:33:42 +00:00
textAlign?: "left" | "center" | "right";
disabled?: boolean;
2019-09-02 09:02:56 +00:00
}
2019-09-13 11:33:42 +00:00
const TableCellHeader: React.FC<TableCellHeaderProps> = props => {
2019-09-02 09:02:56 +00:00
const classes = useStyles(props);
2019-09-13 11:33:42 +00:00
const {
arrowPosition,
children,
className,
direction,
textAlign,
disabled = false,
onClick,
2019-09-13 11:33:42 +00:00
...rest
} = props;
2019-09-02 09:02:56 +00:00
return (
2019-12-17 17:13:56 +00:00
<TableCell
{...rest}
onClick={e => {
if (!disabled) {
onClick(e);
}
}}
2019-12-17 17:13:56 +00:00
className={classNames(classes.root, className, {
[classes.disabled]: disabled
2019-12-17 17:13:56 +00:00
})}
>
2019-09-13 11:33:42 +00:00
<div
className={classNames(classes.labelContainer, {
2019-09-16 13:33:24 +00:00
[classes.labelContainerActive]: !!direction && !!arrowPosition,
2019-09-13 11:33:42 +00:00
[classes.labelContainerCenter]: textAlign === "center",
[classes.labelContainerRight]: textAlign === "right"
})}
>
2019-09-02 09:02:56 +00:00
{!!direction && arrowPosition === "left" && (
<ArrowSort
className={classNames(classes.arrow, classes.arrowLeft, {
[classes.arrowUp]: direction === "asc"
})}
/>
)}
<div className={classes.label}>{children}</div>
{!!direction && arrowPosition === "right" && (
<ArrowSort
className={classNames(classes.arrow, {
[classes.arrowUp]: direction === "asc"
})}
/>
)}
</div>
</TableCell>
);
};
TableCellHeader.displayName = "TableCellHeader";
TableCellHeader.defaultProps = {
2019-09-13 11:33:42 +00:00
arrowPosition: "left",
textAlign: "left"
2019-09-02 09:02:56 +00:00
};
export default TableCellHeader;