diff --git a/web/client/components/TOC/fragments/settings/FeatureInfoEditor.jsx b/web/client/components/TOC/fragments/settings/FeatureInfoEditor.jsx index dcc4991f1d..9b124312f6 100644 --- a/web/client/components/TOC/fragments/settings/FeatureInfoEditor.jsx +++ b/web/client/components/TOC/fragments/settings/FeatureInfoEditor.jsx @@ -7,6 +7,7 @@ */ const React = require('react'); +const PropTypes = require('prop-types'); const ReactQuill = require('react-quill'); const ResizableModal = require('../../../misc/ResizableModal'); const Portal = require('../../../misc/Portal'); @@ -31,38 +32,76 @@ Quill.register({ * @prop {bool} enableIFrameModule enable iframe in editor, default true */ -module.exports = ({onShowEditor = () => {}, showEditor, element = {}, onChange = () => {}, enableIFrameModule = true}) =>( - - } - size="lg" - showFullscreen - clickOutEnabled={false} - onClose={() => onShowEditor(!showEditor)} - buttons={[ - { - bsStyle: 'primary', - text: , - onClick: () => onShowEditor(!showEditor) - } - ]}> -
- { - onChange('featureInfo', { - ...(element && element.featureInfo || {}), - template - }); - }}/> -
-
-
-); +class FeatureInfoEditor extends React.Component { + + static propTypes = { + showEditor: PropTypes.bool, + element: PropTypes.object, + onChange: PropTypes.func, + onShowEditor: PropTypes.func, + enableIFrameModule: PropTypes.bool + }; + + static defaultProps = { + showEditor: false, + element: {}, + enableIFrameModule: false, + onChange: () => {}, + onShowEditor: () => {} + }; + + state = { + template: ' ' + }; + + componentWillMount() { + this.setState({ + template: this.props.element && this.props.element.featureInfo && this.props.element.featureInfo.template || ' ' + }); + } + + render() { + const { showEditor, enableIFrameModule = true } = this.props; + return ( + + } + size="lg" + showFullscreen + clickOutEnabled={false} + onClose={() => this.close()} + buttons={[ + { + bsStyle: 'primary', + text: , + onClick: () => this.close() + } + ]}> +
+ { if (quill) { this.quill = quill; } } } + modules={enableIFrameModule ? { + resizeModule: {}, + toolbar: toolbarConfig + } : {}} + defaultValue={this.state.template} + onChange={template => this.setState({ template })}/> +
+
+
+ ); + } + + close = () => { + this.props.onShowEditor(!this.props.showEditor); + this.props.onChange('featureInfo', { + ...(this.props.element && this.props.element.featureInfo || {}), + template: this.state.template + }); + }; +} + +module.exports = FeatureInfoEditor; diff --git a/web/client/components/TOC/fragments/settings/__tests__/FeatureInfoEditor-test.jsx b/web/client/components/TOC/fragments/settings/__tests__/FeatureInfoEditor-test.jsx index a8070dae35..ccb0d2c688 100644 --- a/web/client/components/TOC/fragments/settings/__tests__/FeatureInfoEditor-test.jsx +++ b/web/client/components/TOC/fragments/settings/__tests__/FeatureInfoEditor-test.jsx @@ -30,35 +30,67 @@ describe("test FeatureInfoEditor", () => { }); it('test rendering close x', () => { + const template = '

html

'; const testHandlers = { - onShowEditor: () => {} + onShowEditor: () => {}, + onChange: () => {} }; const spyOnShowEditor = expect.spyOn(testHandlers, 'onShowEditor'); + const spyOnChange = expect.spyOn(testHandlers, 'onChange'); - ReactDOM.render(, document.getElementById("container")); + const cmp = ReactDOM.render(, document.getElementById("container")); const modalEditor = document.getElementsByClassName('ms-resizable-modal'); expect(modalEditor.length).toBe(1); + + // edit template + const editor = cmp.quill.getEditor(); + editor.clipboard.dangerouslyPasteHTML(template); + expect(spyOnChange).toNotHaveBeenCalled(); + spyOnChange.reset(); + const btns = document.getElementsByClassName('ms-header-btn'); expect(btns.length).toBe(2); TestUtils.Simulate.click(btns[1]); expect(spyOnShowEditor).toHaveBeenCalled(); + + expect(spyOnShowEditor).toHaveBeenCalled(); + expect(spyOnChange.calls[0].arguments).toEqual([ 'featureInfo', { template } ]); }); it('test rendering close button', () => { + const template = '

html

'; + const testHandlers = { - onShowEditor: () => {} + onShowEditor: () => {}, + onChange: () => {} }; + const spyOnShowEditor = expect.spyOn(testHandlers, 'onShowEditor'); + const spyOnChange = expect.spyOn(testHandlers, 'onChange'); - ReactDOM.render(, document.getElementById("container")); + const cmp = ReactDOM.render(, document.getElementById("container")); const modalEditor = document.getElementsByClassName('ms-resizable-modal'); expect(modalEditor.length).toBe(1); + + // edit template + const editor = cmp.quill.getEditor(); + editor.clipboard.dangerouslyPasteHTML(template); + expect(spyOnChange).toNotHaveBeenCalled(); + spyOnChange.reset(); + const btns = document.getElementsByClassName('btn'); expect(btns.length).toBe(1); TestUtils.Simulate.click(btns[0]); expect(spyOnShowEditor).toHaveBeenCalled(); + expect(spyOnChange.calls[0].arguments).toEqual([ 'featureInfo', { template } ]); }); });