chore(site): Upgrade storybook to 7.0.4 (#7127)

This commit is contained in:
Bruno Quaresma
2023-04-13 18:36:20 -03:00
committed by GitHub
parent 085330ad96
commit 17bb1a1ff1
217 changed files with 2333 additions and 5784 deletions

View File

@ -634,6 +634,9 @@ jobs:
- name: Publish to Chromatic (non-mainline)
if: github.ref != 'refs/heads/main' && github.repository_owner == 'coder'
uses: chromaui/action@v1
env:
NODE_OPTIONS: "--max_old_space_size=4096"
STORYBOOK: true
with:
buildScriptName: "storybook:build"
exitOnceUploaded: true
@ -651,6 +654,9 @@ jobs:
- name: Publish to Chromatic (mainline)
if: github.ref == 'refs/heads/main' && github.repository_owner == 'coder'
uses: chromaui/action@v1
env:
NODE_OPTIONS: "--max_old_space_size=4096"
STORYBOOK: true
with:
autoAcceptChanges: true
buildScriptName: "storybook:build"

View File

@ -1,49 +1,14 @@
/**
* @fileoverview This file is configures Storybook
*
* @see <https://storybook.js.org/docs/react/configure/overview>
*/
const path = require("path")
module.exports = {
// Automatically loads all stories in source ending in 'stories.tsx'
//
// SEE: https://storybook.js.org/docs/react/configure/overview#configure-story-loading
stories: ["../src/**/*.stories.tsx"],
// addons are official and community plugins to extend Storybook.
//
// SEE: https://storybook.js.org/addons
addons: [
"@storybook/addon-links",
{
name: "@storybook/addon-essentials",
options: {
actions: false,
},
},
"@storybook/addon-essentials",
"@storybook/addon-mdx-gfm",
"@storybook/addon-actions",
],
// SEE: https://storybook.js.org/docs/react/configure/babel
babel: async (options) => ({
...options,
plugins: [["@babel/plugin-proposal-class-properties", { loose: true }]],
}),
// Static files loaded by storybook, relative to this file.
//
// SEE: https://storybook.js.org/docs/react/configure/overview#using-storybook-api
staticDirs: ["../static"],
// Storybook internally uses its own Webpack configuration instead of ours.
//
// SEE: https://storybook.js.org/docs/react/configure/webpack
webpackFinal: async (config) => {
config.resolve.modules = [
path.resolve(__dirname, ".."),
"node_modules",
"../src",
]
return config
framework: {
name: "@storybook/react-vite",
options: {},
},
}

View File

@ -1,35 +1,32 @@
import CssBaseline from "@material-ui/core/CssBaseline"
import ThemeProvider from "@material-ui/styles/ThemeProvider"
import { createMemoryHistory } from "history"
import { addDecorator } from "node_modules/@storybook/react"
import { unstable_HistoryRouter as HistoryRouter } from "react-router-dom"
import { dark } from "../src/theme"
import "../src/theme/globalFonts"
import "../src/i18n"
addDecorator((story) => (
<ThemeProvider theme={dark}>
<CssBaseline />
{story()}
</ThemeProvider>
))
const history = createMemoryHistory()
const routerDecorator = (Story) => {
export const decorators = [
(Story) => (
<ThemeProvider theme={dark}>
<CssBaseline />
<Story />
</ThemeProvider>
),
(Story) => {
return (
<HistoryRouter history={history}>
<Story />
</HistoryRouter>
)
}
addDecorator(routerDecorator)
},
]
export const parameters = {
actions: {
argTypesRegex: "^on[A-Z].*",
argTypesRegex: "^handle[A-Z].*",
argTypesRegex: "^(on|handler)[A-Z].*",
},
controls: {
expanded: true,

View File

@ -17,8 +17,8 @@
"lint:fix": "FIX=true yarn lint",
"playwright:install": "playwright install --with-deps chromium",
"playwright:test": "playwright test --config=e2e/playwright.config.ts",
"storybook": "start-storybook -p 6006",
"storybook:build": "build-storybook",
"storybook": "STORYBOOK=true storybook dev -p 6006",
"storybook:build": "storybook build",
"test": "jest --selectProjects test",
"test:ci": "jest --selectProjects test --silent",
"test:coverage": "jest --selectProjects test --collectCoverage",
@ -54,7 +54,7 @@
"date-fns": "2.29.3",
"dayjs": "1.11.4",
"emoji-mart": "5.4.0",
"eslint-plugin-testing-library": "^5.10.2",
"eslint-plugin-testing-library": "5.10.2",
"eventsourcemock": "2.0.0",
"formik": "2.2.9",
"front-matter": "4.0.2",
@ -75,8 +75,8 @@
"react-markdown": "8.0.3",
"react-router-dom": "6.4.1",
"react-syntax-highlighter": "15.5.0",
"react-virtualized-auto-sizer": "^1.0.7",
"react-window": "^1.8.8",
"react-virtualized-auto-sizer": "1.0.7",
"react-window": "1.8.8",
"remark-gfm": "3.0.1",
"rollup-plugin-visualizer": "5.9.0",
"sourcemapped-stacktrace": "1.1.11",
@ -84,7 +84,7 @@
"tzdata": "1.0.30",
"ua-parser-js": "1.0.33",
"uuid": "9.0.0",
"vite": "3.1.3",
"vite": "4.2.1",
"xstate": "4.33.5",
"xterm": "4.19.0",
"xterm-addon-fit": "0.5.0",
@ -93,10 +93,11 @@
},
"devDependencies": {
"@playwright/test": "1.29.2",
"@storybook/addon-actions": "6.5.9",
"@storybook/addon-essentials": "6.5.12",
"@storybook/addon-links": "6.5.9",
"@storybook/react": "6.5.12",
"@storybook/addon-actions": "7.0.4",
"@storybook/addon-essentials": "7.0.4",
"@storybook/addon-links": "7.0.4",
"@storybook/addon-mdx-gfm": "7.0.4",
"@storybook/react-vite": "7.0.4",
"@swc/core": "1.3.38",
"@swc/jest": "0.2.24",
"@testing-library/jest-dom": "5.16.5",
@ -127,6 +128,7 @@
"eslint-plugin-jsx-a11y": "6.6.1",
"eslint-plugin-react": "7.31.1",
"eslint-plugin-react-hooks": "4.6.0",
"eslint-plugin-storybook": "^0.6.11",
"eslint-plugin-unicorn": "44.0.0",
"jest": "29.5.0",
"jest-canvas-mock": "2.4.0",
@ -139,7 +141,7 @@
"prettier": "2.8.1",
"resize-observer": "1.0.4",
"semver": "7.3.7",
"storybook-addon-mock": "^3.2.0",
"storybook": "7.0.4",
"storybook-react-context": "^0.6.0",
"typescript": "4.8.2"
},

View File

@ -5,9 +5,9 @@ import { makeStyles } from "@material-ui/core/styles"
import Tooltip from "@material-ui/core/Tooltip"
import ErrorOutlineIcon from "@material-ui/icons/ErrorOutline"
import { FC } from "react"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import * as TypesGen from "../../api/typesGenerated"
import { generateRandomString } from "../../util/random"
import { generateRandomString } from "../../utils/random"
import { BaseIcon } from "./BaseIcon"
import { ShareIcon } from "./ShareIcon"

View File

@ -2,7 +2,7 @@ import { makeStyles } from "@material-ui/core/styles"
import { AuditLog } from "api/typesGenerated"
import { colors } from "theme/colors"
import { MONOSPACE_FONT_FAMILY } from "theme/constants"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import { FC } from "react"
const getDiffValue = (value: unknown): string => {

View File

@ -5,7 +5,7 @@ import MuiAvatar, {
} from "@material-ui/core/Avatar"
import { makeStyles } from "@material-ui/core/styles"
import { FC } from "react"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import { firstLetter } from "./firstLetter"
export type AvatarProps = MuiAvatarProps & {

View File

@ -4,7 +4,7 @@ import SvgIcon from "@material-ui/core/SvgIcon"
import CheckIcon from "@material-ui/icons/Check"
import { FC } from "react"
import { NavLink } from "react-router-dom"
import { ellipsizeText } from "../../util/ellipsizeText"
import { ellipsizeText } from "../../utils/ellipsizeText"
import { Typography } from "../Typography/Typography"
type BorderedMenuRowVariant = "narrow" | "wide"

View File

@ -5,7 +5,7 @@ import PlayArrowOutlined from "@material-ui/icons/PlayArrowOutlined"
import PauseOutlined from "@material-ui/icons/PauseOutlined"
import DeleteOutlined from "@material-ui/icons/DeleteOutlined"
import { WorkspaceBuild, WorkspaceTransition } from "api/typesGenerated"
import { getDisplayWorkspaceBuildStatus } from "util/workspace"
import { getDisplayWorkspaceBuildStatus } from "utils/workspace"
import { PaletteIndex } from "theme/palettes"
import { Avatar, AvatarProps } from "components/Avatar/Avatar"

View File

@ -10,7 +10,7 @@ import { MONOSPACE_FONT_FAMILY } from "theme/constants"
import {
displayWorkspaceBuildDuration,
getDisplayWorkspaceBuildInitiatedBy,
} from "util/workspace"
} from "utils/workspace"
import { BuildAvatar } from "./BuildAvatar"
export interface BuildRowProps {

View File

@ -1,7 +1,7 @@
import { makeStyles } from "@material-ui/core/styles"
import { FC, Fragment, ReactElement } from "react"
import { MONOSPACE_FONT_FAMILY } from "../../theme/constants"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
export interface CodeBlockProps {
lines: string[]

View File

@ -1,7 +1,7 @@
import { makeStyles, Theme } from "@material-ui/core/styles"
import { FC } from "react"
import { MONOSPACE_FONT_FAMILY } from "../../theme/constants"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
import { CopyButton } from "../CopyButton/CopyButton"
export interface CodeExampleProps {

View File

@ -3,7 +3,7 @@ import { makeStyles } from "@material-ui/core/styles"
import Tooltip from "@material-ui/core/Tooltip"
import Check from "@material-ui/icons/Check"
import { useClipboard } from "hooks/useClipboard"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
import { FileCopyIcon } from "../Icons/FileCopyIcon"
interface CopyButtonProps {

View File

@ -3,7 +3,7 @@ import Tooltip from "@material-ui/core/Tooltip"
import { useClickable } from "hooks/useClickable"
import { useClipboard } from "hooks/useClipboard"
import { FC, HTMLProps } from "react"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
interface CopyableValueProps extends HTMLProps<HTMLDivElement> {
value: string

View File

@ -8,7 +8,7 @@ import {
getFormHelpers,
nameValidator,
onChangeTrimmed,
} from "../../util/formUtils"
} from "../../utils/formUtils"
import { FormFooter } from "../FormFooter/FormFooter"
import { FullPageForm } from "../FullPageForm/FullPageForm"
import { Stack } from "../Stack/Stack"

View File

@ -2,7 +2,7 @@ import { makeStyles } from "@material-ui/core/styles"
import { Stack } from "components/Stack/Stack"
import { PropsWithChildren, FC } from "react"
import { MONOSPACE_FONT_FAMILY } from "theme/constants"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
export const EnabledBadge: FC = () => {
const styles = useStyles()

View File

@ -8,7 +8,7 @@ import { GitIcon } from "components/Icons/GitIcon"
import { Stack } from "components/Stack/Stack"
import { ElementType, PropsWithChildren, ReactNode, FC } from "react"
import { NavLink } from "react-router-dom"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
const SidebarNavItem: FC<
PropsWithChildren<{ href: string; icon: ReactNode }>

View File

@ -6,21 +6,15 @@ export default {
title: "Components/Dialogs/ConfirmDialog",
component: ConfirmDialog,
argTypes: {
onClose: {
action: "onClose",
defaultValue: action("onClose"),
},
onConfirm: {
action: "onConfirm",
defaultValue: action("onConfirm"),
},
open: {
control: "boolean",
defaultValue: true,
},
title: {
defaultValue: "Confirm Dialog",
},
args: {
onClose: action("onClose"),
onConfirm: action("onConfirm"),
open: true,
title: "Confirm Dialog",
},
} as ComponentMeta<typeof ConfirmDialog>

View File

@ -6,28 +6,17 @@ export default {
title: "Components/Dialogs/DeleteDialog",
component: DeleteDialog,
argTypes: {
onCancel: {
action: "onClose",
defaultValue: action("onClose"),
},
onConfirm: {
action: "onConfirm",
defaultValue: action("onConfirm"),
},
open: {
control: "boolean",
defaultValue: true,
},
entity: {
defaultValue: "foo",
},
name: {
defaultValue: "MyFoo",
},
info: {
defaultValue:
"Here's some info about the foo so you know you're deleting the right one.",
},
args: {
onCancel: action("onClose"),
onConfirm: action("onConfirm"),
open: true,
entity: "foo",
name: "MyFoo",
info: "Here's some info about the foo so you know you're deleting the right one.",
},
} as ComponentMeta<typeof DeleteDialog>

View File

@ -4,7 +4,7 @@ import MuiDialog, {
import { alpha, darken, makeStyles } from "@material-ui/core/styles"
import * as React from "react"
import { colors } from "theme/colors"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
import {
LoadingButton,
LoadingButtonProps,

View File

@ -11,7 +11,7 @@ import PlayCircleOutlineIcon from "@material-ui/icons/PlayCircleOutline"
import { LoadingButton } from "components/LoadingButton/LoadingButton"
import { FC } from "react"
import { useTranslation } from "react-i18next"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import { WorkspaceActionButton } from "../WorkspaceActionButton/WorkspaceActionButton"
interface WorkspaceAction {

View File

@ -2,7 +2,7 @@ import Box from "@material-ui/core/Box"
import { makeStyles } from "@material-ui/core/styles"
import Typography from "@material-ui/core/Typography"
import { FC, ReactNode } from "react"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
export interface EmptyStateProps {
/** Text Message to display, placed inside Typography component */

View File

@ -5,7 +5,7 @@ import Snackbar, {
import { makeStyles } from "@material-ui/core/styles"
import CloseIcon from "@material-ui/icons/Close"
import { FC } from "react"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
type EnterpriseSnackbarVariant = "error" | "info" | "success"

View File

@ -7,7 +7,7 @@ import {
import { PropsWithChildren, FC } from "react"
import Collapse from "@material-ui/core/Collapse"
import { useTranslation } from "react-i18next"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
export interface ExpanderProps {
expanded: boolean

View File

@ -11,7 +11,7 @@ import {
PropsWithChildren,
useContext,
} from "react"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
type FormContextValue = { direction?: "horizontal" | "vertical" }

View File

@ -1,7 +1,7 @@
import { makeStyles } from "@material-ui/core/styles"
import { useCallback, useState, FC } from "react"
import { useCustomEvent } from "../../hooks/events"
import { CustomEventListener } from "../../util/events"
import { CustomEventListener } from "../../utils/events"
import { EnterpriseSnackbar } from "../EnterpriseSnackbar/EnterpriseSnackbar"
import { ErrorIcon } from "../Icons/ErrorIcon"
import { Typography } from "../Typography/Typography"

View File

@ -1,4 +1,4 @@
import { dispatchCustomEvent } from "../../util/events"
import { dispatchCustomEvent } from "../../utils/events"
///////////////////////////////////////////////////////////////////////////////
// Notification Types

View File

@ -5,8 +5,11 @@ export default {
title: "components/LoadingButton",
component: LoadingButton,
argTypes: {
loading: { control: { type: "boolean" } },
children: { control: "text", defaultValue: "Create workspace" },
loading: { control: "boolean" },
children: { control: "text" },
},
args: {
children: "Create workspace",
},
}

View File

@ -3,7 +3,7 @@ import { LogLevel } from "api/typesGenerated"
import dayjs from "dayjs"
import { FC, useMemo } from "react"
import { MONOSPACE_FONT_FAMILY } from "../../theme/constants"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
import AnsiToHTML from "ansi-to-html"
export interface Line {

View File

@ -10,7 +10,7 @@ import { NavLink, useLocation } from "react-router-dom"
import { colors } from "theme/colors"
import * as TypesGen from "../../api/typesGenerated"
import { navHeight } from "../../theme/constants"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
import { UserDropdown } from "../UserDropdown/UsersDropdown"
export const USERS_LINK = `/users?filter=${encodeURIComponent("status:active")}`

View File

@ -1,6 +1,6 @@
import { makeStyles } from "@material-ui/core/styles"
import { PropsWithChildren, FC } from "react"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
import { Stack } from "../Stack/Stack"
export interface PageHeaderProps {

View File

@ -5,19 +5,11 @@ import { createPaginationRef } from "./utils"
export default {
title: "components/PaginationWidget",
component: PaginationWidget,
argTypes: {
prevLabel: {
defaultValue: "Previous",
},
nextLabel: {
defaultValue: "Next",
},
paginationRef: {
defaultValue: createPaginationRef({ page: 1, limit: 12 }),
},
numRecords: {
defaultValue: 200,
},
args: {
prevLabel: "Previous",
nextLabel: "Next",
paginationRef: createPaginationRef({ page: 1, limit: 12 }),
numRecords: 200,
},
}

View File

@ -1,7 +1,7 @@
import { makeStyles, Theme } from "@material-ui/core/styles"
import { FC } from "react"
import { PaletteIndex } from "theme/palettes"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
export interface PillProps {
className?: string

View File

@ -2,7 +2,7 @@ import { useAuth } from "components/AuthProvider/AuthProvider"
import { FC } from "react"
import { Navigate, useLocation } from "react-router"
import { Outlet } from "react-router-dom"
import { embedRedirect } from "../../util/redirect"
import { embedRedirect } from "../../utils/redirect"
import { FullScreenLoader } from "../Loader/FullScreenLoader"
export const RequireAuth: FC = () => {

View File

@ -19,6 +19,7 @@ import {
useRef,
useState,
} from "react"
import { humanDuration } from "utils/duration"
export const WatchAgentMetadataContext = createContext(watchAgentMetadata)
@ -135,7 +136,6 @@ const MetadataItem: FC<{ item: WorkspaceAgentMetadata }> = ({ item }) => {
<div
className={styles.metadataLabel}
onMouseEnter={() => setIsOpen(true)}
// onMouseLeave={() => setIsOpen(false)}
role="presentation"
ref={labelAnchorRef}
>
@ -165,17 +165,16 @@ const MetadataItem: FC<{ item: WorkspaceAgentMetadata }> = ({ item }) => {
{status === "stale" ? (
<HelpTooltipText>
This item is now stale because the agent hasn{"'"}t reported a new
value in {dayjs.duration(item.result.age, "s").humanize()}.
value in {humanDuration(item.result.age, "s")}.
</HelpTooltipText>
) : (
<></>
)}
{status === "valid" ? (
<HelpTooltipText>
The agent collected this value{" "}
{dayjs.duration(item.result.age, "s").humanize()} ago and will
update it in{" "}
{dayjs.duration(Math.min(updatesInSeconds, 0), "s").humanize()}.
The agent collected this value {humanDuration(item.result.age, "s")}{" "}
ago and will update it in{" "}
{humanDuration(Math.min(updatesInSeconds, 0), "s")}.
</HelpTooltipText>
) : (
<></>

View File

@ -73,7 +73,6 @@ export const AgentRow: FC<AgentRowProps> = ({
}) => {
const styles = useStyles()
const { t } = useTranslation("agent")
const [logsMachine, sendLogsEvent] = useMachine(workspaceAgentLogsMachine, {
context: { agentID: agent.id },
services: process.env.STORYBOOK

View File

@ -3,7 +3,7 @@ import { AppPreviewLink } from "components/AppLink/AppPreviewLink"
import { Maybe } from "components/Conditionals/Maybe"
import { FC } from "react"
import { useTranslation } from "react-i18next"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import { WorkspaceAgent } from "../../api/typesGenerated"
import { Stack } from "../Stack/Stack"

View File

@ -1,6 +1,6 @@
import Tooltip from "@material-ui/core/Tooltip"
import { makeStyles } from "@material-ui/core/styles"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import { WorkspaceAgent } from "api/typesGenerated"
import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"
import { useTranslation } from "react-i18next"

View File

@ -1,7 +1,7 @@
import { useRef, useState, FC } from "react"
import { makeStyles } from "@material-ui/core/styles"
import { WorkspaceAgent } from "api/typesGenerated"
import { getDisplayVersionStatus } from "util/workspace"
import { getDisplayVersionStatus } from "utils/workspace"
import { AgentOutdatedTooltip } from "components/Tooltips/AgentOutdatedTooltip"
export const AgentVersion: FC<{

View File

@ -1,5 +1,5 @@
import { ComponentMeta, Story } from "@storybook/react"
import { userFilterQuery, workspaceFilterQuery } from "../../util/filters"
import { Story } from "@storybook/react"
import { userFilterQuery, workspaceFilterQuery } from "../../utils/filters"
import {
SearchBarWithFilter,
SearchBarWithFilterProps,
@ -8,12 +8,10 @@ import {
export default {
title: "components/SearchBarWithFilter",
component: SearchBarWithFilter,
argTypes: {
filter: {
defaultValue: workspaceFilterQuery.me,
args: {
filter: workspaceFilterQuery.me,
},
},
} as ComponentMeta<typeof SearchBarWithFilter>
}
const Template: Story<SearchBarWithFilterProps> = (args) => (
<SearchBarWithFilter {...args} />

View File

@ -1,7 +1,7 @@
import { makeStyles } from "@material-ui/core/styles"
import Typography from "@material-ui/core/Typography"
import { FC } from "react"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
import { SectionAction } from "../SectionAction/SectionAction"
type SectionLayout = "fixed" | "fluid"

View File

@ -6,7 +6,7 @@ import {
getFormHelpers,
nameValidator,
onChangeTrimmed,
} from "../../util/formUtils"
} from "../../utils/formUtils"
import { LoadingButton } from "../LoadingButton/LoadingButton"
import { Stack } from "../Stack/Stack"
import { AlertBanner } from "components/AlertBanner/AlertBanner"

View File

@ -3,7 +3,7 @@ import { Sidebar } from "./Sidebar"
import { Stack } from "components/Stack/Stack"
import { FC, Suspense } from "react"
import { Helmet } from "react-helmet-async"
import { pageTitle } from "../../util/page"
import { pageTitle } from "../../utils/page"
import { Margins } from "../Margins/Margins"
import { useMe } from "hooks/useMe"
import { Loader } from "components/Loader/Loader"

View File

@ -6,7 +6,7 @@ import { Stack } from "components/Stack/Stack"
import { UserAvatar } from "components/UserAvatar/UserAvatar"
import { FC, ElementType, PropsWithChildren, ReactNode } from "react"
import { NavLink } from "react-router-dom"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import AccountIcon from "@material-ui/icons/Person"
import SecurityIcon from "@material-ui/icons/LockOutlined"

View File

@ -2,7 +2,7 @@ import TextField from "@material-ui/core/TextField"
import { FormikContextType, FormikTouched, useFormik } from "formik"
import { FC } from "react"
import * as Yup from "yup"
import { getFormHelpers } from "../../util/formUtils"
import { getFormHelpers } from "../../utils/formUtils"
import { LoadingButton } from "../LoadingButton/LoadingButton"
import { Stack } from "../Stack/Stack"
import { AlertBanner } from "components/AlertBanner/AlertBanner"

View File

@ -1,6 +1,6 @@
import { Stack } from "../Stack/Stack"
import TextField from "@material-ui/core/TextField"
import { getFormHelpers, onChangeTrimmed } from "../../util/formUtils"
import { getFormHelpers, onChangeTrimmed } from "../../utils/formUtils"
import { LoadingButton } from "../LoadingButton/LoadingButton"
import { Language } from "./SignInForm"
import { FormikContextType, FormikTouched, useFormik } from "formik"

View File

@ -2,7 +2,7 @@ import { makeStyles } from "@material-ui/core/styles"
import { CSSProperties } from "@material-ui/core/styles/withStyles"
import { FC } from "react"
import { ReactNode } from "react-markdown/lib/react-markdown"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
type Direction = "column" | "row"

View File

@ -1,7 +1,7 @@
import { Theme, useTheme } from "@material-ui/core/styles"
import { useMonaco } from "@monaco-editor/react"
import { useEffect, useState } from "react"
import { hslToHex } from "util/colors"
import { hslToHex } from "utils/colors"
import { editor } from "monaco-editor"
// Theme based on https://github.com/brijeshb42/monaco-themes/blob/master/themes/Dracula.json

View File

@ -4,7 +4,7 @@ import { makeStyles } from "@material-ui/core/styles"
import { FC } from "react"
import { NavLink } from "react-router-dom"
import { sidePadding } from "theme/constants"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
export interface TabSidebarItem {
path: string

View File

@ -2,7 +2,7 @@ import Link from "@material-ui/core/Link"
import { makeStyles } from "@material-ui/core/styles"
import TableCell, { TableCellProps } from "@material-ui/core/TableCell"
import { Link as RouterLink } from "react-router-dom"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
// TableCellLink wraps a TableCell filling the entirety with a Link.
// This allows table rows to be clickable with browser-behavior like ctrl+click.

View File

@ -2,7 +2,7 @@ import { makeStyles } from "@material-ui/core/styles"
import { TemplateExample } from "api/typesGenerated"
import { FC } from "react"
import { Link } from "react-router-dom"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
export interface TemplateExampleCardProps {
example: TemplateExample

View File

@ -5,8 +5,8 @@ import { TerraformIcon } from "components/Icons/TerraformIcon"
import { SyntaxHighlighter } from "components/SyntaxHighlighter/SyntaxHighlighter"
import { UseTabResult } from "hooks/useTab"
import { FC } from "react"
import { combineClasses } from "util/combineClasses"
import { TemplateVersionFiles } from "util/templateVersion"
import { combineClasses } from "utils/combineClasses"
import { TemplateVersionFiles } from "utils/templateVersion"
const iconByExtension: Record<string, JSX.Element> = {
tf: <TerraformIcon />,

View File

@ -2,7 +2,7 @@ import { makeStyles } from "@material-ui/core/styles"
import { useOrganizationId } from "hooks/useOrganizationId"
import { createContext, FC, Suspense, useContext } from "react"
import { NavLink, Outlet, useNavigate, useParams } from "react-router-dom"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import { Margins } from "components/Margins/Margins"
import { Stack } from "components/Stack/Stack"
import { Loader } from "components/Loader/Loader"

View File

@ -8,19 +8,13 @@ import {
export default {
title: "Components/TemplatePageHeader",
component: TemplatePageHeader,
argTypes: {
template: {
defaultValue: MockTemplate,
},
activeVersion: {
defaultValue: MockTemplateVersion,
},
args: {
template: MockTemplate,
activeVersion: MockTemplateVersion,
permissions: {
defaultValue: {
canUpdateTemplate: true,
},
},
},
} as ComponentMeta<typeof TemplatePageHeader>
const Template: Story<TemplatePageHeaderProps> = (args) => (

View File

@ -1,11 +1,11 @@
import { Stats, StatsItem } from "components/Stats/Stats"
import { FC } from "react"
import { Link } from "react-router-dom"
import { createDayString } from "util/createDayString"
import { createDayString } from "utils/createDayString"
import {
formatTemplateBuildTime,
formatTemplateActiveDevelopers,
} from "util/templates"
} from "utils/templates"
import { Template, TemplateVersion } from "../../api/typesGenerated"
const Language = {

View File

@ -3,8 +3,8 @@ import { ConfirmDialog } from "components/Dialogs/ConfirmDialog/ConfirmDialog"
import { Stack } from "components/Stack/Stack"
import { ChangeEvent, FC, useState } from "react"
import Typography from "@material-ui/core/Typography"
import { allowedExtensions, isAllowedFile } from "util/templateVersion"
import { FileTree, isFolder, validatePath } from "util/filetree"
import { allowedExtensions, isAllowedFile } from "utils/templateVersion"
import { FileTree, isFolder, validatePath } from "utils/filetree"
export const CreateFileDialog: FC<{
onClose: () => void

View File

@ -6,7 +6,7 @@ import TreeItem from "@material-ui/lab/TreeItem"
import Menu from "@material-ui/core/Menu"
import MenuItem from "@material-ui/core/MenuItem"
import { CSSProperties, FC, useState } from "react"
import { FileTree } from "util/filetree"
import { FileTree } from "utils/filetree"
import { DockerIcon } from "components/Icons/DockerIcon"
import { colors } from "theme/colors"

View File

@ -2,7 +2,7 @@ import { useTheme } from "@material-ui/core/styles"
import Editor from "@monaco-editor/react"
import { FC, useLayoutEffect, useMemo, useState } from "react"
import { MONOSPACE_FONT_FAMILY } from "theme/constants"
import { hslToHex } from "util/colors"
import { hslToHex } from "utils/colors"
import type { editor } from "monaco-editor"
export const MonacoEditor: FC<{

View File

@ -1,6 +1,6 @@
import { DialogProps } from "components/Dialogs/Dialog"
import { FC } from "react"
import { getFormHelpers } from "util/formUtils"
import { getFormHelpers } from "utils/formUtils"
import { FormFields } from "components/Form/Form"
import { useFormik } from "formik"
import * as Yup from "yup"

View File

@ -29,7 +29,7 @@ import {
removeFile,
traverse,
updateFile,
} from "util/filetree"
} from "utils/filetree"
import {
CreateFileDialog,
DeleteFileDialog,

View File

@ -4,8 +4,8 @@ import { makeStyles } from "@material-ui/core/styles"
import ComputerIcon from "@material-ui/icons/Computer"
import { FC } from "react"
import * as TypesGen from "../../api/typesGenerated"
import { combineClasses } from "../../util/combineClasses"
import { generateRandomString } from "../../util/random"
import { combineClasses } from "../../utils/combineClasses"
import { generateRandomString } from "../../utils/random"
export const Language = {
linkText: "Terminal",

View File

@ -1,7 +1,7 @@
import { makeStyles } from "@material-ui/core/styles"
import TableRow, { TableRowProps } from "@material-ui/core/TableRow"
import { PropsWithChildren } from "react"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
interface TimelineEntryProps {
clickable?: boolean

View File

@ -11,7 +11,7 @@ import {
FC,
PropsWithChildren,
} from "react"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import { Stack } from "../../Stack/Stack"
type Icon = typeof HelpIcon

View File

@ -8,7 +8,7 @@ import MuiTypography, {
TypographyProps as MuiTypographyProps,
} from "@material-ui/core/Typography"
import * as React from "react"
import { appendCSSString, combineClasses } from "../../util/combineClasses"
import { appendCSSString, combineClasses } from "../../utils/combineClasses"
export interface TypographyProps extends MuiTypographyProps {
short?: boolean

View File

@ -11,7 +11,7 @@ import { Link } from "react-router-dom"
import * as TypesGen from "../../api/typesGenerated"
import DocsIcon from "@material-ui/icons/MenuBook"
import LogoutIcon from "@material-ui/icons/ExitToAppOutlined"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
export const Language = {
accountLabel: "Account",

View File

@ -7,7 +7,7 @@ import { Group, User } from "api/typesGenerated"
import { AvatarData } from "components/AvatarData/AvatarData"
import debounce from "just-debounce-it"
import { ChangeEvent, useState } from "react"
import { getGroupSubtitle } from "util/groups"
import { getGroupSubtitle } from "utils/groups"
import { searchUsersAndGroupsMachine } from "xServices/template/searchUsersAndGroupsXService"
export type UserOrGroupAutocompleteValue = User | Group | null

View File

@ -15,7 +15,7 @@ import {
Outlet,
useNavigate,
} from "react-router-dom"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import { authMethodsXService } from "xServices/auth/authMethodsXService"
import { Margins } from "../../components/Margins/Margins"
import { Stack } from "../../components/Stack/Stack"

View File

@ -9,10 +9,8 @@ import { UsersTable, UsersTableProps } from "./UsersTable"
export default {
title: "components/UsersTable",
component: UsersTable,
argTypes: {
isNonInitialPage: {
defaultValue: false,
},
args: {
isNonInitialPage: false,
},
} as ComponentMeta<typeof UsersTable>

View File

@ -8,7 +8,7 @@ import { Pill } from "components/Pill/Pill"
import { FC } from "react"
import { useTranslation } from "react-i18next"
import * as TypesGen from "../../api/typesGenerated"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
import { AvatarData } from "../AvatarData/AvatarData"
import { EmptyState } from "../EmptyState/EmptyState"
import { TableLoaderSkeleton } from "../TableLoader/TableLoader"

View File

@ -10,7 +10,7 @@ import { useClickableTableRow } from "hooks/useClickableTableRow"
import { useTranslation } from "react-i18next"
import { useNavigate } from "react-router-dom"
import { colors } from "theme/colors"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
export interface VersionRowProps {
version: TemplateVersion

View File

@ -24,6 +24,7 @@ Example.args = {
},
MockTemplateVersion,
],
onPromoteClick: undefined,
}
export const CanPromote = Template.bind({})

View File

@ -3,7 +3,7 @@ import { FC } from "react"
import { useTranslation } from "react-i18next"
import { Link } from "react-router-dom"
import { WorkspaceBuild } from "../../api/typesGenerated"
import { displayWorkspaceBuildDuration } from "../../util/workspace"
import { displayWorkspaceBuildDuration } from "../../utils/workspace"
export interface WorkspaceBuildStatsProps {
build: WorkspaceBuild

View File

@ -9,10 +9,8 @@ dayjs.extend(utc)
export default {
title: "components/WorkspaceSchedule",
component: WorkspaceSchedule,
argTypes: {
canUpdateWorkspace: {
defaultValue: true,
},
args: {
canUpdateWorkspace: true,
},
}

View File

@ -15,7 +15,7 @@ import {
autostopDisplay,
extractTimezone,
Language as ScheduleLanguage,
} from "../../util/schedule"
} from "../../utils/schedule"
import { Stack } from "../Stack/Stack"
// REMARK: some plugins depend on utc, so it's listed first. Otherwise they're

View File

@ -28,7 +28,7 @@ import {
} from "pages/WorkspaceSettingsPage/WorkspaceSchedulePage/schedule"
import { ChangeEvent, FC } from "react"
import * as Yup from "yup"
import { getFormHelpers } from "../../util/formUtils"
import { getFormHelpers } from "../../utils/formUtils"
import { zones } from "./zones"
// REMARK: some plugins depend on utc, so it's listed first. Otherwise they're

View File

@ -3,7 +3,7 @@ import { makeStyles } from "@material-ui/core/styles"
import Typography from "@material-ui/core/Typography"
import { HTMLProps, ReactNode, FC, PropsWithChildren } from "react"
import { CardPadding } from "../../theme/constants"
import { combineClasses } from "../../util/combineClasses"
import { combineClasses } from "../../utils/combineClasses"
export interface WorkspaceSectionProps {
/**

View File

@ -2,16 +2,16 @@ import Link from "@material-ui/core/Link"
import { OutdatedHelpTooltip } from "components/Tooltips"
import { FC, useRef, useState } from "react"
import { Link as RouterLink } from "react-router-dom"
import { createDayString } from "util/createDayString"
import { createDayString } from "utils/createDayString"
import {
getDisplayWorkspaceBuildInitiatedBy,
getDisplayWorkspaceTemplateName,
isWorkspaceOn,
} from "util/workspace"
} from "utils/workspace"
import { Workspace } from "../../api/typesGenerated"
import { Stats, StatsItem } from "components/Stats/Stats"
import upperFirst from "lodash/upperFirst"
import { autostartDisplay, autostopDisplay } from "util/schedule"
import { autostartDisplay, autostopDisplay } from "utils/schedule"
import IconButton from "@material-ui/core/IconButton"
import RemoveIcon from "@material-ui/icons/RemoveOutlined"
import { makeStyles } from "@material-ui/core/styles"

View File

@ -6,7 +6,7 @@ import { AvatarData } from "components/AvatarData/AvatarData"
import { WorkspaceStatusBadge } from "components/WorkspaceStatusBadge/WorkspaceStatusBadge"
import { FC } from "react"
import { useNavigate } from "react-router-dom"
import { getDisplayWorkspaceTemplateName } from "util/workspace"
import { getDisplayWorkspaceTemplateName } from "utils/workspace"
import { LastUsed } from "../LastUsed/LastUsed"
import { Workspace } from "api/typesGenerated"
import { OutdatedHelpTooltip } from "components/Tooltips/OutdatedHelpTooltip"

View File

@ -1,5 +1,5 @@
import { renderHook, waitFor } from "@testing-library/react"
import { dispatchCustomEvent } from "../util/events"
import { dispatchCustomEvent } from "../utils/events"
import { useCustomEvent } from "./events"
describe("useCustomEvent", () => {

View File

@ -1,5 +1,5 @@
import { useEffect } from "react"
import { CustomEventListener } from "../util/events"
import { CustomEventListener } from "../utils/events"
/**
* Handles a custom event with descriptive type information.

View File

@ -13,7 +13,7 @@ import {
} from "testHelpers/renderHelpers"
import { server } from "testHelpers/server"
import * as CreateDayString from "util/createDayString"
import * as CreateDayString from "utils/createDayString"
import AuditPage from "./AuditPage"
interface RenderPageOptions {

View File

@ -7,7 +7,7 @@ import { useFeatureVisibility } from "hooks/useFeatureVisibility"
import { FC } from "react"
import { Helmet } from "react-helmet-async"
import { useSearchParams } from "react-router-dom"
import { pageTitle } from "util/page"
import { pageTitle } from "utils/page"
import { auditMachine } from "xServices/audit/auditXService"
import { PaginationMachineRef } from "xServices/pagination/paginationXService"
import { AuditPageView } from "./AuditPageView"

View File

@ -6,19 +6,11 @@ import { AuditPageView, AuditPageViewProps } from "./AuditPageView"
export default {
title: "pages/AuditPageView",
component: AuditPageView,
argTypes: {
auditLogs: {
defaultValue: [MockAuditLog, MockAuditLog2],
},
count: {
defaultValue: 1000,
},
paginationRef: {
defaultValue: createPaginationRef({ page: 1, limit: 25 }),
},
isAuditLogVisible: {
defaultValue: true,
},
args: {
auditLogs: [MockAuditLog, MockAuditLog2],
count: 1000,
paginationRef: createPaginationRef({ page: 1, limit: 25 }),
isAuditLogVisible: true,
},
} as ComponentMeta<typeof AuditPageView>

View File

@ -1,7 +1,7 @@
import { useEffect, useState, FC, PropsWithChildren } from "react"
import { Helmet } from "react-helmet-async"
import { getApiKey } from "../../api/api"
import { pageTitle } from "../../util/page"
import { pageTitle } from "../../utils/page"
import { CliAuthPageView } from "./CliAuthPageView"
export const CliAuthenticationPage: FC<PropsWithChildren<unknown>> = () => {

View File

@ -5,7 +5,10 @@ export default {
title: "pages/CliAuthPageView",
component: CliAuthPageView,
argTypes: {
sessionToken: { control: "text", defaultValue: "some-session-token" },
sessionToken: { control: "text" },
},
args: {
sessionToken: "some-session-token",
},
}

View File

@ -23,7 +23,7 @@ import {
getFormHelpers,
onChangeTrimmed,
templateDisplayNameValidator,
} from "util/formUtils"
} from "utils/formUtils"
import { CreateTemplateData } from "xServices/createTemplate/createTemplateXService"
import * as Yup from "yup"
import { WorkspaceBuildLogs } from "components/WorkspaceBuildLogs/WorkspaceBuildLogs"

View File

@ -11,7 +11,7 @@ import { FC } from "react"
import { Helmet } from "react-helmet-async"
import { useTranslation } from "react-i18next"
import { useNavigate, useSearchParams } from "react-router-dom"
import { pageTitle } from "util/page"
import { pageTitle } from "utils/page"
import { createTemplateMachine } from "xServices/createTemplate/createTemplateXService"
import { CreateTemplateForm } from "./CreateTemplateForm"

View File

@ -4,7 +4,7 @@ import { FC, DragEvent, useRef } from "react"
import UploadIcon from "@material-ui/icons/CloudUploadOutlined"
import { useClickable } from "hooks/useClickable"
import CircularProgress from "@material-ui/core/CircularProgress"
import { combineClasses } from "util/combineClasses"
import { combineClasses } from "utils/combineClasses"
import IconButton from "@material-ui/core/IconButton"
import RemoveIcon from "@material-ui/icons/DeleteOutline"
import FileIcon from "@material-ui/icons/FolderOutlined"

View File

@ -7,7 +7,7 @@ import {
} from "components/Form/Form"
import makeStyles from "@material-ui/core/styles/makeStyles"
import { useTranslation } from "react-i18next"
import { onChangeTrimmed, getFormHelpers } from "util/formUtils"
import { onChangeTrimmed, getFormHelpers } from "utils/formUtils"
import TextField from "@material-ui/core/TextField"
import MenuItem from "@material-ui/core/MenuItem"
import {

View File

@ -1,7 +1,7 @@
import { FC, useState } from "react"
import { useTranslation } from "react-i18next"
import { Helmet } from "react-helmet-async"
import { pageTitle } from "util/page"
import { pageTitle } from "utils/page"
import { FullPageHorizontalForm } from "components/FullPageForm/FullPageHorizontalForm"
import { useNavigate } from "react-router-dom"
import { useFormik } from "formik"

View File

@ -5,7 +5,7 @@ import { useOrganizationId } from "hooks/useOrganizationId"
import { FC } from "react"
import { Helmet } from "react-helmet-async"
import { useNavigate, useParams, useSearchParams } from "react-router-dom"
import { pageTitle } from "util/page"
import { pageTitle } from "utils/page"
import { createWorkspaceMachine } from "xServices/createWorkspace/createWorkspaceXService"
import {
CreateWorkspaceErrors,

View File

@ -135,6 +135,7 @@ RichParameters.args = {
MockTemplateVersionParameter3,
{
name: "Region",
required: false,
description: "",
description_plaintext: "",
type: "string",

View File

@ -7,7 +7,7 @@ import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete"
import { FormikContextType, FormikTouched, useFormik } from "formik"
import { FC, useEffect, useState } from "react"
import { useTranslation } from "react-i18next"
import { getFormHelpers, nameValidator, onChangeTrimmed } from "util/formUtils"
import { getFormHelpers, nameValidator, onChangeTrimmed } from "utils/formUtils"
import * as Yup from "yup"
import { AlertBanner } from "components/AlertBanner/AlertBanner"
import { FullPageHorizontalForm } from "components/FullPageForm/FullPageHorizontalForm"
@ -25,7 +25,7 @@ import {
selectInitialRichParametersValues,
useValidationSchemaForRichParameters,
workspaceBuildParameterValue,
} from "util/richParameters"
} from "utils/richParameters"
export enum CreateWorkspaceErrors {
GET_TEMPLATES_ERROR = "getTemplatesError",

View File

@ -2,7 +2,7 @@ import { UpdateAppearanceConfig } from "api/typesGenerated"
import { useDashboard } from "components/Dashboard/DashboardProvider"
import { FC } from "react"
import { Helmet } from "react-helmet-async"
import { pageTitle } from "util/page"
import { pageTitle } from "utils/page"
import { AppearanceSettingsPageView } from "./AppearanceSettingsPageView"
// ServiceBanner is unlike the other Deployment Settings pages because it

View File

@ -7,9 +7,8 @@ import {
export default {
title: "pages/AppearanceSettingsPageView",
component: AppearanceSettingsPageView,
argTypes: {
args: {
appearance: {
defaultValue: {
logo_url: "https://github.com/coder.png",
service_banner: {
enabled: true,
@ -17,16 +16,11 @@ export default {
background_color: "white",
},
},
},
isEntitled: {
defaultValue: false,
},
updateAppearance: {
defaultValue: () => {
isEntitled: false,
updateAppearance: () => {
return undefined
},
},
},
} as ComponentMeta<typeof AppearanceSettingsPageView>
const Template: Story<AppearanceSettingsPageViewProps> = (args) => (

View File

@ -8,7 +8,7 @@ import {
} from "components/DeploySettingsLayout/Badges"
import InputAdornment from "@material-ui/core/InputAdornment"
import { Fieldset } from "components/DeploySettingsLayout/Fieldset"
import { getFormHelpers } from "util/formUtils"
import { getFormHelpers } from "utils/formUtils"
import Button from "@material-ui/core/Button"
import FormControlLabel from "@material-ui/core/FormControlLabel"
import FormHelperText from "@material-ui/core/FormHelperText"

View File

@ -1,7 +1,7 @@
import { useDeploySettings } from "components/DeploySettingsLayout/DeploySettingsLayout"
import { FC } from "react"
import { Helmet } from "react-helmet-async"
import { pageTitle } from "util/page"
import { pageTitle } from "utils/page"
import { GeneralSettingsPageView } from "./GeneralSettingsPageView"
const GeneralSettingsPage: FC = () => {

View File

@ -11,26 +11,22 @@ import {
export default {
title: "pages/GeneralSettingsPageView",
component: GeneralSettingsPageView,
argTypes: {
deploymentOptions: {
defaultValue: [
args: {
deploymentOptions: [
{
name: "Access URL",
usage:
description:
"External URL to access your deployment. This must be accessible by all provisioned workspaces.",
value: "https://dev.coder.com",
},
{
name: "Wildcard Access URL",
usage:
description:
'Specifies the wildcard hostname to use for workspace applications in the form "*.example.com".',
value: "*--apps.dev.coder.com",
},
],
},
deploymentDAUs: {
defaultValue: MockDeploymentDAUResponse,
},
deploymentDAUs: MockDeploymentDAUResponse,
},
} as ComponentMeta<typeof GeneralSettingsPageView>

View File

@ -5,7 +5,7 @@ import { DAUChart } from "components/DAUChart/DAUChart"
import { Header } from "components/DeploySettingsLayout/Header"
import OptionsTable from "components/DeploySettingsLayout/OptionsTable"
import { Stack } from "components/Stack/Stack"
import { useDeploymentOptions } from "util/deployOptions"
import { useDeploymentOptions } from "utils/deployOptions"
export type GeneralSettingsPageViewProps = {
deploymentOptions: DeploymentOption[]

Some files were not shown because too many files have changed in this diff Show More