@entur-partner/rich-text-editor 2.1.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"rich-text-editor.cjs.production.min.js","sources":["../src/withI18n.js","../src/RichTextEditor/BlockTypeDropdown/index.js","../src/RichTextEditor/Controls/BlockTypeSelectControls.js","../src/events.js","../src/RichTextEditor/StyleButton/index.js","../src/RichTextEditor/Controls/BlockTypeButtonControls.js","../src/RichTextEditor/Controls/BlockTypeLinkControls.js","../src/RichTextEditor/Controls/InlineStyleControls.js","../src/RichTextEditor/Controls/TagControls.js","../src/RichTextEditor/Link/index.js","../src/RichTextEditor/constants.js","../src/RichTextEditor/index.js","../src/RichTextEditor/markdownConvertion.js","../src/ExpandableMultiLanguageRichTextEditor.tsx","../src/RichTextEditor/htmlConvertion.js"],"sourcesContent":["import { createWithI18n } from '@entur-partner/legacy';\n\nconst simpleFormat = (formatMessage) => (name, value) =>\n formatMessage({ id: name }, value);\n\nexport const withI18n = createWithI18n(simpleFormat);\n","import './styles.scss';\n\nimport React, { Component } from 'react';\nimport { Dropdown } from '@entur/dropdown';\n\nimport { withI18n } from '../../withI18n';\n\nclass BlockTypeDropdown extends Component {\n handleOnClick = (selectedOption) => {\n const { onChange } = this.props;\n onChange(selectedOption);\n };\n\n toItem(option) {\n return {\n value: option.style,\n label: this.renderFormattedLabel(option.label),\n };\n }\n\n renderFormattedLabel(label) {\n const formattedLabelText = this.props.i18n(label);\n switch (label) {\n case 'styles.p':\n return <div className=\"default-p\">{formattedLabelText}</div>;\n case 'styles.h1':\n return <div className=\"default-h1\">{formattedLabelText}</div>;\n case 'styles.h2':\n return <div className=\"default-h2\">{formattedLabelText}</div>;\n case 'styles.h3':\n return <div className=\"default-h3\">{formattedLabelText}</div>;\n case 'styles.h4':\n return <div className=\"default-h4\">{formattedLabelText}</div>;\n case 'styles.h5':\n return <div className=\"default-h5\">{formattedLabelText}</div>;\n case 'styles.h6':\n return <div className=\"default-h6\">{formattedLabelText}</div>;\n default:\n return <p>{formattedLabelText}</p>;\n }\n }\n\n render() {\n const { options, selected, i18n } = this.props;\n\n return (\n <Dropdown\n className=\"block-type-dropdown\"\n items={options.map((option) => this.toItem(option))}\n initialSelectedItem={this.toItem(selected)}\n label={i18n('styles.style')}\n onChange={(selectedItem) => this.handleOnClick(selectedItem.value)}\n />\n );\n }\n}\n\nexport default withI18n(BlockTypeDropdown);\n","import './styles.scss';\n\nimport React from 'react';\n\nimport BlockTypeDropdown from '../BlockTypeDropdown';\n\nconst BlockTypeControls = ({ editorState, blockTypes, onToggle }) => {\n const selection = editorState.getSelection();\n const blockTypeStyle = editorState\n .getCurrentContent()\n .getBlockForKey(selection.getStartKey())\n .getType();\n\n const selectedOption =\n blockTypes.find((option) => option.style === blockTypeStyle) ||\n blockTypes[0];\n\n return (\n <BlockTypeDropdown\n options={blockTypes}\n selected={selectedOption}\n onChange={onToggle}\n />\n );\n};\n\nexport default BlockTypeControls;\n","export const Key = Object.freeze({\n ENTER: 13,\n});\n\nexport function getKey(event) {\n return event.keyCode || event.which;\n}\n","import './styles.scss';\n\nimport React, { Component } from 'react';\nimport cx from 'classnames';\n\nimport { withI18n } from '../../withI18n';\nimport { Key, getKey } from '../../events';\n\nclass StyleButton extends Component {\n onToggle = (e) => {\n const { style, onToggle } = this.props;\n e.preventDefault();\n onToggle(style);\n };\n\n onToggleNoEvent = () => {\n const { style, onToggle } = this.props;\n onToggle(style);\n };\n\n render() {\n const { i18n, active, label, title, hotKey } = this.props;\n\n const classNames = cx('editor-stylebutton', { active });\n\n return (\n <div\n className={classNames}\n onMouseDown={this.onToggle}\n title={i18n(title) + hotKey}\n tabIndex={0}\n onKeyPress={(event) => {\n if (getKey(event) === Key.ENTER) {\n this.onToggleNoEvent();\n }\n }}\n >\n {label}\n </div>\n );\n }\n}\n\nexport default withI18n(StyleButton);\n","import './styles.scss';\n\nimport React from 'react';\n\nimport StyleButton from '../StyleButton';\n\nconst BlockTypeButtonControls = (props) => {\n const { editorState, blockTypes, onToggle } = props;\n const selection = editorState.getSelection();\n const blockTypeStyle = editorState\n .getCurrentContent()\n .getBlockForKey(selection.getStartKey())\n .getType();\n\n return (\n <div className=\"controls-group block-editor-controls\">\n {blockTypes.map((type, i) => (\n <StyleButton\n key={i}\n active={type.style === blockTypeStyle}\n label={type.label}\n onToggle={onToggle}\n style={type.style}\n title={type.tooltip}\n />\n ))}\n </div>\n );\n};\n\nexport default BlockTypeButtonControls;\n","import './styles.scss';\n\nimport React, { Component } from 'react';\nimport { EditorState } from 'draft-js';\nimport PropTypes from 'prop-types';\nimport { TextField } from '@entur/form';\nimport { UnlinkIcon, LinkIcon, CheckIcon, CloseIcon } from '@entur/icons';\nimport { Unbutton } from '@entur-partner/common';\nimport { SecondarySquareButton } from '@entur/button';\n\nimport { withI18n } from '../../withI18n';\nimport { Key, getKey } from '../../events';\n\nclass BlockTypeLinkControls extends Component {\n state = {\n urlValue: '',\n showUrlInput: false,\n hasLink: false,\n };\n\n onUrlChange = (e) => {\n this.setState({ urlValue: e.target.value });\n };\n\n addLink = (e) => {\n e.preventDefault();\n const { editorState } = this.props;\n const selection = editorState.getSelection();\n if (!selection.isCollapsed()) {\n const currentContent = editorState.getCurrentContent();\n const startKey = selection.getStartKey();\n const startOffset = selection.getStartOffset();\n const blockWithLinkAtBeginning = currentContent.getBlockForKey(startKey);\n const linkKey = blockWithLinkAtBeginning.getEntityAt(startOffset);\n\n let url = '';\n if (linkKey) {\n const linkInstance = currentContent.getEntity(linkKey);\n url = linkInstance.getData().url;\n }\n\n this.setState({\n showUrlInput: true,\n urlValue: url,\n hasLink: !!url,\n });\n }\n };\n\n confirmLink = (e) => {\n e.preventDefault();\n const { urlValue } = this.state;\n const { editorState, onToggle } = this.props;\n const contentState = editorState.getCurrentContent();\n const contentStateWithEntity = contentState.createEntity(\n 'LINK',\n 'MUTABLE',\n { url: urlValue }\n );\n const entityKey = contentStateWithEntity.getLastCreatedEntityKey();\n const newEditorState = EditorState.set(editorState, {\n currentContent: contentStateWithEntity,\n });\n onToggle(newEditorState, entityKey);\n this.setState({\n showUrlInput: false,\n urlValue: '',\n });\n };\n\n cancelLink = (e) => {\n e.preventDefault();\n this.setState({\n showUrlInput: false,\n urlValue: '',\n });\n };\n\n onLinkInputKeyDown = (e) => {\n if (getKey(e) === Key.ENTER) {\n this.confirmLink(e);\n }\n };\n\n removeLink = (e) => {\n e.preventDefault();\n const { editorState, onToggle } = this.props;\n const { hasLink } = this.state;\n const selection = editorState.getSelection();\n if (!selection.isCollapsed() && hasLink) {\n onToggle(editorState, null);\n this.setState({\n showUrlInput: false,\n });\n }\n };\n\n render() {\n const { i18n } = this.props;\n const { showUrlInput, hasLink } = this.state;\n return (\n <div className=\"controls-group block-editor-controls link-controls\">\n <div\n className=\"editor-stylebutton\"\n title={i18n('styles.link')}\n onClick={this.addLink}\n tabIndex={0}\n >\n <LinkIcon />\n </div>\n\n {showUrlInput && (\n <div className=\"url-input-container\">\n <span className=\"exit-button\" onMouseDown={this.cancelLink}>\n <CloseIcon />\n </span>\n <div className=\"link-label\">{i18n('common.from')}</div>\n <div className=\"url-input-form\">\n <TextField\n style={{ width: 250, margin: 5 }}\n onChange={this.onUrlChange}\n value={this.state.urlValue}\n onKeyDown={this.onLinkInputKeyDown}\n placeholder=\"https://example.com\"\n />\n <SecondarySquareButton onMouseDown={this.confirmLink}>\n <CheckIcon width={15} height={15} />\n </SecondarySquareButton>\n </div>\n {hasLink && (\n <div className=\"remove-link\">\n <Unbutton\n onClick={this.removeLink}\n title={i18n('styles.unlink')}\n >\n <UnlinkIcon />\n {i18n('styles.unlink')}\n </Unbutton>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\nBlockTypeLinkControls.propTypes = {\n editorState: PropTypes.object,\n onToggle: PropTypes.func,\n};\n\nexport default withI18n(BlockTypeLinkControls);\n","import './styles.scss';\n\nimport React from 'react';\n\nimport StyleButton from '../StyleButton';\n\nconst InlineStyleControls = (props) => {\n const { editorState, inlineStyles } = props;\n\n const currentStyle = editorState.getCurrentInlineStyle();\n\n return (\n <div className=\"controls-group inline-editor-controls\">\n {inlineStyles.map((type, i) => (\n <StyleButton\n key={i}\n active={currentStyle.has(type.style)}\n label={type.label}\n onToggle={props.onToggle}\n style={type.style}\n title={type.tooltip}\n hotKey={type.hotKey}\n />\n ))}\n </div>\n );\n};\n\nexport default InlineStyleControls;\n","import './styles.scss';\n\nimport React, { Component, createRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { MenuItem, Popover, Menu } from '@entur-partner/legacy';\nimport { DownArrowIcon } from '@entur/icons';\n\nimport { withI18n } from '../../withI18n';\n\nclass TagControls extends Component {\n tagControlRef = createRef();\n state = { isOpen: false };\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handleClickOutside);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handleClickOutside);\n }\n\n handleClickOutside = (e) => {\n if (\n this.tagControlRef &&\n this.tagControlRef.current &&\n !this.tagControlRef.current.contains(e.target)\n ) {\n this.setState({ isOpen: false });\n }\n };\n\n handleTagClick = (tag, delimiter) => {\n const { editorState, onInsertTag } = this.props;\n const delimiterStart = delimiter[0];\n const delimiterEnd = delimiter[1];\n const fullTag = `${delimiterStart}${tag}${delimiterEnd}`;\n onInsertTag(editorState, fullTag);\n };\n\n render() {\n const { i18n, tags } = this.props;\n const { isOpen } = this.state;\n const menuItems = tags.map((tag, i) => {\n const delimiter = tag.delimiter || '{}';\n return (\n <MenuItem\n key={i}\n className=\"tag-control\"\n id={'tag-control-' + tag.tag}\n onClick={() => this.handleTagClick(tag.tag, delimiter)}\n >\n {tag.icon}\n <span className=\"tag-control-text\">{tag.label}</span>\n </MenuItem>\n );\n });\n\n return (\n <div className=\"tag-control-dropdown\" ref={this.tagControlRef}>\n <div\n className=\"tag-control-header\"\n onClick={() => this.setState(({ isOpen }) => ({ isOpen: !isOpen }))}\n >\n {i18n('common.insert')}\n <DownArrowIcon className=\"tag-control-chevron\" inline />\n </div>\n <Popover open={isOpen} className=\"tag-control-content\">\n <Menu className=\"action-menu\">{menuItems}</Menu>\n </Popover>\n </div>\n );\n }\n}\n\nTagControls.propTypes = {\n editorState: PropTypes.object,\n tags: PropTypes.arrayOf(PropTypes.object).isRequired,\n onInsertTag: PropTypes.func.isRequired,\n};\n\nexport default withI18n(TagControls);\n","import React from 'react';\n\nexport const HtmlLink = ({ url, children }) => {\n return <a href={url}>{children}</a>;\n};\n\nconst Link = (props) => {\n const { url } = props.contentState.getEntity(props.entityKey).getData();\n return <HtmlLink url={url}>{props.children}</HtmlLink>;\n};\n\nexport function findLinkEntities(contentBlock, callback, contentState) {\n contentBlock.findEntityRanges((character) => {\n const entityKey = character.getEntity();\n return (\n entityKey !== null &&\n contentState.getEntity(entityKey).getType() === 'LINK'\n );\n }, callback);\n}\n\nexport default Link;\n","import React from 'react';\nimport {\n BoldIcon,\n ItalicIcon,\n UnderlineIcon,\n BulletListIcon,\n NumberListIcon,\n} from '@entur/icons';\nimport { CompositeDecorator } from 'draft-js';\n\nimport Link, { findLinkEntities } from './Link';\n\nexport const EditorConfigTypes = Object.freeze({\n FONT_LIST: {\n UNSTYLED: 'unstyled',\n HEADER_ONE: 'header-one',\n HEADER_TWO: 'header-two',\n HEADER_THREE: 'header-three',\n HEADER_FOUR: 'header-four',\n HEADER_FIVE: 'header-five',\n HEADER_SIX: 'header-six',\n },\n BLOCK_TYPES: {\n UNORDERED_LIST: 'unordered-list',\n ORDERED_LIST: 'ordered-list',\n },\n INLINE_STYLES: {\n BOLD: 'bold',\n ITALIC: 'italic',\n UNDERLINE: 'underline',\n },\n});\n\nexport const FontList = Object.freeze({\n unstyled: { label: 'styles.p', style: 'unstyled' },\n 'header-one': { label: 'styles.h1', style: 'header-one' },\n 'header-two': { label: 'styles.h2', style: 'header-two' },\n 'header-three': { label: 'styles.h3', style: 'header-three' },\n 'header-four': { label: 'styles.h4', style: 'header-four' },\n 'header-five': { label: 'styles.h5', style: 'header-five' },\n 'header-six': { label: 'styles.h6', style: 'header-six' },\n});\n\nexport const BlockTypeList = Object.freeze({\n 'unordered-list': {\n label: <BulletListIcon />,\n style: 'unordered-list-item',\n tooltip: 'styles.unordered_list_item',\n },\n 'ordered-list': {\n label: <NumberListIcon />,\n style: 'ordered-list-item',\n tooltip: 'styles.ordered_list_item',\n },\n});\n\nexport const InlineStylesList = Object.freeze({\n bold: {\n label: <BoldIcon />,\n style: 'BOLD',\n tooltip: 'styles.bold',\n hotKey: '(Ctrl+B)',\n },\n italic: {\n label: <ItalicIcon />,\n style: 'ITALIC',\n tooltip: 'styles.italic',\n hotKey: '(Ctrl+I)',\n },\n underline: {\n label: <UnderlineIcon />,\n style: 'UNDERLINE',\n tooltip: 'styles.underline',\n hotKey: '(Ctrl+U)',\n },\n});\n\nexport const MinifiedConfigTypes = Object.freeze({\n fontList: [\n { type: 'unstyled', label: 'styles.p', style: 'unstyled' },\n { type: 'header-two', label: 'styles.h1', style: 'header-two' },\n ],\n blockTypes: Object.values(EditorConfigTypes.BLOCK_TYPES),\n inlineStyles: [\n EditorConfigTypes.INLINE_STYLES.BOLD,\n EditorConfigTypes.INLINE_STYLES.ITALIC,\n ],\n});\nexport const decorator = new CompositeDecorator([\n {\n strategy: findLinkEntities,\n component: Link,\n },\n]);\n","import './styles.scss';\n\nimport React, { Component, createRef } from 'react';\nimport {\n Editor,\n EditorState,\n Modifier,\n RichUtils,\n getDefaultKeyBinding,\n} from 'draft-js';\nimport PropTypes from 'prop-types';\nimport cx from 'classnames';\nimport { Label } from '@entur/typography';\n\nimport BlockTypeSelectControls from './Controls/BlockTypeSelectControls';\nimport BlockTypeButtonControls from './Controls/BlockTypeButtonControls';\nimport BlockTypeLinkControls from './Controls/BlockTypeLinkControls';\nimport InlineStyleControls from './Controls/InlineStyleControls';\nimport TagControls from './Controls/TagControls';\nimport {\n BlockTypeList,\n EditorConfigTypes,\n FontList,\n InlineStylesList,\n decorator,\n} from './constants';\n\nclass RichTextEditor extends Component {\n static decorator = decorator;\n\n wrapperRef = createRef();\n editor = createRef();\n\n focusEditor() {\n this.editor.current && this.editor.current.focus();\n }\n\n handleKeyCommand = (command, editorState) => {\n const newState = RichUtils.handleKeyCommand(editorState, command);\n if (newState) {\n this.props.onChange(newState);\n return true;\n }\n return false;\n };\n\n keyBindingFn = (evt) => {\n switch (evt.keyCode) {\n case 9:\n return this.onTab(evt);\n default:\n return getDefaultKeyBinding(evt);\n }\n };\n\n onTab = (evt) => {\n evt.stopPropagation();\n const { maxTabDepth, editorState, onChange } = this.props;\n onChange(RichUtils.onTab(evt, editorState, maxTabDepth));\n };\n\n toggleButtonBlockType = (blockType) => {\n const { editorState, onChange } = this.props;\n onChange(RichUtils.toggleBlockType(editorState, blockType));\n };\n\n toggleSelectBlockType = (blockType) => {\n const { editorState, onChange } = this.props;\n onChange(RichUtils.toggleBlockType(editorState, blockType));\n };\n\n toggleInlineStyle = (inlineStyle) => {\n const { editorState, onChange } = this.props;\n onChange(RichUtils.toggleInlineStyle(editorState, inlineStyle));\n };\n\n toggleLink = (newEditorState, entityKey) => {\n this.props.onChange(\n RichUtils.toggleLink(\n newEditorState,\n newEditorState.getSelection(),\n entityKey\n )\n );\n };\n\n insertText = (editorState, text) => {\n const newContent = Modifier.insertText(\n editorState.getCurrentContent(),\n editorState.getSelection(),\n text\n );\n this.props.onChange(\n EditorState.push(editorState, newContent, 'insert-characters'),\n () => this.focusEditor()\n );\n };\n\n getFontListConfigForPanelType = (panelType) => {\n const controlConfig = this.getControlConfigBySet(\n this.props.controlConfigSet\n );\n return controlConfig[panelType];\n };\n\n getControlConfigBySet = (config) => {\n const fontList = ((config && config.fontList) || Object.keys(FontList))\n .filter((f) => (typeof f === 'object' ? FontList[f.type] : FontList[f]))\n .map((f) => (f.label && f.style ? f : FontList[f]));\n const blockTypes = (\n (config && config.blockTypes) ||\n Object.keys(BlockTypeList)\n )\n .filter((f) =>\n typeof f === 'object' ? BlockTypeList[f.type] : BlockTypeList[f]\n )\n .map((f) => (f.label && f.style ? f : BlockTypeList[f]));\n const inlineStyles = (\n (config && config.inlineStyles) ||\n Object.keys(InlineStylesList)\n )\n .filter((f) =>\n typeof f === 'object' ? InlineStylesList[f.type] : InlineStylesList[f]\n )\n .map((f) => (f.label && f.style ? f : InlineStylesList[f]));\n\n return {\n fontList,\n blockTypes,\n inlineStyles,\n };\n };\n\n render() {\n const {\n className,\n showFontMenu,\n showInlineStyleMenu,\n showTextFormatMenu,\n showLinkMenu,\n label,\n tags,\n editorState,\n onChange,\n handleBeforeInput,\n } = this.props;\n\n const classNames = cx('editor-root', className);\n\n return (\n <div ref={this.wrapperRef}>\n {label && <Label>{label}</Label>}\n\n <div className={classNames}>\n <div className=\"controls-wrapper\">\n {showFontMenu && (\n <BlockTypeSelectControls\n editorState={editorState}\n onToggle={this.toggleSelectBlockType}\n blockTypes={this.getFontListConfigForPanelType('fontList')}\n />\n )}\n {showInlineStyleMenu && (\n <InlineStyleControls\n editorState={editorState}\n onToggle={this.toggleInlineStyle}\n inlineStyles={this.getFontListConfigForPanelType(\n 'inlineStyles'\n )}\n />\n )}\n {showTextFormatMenu && (\n <BlockTypeButtonControls\n editorState={editorState}\n onToggle={this.toggleButtonBlockType}\n blockTypes={this.getFontListConfigForPanelType('blockTypes')}\n />\n )}\n {showLinkMenu && (\n <BlockTypeLinkControls\n editorState={editorState}\n onToggle={this.toggleLink}\n />\n )}\n {tags && tags.length > 0 && (\n <TagControls\n editorState={editorState}\n tags={tags}\n onInsertTag={this.insertText}\n />\n )}\n </div>\n\n <div className=\"editor-wrapper\">\n <Editor\n ref={this.editor}\n editorState={editorState}\n handleKeyCommand={this.handleKeyCommand}\n onChange={onChange}\n handleBeforeInput={handleBeforeInput}\n keyBindingFn={this.keyBindingFn}\n spellCheck\n />\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst styleShape = (configList) =>\n PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.oneOf([...Object.values(configList)])),\n PropTypes.arrayOf(\n PropTypes.shape({\n type: PropTypes.oneOf([...Object.values(configList)]),\n label: PropTypes.string,\n style: PropTypes.string,\n tooltip: PropTypes.string,\n hotKey: PropTypes.string,\n })\n ),\n ]);\n\nRichTextEditor.propTypes = {\n editorState: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n maxTabDepth: PropTypes.number,\n showFontMenu: PropTypes.bool,\n showInlineStyleMenu: PropTypes.bool,\n showTextFormatMenu: PropTypes.bool,\n showLinkMenu: PropTypes.bool,\n label: PropTypes.string,\n tags: PropTypes.arrayOf(PropTypes.object),\n controlConfigSet: PropTypes.shape({\n fontList: styleShape(EditorConfigTypes.FONT_LIST),\n blockTypes: styleShape(EditorConfigTypes.BLOCK_TYPES),\n inlineStyles: styleShape(EditorConfigTypes.INLINE_STYLES),\n }),\n};\nRichTextEditor.defaultProps = {\n maxTabDepth: 4,\n showFontMenu: true,\n showInlineStyleMenu: true,\n showTextFormatMenu: true,\n showLinkMenu: true,\n label: '',\n};\n\nexport default RichTextEditor;\n","import { markdownToDraft, draftToMarkdown } from 'markdown-draft-js';\nimport { convertToRaw, convertFromRaw, EditorState } from 'draft-js';\nimport showdown from 'showdown';\n\nimport { decorator } from './constants';\n\nexport const editorStateToMarkdown = (editorState) => {\n const rawState = convertToRaw(editorState.getCurrentContent());\n return draftToMarkdown(rawState, { preserveNewlines: true });\n};\n\nexport const markdownToEditorState = (markdown) => {\n if (!markdown) {\n return EditorState.createEmpty(decorator);\n }\n const rawState = markdownToDraft(markdown, { preserveNewlines: true });\n const contentState = convertFromRaw(rawState);\n return EditorState.createWithContent(contentState, decorator);\n};\n\nconst converter = new showdown.Converter({\n underline: true,\n});\n\nexport const markdownToHtml = (markdown) => {\n return converter.makeHtml(markdown);\n};\n","import React, { useState } from 'react';\nimport { EditorState } from 'draft-js';\nimport { ExpandablePanel } from '@entur/expand';\nimport {\n LanguageKey,\n LanguageOption,\n MultiLanguageValues,\n Stack,\n} from '@entur-partner/common';\nimport { FeedbackText, VariantType } from '@entur/form';\n\nimport {\n editorStateToMarkdown,\n markdownToEditorState,\n} from './RichTextEditor/markdownConvertion';\nimport RichTextEditor from './RichTextEditor';\nimport { MinifiedConfigTypes } from './RichTextEditor/constants';\n\ntype MultiLanguageInputProps = {\n values: MultiLanguageValues;\n onChange: (values: MultiLanguageValues) => void;\n variant?: (lang: LanguageKey) => VariantType;\n feedback?: (lang: LanguageKey) => string;\n tags?: {\n tag: string;\n delimiter: string;\n label: string;\n }[];\n};\n\ntype RichTextEditorForLanguageProps = MultiLanguageInputProps & {\n language: LanguageOption;\n};\n\nconst RichTextEditorForLanguage = ({\n language: { value: langKey, label, required },\n values,\n onChange,\n variant,\n feedback,\n tags,\n}: RichTextEditorForLanguageProps) => {\n const [editorState, setEditorState] = useState<EditorState>(\n markdownToEditorState(values[langKey])\n );\n\n const handleOnChange = (changedState: EditorState) => {\n const newValues = { ...values };\n const content = editorStateToMarkdown(changedState);\n if (values[langKey] && content === '\\n') {\n delete newValues[langKey];\n } else {\n newValues[langKey] = content;\n }\n\n setEditorState(changedState);\n onChange(newValues);\n };\n\n const feedbackText = feedback && feedback(langKey);\n\n return (\n <>\n <RichTextEditor\n label={required ? label + '*' : label}\n editorState={editorState}\n onChange={(changedState: EditorState) => handleOnChange(changedState)}\n controlConfigSet={MinifiedConfigTypes}\n tags={tags}\n />\n {variant && feedbackText?.length! > 0 && (\n <FeedbackText variant={variant(langKey)}>{feedbackText}</FeedbackText>\n )}\n </>\n );\n};\n\ntype ExpandableMultiLanguageRichTextEditorProps = MultiLanguageInputProps & {\n name: string;\n title: string;\n languages: LanguageOption[];\n};\n\nexport const ExpandableMultiLanguageRichTextEditor = ({\n name,\n title,\n languages,\n ...rest\n}: ExpandableMultiLanguageRichTextEditorProps) => (\n <ExpandablePanel\n title={title}\n defaultOpen\n contentStyle={{\n padding: '4px 4px 4px 4px',\n marginTop: '16px',\n marginBottom: '16px',\n }}\n >\n <Stack space=\"medium\">\n {languages.map((lang) => (\n <div\n key={name + lang.value}\n data-testid={`multi-lang-rich-text-${name}-${lang.value}`}\n >\n <RichTextEditorForLanguage language={lang} {...rest} />\n </div>\n ))}\n </Stack>\n </ExpandablePanel>\n);\n","import React from 'react';\nimport { EditorState } from 'draft-js';\nimport { convertFromHTML, convertToHTML } from 'draft-convert';\n\nimport { HtmlLink } from './Link';\nimport { decorator } from './constants';\n\n/* eslint-disable react/display-name */\n\nexport const entityToHtml = {\n entityToHTML: (entity, originalText) => {\n if (entity.type === 'LINK') {\n return <HtmlLink url={entity.data.url}>{originalText}</HtmlLink>;\n }\n return originalText;\n },\n};\n\nexport const htmlToEntity = {\n htmlToEntity: (nodeName, node, createEntity) => {\n if (nodeName === 'a') {\n return createEntity('LINK', 'MUTABLE', { url: node.href });\n }\n },\n};\n\n/* eslint-disable react/display-name */\n\nexport const htmlToEditorState = (html) => {\n if (!html) {\n return EditorState.createEmpty(decorator);\n }\n const rawState = convertFromHTML(htmlToEntity)(html);\n return EditorState.createWithContent(rawState, decorator);\n};\n\nexport const editorStateToHtml = (editorState) => {\n return convertToHTML(entityToHtml)(editorState.getCurrentContent());\n};\n"],"names":["withI18n","createWithI18n","formatMessage","name","value","id","BlockTypeDropdown$1","handleOnClick","selectedOption","onChange","_this","props","toItem","option","style","label","this","renderFormattedLabel","formattedLabelText","i18n","React","createElement","className","render","_this2","_this$props","selected","Dropdown","items","options","map","initialSelectedItem","selectedItem","Component","BlockTypeControls","_ref","editorState","blockTypes","onToggle","selection","getSelection","blockTypeStyle","getCurrentContent","getBlockForKey","getStartKey","getType","find","BlockTypeDropdown","Key","Object","freeze","ENTER","getKey","event","keyCode","which","StyleButton$1","e","preventDefault","onToggleNoEvent","_this$props2","_this$props3","title","hotKey","classNames","cx","active","onMouseDown","tabIndex","onKeyPress","BlockTypeButtonControls","type","i","StyleButton","key","tooltip","BlockTypeLinkControls","state","urlValue","showUrlInput","hasLink","onUrlChange","setState","target","addLink","isCollapsed","currentContent","startKey","startOffset","getStartOffset","linkKey","getEntityAt","url","getEntity","getData","confirmLink","contentStateWithEntity","createEntity","entityKey","getLastCreatedEntityKey","EditorState","set","cancelLink","onLinkInputKeyDown","removeLink","_this$state","onClick","LinkIcon","CloseIcon","TextField","width","margin","onKeyDown","placeholder","SecondarySquareButton","CheckIcon","height","Unbutton","UnlinkIcon","propTypes","PropTypes","object","func","BlockTypeLinkControls$1","InlineStyleControls","inlineStyles","currentStyle","getCurrentInlineStyle","has","TagControls","tagControlRef","createRef","isOpen","handleClickOutside","current","contains","handleTagClick","tag","delimiter","onInsertTag","delimiterStart","componentDidMount","document","addEventListener","componentWillUnmount","removeEventListener","menuItems","tags","MenuItem","icon","ref","DownArrowIcon","inline","Popover","open","Menu","arrayOf","isRequired","TagControls$1","HtmlLink","href","children","EditorConfigTypes","FONT_LIST","UNSTYLED","HEADER_ONE","HEADER_TWO","HEADER_THREE","HEADER_FOUR","HEADER_FIVE","HEADER_SIX","BLOCK_TYPES","UNORDERED_LIST","ORDERED_LIST","INLINE_STYLES","BOLD","ITALIC","UNDERLINE","FontList","unstyled","BlockTypeList","BulletListIcon","NumberListIcon","InlineStylesList","bold","BoldIcon","italic","ItalicIcon","underline","UnderlineIcon","MinifiedConfigTypes","fontList","values","decorator","CompositeDecorator","strategy","contentBlock","callback","contentState","findEntityRanges","character","component","RichTextEditor","wrapperRef","editor","handleKeyCommand","command","newState","RichUtils","keyBindingFn","evt","onTab","getDefaultKeyBinding","stopPropagation","maxTabDepth","toggleButtonBlockType","blockType","toggleBlockType","toggleSelectBlockType","toggleInlineStyle","inlineStyle","_this$props4","toggleLink","newEditorState","insertText","text","newContent","Modifier","push","focusEditor","getFontListConfigForPanelType","panelType","getControlConfigBySet","controlConfigSet","config","keys","filter","f","focus","_this$props5","showFontMenu","showInlineStyleMenu","showTextFormatMenu","showLinkMenu","handleBeforeInput","Label","BlockTypeSelectControls","length","Editor","spellCheck","styleShape","configList","oneOfType","oneOf","shape","concat","string","number","bool","defaultProps","editorStateToMarkdown","rawState","convertToRaw","draftToMarkdown","preserveNewlines","markdownToEditorState","markdown","createEmpty","markdownToDraft","convertFromRaw","createWithContent","converter","showdown","Converter","RichTextEditorForLanguage","_ref$language","language","langKey","required","variant","feedback","useState","_useState","setEditorState","feedbackText","Fragment","changedState","newValues","content","handleOnChange","FeedbackText","entityToHtml","entityToHTML","entity","originalText","data","htmlToEntity","nodeName","node","_ref2","languages","rest","_objectWithoutPropertiesLoose","_excluded","ExpandablePanel","defaultOpen","contentStyle","padding","marginTop","marginBottom","Stack","space","lang","_extends","convertToHTML","html","convertFromHTML","makeHtml"],"mappings":"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"}
1
+ {"version":3,"file":"rich-text-editor.cjs.production.min.js","sources":["../src/withI18n.js","../src/RichTextEditor/BlockTypeDropdown/index.js","../src/RichTextEditor/Controls/BlockTypeSelectControls.js","../src/events.js","../src/RichTextEditor/StyleButton/index.js","../src/RichTextEditor/Controls/BlockTypeButtonControls.js","../src/RichTextEditor/Controls/BlockTypeLinkControls.js","../src/RichTextEditor/Controls/InlineStyleControls.js","../src/RichTextEditor/Controls/TagControls.js","../src/RichTextEditor/Link/index.js","../src/RichTextEditor/constants.js","../src/RichTextEditor/index.js","../src/RichTextEditor/markdownConvertion.js","../src/ExpandableMultiLanguageRichTextEditor.tsx","../src/RichTextEditor/htmlConvertion.js"],"sourcesContent":["import React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nfunction useI18N() {\n const {\n t,\n i18n: { language },\n } = useTranslation();\n\n if (language !== 'nb' && language !== 'en') {\n throw Error('Language must be either nb or en.');\n }\n\n return t;\n}\n\nexport function withI18n(Component) {\n return function WrappedComponent(props) {\n const t = useI18N();\n return <Component {...props} i18n={t} />;\n };\n}\n","import './styles.scss';\n\nimport React, { Component } from 'react';\nimport { Dropdown } from '@entur/dropdown';\n\nimport { withI18n } from '../../withI18n';\n\nclass BlockTypeDropdown extends Component {\n handleOnClick = (selectedOption) => {\n const { onChange } = this.props;\n onChange(selectedOption);\n };\n\n toItem(option) {\n return {\n value: option.style,\n label: this.renderFormattedLabel(option.label),\n };\n }\n\n renderFormattedLabel(label) {\n const formattedLabelText = this.props.i18n(label);\n switch (label) {\n case 'styles.p':\n return <div className=\"default-p\">{formattedLabelText}</div>;\n case 'styles.h1':\n return <div className=\"default-h1\">{formattedLabelText}</div>;\n case 'styles.h2':\n return <div className=\"default-h2\">{formattedLabelText}</div>;\n case 'styles.h3':\n return <div className=\"default-h3\">{formattedLabelText}</div>;\n case 'styles.h4':\n return <div className=\"default-h4\">{formattedLabelText}</div>;\n case 'styles.h5':\n return <div className=\"default-h5\">{formattedLabelText}</div>;\n case 'styles.h6':\n return <div className=\"default-h6\">{formattedLabelText}</div>;\n default:\n return <p>{formattedLabelText}</p>;\n }\n }\n\n render() {\n const { options, selected, i18n } = this.props;\n\n return (\n <Dropdown\n className=\"block-type-dropdown\"\n items={options.map((option) => this.toItem(option))}\n initialSelectedItem={this.toItem(selected)}\n label={i18n('styles.style')}\n onChange={(selectedItem) => this.handleOnClick(selectedItem.value)}\n />\n );\n }\n}\n\nexport default withI18n(BlockTypeDropdown);\n","import './styles.scss';\n\nimport React from 'react';\n\nimport BlockTypeDropdown from '../BlockTypeDropdown';\n\nconst BlockTypeControls = ({ editorState, blockTypes, onToggle }) => {\n const selection = editorState.getSelection();\n const blockTypeStyle = editorState\n .getCurrentContent()\n .getBlockForKey(selection.getStartKey())\n .getType();\n\n const selectedOption =\n blockTypes.find((option) => option.style === blockTypeStyle) ||\n blockTypes[0];\n\n return (\n <BlockTypeDropdown\n options={blockTypes}\n selected={selectedOption}\n onChange={onToggle}\n />\n );\n};\n\nexport default BlockTypeControls;\n","export const Key = Object.freeze({\n ENTER: 13,\n});\n\nexport function getKey(event) {\n return event.keyCode || event.which;\n}\n","import './styles.scss';\n\nimport React, { Component } from 'react';\nimport cx from 'classnames';\n\nimport { withI18n } from '../../withI18n';\nimport { Key, getKey } from '../../events';\n\nclass StyleButton extends Component {\n onToggle = (e) => {\n const { style, onToggle } = this.props;\n e.preventDefault();\n onToggle(style);\n };\n\n onToggleNoEvent = () => {\n const { style, onToggle } = this.props;\n onToggle(style);\n };\n\n render() {\n const { i18n, active, label, title, hotKey } = this.props;\n\n const classNames = cx('editor-stylebutton', { active });\n\n return (\n <div\n className={classNames}\n onMouseDown={this.onToggle}\n title={i18n(title) + hotKey}\n tabIndex={0}\n onKeyPress={(event) => {\n if (getKey(event) === Key.ENTER) {\n this.onToggleNoEvent();\n }\n }}\n >\n {label}\n </div>\n );\n }\n}\n\nexport default withI18n(StyleButton);\n","import './styles.scss';\n\nimport React from 'react';\n\nimport StyleButton from '../StyleButton';\n\nconst BlockTypeButtonControls = (props) => {\n const { editorState, blockTypes, onToggle } = props;\n const selection = editorState.getSelection();\n const blockTypeStyle = editorState\n .getCurrentContent()\n .getBlockForKey(selection.getStartKey())\n .getType();\n\n return (\n <div className=\"controls-group block-editor-controls\">\n {blockTypes.map((type, i) => (\n <StyleButton\n key={i}\n active={type.style === blockTypeStyle}\n label={type.label}\n onToggle={onToggle}\n style={type.style}\n title={type.tooltip}\n />\n ))}\n </div>\n );\n};\n\nexport default BlockTypeButtonControls;\n","import './styles.scss';\n\nimport React, { Component } from 'react';\nimport { EditorState } from 'draft-js';\nimport PropTypes from 'prop-types';\nimport { TextField } from '@entur/form';\nimport { UnlinkIcon, LinkIcon, CheckIcon, CloseIcon } from '@entur/icons';\nimport { Unbutton } from '@entur-partner/common';\nimport { SecondarySquareButton } from '@entur/button';\n\nimport { withI18n } from '../../withI18n';\nimport { Key, getKey } from '../../events';\n\nclass BlockTypeLinkControls extends Component {\n state = {\n urlValue: '',\n showUrlInput: false,\n hasLink: false,\n };\n\n onUrlChange = (e) => {\n this.setState({ urlValue: e.target.value });\n };\n\n addLink = (e) => {\n e.preventDefault();\n const { editorState } = this.props;\n const selection = editorState.getSelection();\n if (!selection.isCollapsed()) {\n const currentContent = editorState.getCurrentContent();\n const startKey = selection.getStartKey();\n const startOffset = selection.getStartOffset();\n const blockWithLinkAtBeginning = currentContent.getBlockForKey(startKey);\n const linkKey = blockWithLinkAtBeginning.getEntityAt(startOffset);\n\n let url = '';\n if (linkKey) {\n const linkInstance = currentContent.getEntity(linkKey);\n url = linkInstance.getData().url;\n }\n\n this.setState({\n showUrlInput: true,\n urlValue: url,\n hasLink: !!url,\n });\n }\n };\n\n confirmLink = (e) => {\n e.preventDefault();\n const { urlValue } = this.state;\n const { editorState, onToggle } = this.props;\n const contentState = editorState.getCurrentContent();\n const contentStateWithEntity = contentState.createEntity(\n 'LINK',\n 'MUTABLE',\n { url: urlValue }\n );\n const entityKey = contentStateWithEntity.getLastCreatedEntityKey();\n const newEditorState = EditorState.set(editorState, {\n currentContent: contentStateWithEntity,\n });\n onToggle(newEditorState, entityKey);\n this.setState({\n showUrlInput: false,\n urlValue: '',\n });\n };\n\n cancelLink = (e) => {\n e.preventDefault();\n this.setState({\n showUrlInput: false,\n urlValue: '',\n });\n };\n\n onLinkInputKeyDown = (e) => {\n if (getKey(e) === Key.ENTER) {\n this.confirmLink(e);\n }\n };\n\n removeLink = (e) => {\n e.preventDefault();\n const { editorState, onToggle } = this.props;\n const { hasLink } = this.state;\n const selection = editorState.getSelection();\n if (!selection.isCollapsed() && hasLink) {\n onToggle(editorState, null);\n this.setState({\n showUrlInput: false,\n });\n }\n };\n\n render() {\n const { i18n } = this.props;\n const { showUrlInput, hasLink } = this.state;\n return (\n <div className=\"controls-group block-editor-controls link-controls\">\n <div\n className=\"editor-stylebutton\"\n title={i18n('styles.link')}\n onClick={this.addLink}\n tabIndex={0}\n >\n <LinkIcon />\n </div>\n\n {showUrlInput && (\n <div className=\"url-input-container\">\n <span className=\"exit-button\" onMouseDown={this.cancelLink}>\n <CloseIcon />\n </span>\n <div className=\"link-label\">{i18n('common.from')}</div>\n <div className=\"url-input-form\">\n <TextField\n style={{ width: 250, margin: 5 }}\n onChange={this.onUrlChange}\n value={this.state.urlValue}\n onKeyDown={this.onLinkInputKeyDown}\n placeholder=\"https://example.com\"\n />\n <SecondarySquareButton onMouseDown={this.confirmLink}>\n <CheckIcon width={15} height={15} />\n </SecondarySquareButton>\n </div>\n {hasLink && (\n <div className=\"remove-link\">\n <Unbutton\n onClick={this.removeLink}\n title={i18n('styles.unlink')}\n >\n <UnlinkIcon />\n {i18n('styles.unlink')}\n </Unbutton>\n </div>\n )}\n </div>\n )}\n </div>\n );\n }\n}\nBlockTypeLinkControls.propTypes = {\n editorState: PropTypes.object,\n onToggle: PropTypes.func,\n};\n\nexport default withI18n(BlockTypeLinkControls);\n","import './styles.scss';\n\nimport React from 'react';\n\nimport StyleButton from '../StyleButton';\n\nconst InlineStyleControls = (props) => {\n const { editorState, inlineStyles } = props;\n\n const currentStyle = editorState.getCurrentInlineStyle();\n\n return (\n <div className=\"controls-group inline-editor-controls\">\n {inlineStyles.map((type, i) => (\n <StyleButton\n key={i}\n active={currentStyle.has(type.style)}\n label={type.label}\n onToggle={props.onToggle}\n style={type.style}\n title={type.tooltip}\n hotKey={type.hotKey}\n />\n ))}\n </div>\n );\n};\n\nexport default InlineStyleControls;\n","import './styles.scss';\n\nimport React, { Component, createRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { Popover } from '@entur/tooltip';\nimport { OverflowMenuItem, OverflowMenu } from '@entur/menu';\nimport { DownArrowIcon } from '@entur/icons';\n\nimport { withI18n } from '../../withI18n';\n\nclass TagControls extends Component {\n tagControlRef = createRef();\n state = { isOpen: false };\n\n componentDidMount() {\n document.addEventListener('mousedown', this.handleClickOutside);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mousedown', this.handleClickOutside);\n }\n\n handleClickOutside = (e) => {\n if (\n this.tagControlRef &&\n this.tagControlRef.current &&\n !this.tagControlRef.current.contains(e.target)\n ) {\n this.setState({ isOpen: false });\n }\n };\n\n handleTagClick = (tag, delimiter) => {\n const { editorState, onInsertTag } = this.props;\n const delimiterStart = delimiter[0];\n const delimiterEnd = delimiter[1];\n const fullTag = `${delimiterStart}${tag}${delimiterEnd}`;\n onInsertTag(editorState, fullTag);\n };\n\n render() {\n const { i18n, tags } = this.props;\n const { isOpen } = this.state;\n const menuItems = tags.map((tag, i) => {\n const delimiter = tag.delimiter || '{}';\n return (\n <OverflowMenuItem\n key={i}\n className=\"tag-control\"\n id={'tag-control-' + tag.tag}\n onClick={() => this.handleTagClick(tag.tag, delimiter)}\n >\n {tag.icon}\n <span className=\"tag-control-text\">{tag.label}</span>\n </OverflowMenuItem>\n );\n });\n\n return (\n <div className=\"tag-control-dropdown\" ref={this.tagControlRef}>\n <div\n className=\"tag-control-header\"\n onClick={() => this.setState(({ isOpen }) => ({ isOpen: !isOpen }))}\n >\n {i18n('common.insert')}\n <DownArrowIcon className=\"tag-control-chevron\" inline />\n </div>\n <Popover open={isOpen} className=\"tag-control-content\">\n <OverflowMenu className=\"action-menu\">{menuItems}</OverflowMenu>\n </Popover>\n </div>\n );\n }\n}\n\nTagControls.propTypes = {\n editorState: PropTypes.object,\n tags: PropTypes.arrayOf(PropTypes.object).isRequired,\n onInsertTag: PropTypes.func.isRequired,\n};\n\nexport default withI18n(TagControls);\n","import React from 'react';\n\nexport const HtmlLink = ({ url, children }) => {\n return <a href={url}>{children}</a>;\n};\n\nconst Link = (props) => {\n const { url } = props.contentState.getEntity(props.entityKey).getData();\n return <HtmlLink url={url}>{props.children}</HtmlLink>;\n};\n\nexport function findLinkEntities(contentBlock, callback, contentState) {\n contentBlock.findEntityRanges((character) => {\n const entityKey = character.getEntity();\n return (\n entityKey !== null &&\n contentState.getEntity(entityKey).getType() === 'LINK'\n );\n }, callback);\n}\n\nexport default Link;\n","import React from 'react';\nimport {\n BoldIcon,\n ItalicIcon,\n UnderlineIcon,\n BulletListIcon,\n NumberListIcon,\n} from '@entur/icons';\nimport { CompositeDecorator } from 'draft-js';\n\nimport Link, { findLinkEntities } from './Link';\n\nexport const EditorConfigTypes = Object.freeze({\n FONT_LIST: {\n UNSTYLED: 'unstyled',\n HEADER_ONE: 'header-one',\n HEADER_TWO: 'header-two',\n HEADER_THREE: 'header-three',\n HEADER_FOUR: 'header-four',\n HEADER_FIVE: 'header-five',\n HEADER_SIX: 'header-six',\n },\n BLOCK_TYPES: {\n UNORDERED_LIST: 'unordered-list',\n ORDERED_LIST: 'ordered-list',\n },\n INLINE_STYLES: {\n BOLD: 'bold',\n ITALIC: 'italic',\n UNDERLINE: 'underline',\n },\n});\n\nexport const FontList = Object.freeze({\n unstyled: { label: 'styles.p', style: 'unstyled' },\n 'header-one': { label: 'styles.h1', style: 'header-one' },\n 'header-two': { label: 'styles.h2', style: 'header-two' },\n 'header-three': { label: 'styles.h3', style: 'header-three' },\n 'header-four': { label: 'styles.h4', style: 'header-four' },\n 'header-five': { label: 'styles.h5', style: 'header-five' },\n 'header-six': { label: 'styles.h6', style: 'header-six' },\n});\n\nexport const BlockTypeList = Object.freeze({\n 'unordered-list': {\n label: <BulletListIcon />,\n style: 'unordered-list-item',\n tooltip: 'styles.unordered_list_item',\n },\n 'ordered-list': {\n label: <NumberListIcon />,\n style: 'ordered-list-item',\n tooltip: 'styles.ordered_list_item',\n },\n});\n\nexport const InlineStylesList = Object.freeze({\n bold: {\n label: <BoldIcon />,\n style: 'BOLD',\n tooltip: 'styles.bold',\n hotKey: '(Ctrl+B)',\n },\n italic: {\n label: <ItalicIcon />,\n style: 'ITALIC',\n tooltip: 'styles.italic',\n hotKey: '(Ctrl+I)',\n },\n underline: {\n label: <UnderlineIcon />,\n style: 'UNDERLINE',\n tooltip: 'styles.underline',\n hotKey: '(Ctrl+U)',\n },\n});\n\nexport const MinifiedConfigTypes = Object.freeze({\n fontList: [\n { type: 'unstyled', label: 'styles.p', style: 'unstyled' },\n { type: 'header-two', label: 'styles.h1', style: 'header-two' },\n ],\n blockTypes: Object.values(EditorConfigTypes.BLOCK_TYPES),\n inlineStyles: [\n EditorConfigTypes.INLINE_STYLES.BOLD,\n EditorConfigTypes.INLINE_STYLES.ITALIC,\n ],\n});\nexport const decorator = new CompositeDecorator([\n {\n strategy: findLinkEntities,\n component: Link,\n },\n]);\n","import './styles.scss';\n\nimport React, { Component, createRef } from 'react';\nimport {\n Editor,\n EditorState,\n Modifier,\n RichUtils,\n getDefaultKeyBinding,\n} from 'draft-js';\nimport PropTypes from 'prop-types';\nimport cx from 'classnames';\nimport { Label } from '@entur/typography';\n\nimport BlockTypeSelectControls from './Controls/BlockTypeSelectControls';\nimport BlockTypeButtonControls from './Controls/BlockTypeButtonControls';\nimport BlockTypeLinkControls from './Controls/BlockTypeLinkControls';\nimport InlineStyleControls from './Controls/InlineStyleControls';\nimport TagControls from './Controls/TagControls';\nimport {\n BlockTypeList,\n EditorConfigTypes,\n FontList,\n InlineStylesList,\n decorator,\n} from './constants';\n\nclass RichTextEditor extends Component {\n static decorator = decorator;\n\n wrapperRef = createRef();\n editor = createRef();\n\n focusEditor() {\n this.editor.current && this.editor.current.focus();\n }\n\n handleKeyCommand = (command, editorState) => {\n const newState = RichUtils.handleKeyCommand(editorState, command);\n if (newState) {\n this.props.onChange(newState);\n return true;\n }\n return false;\n };\n\n keyBindingFn = (evt) => {\n switch (evt.keyCode) {\n case 9:\n return this.onTab(evt);\n default:\n return getDefaultKeyBinding(evt);\n }\n };\n\n onTab = (evt) => {\n evt.stopPropagation();\n const { maxTabDepth, editorState, onChange } = this.props;\n onChange(RichUtils.onTab(evt, editorState, maxTabDepth));\n };\n\n toggleButtonBlockType = (blockType) => {\n const { editorState, onChange } = this.props;\n onChange(RichUtils.toggleBlockType(editorState, blockType));\n };\n\n toggleSelectBlockType = (blockType) => {\n const { editorState, onChange } = this.props;\n onChange(RichUtils.toggleBlockType(editorState, blockType));\n };\n\n toggleInlineStyle = (inlineStyle) => {\n const { editorState, onChange } = this.props;\n onChange(RichUtils.toggleInlineStyle(editorState, inlineStyle));\n };\n\n toggleLink = (newEditorState, entityKey) => {\n this.props.onChange(\n RichUtils.toggleLink(\n newEditorState,\n newEditorState.getSelection(),\n entityKey\n )\n );\n };\n\n insertText = (editorState, text) => {\n const newContent = Modifier.insertText(\n editorState.getCurrentContent(),\n editorState.getSelection(),\n text\n );\n this.props.onChange(\n EditorState.push(editorState, newContent, 'insert-characters'),\n () => this.focusEditor()\n );\n };\n\n getFontListConfigForPanelType = (panelType) => {\n const controlConfig = this.getControlConfigBySet(\n this.props.controlConfigSet\n );\n return controlConfig[panelType];\n };\n\n getControlConfigBySet = (config) => {\n const fontList = ((config && config.fontList) || Object.keys(FontList))\n .filter((f) => (typeof f === 'object' ? FontList[f.type] : FontList[f]))\n .map((f) => (f.label && f.style ? f : FontList[f]));\n const blockTypes = (\n (config && config.blockTypes) ||\n Object.keys(BlockTypeList)\n )\n .filter((f) =>\n typeof f === 'object' ? BlockTypeList[f.type] : BlockTypeList[f]\n )\n .map((f) => (f.label && f.style ? f : BlockTypeList[f]));\n const inlineStyles = (\n (config && config.inlineStyles) ||\n Object.keys(InlineStylesList)\n )\n .filter((f) =>\n typeof f === 'object' ? InlineStylesList[f.type] : InlineStylesList[f]\n )\n .map((f) => (f.label && f.style ? f : InlineStylesList[f]));\n\n return {\n fontList,\n blockTypes,\n inlineStyles,\n };\n };\n\n render() {\n const {\n className,\n showFontMenu,\n showInlineStyleMenu,\n showTextFormatMenu,\n showLinkMenu,\n label,\n tags,\n editorState,\n onChange,\n handleBeforeInput,\n } = this.props;\n\n const classNames = cx('editor-root', className);\n\n return (\n <div ref={this.wrapperRef}>\n {label && <Label>{label}</Label>}\n\n <div className={classNames}>\n <div className=\"controls-wrapper\">\n {showFontMenu && (\n <BlockTypeSelectControls\n editorState={editorState}\n onToggle={this.toggleSelectBlockType}\n blockTypes={this.getFontListConfigForPanelType('fontList')}\n />\n )}\n {showInlineStyleMenu && (\n <InlineStyleControls\n editorState={editorState}\n onToggle={this.toggleInlineStyle}\n inlineStyles={this.getFontListConfigForPanelType(\n 'inlineStyles'\n )}\n />\n )}\n {showTextFormatMenu && (\n <BlockTypeButtonControls\n editorState={editorState}\n onToggle={this.toggleButtonBlockType}\n blockTypes={this.getFontListConfigForPanelType('blockTypes')}\n />\n )}\n {showLinkMenu && (\n <BlockTypeLinkControls\n editorState={editorState}\n onToggle={this.toggleLink}\n />\n )}\n {tags && tags.length > 0 && (\n <TagControls\n editorState={editorState}\n tags={tags}\n onInsertTag={this.insertText}\n />\n )}\n </div>\n\n <div className=\"editor-wrapper\">\n <Editor\n ref={this.editor}\n editorState={editorState}\n handleKeyCommand={this.handleKeyCommand}\n onChange={onChange}\n handleBeforeInput={handleBeforeInput}\n keyBindingFn={this.keyBindingFn}\n spellCheck\n />\n </div>\n </div>\n </div>\n );\n }\n}\n\nconst styleShape = (configList) =>\n PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.oneOf([...Object.values(configList)])),\n PropTypes.arrayOf(\n PropTypes.shape({\n type: PropTypes.oneOf([...Object.values(configList)]),\n label: PropTypes.string,\n style: PropTypes.string,\n tooltip: PropTypes.string,\n hotKey: PropTypes.string,\n })\n ),\n ]);\n\nRichTextEditor.propTypes = {\n editorState: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n maxTabDepth: PropTypes.number,\n showFontMenu: PropTypes.bool,\n showInlineStyleMenu: PropTypes.bool,\n showTextFormatMenu: PropTypes.bool,\n showLinkMenu: PropTypes.bool,\n label: PropTypes.string,\n tags: PropTypes.arrayOf(PropTypes.object),\n controlConfigSet: PropTypes.shape({\n fontList: styleShape(EditorConfigTypes.FONT_LIST),\n blockTypes: styleShape(EditorConfigTypes.BLOCK_TYPES),\n inlineStyles: styleShape(EditorConfigTypes.INLINE_STYLES),\n }),\n};\nRichTextEditor.defaultProps = {\n maxTabDepth: 4,\n showFontMenu: true,\n showInlineStyleMenu: true,\n showTextFormatMenu: true,\n showLinkMenu: true,\n label: '',\n};\n\nexport default RichTextEditor;\n","import { markdownToDraft, draftToMarkdown } from 'markdown-draft-js';\nimport { convertToRaw, convertFromRaw, EditorState } from 'draft-js';\nimport showdown from 'showdown';\n\nimport { decorator } from './constants';\n\nexport const editorStateToMarkdown = (editorState) => {\n const rawState = convertToRaw(editorState.getCurrentContent());\n return draftToMarkdown(rawState, { preserveNewlines: true });\n};\n\nexport const markdownToEditorState = (markdown) => {\n if (!markdown) {\n return EditorState.createEmpty(decorator);\n }\n const rawState = markdownToDraft(markdown, { preserveNewlines: true });\n const contentState = convertFromRaw(rawState);\n return EditorState.createWithContent(contentState, decorator);\n};\n\nconst converter = new showdown.Converter({\n underline: true,\n});\n\nexport const markdownToHtml = (markdown) => {\n return converter.makeHtml(markdown);\n};\n","import React, { useState } from 'react';\nimport { EditorState } from 'draft-js';\nimport { ExpandablePanel } from '@entur/expand';\nimport {\n LanguageKey,\n LanguageOption,\n MultiLanguageValues,\n Stack,\n} from '@entur-partner/common';\nimport { FeedbackText, VariantType } from '@entur/form';\n\nimport {\n editorStateToMarkdown,\n markdownToEditorState,\n} from './RichTextEditor/markdownConvertion';\nimport RichTextEditor from './RichTextEditor';\nimport { MinifiedConfigTypes } from './RichTextEditor/constants';\n\ntype MultiLanguageInputProps = {\n values: MultiLanguageValues;\n onChange: (values: MultiLanguageValues) => void;\n variant?: (lang: LanguageKey) => VariantType;\n feedback?: (lang: LanguageKey) => string;\n tags?: {\n tag: string;\n delimiter: string;\n label: string;\n }[];\n};\n\ntype RichTextEditorForLanguageProps = MultiLanguageInputProps & {\n language: LanguageOption;\n};\n\nconst RichTextEditorForLanguage = ({\n language: { value: langKey, label, required },\n values,\n onChange,\n variant,\n feedback,\n tags,\n}: RichTextEditorForLanguageProps) => {\n const [editorState, setEditorState] = useState<EditorState>(\n markdownToEditorState(values[langKey])\n );\n\n const handleOnChange = (changedState: EditorState) => {\n const newValues = { ...values };\n const content = editorStateToMarkdown(changedState);\n if (values[langKey] && content === '\\n') {\n delete newValues[langKey];\n } else {\n newValues[langKey] = content;\n }\n\n setEditorState(changedState);\n onChange(newValues);\n };\n\n const feedbackText = feedback && feedback(langKey);\n\n return (\n <>\n <RichTextEditor\n label={required ? label + '*' : label}\n editorState={editorState}\n onChange={(changedState: EditorState) => handleOnChange(changedState)}\n controlConfigSet={MinifiedConfigTypes}\n tags={tags}\n />\n {variant && feedbackText?.length! > 0 && (\n <FeedbackText variant={variant(langKey)}>{feedbackText}</FeedbackText>\n )}\n </>\n );\n};\n\ntype ExpandableMultiLanguageRichTextEditorProps = MultiLanguageInputProps & {\n name: string;\n title: string;\n languages: LanguageOption[];\n};\n\nexport const ExpandableMultiLanguageRichTextEditor = ({\n name,\n title,\n languages,\n ...rest\n}: ExpandableMultiLanguageRichTextEditorProps) => (\n <ExpandablePanel\n title={title}\n defaultOpen\n contentStyle={{\n padding: '4px 4px 4px 4px',\n marginTop: '16px',\n marginBottom: '16px',\n }}\n >\n <Stack space=\"medium\">\n {languages.map((lang) => (\n <div\n key={name + lang.value}\n data-testid={`multi-lang-rich-text-${name}-${lang.value}`}\n >\n <RichTextEditorForLanguage language={lang} {...rest} />\n </div>\n ))}\n </Stack>\n </ExpandablePanel>\n);\n","import React from 'react';\nimport { EditorState } from 'draft-js';\nimport { convertFromHTML, convertToHTML } from 'draft-convert';\n\nimport { HtmlLink } from './Link';\nimport { decorator } from './constants';\n\n/* eslint-disable react/display-name */\n\nexport const entityToHtml = {\n entityToHTML: (entity, originalText) => {\n if (entity.type === 'LINK') {\n return <HtmlLink url={entity.data.url}>{originalText}</HtmlLink>;\n }\n return originalText;\n },\n};\n\nexport const htmlToEntity = {\n htmlToEntity: (nodeName, node, createEntity) => {\n if (nodeName === 'a') {\n return createEntity('LINK', 'MUTABLE', { url: node.href });\n }\n },\n};\n\n/* eslint-disable react/display-name */\n\nexport const htmlToEditorState = (html) => {\n if (!html) {\n return EditorState.createEmpty(decorator);\n }\n const rawState = convertFromHTML(htmlToEntity)(html);\n return EditorState.createWithContent(rawState, decorator);\n};\n\nexport const editorStateToHtml = (editorState) => {\n return convertToHTML(entityToHtml)(editorState.getCurrentContent());\n};\n"],"names":["withI18n","Component","props","t","_useTranslation","useTranslation","language","i18n","Error","useI18N","React","createElement","_extends","BlockTypeDropdown$1","handleOnClick","selectedOption","onChange","_this","toItem","option","value","style","label","this","renderFormattedLabel","formattedLabelText","className","render","_this2","_this$props","selected","Dropdown","items","options","map","initialSelectedItem","selectedItem","BlockTypeControls","_ref","editorState","blockTypes","onToggle","selection","getSelection","blockTypeStyle","getCurrentContent","getBlockForKey","getStartKey","getType","find","BlockTypeDropdown","Key","Object","freeze","ENTER","getKey","event","keyCode","which","StyleButton$1","e","preventDefault","onToggleNoEvent","_this$props2","_this$props3","title","hotKey","classNames","cx","active","onMouseDown","tabIndex","onKeyPress","BlockTypeButtonControls","type","i","StyleButton","key","tooltip","BlockTypeLinkControls","state","urlValue","showUrlInput","hasLink","onUrlChange","setState","target","addLink","isCollapsed","currentContent","startKey","startOffset","getStartOffset","linkKey","getEntityAt","url","getEntity","getData","confirmLink","contentStateWithEntity","createEntity","entityKey","getLastCreatedEntityKey","EditorState","set","cancelLink","onLinkInputKeyDown","removeLink","_this$state","onClick","LinkIcon","CloseIcon","TextField","width","margin","onKeyDown","placeholder","SecondarySquareButton","CheckIcon","height","Unbutton","UnlinkIcon","propTypes","PropTypes","object","func","BlockTypeLinkControls$1","InlineStyleControls","inlineStyles","currentStyle","getCurrentInlineStyle","has","TagControls","tagControlRef","createRef","isOpen","handleClickOutside","current","contains","handleTagClick","tag","delimiter","onInsertTag","delimiterStart","componentDidMount","document","addEventListener","componentWillUnmount","removeEventListener","menuItems","tags","OverflowMenuItem","id","icon","ref","DownArrowIcon","inline","Popover","open","OverflowMenu","arrayOf","isRequired","TagControls$1","HtmlLink","href","children","EditorConfigTypes","FONT_LIST","UNSTYLED","HEADER_ONE","HEADER_TWO","HEADER_THREE","HEADER_FOUR","HEADER_FIVE","HEADER_SIX","BLOCK_TYPES","UNORDERED_LIST","ORDERED_LIST","INLINE_STYLES","BOLD","ITALIC","UNDERLINE","FontList","unstyled","BlockTypeList","BulletListIcon","NumberListIcon","InlineStylesList","bold","BoldIcon","italic","ItalicIcon","underline","UnderlineIcon","MinifiedConfigTypes","fontList","values","decorator","CompositeDecorator","strategy","contentBlock","callback","contentState","findEntityRanges","character","component","RichTextEditor","wrapperRef","editor","handleKeyCommand","command","newState","RichUtils","keyBindingFn","evt","onTab","getDefaultKeyBinding","stopPropagation","maxTabDepth","toggleButtonBlockType","blockType","toggleBlockType","toggleSelectBlockType","toggleInlineStyle","inlineStyle","_this$props4","toggleLink","newEditorState","insertText","text","newContent","Modifier","push","focusEditor","getFontListConfigForPanelType","panelType","getControlConfigBySet","controlConfigSet","config","keys","filter","f","focus","_this$props5","showFontMenu","showInlineStyleMenu","showTextFormatMenu","showLinkMenu","handleBeforeInput","Label","BlockTypeSelectControls","length","Editor","spellCheck","styleShape","configList","oneOfType","oneOf","shape","concat","string","number","bool","defaultProps","editorStateToMarkdown","rawState","convertToRaw","draftToMarkdown","preserveNewlines","markdownToEditorState","markdown","createEmpty","markdownToDraft","convertFromRaw","createWithContent","converter","showdown","Converter","RichTextEditorForLanguage","_ref$language","langKey","required","variant","feedback","useState","_useState","setEditorState","feedbackText","Fragment","changedState","newValues","content","handleOnChange","FeedbackText","entityToHtml","entityToHTML","entity","originalText","data","htmlToEntity","nodeName","node","_ref2","name","languages","rest","_objectWithoutPropertiesLoose","_excluded","ExpandablePanel","defaultOpen","contentStyle","padding","marginTop","marginBottom","Stack","space","lang","convertToHTML","html","convertFromHTML","makeHtml"],"mappings":"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"}
@@ -4,11 +4,13 @@ import PropTypes from 'prop-types';
4
4
  import cx from 'classnames';
5
5
  import { Label } from '@entur/typography';
6
6
  import { Dropdown } from '@entur/dropdown';
7
- import { createWithI18n, MenuItem, Popover, Menu } from '@entur-partner/legacy';
7
+ import { useTranslation } from 'react-i18next';
8
8
  import { TextField, FeedbackText } from '@entur/form';
9
9
  import { LinkIcon, CloseIcon, CheckIcon, UnlinkIcon, DownArrowIcon, BulletListIcon, NumberListIcon, BoldIcon, ItalicIcon, UnderlineIcon } from '@entur/icons';
10
10
  import { Unbutton, Stack } from '@entur-partner/common';
11
11
  import { SecondarySquareButton } from '@entur/button';
12
+ import { Popover } from '@entur/tooltip';
13
+ import { OverflowMenuItem, OverflowMenu } from '@entur/menu';
12
14
  import { ExpandablePanel } from '@entur/expand';
13
15
  import { draftToMarkdown, markdownToDraft } from 'markdown-draft-js';
14
16
  import showdown from 'showdown';
@@ -61,15 +63,26 @@ function _objectWithoutPropertiesLoose(source, excluded) {
61
63
  return target;
62
64
  }
63
65
 
64
- var simpleFormat = function simpleFormat(formatMessage) {
65
- return function (name, value) {
66
- return formatMessage({
67
- id: name
68
- }, value);
69
- };
70
- };
66
+ function useI18N() {
67
+ var _useTranslation = useTranslation(),
68
+ t = _useTranslation.t,
69
+ language = _useTranslation.i18n.language;
70
+
71
+ if (language !== 'nb' && language !== 'en') {
72
+ throw Error('Language must be either nb or en.');
73
+ }
71
74
 
72
- var withI18n = /*#__PURE__*/createWithI18n(simpleFormat);
75
+ return t;
76
+ }
77
+
78
+ function withI18n(Component) {
79
+ return function WrappedComponent(props) {
80
+ var t = useI18N();
81
+ return /*#__PURE__*/React.createElement(Component, _extends({}, props, {
82
+ i18n: t
83
+ }));
84
+ };
85
+ }
73
86
 
74
87
  var BlockTypeDropdown = /*#__PURE__*/function (_Component) {
75
88
  _inheritsLoose(BlockTypeDropdown, _Component);
@@ -509,7 +522,7 @@ var TagControls = /*#__PURE__*/function (_Component) {
509
522
  var isOpen = this.state.isOpen;
510
523
  var menuItems = tags.map(function (tag, i) {
511
524
  var delimiter = tag.delimiter || '{}';
512
- return /*#__PURE__*/React.createElement(MenuItem, {
525
+ return /*#__PURE__*/React.createElement(OverflowMenuItem, {
513
526
  key: i,
514
527
  className: "tag-control",
515
528
  id: 'tag-control-' + tag.tag,
@@ -539,7 +552,7 @@ var TagControls = /*#__PURE__*/function (_Component) {
539
552
  })), /*#__PURE__*/React.createElement(Popover, {
540
553
  open: isOpen,
541
554
  className: "tag-control-content"
542
- }, /*#__PURE__*/React.createElement(Menu, {
555
+ }, /*#__PURE__*/React.createElement(OverflowMenu, {
543
556
  className: "action-menu"
544
557
  }, menuItems)));
545
558
  };