mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-05-14 15:14:56 -04:00
Move yaml-array warning to documentrenderpane (#916)
Signed-off-by: Tilman Vatteroth <tilman.vatteroth@tu-dortmund.de>
This commit is contained in:
parent
dc8ac6e3d8
commit
4459dc742f
4 changed files with 57 additions and 25 deletions
|
@ -4,18 +4,22 @@ SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file)
|
||||||
SPDX-License-Identifier: AGPL-3.0-only
|
SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { RefObject, useState } from 'react'
|
import { TocAst } from 'markdown-it-toc-done-right'
|
||||||
import { Dropdown } from 'react-bootstrap'
|
import React, { RefObject, useRef, useState } from 'react'
|
||||||
|
import { Alert, Dropdown } from 'react-bootstrap'
|
||||||
|
import { Trans } from 'react-i18next'
|
||||||
import { useSelector } from 'react-redux'
|
import { useSelector } from 'react-redux'
|
||||||
import useResizeObserver from 'use-resize-observer'
|
import useResizeObserver from 'use-resize-observer'
|
||||||
import { TocAst } from 'markdown-it-toc-done-right'
|
import links from '../../../links.json'
|
||||||
import { ApplicationState } from '../../../redux'
|
import { ApplicationState } from '../../../redux'
|
||||||
import { ForkAwesomeIcon } from '../../common/fork-awesome/fork-awesome-icon'
|
import { ForkAwesomeIcon } from '../../common/fork-awesome/fork-awesome-icon'
|
||||||
|
import { TranslatedExternalLink } from '../../common/links/translated-external-link'
|
||||||
import { ShowIf } from '../../common/show-if/show-if'
|
import { ShowIf } from '../../common/show-if/show-if'
|
||||||
import { FullMarkdownRenderer } from '../../markdown-renderer/full-markdown-renderer'
|
import { FullMarkdownRenderer } from '../../markdown-renderer/full-markdown-renderer'
|
||||||
import { LineMarkerPosition } from '../../markdown-renderer/types'
|
import { LineMarkerPosition } from '../../markdown-renderer/types'
|
||||||
import { TableOfContents } from '../table-of-contents/table-of-contents'
|
import { TableOfContents } from '../table-of-contents/table-of-contents'
|
||||||
import { YAMLMetaData } from '../yaml-metadata/yaml-metadata'
|
import { YAMLMetaData } from '../yaml-metadata/yaml-metadata'
|
||||||
|
import { useAdaptedLineMarkerCallback } from './use-adapted-line-markers-callback'
|
||||||
|
|
||||||
export interface DocumentRenderPaneProps {
|
export interface DocumentRenderPaneProps {
|
||||||
extraClasses?: string
|
extraClasses?: string
|
||||||
|
@ -25,7 +29,7 @@ export interface DocumentRenderPaneProps {
|
||||||
onMouseEnterRenderer?: () => void
|
onMouseEnterRenderer?: () => void
|
||||||
onScrollRenderer?: () => void
|
onScrollRenderer?: () => void
|
||||||
onTaskCheckedChange: (lineInMarkdown: number, checked: boolean) => void
|
onTaskCheckedChange: (lineInMarkdown: number, checked: boolean) => void
|
||||||
rendererReference?: RefObject<HTMLDivElement>
|
documentRenderPaneRef?: RefObject<HTMLDivElement>
|
||||||
wide?: boolean
|
wide?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,29 +41,42 @@ export const DocumentRenderPane: React.FC<DocumentRenderPaneProps> = ({
|
||||||
onMouseEnterRenderer,
|
onMouseEnterRenderer,
|
||||||
onScrollRenderer,
|
onScrollRenderer,
|
||||||
onTaskCheckedChange,
|
onTaskCheckedChange,
|
||||||
rendererReference,
|
documentRenderPaneRef,
|
||||||
wide
|
wide
|
||||||
}) => {
|
}) => {
|
||||||
const [tocAst, setTocAst] = useState<TocAst>()
|
const [tocAst, setTocAst] = useState<TocAst>()
|
||||||
const { width } = useResizeObserver(rendererReference ? { ref: rendererReference } : undefined)
|
const { width } = useResizeObserver(documentRenderPaneRef ? { ref: documentRenderPaneRef } : undefined)
|
||||||
const realWidth = width || 0
|
const realWidth = width || 0
|
||||||
|
const rendererRef = useRef<HTMLDivElement|null>(null)
|
||||||
const markdownContent = useSelector((state: ApplicationState) => state.documentContent.content)
|
const markdownContent = useSelector((state: ApplicationState) => state.documentContent.content)
|
||||||
|
const yamlDeprecatedTags = useSelector((state: ApplicationState) => state.documentContent.metadata.deprecatedTagsSyntax)
|
||||||
|
const changeLineMarker = useAdaptedLineMarkerCallback(documentRenderPaneRef, rendererRef, onLineMarkerPositionChanged)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={`bg-light flex-fill pb-5 flex-row d-flex w-100 h-100 ${extraClasses ?? ''}`}
|
<div className={`bg-light flex-fill pb-5 flex-row d-flex w-100 h-100 ${extraClasses ?? ''}`}
|
||||||
ref={rendererReference} onScroll={onScrollRenderer} onMouseEnter={onMouseEnterRenderer}>
|
ref={documentRenderPaneRef} onScroll={onScrollRenderer} onMouseEnter={onMouseEnterRenderer}>
|
||||||
<div className={'col-md'}/>
|
<div className={'col-md'}/>
|
||||||
<div className={'bg-light flex-fill'}>
|
<div className={'bg-light flex-fill'}>
|
||||||
|
<ShowIf condition={yamlDeprecatedTags}>
|
||||||
|
<Alert variant='warning' dir='auto'>
|
||||||
|
<Trans i18nKey='editor.deprecatedTags' />
|
||||||
|
<br/>
|
||||||
|
<TranslatedExternalLink i18nKey={'common.readForMoreInfo'} href={links.faq} className={'text-primary'}/>
|
||||||
|
</Alert>
|
||||||
|
</ShowIf>
|
||||||
|
<div >
|
||||||
<FullMarkdownRenderer
|
<FullMarkdownRenderer
|
||||||
|
rendererRef={rendererRef}
|
||||||
className={'flex-fill mb-3'}
|
className={'flex-fill mb-3'}
|
||||||
content={markdownContent}
|
content={markdownContent}
|
||||||
onFirstHeadingChange={onFirstHeadingChange}
|
onFirstHeadingChange={onFirstHeadingChange}
|
||||||
onLineMarkerPositionChanged={onLineMarkerPositionChanged}
|
onLineMarkerPositionChanged={changeLineMarker}
|
||||||
onMetaDataChange={onMetadataChange}
|
onMetaDataChange={onMetadataChange}
|
||||||
onTaskCheckedChange={onTaskCheckedChange}
|
onTaskCheckedChange={onTaskCheckedChange}
|
||||||
onTocChange={(tocAst) => setTocAst(tocAst)}
|
onTocChange={(tocAst) => setTocAst(tocAst)}
|
||||||
wide={wide}
|
wide={wide}
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={'col-md'}>
|
<div className={'col-md'}>
|
||||||
|
|
|
@ -33,7 +33,7 @@ export const ScrollingDocumentRenderPane: React.FC<DocumentRenderPaneProps & Scr
|
||||||
return (
|
return (
|
||||||
<DocumentRenderPane
|
<DocumentRenderPane
|
||||||
extraClasses={'overflow-y-scroll'}
|
extraClasses={'overflow-y-scroll'}
|
||||||
rendererReference={renderer}
|
documentRenderPaneRef={renderer}
|
||||||
wide={wide}
|
wide={wide}
|
||||||
onFirstHeadingChange={onFirstHeadingChange}
|
onFirstHeadingChange={onFirstHeadingChange}
|
||||||
onLineMarkerPositionChanged={setLineMarks}
|
onLineMarkerPositionChanged={setLineMarks}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file)
|
||||||
|
|
||||||
|
SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { RefObject, useCallback } from 'react'
|
||||||
|
import { LineMarkerPosition } from '../../markdown-renderer/types'
|
||||||
|
|
||||||
|
export const useAdaptedLineMarkerCallback = (documentRenderPaneRef: RefObject<HTMLDivElement> | undefined,
|
||||||
|
rendererRef: RefObject<HTMLDivElement | null>,
|
||||||
|
onLineMarkerPositionChanged: ((lineMarkerPosition: LineMarkerPosition[]) => void) | undefined): ((lineMarkerPosition: LineMarkerPosition[]) => void) => {
|
||||||
|
return useCallback((linkMarkerPositions) => {
|
||||||
|
if (!onLineMarkerPositionChanged) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const documentRenderPaneTop = (documentRenderPaneRef?.current?.offsetTop ?? 0)
|
||||||
|
const rendererTop = (rendererRef.current?.offsetTop ?? 0)
|
||||||
|
const offset = rendererTop - documentRenderPaneTop
|
||||||
|
onLineMarkerPositionChanged(linkMarkerPositions.map(oldMarker => ({
|
||||||
|
line: oldMarker.line,
|
||||||
|
position: oldMarker.position + offset
|
||||||
|
})))
|
||||||
|
}, [documentRenderPaneRef, onLineMarkerPositionChanged, rendererRef])
|
||||||
|
}
|
|
@ -4,15 +4,11 @@ SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file)
|
||||||
SPDX-License-Identifier: AGPL-3.0-only
|
SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { useCallback, useMemo, useRef, useState } from 'react'
|
import { TocAst } from 'markdown-it-toc-done-right'
|
||||||
|
import React, { RefObject, useCallback, useMemo, useRef, useState } from 'react'
|
||||||
import { Alert } from 'react-bootstrap'
|
import { Alert } from 'react-bootstrap'
|
||||||
import { Trans, useTranslation } from 'react-i18next'
|
import { Trans, useTranslation } from 'react-i18next'
|
||||||
import { TocAst } from 'markdown-it-toc-done-right'
|
|
||||||
import { useSelector } from 'react-redux'
|
|
||||||
import { ApplicationState } from '../../redux'
|
|
||||||
import { InternalLink } from '../common/links/internal-link'
|
import { InternalLink } from '../common/links/internal-link'
|
||||||
import links from '../../links.json'
|
|
||||||
import { TranslatedExternalLink } from '../common/links/translated-external-link'
|
|
||||||
import { ShowIf } from '../common/show-if/show-if'
|
import { ShowIf } from '../common/show-if/show-if'
|
||||||
import { RawYAMLMetadata, YAMLMetaData } from '../editor/yaml-metadata/yaml-metadata'
|
import { RawYAMLMetadata, YAMLMetaData } from '../editor/yaml-metadata/yaml-metadata'
|
||||||
import { BasicMarkdownRenderer } from './basic-markdown-renderer'
|
import { BasicMarkdownRenderer } from './basic-markdown-renderer'
|
||||||
|
@ -31,6 +27,7 @@ export interface FullMarkdownRendererProps {
|
||||||
onMetaDataChange?: (yamlMetaData: YAMLMetaData | undefined) => void
|
onMetaDataChange?: (yamlMetaData: YAMLMetaData | undefined) => void
|
||||||
onTaskCheckedChange?: (lineInMarkdown: number, checked: boolean) => void
|
onTaskCheckedChange?: (lineInMarkdown: number, checked: boolean) => void
|
||||||
onTocChange?: (ast: TocAst) => void
|
onTocChange?: (ast: TocAst) => void
|
||||||
|
rendererRef?: RefObject<HTMLDivElement>
|
||||||
}
|
}
|
||||||
|
|
||||||
export const FullMarkdownRenderer: React.FC<FullMarkdownRendererProps & AdditionalMarkdownRendererProps> = ({
|
export const FullMarkdownRenderer: React.FC<FullMarkdownRendererProps & AdditionalMarkdownRendererProps> = ({
|
||||||
|
@ -41,13 +38,13 @@ export const FullMarkdownRenderer: React.FC<FullMarkdownRendererProps & Addition
|
||||||
onTocChange,
|
onTocChange,
|
||||||
content,
|
content,
|
||||||
className,
|
className,
|
||||||
wide
|
wide,
|
||||||
|
rendererRef
|
||||||
}) => {
|
}) => {
|
||||||
const allReplacers = useReplacerInstanceListCreator(onTaskCheckedChange)
|
const allReplacers = useReplacerInstanceListCreator(onTaskCheckedChange)
|
||||||
useTranslation()
|
useTranslation()
|
||||||
|
|
||||||
const [yamlError, setYamlError] = useState(false)
|
const [yamlError, setYamlError] = useState(false)
|
||||||
const yamlDeprecatedTags = useSelector((state: ApplicationState) => state.documentContent.metadata.deprecatedTagsSyntax)
|
|
||||||
|
|
||||||
const rawMetaRef = useRef<RawYAMLMetadata>()
|
const rawMetaRef = useRef<RawYAMLMetadata>()
|
||||||
const firstHeadingRef = useRef<string>()
|
const firstHeadingRef = useRef<string>()
|
||||||
|
@ -81,7 +78,7 @@ export const FullMarkdownRenderer: React.FC<FullMarkdownRendererProps & Addition
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={'position-relative'}>
|
<div ref={rendererRef} className={'position-relative'}>
|
||||||
<ShowIf condition={yamlError}>
|
<ShowIf condition={yamlError}>
|
||||||
<Alert variant='warning' dir='auto'>
|
<Alert variant='warning' dir='auto'>
|
||||||
<Trans i18nKey='editor.invalidYaml'>
|
<Trans i18nKey='editor.invalidYaml'>
|
||||||
|
@ -89,13 +86,6 @@ export const FullMarkdownRenderer: React.FC<FullMarkdownRendererProps & Addition
|
||||||
</Trans>
|
</Trans>
|
||||||
</Alert>
|
</Alert>
|
||||||
</ShowIf>
|
</ShowIf>
|
||||||
<ShowIf condition={yamlDeprecatedTags}>
|
|
||||||
<Alert variant='warning' dir='auto'>
|
|
||||||
<Trans i18nKey='editor.deprecatedTags' />
|
|
||||||
<br/>
|
|
||||||
<TranslatedExternalLink i18nKey={'common.readForMoreInfo'} href={links.faq} className={'text-primary'}/>
|
|
||||||
</Alert>
|
|
||||||
</ShowIf>
|
|
||||||
<BasicMarkdownRenderer className={className} wide={wide} content={content} componentReplacers={allReplacers}
|
<BasicMarkdownRenderer className={className} wide={wide} content={content} componentReplacers={allReplacers}
|
||||||
markdownIt={markdownIt} documentReference={documentElement}
|
markdownIt={markdownIt} documentReference={documentElement}
|
||||||
onBeforeRendering={clearMetadata}/>
|
onBeforeRendering={clearMetadata}/>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue