diff --git a/package.json b/package.json index 722c005..5e233ff 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "prop-types": "^15.7.2", "react": "^16.14.0", "react-dom": "^16.14.0", + "react-modal": "^3.14.4", "react-redux": "^7.2.6", "react-rnd": "~10.2.4", "react-svg-loader": "^3.0.3", diff --git a/src/assets/img/load-data.svg b/src/assets/img/load-data.svg new file mode 100644 index 0000000..7d244a8 --- /dev/null +++ b/src/assets/img/load-data.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/img/source.svg b/src/assets/img/source.svg index 1c3ebfe..e1b66da 100644 --- a/src/assets/img/source.svg +++ b/src/assets/img/source.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/ckeditorinspectorui.css b/src/ckeditorinspectorui.css index 434ae13..c7a0210 100644 --- a/src/ckeditorinspectorui.css +++ b/src/ckeditorinspectorui.css @@ -3,7 +3,8 @@ * For licensing, see LICENSE.md. */ -.ck-inspector { +.ck-inspector, +.ck-inspector-portal { --ck-inspector-color-white: #fff; --ck-inspector-color-black: #000; --ck-inspector-color-background: #F3F3F3; @@ -15,7 +16,9 @@ /* Reset first */ .ck-inspector, -.ck-inspector *:not(select) { +.ck-inspector *:not(select), +.ck-inspector-portal, +.ck-inspector-portal *:not(select) { box-sizing: border-box; width: auto; height: auto; diff --git a/src/components/seteditordatabutton.css b/src/components/seteditordatabutton.css new file mode 100644 index 0000000..3dc50d4 --- /dev/null +++ b/src/components/seteditordatabutton.css @@ -0,0 +1,115 @@ +/** + * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md. + */ + +.ck-inspector-modal { + --ck-inspector-set-data-modal-overlay: rgba(0, 0, 0, 0.5); + --ck-inspector-set-data-modal-shadow: rgba(0,0,0,0.06); + --ck-inspector-set-data-modal-button-background: #eee; + --ck-inspector-set-data-modal-button-background-hover: #ddd; + --ck-inspector-set-data-modal-save-button-background: #1976d2; + --ck-inspector-set-data-modal-save-button-background-hover: #0b60b5; +} + +/* Modal overlay */ +.ck-inspector-modal.ck-inspector-quick-actions__set-data-modal { + z-index: 999999; + position: fixed; + inset: 0px; + background-color: var(--ck-inspector-set-data-modal-overlay); + + /* Modal content */ + & .ck-inspector-quick-actions__set-data-modal__content { + position: absolute; + border: 1px solid var(--ck-inspector-color-border); + background: var(--ck-inspector-color-white); + overflow: auto; + border-radius: 2px; + outline: none; + box-shadow: 0 1px 1px var(--ck-inspector-set-data-modal-shadow), + 0 2px 2px var(--ck-inspector-set-data-modal-shadow), + 0 4px 4px var(--ck-inspector-set-data-modal-shadow), + 0 8px 8px var(--ck-inspector-set-data-modal-shadow), + 0 16px 16px var(--ck-inspector-set-data-modal-shadow); + + max-height: calc(100vh - 160px); + max-width: calc(100vw - 160px); + width: 100%; + height: 100%; + + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + + display: flex; + flex-direction: column; + justify-content: space-between; + + /* Modal title */ + & h2 { + font-size: 14px; + font-weight: bold; + margin: 0; + padding: 12px 20px; + background: var(--ck-inspector-color-background); + border-bottom: 1px solid var(--ck-inspector-color-border); + } + + & textarea { + flex-grow: 1; + margin: 20px; + border: 1px solid var(--ck-inspector-color-border); + border-radius: 2px; + resize: none; + padding: 10px; + font-family: monospace; + font-size: 14px; + } + + & button { + padding: 10px 20px; + border-radius: 2px; + font-size: 14px; + white-space: nowrap; + /* background: var(--ck-inspector-set-data-modal-button-background); */ + border: 1px solid var(--ck-inspector-color-border); + + &:hover { + background: var(--ck-inspector-set-data-modal-button-background-hover); + } + } + + & .ck-inspector-quick-actions__set-data-modal__buttons { + margin: 0 20px 20px; + display: flex; + justify-content: center; + + & button { + & + button { + margin-left: 20px; + } + + &:first-child { + margin-right: auto; + } + + &:not(:first-child) { + flex-basis: 20%; + } + + /* Save button */ + &:last-child { + background: var(--ck-inspector-set-data-modal-save-button-background); + border-color: var(--ck-inspector-set-data-modal-save-button-background); + color: #fff; + font-weight: bold; + + &:hover { + background: var(--ck-inspector-set-data-modal-save-button-background-hover); + } + } + } + } + } +} diff --git a/src/components/seteditordatabutton.js b/src/components/seteditordatabutton.js new file mode 100644 index 0000000..0cac9a5 --- /dev/null +++ b/src/components/seteditordatabutton.js @@ -0,0 +1,132 @@ +/** + * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md. + */ + +/* global document */ + +import React, { Component } from 'react'; +import Modal from 'react-modal'; + +import Button from './button'; +import LoadDataIcon from '../assets/img/load-data.svg'; + +import './seteditordatabutton.css'; + +export default class SetEditorDataButton extends Component { + constructor( props ) { + super( props ); + + this.state = { + isModalOpen: false, + editorDataValue: '' + }; + + this.textarea = React.createRef(); + } + + render() { + return [ + + + + + + ]; + } + + _setEditorDataAndCloseModal() { + this.props.editor.setData( this.state.editorDataValue ); + + this._closeModal(); + } + + _closeModal() { + this.setState( { + isModalOpen: false + } ); + } + + _handlDataChange( evt ) { + this.setState( { + editorDataValue: evt.target.value + } ); + } + + _handleModalAfterOpen() { + this.setState( { + editorDataValue: this.props.editor.getData() + } ); + + this.textarea.current.select(); + } +} diff --git a/src/editorquickactions.js b/src/editorquickactions.js index 99cc54b..b05569e 100644 --- a/src/editorquickactions.js +++ b/src/editorquickactions.js @@ -9,6 +9,7 @@ import React, { Component } from 'react'; import { connect } from 'react-redux'; import copy from 'copy-to-clipboard'; +import SetEditorDataButton from './components/seteditordatabutton'; import Button from './components/button'; import SourceIcon from './assets/img/source.svg'; @@ -43,6 +44,7 @@ class EditorQuickActions extends Component { onClick={() => console.log( this.props.editor )} /> { this._getLogButton() } +