From 8247a32fcfc4fad523360abe33135f061b5bd7f7 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 3 Nov 2023 20:47:35 +0000 Subject: [PATCH 01/10] hi --- .../src/components/Resources/ResourceCard.tsx | 3 ++- .../Resources/Resources.stories.tsx | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/site/src/components/Resources/ResourceCard.tsx b/site/src/components/Resources/ResourceCard.tsx index f5c0779d68a29..bfdff84b2aa13 100644 --- a/site/src/components/Resources/ResourceCard.tsx +++ b/site/src/components/Resources/ResourceCard.tsx @@ -8,6 +8,7 @@ import { CopyableValue } from "components/CopyableValue/CopyableValue"; import { Stack } from "../Stack/Stack"; import { ResourceAvatar } from "./ResourceAvatar"; import { SensitiveValue } from "./SensitiveValue"; +import { MemoizedMarkdown } from "components/Markdown/Markdown"; const styles = { resourceCard: (theme) => ({ @@ -137,7 +138,7 @@ export const ResourceCard: FC = ({ resource, agentRow }) => { ) : ( - {meta.value} + {meta.value} )} diff --git a/site/src/components/Resources/Resources.stories.tsx b/site/src/components/Resources/Resources.stories.tsx index 7e107b79ad315..2d3ba077c5f08 100644 --- a/site/src/components/Resources/Resources.stories.tsx +++ b/site/src/components/Resources/Resources.stories.tsx @@ -58,6 +58,25 @@ const reallyLong = { sensitive: false, }; +export const Markdown: Story = { + args: { + resources: [ + { + ...nullDevice, + type: "workspace", + id: "1", + name: "Workspace", + metadata: [ + { key: "text", value: "hello", sensitive: false }, + { key: "link", value: "[hello](hello)", sensitive: false }, + { key: "heading", value: "# hello", sensitive: false }, + { key: "image", value: "![go](/icon/go.svg)", sensitive: false }, + ], + }, + ], + }, +}; + export const BunchOfDevicesWithMetadata: Story = { args: { resources: [ From 0f604a902d93791fae0a571e08c6a9283dd977ff Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 3 Nov 2023 22:07:06 +0000 Subject: [PATCH 02/10] yuh --- site/src/components/Markdown/Markdown.tsx | 43 +++++++++++++++++++ .../src/components/Resources/ResourceCard.tsx | 6 ++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/site/src/components/Markdown/Markdown.tsx b/site/src/components/Markdown/Markdown.tsx index 5391e965172bb..77a7f7be9649c 100644 --- a/site/src/components/Markdown/Markdown.tsx +++ b/site/src/components/Markdown/Markdown.tsx @@ -113,7 +113,50 @@ export const Markdown: FC = (props) => { ); }; +/** + * Supports a strict subset of Markdown that bahaves well as inline/confined content. + */ +export const InlineMarkdown: FC = (props) => { + const { children, className } = props; + + return ( + ( + + {children} + + ), + + pre: ({ children }) =>
{children}
, + + code: ({ node, className, children, style, ...props }) => ( + ({ + padding: "1px 4px", + background: theme.palette.divider, + borderRadius: 4, + color: theme.palette.text.primary, + fontSize: 14, + })} + {...props} + > + {children} + + ), + }} + > + {children} +
+ ); +}; + export const MemoizedMarkdown = memo(Markdown); +export const MemoizedInlineMarkdown = memo(InlineMarkdown); const markdownStyles: Interpolation = (theme: Theme) => ({ fontSize: 16, diff --git a/site/src/components/Resources/ResourceCard.tsx b/site/src/components/Resources/ResourceCard.tsx index bfdff84b2aa13..f94e59cac662b 100644 --- a/site/src/components/Resources/ResourceCard.tsx +++ b/site/src/components/Resources/ResourceCard.tsx @@ -8,7 +8,7 @@ import { CopyableValue } from "components/CopyableValue/CopyableValue"; import { Stack } from "../Stack/Stack"; import { ResourceAvatar } from "./ResourceAvatar"; import { SensitiveValue } from "./SensitiveValue"; -import { MemoizedMarkdown } from "components/Markdown/Markdown"; +import { MemoizedInlineMarkdown } from "components/Markdown/Markdown"; const styles = { resourceCard: (theme) => ({ @@ -138,7 +138,9 @@ export const ResourceCard: FC = ({ resource, agentRow }) => { ) : ( - {meta.value} + + {meta.value} + )} From cf77df812b82739a7f0f220a6311b0f1f2687fae Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 3 Nov 2023 22:14:47 +0000 Subject: [PATCH 03/10] update story --- .../components/Resources/Resources.stories.tsx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/site/src/components/Resources/Resources.stories.tsx b/site/src/components/Resources/Resources.stories.tsx index 2d3ba077c5f08..8bca35c22e7d6 100644 --- a/site/src/components/Resources/Resources.stories.tsx +++ b/site/src/components/Resources/Resources.stories.tsx @@ -68,8 +68,22 @@ export const Markdown: Story = { name: "Workspace", metadata: [ { key: "text", value: "hello", sensitive: false }, - { key: "link", value: "[hello](hello)", sensitive: false }, - { key: "heading", value: "# hello", sensitive: false }, + { key: "link", value: "[hello](#)", sensitive: false }, + { key: "b/i", value: "_hello_, **friend**!", sensitive: false }, + { key: "coder", value: "`beep boop`", sensitive: false }, + { key: "heading", value: "# HI", sensitive: false }, // unsupported + { key: "image", value: "![go](/icon/go.svg)", sensitive: false }, // unsupported + ], + }, + + // bits of Markdown that are intentionally not supported here + { + ...nullDevice, + type: "unsupported", + id: "2", + name: "Unsupported", + metadata: [ + { key: "heading", value: "# HI", sensitive: false }, { key: "image", value: "![go](/icon/go.svg)", sensitive: false }, ], }, From d96380870e67dacf55f60037084536f721f04e84 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 3 Nov 2023 22:15:20 +0000 Subject: [PATCH 04/10] ohp --- site/src/components/Resources/Resources.stories.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/site/src/components/Resources/Resources.stories.tsx b/site/src/components/Resources/Resources.stories.tsx index 8bca35c22e7d6..8cc770490851b 100644 --- a/site/src/components/Resources/Resources.stories.tsx +++ b/site/src/components/Resources/Resources.stories.tsx @@ -71,8 +71,6 @@ export const Markdown: Story = { { key: "link", value: "[hello](#)", sensitive: false }, { key: "b/i", value: "_hello_, **friend**!", sensitive: false }, { key: "coder", value: "`beep boop`", sensitive: false }, - { key: "heading", value: "# HI", sensitive: false }, // unsupported - { key: "image", value: "![go](/icon/go.svg)", sensitive: false }, // unsupported ], }, From d0620363d0663ad4ed7398fdd747bbdec6c654f7 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Fri, 3 Nov 2023 22:31:29 +0000 Subject: [PATCH 05/10] nice --- site/src/components/Markdown/Markdown.tsx | 4 +--- site/src/components/Resources/Resources.stories.tsx | 7 +++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/site/src/components/Markdown/Markdown.tsx b/site/src/components/Markdown/Markdown.tsx index 77a7f7be9649c..123e948e9b3a6 100644 --- a/site/src/components/Markdown/Markdown.tsx +++ b/site/src/components/Markdown/Markdown.tsx @@ -123,7 +123,7 @@ export const InlineMarkdown: FC = (props) => { ( @@ -132,8 +132,6 @@ export const InlineMarkdown: FC = (props) => { ), - pre: ({ children }) =>
{children}
, - code: ({ node, className, children, style, ...props }) => ( ({ diff --git a/site/src/components/Resources/Resources.stories.tsx b/site/src/components/Resources/Resources.stories.tsx index 8cc770490851b..32cde805cfcbe 100644 --- a/site/src/components/Resources/Resources.stories.tsx +++ b/site/src/components/Resources/Resources.stories.tsx @@ -81,6 +81,13 @@ export const Markdown: Story = { id: "2", name: "Unsupported", metadata: [ + { + key: "multiple paragraphs", + value: `home, + +home on the range`, + sensitive: false, + }, { key: "heading", value: "# HI", sensitive: false }, { key: "image", value: "![go](/icon/go.svg)", sensitive: false }, ], From b53d1a5ae773dd85242256862c8f77ddd688e2e8 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Mon, 6 Nov 2023 19:27:37 +0000 Subject: [PATCH 06/10] make only simple text copyable --- site/src/components/Markdown/Markdown.tsx | 28 +++++++++++++++---- .../src/components/Resources/ResourceCard.tsx | 21 +++++++++----- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/site/src/components/Markdown/Markdown.tsx b/site/src/components/Markdown/Markdown.tsx index 123e948e9b3a6..8f00581fe160b 100644 --- a/site/src/components/Markdown/Markdown.tsx +++ b/site/src/components/Markdown/Markdown.tsx @@ -5,13 +5,13 @@ import TableCell from "@mui/material/TableCell"; import TableContainer from "@mui/material/TableContainer"; import TableHead from "@mui/material/TableHead"; import TableRow from "@mui/material/TableRow"; -import { FC, memo } from "react"; -import ReactMarkdown from "react-markdown"; +import { type Interpolation, type Theme } from "@emotion/react"; +import { type FC, memo } from "react"; +import ReactMarkdown, { type Options } from "react-markdown"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import gfm from "remark-gfm"; import { colors } from "theme/colors"; import { darcula } from "react-syntax-highlighter/dist/cjs/styles/prism"; -import { type Interpolation, type Theme } from "@emotion/react"; interface MarkdownProps { /** @@ -113,19 +113,35 @@ export const Markdown: FC = (props) => { ); }; +interface MarkdownProps { + /** + * The Markdown text to parse and render + */ + children: string; + + className?: string; + + /** + * Can override the behavior of the generated elements + */ + components?: Options["components"]; +} + /** * Supports a strict subset of Markdown that bahaves well as inline/confined content. */ export const InlineMarkdown: FC = (props) => { - const { children, className } = props; + const { children, className, components = {} } = props; return ( <>{children}, + a: ({ href, target, children }) => ( {children} @@ -146,6 +162,8 @@ export const InlineMarkdown: FC = (props) => { {children} ), + + ...components, }} > {children} diff --git a/site/src/components/Resources/ResourceCard.tsx b/site/src/components/Resources/ResourceCard.tsx index f94e59cac662b..3f0c6418dc398 100644 --- a/site/src/components/Resources/ResourceCard.tsx +++ b/site/src/components/Resources/ResourceCard.tsx @@ -1,8 +1,9 @@ -import { type FC, useState } from "react"; +import { type FC, useState, PropsWithChildren } from "react"; import IconButton from "@mui/material/IconButton"; import Tooltip from "@mui/material/Tooltip"; import { type CSSObject, type Interpolation, type Theme } from "@emotion/react"; -import { WorkspaceAgent, WorkspaceResource } from "api/typesGenerated"; +import { Children } from "react"; +import type { WorkspaceAgent, WorkspaceResource } from "api/typesGenerated"; import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; import { CopyableValue } from "components/CopyableValue/CopyableValue"; import { Stack } from "../Stack/Stack"; @@ -73,6 +74,14 @@ export interface ResourceCardProps { agentRow: (agent: WorkspaceAgent) => JSX.Element; } +const p = ({ children }: PropsWithChildren) => { + const childrens = Children.toArray(children); + if (childrens.every((child) => typeof child === "string")) { + return {children}; + } + return <>{children}; +}; + export const ResourceCard: FC = ({ resource, agentRow }) => { const [shouldDisplayAllMetadata, setShouldDisplayAllMetadata] = useState(false); @@ -137,11 +146,9 @@ export const ResourceCard: FC = ({ resource, agentRow }) => { {meta.sensitive ? ( ) : ( - - - {meta.value} - - + + {meta.value} + )} From 73acdc8ef6baae9ed8f87f4d93b6562b593a4302 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Mon, 6 Nov 2023 20:03:53 +0000 Subject: [PATCH 07/10] wot --- site/src/components/Markdown/Markdown.tsx | 4 ++-- site/src/components/Resources/ResourceCard.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/site/src/components/Markdown/Markdown.tsx b/site/src/components/Markdown/Markdown.tsx index 87c2c2e8440ac..5ee58aed6818a 100644 --- a/site/src/components/Markdown/Markdown.tsx +++ b/site/src/components/Markdown/Markdown.tsx @@ -113,7 +113,7 @@ export const Markdown: FC = (props) => { ); }; -interface MarkdownProps { +interface MarkdownInlineProps { /** * The Markdown text to parse and render */ @@ -130,7 +130,7 @@ interface MarkdownProps { /** * Supports a strict subset of Markdown that bahaves well as inline/confined content. */ -export const InlineMarkdown: FC = (props) => { +export const InlineMarkdown: FC = (props) => { const { children, className, components = {} } = props; return ( diff --git a/site/src/components/Resources/ResourceCard.tsx b/site/src/components/Resources/ResourceCard.tsx index 03437881f824e..b3f754d867cb6 100644 --- a/site/src/components/Resources/ResourceCard.tsx +++ b/site/src/components/Resources/ResourceCard.tsx @@ -1,4 +1,4 @@ -import { type FC, useState, PropsWithChildren } from "react"; +import { type FC, type PropsWithChildren, useState } from "react"; import IconButton from "@mui/material/IconButton"; import Tooltip from "@mui/material/Tooltip"; import { type CSSObject, type Interpolation, type Theme } from "@emotion/react"; From bcda534920bfa0de2d1ab10150a3eacc80e3dbd7 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Mon, 6 Nov 2023 22:54:01 +0000 Subject: [PATCH 08/10] =?UTF-8?q?=E2=9C=A8=20references=20=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/src/components/Resources/ResourceCard.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/site/src/components/Resources/ResourceCard.tsx b/site/src/components/Resources/ResourceCard.tsx index b3f754d867cb6..600e719846ee5 100644 --- a/site/src/components/Resources/ResourceCard.tsx +++ b/site/src/components/Resources/ResourceCard.tsx @@ -74,12 +74,16 @@ export interface ResourceCardProps { agentRow: (agent: WorkspaceAgent) => JSX.Element; } -const p = ({ children }: PropsWithChildren) => { - const childrens = Children.toArray(children); - if (childrens.every((child) => typeof child === "string")) { - return {children}; - } - return <>{children}; +const markdownComponents = { + p: ({ children }: PropsWithChildren) => { + const childrens = Children.toArray(children); + if (childrens.every((child) => typeof child === "string")) { + return ( + {children} + ); + } + return <>{children}; + }, }; export const ResourceCard: FC = ({ resource, agentRow }) => { @@ -146,7 +150,7 @@ export const ResourceCard: FC = ({ resource, agentRow }) => { {meta.sensitive ? ( ) : ( - + {meta.value} )} From 653ff5f100aab4307af6f3c46666d98f93a8a441 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 7 Nov 2023 16:54:38 +0000 Subject: [PATCH 09/10] use `_.isEqual` for `memo` --- site/src/components/Markdown/Markdown.tsx | 14 +++++++++++--- site/src/components/Resources/ResourceCard.tsx | 18 +++++++----------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/site/src/components/Markdown/Markdown.tsx b/site/src/components/Markdown/Markdown.tsx index 5ee58aed6818a..9bac401ca19a2 100644 --- a/site/src/components/Markdown/Markdown.tsx +++ b/site/src/components/Markdown/Markdown.tsx @@ -6,6 +6,7 @@ import TableContainer from "@mui/material/TableContainer"; import TableHead from "@mui/material/TableHead"; import TableRow from "@mui/material/TableRow"; import { type Interpolation, type Theme } from "@emotion/react"; +import isEqual from "lodash/isEqual"; import { type FC, memo } from "react"; import ReactMarkdown, { type Options } from "react-markdown"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; @@ -20,10 +21,15 @@ interface MarkdownProps { children: string; className?: string; + + /** + * Can override the behavior of the generated elements + */ + components?: Options["components"]; } export const Markdown: FC = (props) => { - const { children, className } = props; + const { children, className, components = {} } = props; return ( = (props) => { th: ({ children }) => { return {children}; }, + + ...components, }} > {children} @@ -171,8 +179,8 @@ export const InlineMarkdown: FC = (props) => { ); }; -export const MemoizedMarkdown = memo(Markdown); -export const MemoizedInlineMarkdown = memo(InlineMarkdown); +export const MemoizedMarkdown = memo(Markdown, isEqual); +export const MemoizedInlineMarkdown = memo(InlineMarkdown, isEqual); const markdownStyles: Interpolation = (theme: Theme) => ({ fontSize: 16, diff --git a/site/src/components/Resources/ResourceCard.tsx b/site/src/components/Resources/ResourceCard.tsx index 600e719846ee5..b3f754d867cb6 100644 --- a/site/src/components/Resources/ResourceCard.tsx +++ b/site/src/components/Resources/ResourceCard.tsx @@ -74,16 +74,12 @@ export interface ResourceCardProps { agentRow: (agent: WorkspaceAgent) => JSX.Element; } -const markdownComponents = { - p: ({ children }: PropsWithChildren) => { - const childrens = Children.toArray(children); - if (childrens.every((child) => typeof child === "string")) { - return ( - {children} - ); - } - return <>{children}; - }, +const p = ({ children }: PropsWithChildren) => { + const childrens = Children.toArray(children); + if (childrens.every((child) => typeof child === "string")) { + return {children}; + } + return <>{children}; }; export const ResourceCard: FC = ({ resource, agentRow }) => { @@ -150,7 +146,7 @@ export const ResourceCard: FC = ({ resource, agentRow }) => { {meta.sensitive ? ( ) : ( - + {meta.value} )} From 6451fe017f41bd88985aa6ea300baa7058478e18 Mon Sep 17 00:00:00 2001 From: McKayla Washburn Date: Tue, 7 Nov 2023 17:19:29 +0000 Subject: [PATCH 10/10] storyboooook --- site/src/components/Markdown/Markdown.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/site/src/components/Markdown/Markdown.tsx b/site/src/components/Markdown/Markdown.tsx index 9bac401ca19a2..6a54941f5f7a6 100644 --- a/site/src/components/Markdown/Markdown.tsx +++ b/site/src/components/Markdown/Markdown.tsx @@ -143,7 +143,6 @@ export const InlineMarkdown: FC = (props) => { return (