diff --git a/ui/src/dashboards/components/NoteEditor.tsx b/ui/src/dashboards/components/NoteEditor.tsx index 0b722f6b564..d0790154c88 100644 --- a/ui/src/dashboards/components/NoteEditor.tsx +++ b/ui/src/dashboards/components/NoteEditor.tsx @@ -1,5 +1,5 @@ // Libraries -import React, {PureComponent} from 'react' +import React, {PureComponent, MouseEvent} from 'react' import {connect} from 'react-redux' // Components @@ -38,9 +38,16 @@ interface OwnProps {} type Props = StateProps & DispatchProps & OwnProps -class NoteEditor extends PureComponent { +interface State { + scrollTop: number +} + +class NoteEditor extends PureComponent { + public state = {scrollTop: 0} + public render() { const {note, onSetNote} = this.props + const {scrollTop} = this.state return (
@@ -57,8 +64,17 @@ class NoteEditor extends PureComponent { {this.visibilityToggle}
- - + +
) @@ -81,6 +97,17 @@ class NoteEditor extends PureComponent { ) } + + private handleEditorScroll = (scrollTop: number) => { + this.setState({scrollTop}) + } + + private handlePreviewScroll = (e: MouseEvent) => { + const target = e.target as HTMLElement + const {scrollTop} = target + + this.setState({scrollTop}) + } } const mstp = (state: AppState) => { diff --git a/ui/src/dashboards/components/NoteEditorPreview.tsx b/ui/src/dashboards/components/NoteEditorPreview.tsx index 2767d8516ff..aa5980413e2 100644 --- a/ui/src/dashboards/components/NoteEditorPreview.tsx +++ b/ui/src/dashboards/components/NoteEditorPreview.tsx @@ -1,16 +1,22 @@ -import React, {SFC} from 'react' +import React, {SFC, MouseEvent} from 'react' import ReactMarkdown from 'react-markdown' import FancyScrollbar from 'src/shared/components/fancy_scrollbar/FancyScrollbar' interface Props { note: string + scrollTop: number + onScroll: (e: MouseEvent) => void } const NoteEditorPreview: SFC = props => { return (
- +
{} interface Props { note: string onChangeNote: (value: string) => void + onScroll: (scrollTop: number) => void + scrollTop: number } class NoteEditorText extends PureComponent { + private editor: IInstance + + public componentDidUpdate() { + const currentScrollTop = this.editor.getScrollInfo().top + if (this.props.scrollTop !== currentScrollTop) { + this.editor.scrollTo(0, this.props.scrollTop) + } + } + public render() { const {note} = this.props @@ -36,12 +48,14 @@ class NoteEditorText extends PureComponent { onBeforeChange={this.handleChange} onTouchStart={noOp} editorDidMount={this.handleMount} + onScroll={this.handleScroll} /> ) } private handleMount = (instance: IInstance) => { instance.focus() + this.editor = instance } private handleChange = (_, __, note: string) => { @@ -49,6 +63,12 @@ class NoteEditorText extends PureComponent { onChangeNote(note) } + + private handleScroll = (__: IInstance, scrollInfo: ScrollInfo) => { + const {onScroll} = this.props + + onScroll(scrollInfo.top) + } } export default NoteEditorText