diff --git a/site/src/components/AvatarData/AvatarData.tsx b/site/src/components/AvatarData/AvatarData.tsx index 31bb60282a1aa..93aae3e876570 100644 --- a/site/src/components/AvatarData/AvatarData.tsx +++ b/site/src/components/AvatarData/AvatarData.tsx @@ -4,7 +4,7 @@ import { Stack } from "components/Stack/Stack" import { makeStyles } from "@material-ui/core/styles" export interface AvatarDataProps { - title: string + title: string | JSX.Element subtitle?: string src?: string avatar?: React.ReactNode diff --git a/site/src/components/LastUsed/LastUsed.tsx b/site/src/components/LastUsed/LastUsed.tsx index 533152da97a17..6b8cb271a25fe 100644 --- a/site/src/components/LastUsed/LastUsed.tsx +++ b/site/src/components/LastUsed/LastUsed.tsx @@ -1,13 +1,31 @@ import { makeStyles, Theme, useTheme } from "@material-ui/core/styles" import { FC } from "react" - -import Icon from "@material-ui/icons/Brightness1" import dayjs from "dayjs" import relativeTime from "dayjs/plugin/relativeTime" import { colors } from "theme/colors" +import { Stack } from "components/Stack/Stack" dayjs.extend(relativeTime) +type CircleProps = { color: string; variant?: "solid" | "outlined" } + +const Circle: FC = ({ color, variant = "solid" }) => { + const styles = useCircleStyles({ color, variant }) + return
+} + +const useCircleStyles = makeStyles((theme) => ({ + root: { + width: theme.spacing(1), + height: theme.spacing(1), + backgroundColor: (props: CircleProps) => + props.variant === "solid" ? props.color : undefined, + border: (props: CircleProps) => + props.variant === "outlined" ? `1px solid ${props.color}` : undefined, + borderRadius: 9999, + }, +})) + interface LastUsedProps { lastUsedAt: string } @@ -15,55 +33,44 @@ interface LastUsedProps { export const LastUsed: FC = ({ lastUsedAt }) => { const theme: Theme = useTheme() const styles = useStyles() - const t = dayjs(lastUsedAt) const now = dayjs() - - let color = theme.palette.text.secondary let message = t.fromNow() - let displayCircle = true + let circle: JSX.Element = ( + + ) if (t.isAfter(now.subtract(1, "hour"))) { - color = colors.green[9] + circle = // Since the agent reports on a 10m interval, // the last_used_at can be inaccurate when recent. message = "Now" } else if (t.isAfter(now.subtract(3, "day"))) { - color = theme.palette.text.secondary + circle = } else if (t.isAfter(now.subtract(1, "month"))) { - color = theme.palette.warning.light + circle = } else if (t.isAfter(now.subtract(100, "year"))) { - color = colors.red[10] + circle = } else { // color = theme.palette.error.light message = "Never" - displayCircle = false } return ( - - - - + + {circle} {message} - + ) } const useStyles = makeStyles((theme) => ({ root: { - display: "flex", - alignItems: "center", color: theme.palette.text.secondary, }, - icon: { - marginRight: 8, - width: 10, - height: 10, - }, })) diff --git a/site/src/components/Tooltips/HelpTooltip/HelpTooltip.tsx b/site/src/components/Tooltips/HelpTooltip/HelpTooltip.tsx index 6776e18e97349..46fdcb4fbf7a3 100644 --- a/site/src/components/Tooltips/HelpTooltip/HelpTooltip.tsx +++ b/site/src/components/Tooltips/HelpTooltip/HelpTooltip.tsx @@ -198,7 +198,7 @@ export const HelpTooltipLinksGroup: FC> = ({ const getButtonSpacingFromSize = (size?: Size): number => { switch (size) { case "small": - return 2.75 + return 2.5 case "medium": default: return 3 @@ -208,7 +208,7 @@ const getButtonSpacingFromSize = (size?: Size): number => { const getIconSpacingFromSize = (size?: Size): number => { switch (size) { case "small": - return 1.75 + return 1.5 case "medium": default: return 2 diff --git a/site/src/components/WorkspacesTable/WorkspacesRow.tsx b/site/src/components/WorkspacesTable/WorkspacesRow.tsx index 8ac1aab0125c7..dab63c15a4671 100644 --- a/site/src/components/WorkspacesTable/WorkspacesRow.tsx +++ b/site/src/components/WorkspacesTable/WorkspacesRow.tsx @@ -6,12 +6,15 @@ import { AvatarData } from "components/AvatarData/AvatarData" import { WorkspaceStatusBadge } from "components/WorkspaceStatusBadge/WorkspaceStatusBadge" import { useClickable } from "hooks/useClickable" import { FC } from "react" -import { useNavigate } from "react-router-dom" +import { useNavigate, Link as RouterLink } from "react-router-dom" import { getDisplayWorkspaceTemplateName } from "util/workspace" import { LastUsed } from "../LastUsed/LastUsed" import { Workspace } from "api/typesGenerated" import { OutdatedHelpTooltip } from "components/Tooltips/OutdatedHelpTooltip" import { Avatar } from "components/Avatar/Avatar" +import { Stack } from "components/Stack/Stack" +import TemplateLinkIcon from "@material-ui/icons/OpenInNewOutlined" +import Link from "@material-ui/core/Link" export const WorkspacesRow: FC<{ workspace: Workspace @@ -36,7 +39,18 @@ export const WorkspacesRow: FC<{ > + {workspace.name} + {workspace.outdated && ( + { + onUpdateWorkspace(workspace) + }} + /> + )} + + } subtitle={workspace.owner_name} avatar={ hasTemplateIcon && ( @@ -46,19 +60,21 @@ export const WorkspacesRow: FC<{ /> - {displayTemplateName} - -
- {workspace.latest_build.template_version_name} - {workspace.outdated && ( - { - onUpdateWorkspace(workspace) - }} - /> - )} -
+ { + e.stopPropagation() + }} + > + + + {displayTemplateName} + +
@@ -99,18 +115,17 @@ const useStyles = makeStyles((theme) => ({ paddingLeft: theme.spacing(2), }, - templateIconWrapper: { - // Same size then the avatar component - width: 36, - height: 36, - padding: 2, + templateLink: { + color: theme.palette.text.secondary, - "& img": { - width: "100%", + "&:hover": { + color: theme.palette.text.primary, + textDecoration: "none", }, }, - version: { - display: "flex", + templateLinkIcon: { + width: theme.spacing(1.5), + height: theme.spacing(1.5), }, })) diff --git a/site/src/components/WorkspacesTable/WorkspacesTable.tsx b/site/src/components/WorkspacesTable/WorkspacesTable.tsx index 5ae9ccc8a5784..48ea5c8bbcf19 100644 --- a/site/src/components/WorkspacesTable/WorkspacesTable.tsx +++ b/site/src/components/WorkspacesTable/WorkspacesTable.tsx @@ -12,7 +12,6 @@ const Language = { name: "Name", template: "Template", lastUsed: "Last Used", - version: "Version", status: "Status", lastBuiltBy: "Last Built By", } @@ -33,12 +32,11 @@ export const WorkspacesTable: FC = ({ - {Language.name} + {Language.name} {Language.template} - {Language.version} {Language.lastUsed} - {Language.status} - + {Language.status} +