Skip to content

feat: Redesign resources table #4600

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Oct 18, 2022
Prev Previous commit
Next Next commit
Refactor clickable experience
  • Loading branch information
BrunoQuaresma committed Oct 17, 2022
commit c78e4194f7429e24b1bd71fdc032d5e5892daac6
39 changes: 39 additions & 0 deletions site/src/components/CopyableValue/CopyableValue.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { makeStyles } from "@material-ui/core/styles"
import Tooltip from "@material-ui/core/Tooltip"
import { useClickable } from "hooks/useClickable"
import { useClipboard } from "hooks/useClipboard"
import React, { HTMLProps } from "react"
import { combineClasses } from "util/combineClasses"

interface CopyableValueProps extends HTMLProps<HTMLDivElement> {
value: string
}

export const CopyableValue: React.FC<CopyableValueProps> = ({
value,
className,
...props
}) => {
const { isCopied, copy } = useClipboard(value)
const clickableProps = useClickable(copy)
const styles = useStyles()

return (
<Tooltip
title={isCopied ? "Copied!" : "Click to copy"}
placement="bottom-start"
>
<span
{...props}
{...clickableProps}
className={combineClasses([styles.value, className])}
/>
</Tooltip>
)
}

const useStyles = makeStyles(() => ({
value: {
cursor: "pointer",
},
}))
5 changes: 2 additions & 3 deletions site/src/components/Resources/AgentVersion.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const AgentVersion: FC<{
onMouseEnter={() => setIsOpen(true)}
className={styles.trigger}
>
{displayVersion}
Agent Outdated
</span>
<HelpPopover
id={id}
Expand All @@ -54,9 +54,8 @@ export const AgentVersion: FC<{
)
}

const useStyles = makeStyles((theme) => ({
const useStyles = makeStyles(() => ({
trigger: {
cursor: "pointer",
color: theme.palette.warning.light,
},
}))
6 changes: 4 additions & 2 deletions site/src/components/Resources/ResourceCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
import IconButton from "@material-ui/core/IconButton"
import Tooltip from "@material-ui/core/Tooltip"
import { Maybe } from "components/Conditionals/Maybe"
import { CopyableValue } from "components/CopyableValue/CopyableValue"

const getAgentStatusColor = (theme: Theme, agent: WorkspaceAgent) => {
switch (agent.status) {
Expand Down Expand Up @@ -101,7 +102,9 @@ export const ResourceCard: FC<ResourceCardProps> = ({
{meta.sensitive ? (
<SensitiveValue value={meta.value} />
) : (
meta.value
<CopyableValue value={meta.value}>
{meta.value}
</CopyableValue>
)}
</div>
</div>
Expand Down Expand Up @@ -264,7 +267,6 @@ const useStyles = makeStyles((theme) => ({
textOverflow: "ellipsis",
overflow: "hidden",
whiteSpace: "nowrap",
userSelect: "all",
},

agentRow: {
Expand Down
5 changes: 4 additions & 1 deletion site/src/components/Resources/SensitiveValue.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { makeStyles } from "@material-ui/core/styles"
import Tooltip from "@material-ui/core/Tooltip"
import VisibilityOffOutlined from "@material-ui/icons/VisibilityOffOutlined"
import VisibilityOutlined from "@material-ui/icons/VisibilityOutlined"
import { CopyableValue } from "components/CopyableValue/CopyableValue"
import { useState } from "react"

const Language = {
Expand All @@ -23,7 +24,9 @@ export const SensitiveValue: React.FC<{ value: string }> = ({ value }) => {

return (
<div className={styles.sensitiveValue}>
<div className={styles.value}>{displayValue}</div>
<CopyableValue value={value} className={styles.value}>
{displayValue}
</CopyableValue>
<Tooltip title={buttonLabel}>
<IconButton
className={styles.button}
Expand Down
21 changes: 21 additions & 0 deletions site/src/hooks/useClickable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { KeyboardEvent } from "react"

interface UseClickableResult {
tabIndex: 0
role: "button"
onClick: () => void
onKeyDown: (event: KeyboardEvent) => void
}

export const useClickable = (onClick: () => void): UseClickableResult => {
return {
tabIndex: 0,
role: "button",
onClick,
onKeyDown: (event: KeyboardEvent) => {
if (event.key === "Enter") {
onClick()
}
},
}
}