import { createStyles, Theme, withStyles, WithStyles } from "@material-ui/core/styles"; import { fade } from "@material-ui/core/styles/colorManipulator"; import Typography from "@material-ui/core/Typography"; import * as classNames from "classnames"; import { RawDraftContentState } from "draft-js"; import { BLOCK_TYPE, DraftailEditor, ENTITY_TYPE, INLINE_STYLE } from "draftail"; import React from "react"; import BoldIcon from "../../icons/BoldIcon"; import HeaderOne from "../../icons/HeaderOne"; import HeaderThree from "../../icons/HeaderThree"; import HeaderTwo from "../../icons/HeaderTwo"; import ItalicIcon from "../../icons/ItalicIcon"; import LinkIcon from "../../icons/LinkIcon"; import OrderedListIcon from "../../icons/OrderedListIcon"; import QuotationIcon from "../../icons/QuotationIcon"; import StrikethroughIcon from "../../icons/StrikethroughIcon"; import UnorderedListIcon from "../../icons/UnorderedListIcon"; // import ImageEntity from "./ImageEntity"; // import ImageSource from "./ImageSource"; import LinkEntity from "./LinkEntity"; import LinkSource from "./LinkSource"; export interface RichTextEditorProps { disabled: boolean; error: boolean; helperText: string; label: string; name: string; scroll?: boolean; initial?: RawDraftContentState; onChange: (event: React.ChangeEvent) => void; } const styles = (theme: Theme) => createStyles({ "@keyframes focus": { from: { transform: "scaleX(0) scaleY(1)" }, to: { transform: "scaleX(1) scaleY(1)" } }, "@keyframes hover": { from: { transform: "scaleX(1) scaleY(0)" }, to: { transform: "scaleX(1) scaleY(1)" } }, error: { color: theme.palette.error.main }, helperText: { marginTop: theme.spacing.unit * 0.75 }, input: { "&:hover": { borderBottomColor: theme.palette.primary.main }, backgroundColor: theme.overrides.MuiFilledInput.root.backgroundColor, borderBottom: `1px rgba(0, 0, 0, 0) solid`, borderTopLeftRadius: 4, borderTopRightRadius: 4, padding: "27px 12px 10px", position: "relative", transition: theme.transitions.duration.shortest + "ms" }, label: { fontSize: theme.typography.caption.fontSize, marginBottom: theme.spacing.unit * 2, marginTop: -21 }, linkIcon: { marginTop: 2 }, root: { "& .DraftEditor": { "&-editorContainer": { "& .public-DraftEditor-content": { lineHeight: 1.62 }, "& a": { color: theme.palette.primary.light }, "&:after": { animationDuration: theme.transitions.duration.shortest + "ms", animationFillMode: "both", background: theme.palette.getContrastText( theme.palette.background.default ), bottom: -11, content: "''", display: "block", height: 2, left: -12, position: "absolute", transform: "scaleX(0) scaleY(0)", width: "calc(100% + 24px)" }, position: "relative" }, "&-root": { ...theme.typography.body2 } }, "& .Draftail": { "&-Editor": { "&--focus": { "& .DraftEditor": { "&-editorContainer": { "&:after": { animationName: "focus !important", background: theme.palette.primary.main, transform: "scaleX(0) scaleY(1)" } } } } }, "&-Toolbar": { "&Button": { "& svg": { padding: 2 }, "&--active": { "&:hover": { background: theme.palette.primary.main }, "&:not(:hover)": { borderRightColor: theme.palette.primary.main }, background: theme.palette.primary.main }, "&:focus": { "&:active": { "&:after": { background: fade(theme.palette.primary.main, 0.3), borderRadius: "100%", content: "''", display: "block", height: "100%", width: "100%" } } }, "&:hover": { background: fade(theme.palette.primary.main, 0.3) }, alignItems: "center", background: "none", border: "none", borderRight: `1px ${ theme.overrides.MuiCard.root.borderColor } solid`, color: theme.typography.body2.color, cursor: "pointer", display: "inline-flex", height: 36, justifyContent: "center", padding: theme.spacing.unit + 2, transition: theme.transitions.duration.short + "ms", width: 36 }, "&Group": { "&:last-of-type": { "& .Draftail-ToolbarButton": { "&:last-of-type": { border: "none" } } }, display: "flex" }, background: theme.palette.background.default, border: `1px ${theme.overrides.MuiCard.root.borderColor} solid`, display: "inline-flex", flexWrap: "wrap", marginBottom: theme.spacing.unit, [theme.breakpoints.down(460)]: { width: "min-content" } }, "&-block": { "&--blockquote": { borderLeft: `2px solid ${theme.overrides.MuiCard.root.borderColor}`, margin: 0, padding: `${theme.spacing.unit}px ${theme.spacing.unit * 2}px` } } }, "&$error": { "& .Draftail": { "&-Editor": { "& .DraftEditor": { "&-editorContainer": { "&:after": { animationName: "none", background: theme.palette.error.main, transform: "scaleX(1) scaleY(1)" } } }, "&--focus": { "& .DraftEditor": { "&-editorContainer": { "&:after": { animationName: "none !important" } } } } } } } }, scroll: { "& .DraftEditor": { "&-editorContainer": { "& .public-DraftEditor-content": { lineHeight: 1.62 } } } }, smallIcon: { marginLeft: 10 } }); const RichTextEditor = withStyles(styles, { name: "RichTextEditor" })( ({ classes, error, helperText, initial, label, name, scroll, onChange }: RichTextEditorProps & WithStyles) => (
{label} 0 ? initial : null } onSave={value => onChange({ target: { name, value } } as any) } blockTypes={[ { icon: , type: BLOCK_TYPE.HEADER_ONE }, { icon: , type: BLOCK_TYPE.HEADER_TWO }, { icon: , type: BLOCK_TYPE.HEADER_THREE }, { icon: , type: BLOCK_TYPE.BLOCKQUOTE }, { icon: , type: BLOCK_TYPE.UNORDERED_LIST_ITEM }, { icon: , type: BLOCK_TYPE.ORDERED_LIST_ITEM } ]} inlineStyles={[ { icon: , type: INLINE_STYLE.BOLD }, { icon: , type: INLINE_STYLE.ITALIC }, { icon: , type: INLINE_STYLE.STRIKETHROUGH } ]} enableLineBreak entityTypes={[ { attributes: ["url"], decorator: LinkEntity, icon: , source: LinkSource, type: ENTITY_TYPE.LINK } // { // attributes: ["href"], // decorator: ImageEntity, // icon: , // source: ImageSource, // type: ENTITY_TYPE.IMAGE // } ]} />
{helperText && ( {helperText} )}
) ); RichTextEditor.displayName = "RichTextEditor"; RichTextEditor.defaultProps = { scroll: true }; export default RichTextEditor;