diff --git a/ui/src/app/workflows/components/workflows-row/react-markdown-gfm.tsx b/ui/src/app/workflows/components/workflows-row/react-markdown-gfm.tsx new file mode 100644 index 000000000000..119f60b6e9f5 --- /dev/null +++ b/ui/src/app/workflows/components/workflows-row/react-markdown-gfm.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; + +import {openLinkWithKey} from '../../../shared/components/links'; + +export function ReactMarkdownGfm({markdown}: {markdown: string}) { + return ( + + {markdown} + + ); +} +export default ReactMarkdownGfm; // for lazy loading + +function NestedAnchor(props: React.ComponentProps<'a'>) { + return ( + { + ev.preventDefault(); // don't bubble up + openLinkWithKey(props.href); // eslint-disable-line react/prop-types -- it's not interpreting the prop types correctly + }} + /> + ); +} diff --git a/ui/src/app/workflows/components/workflows-row/workflows-row-name.tsx b/ui/src/app/workflows/components/workflows-row/workflows-row-name.tsx deleted file mode 100644 index 92b240daa5f7..000000000000 --- a/ui/src/app/workflows/components/workflows-row/workflows-row-name.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import * as kubernetes from 'argo-ui/src/models/kubernetes'; -import * as React from 'react'; -import ReactMarkdown from 'react-markdown'; -import remarkGfm from 'remark-gfm'; -import {ANNOTATION_DESCRIPTION, ANNOTATION_TITLE} from '../../../shared/annotations'; - -require('./workflows-row.scss'); - -export const WorkflowsRowName = ({metadata}: {metadata: kubernetes.ObjectMeta}) => { - const title = (metadata.annotations && metadata.annotations[ANNOTATION_TITLE]) || metadata.name; - const description = (metadata.annotations && metadata.annotations[ANNOTATION_DESCRIPTION] && `\n${metadata.annotations[ANNOTATION_DESCRIPTION]}`) || ''; - const markdown = `${title}${description}`; - return ( -
- - {markdown} - -
- ); -}; diff --git a/ui/src/app/workflows/components/workflows-row/workflows-row.scss b/ui/src/app/workflows/components/workflows-row/workflows-row.scss index 9e1f0bdeae04..fca441264981 100644 --- a/ui/src/app/workflows/components/workflows-row/workflows-row.scss +++ b/ui/src/app/workflows/components/workflows-row/workflows-row.scss @@ -3,20 +3,6 @@ .wf-rows-name { line-height: 1.5em; display: inline-block; - position: relative; - pointer-events: none; vertical-align: middle; white-space: pre-line; } -.overlay { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; -} -.wf-rows-name a { - pointer-events: all; - position: relative; - z-index: 1; -} diff --git a/ui/src/app/workflows/components/workflows-row/workflows-row.tsx b/ui/src/app/workflows/components/workflows-row/workflows-row.tsx index 7b6e04d1e2a1..5f8122bf551a 100644 --- a/ui/src/app/workflows/components/workflows-row/workflows-row.tsx +++ b/ui/src/app/workflows/components/workflows-row/workflows-row.tsx @@ -2,15 +2,19 @@ import {Ticker} from 'argo-ui/src/index'; import * as React from 'react'; import {useState} from 'react'; import {Link} from 'react-router-dom'; + import * as models from '../../../../models'; import {isArchivedWorkflow, Workflow} from '../../../../models'; +import {ANNOTATION_DESCRIPTION, ANNOTATION_TITLE} from '../../../shared/annotations'; import {uiUrl} from '../../../shared/base'; +import {Loading} from '../../../shared/components/loading'; import {DurationPanel} from '../../../shared/components/duration-panel'; import {PhaseIcon} from '../../../shared/components/phase-icon'; import {Timestamp} from '../../../shared/components/timestamp'; import {wfDuration} from '../../../shared/duration'; import {WorkflowDrawer} from '../workflow-drawer/workflow-drawer'; -import {WorkflowsRowName} from './workflows-row-name'; + +require('./workflows-row.scss'); interface WorkflowsRowProps { workflow: Workflow; @@ -23,7 +27,11 @@ interface WorkflowsRowProps { export function WorkflowsRow(props: WorkflowsRowProps) { const [hideDrawer, setHideDrawer] = useState(true); const wf = props.workflow; - const workflowLink = uiUrl(`workflows/${wf.metadata.namespace}/${wf.metadata.name}?uid=${wf.metadata.uid}`); + // title + description vars + const title = wf.metadata.annotations?.[ANNOTATION_TITLE] ?? wf.metadata.name; + const description = (wf.metadata.annotations?.[ANNOTATION_DESCRIPTION] && `\n${wf.metadata.annotations[ANNOTATION_DESCRIPTION]}`) || ''; + const hasAnnotation = title !== wf.metadata.name && description !== ''; + const markdown = `${title}${description}`; return (
@@ -42,16 +50,15 @@ export function WorkflowsRow(props: WorkflowsRowProps) { />
-
- - -
- +
+ +
{hasAnnotation ? : markdown}
+
{wf.metadata.namespace}
@@ -96,8 +103,21 @@ export function WorkflowsRow(props: WorkflowsRowProps) { ); })} {hideDrawer ? : } - +
); } + +// lazy load ReactMarkdown (and remark-gfm) as it is a large optional component (which can be split into a separate bundle) +const LazyReactMarkdownGfm = React.lazy(() => { + return import(/* webpackChunkName: "react-markdown-plus-gfm" */ './react-markdown-gfm'); +}); + +function SuspenseReactMarkdownGfm(props: {markdown: string}) { + return ( + }> + + + ); +}