diff --git a/site/src/components/Pill/Pill.tsx b/site/src/components/Pill/Pill.tsx index f3c7190252bee..b250c0318bded 100644 --- a/site/src/components/Pill/Pill.tsx +++ b/site/src/components/Pill/Pill.tsx @@ -1,4 +1,4 @@ -import { type FC, type ReactNode, useMemo } from "react"; +import { type FC, type ReactNode, useMemo, forwardRef } from "react"; import { css, type Interpolation, type Theme, useTheme } from "@emotion/react"; import { colors } from "theme/colors"; @@ -44,61 +44,71 @@ const themeStyles = }; }; -export const Pill: FC = (props) => { - const { lightBorder, icon, text = null, type = "neutral", ...attrs } = props; - const theme = useTheme(); +export const Pill: FC = forwardRef( + (props, ref) => { + const { + lightBorder, + icon, + text = null, + type = "neutral", + ...attrs + } = props; + const theme = useTheme(); - const typeStyles = useMemo(() => { - if (type in themeOverrides) { - return themeOverrides[type as keyof typeof themeOverrides](lightBorder); - } - return themeStyles(type, lightBorder); - }, [type, lightBorder]); + const typeStyles = useMemo(() => { + if (type in themeOverrides) { + return themeOverrides[type as keyof typeof themeOverrides](lightBorder); + } + return themeStyles(type, lightBorder); + }, [type, lightBorder]); - return ( -
- {icon && ( -
img, - & > svg { + return ( +
+ {icon && ( +
- {icon} -
- )} - {text} -
- ); -}; + line-height: 0; + display: flex; + align-items: center; + justify-content: center; + + & > img, + & > svg { + width: ${theme.spacing(1.75)}; + height: ${theme.spacing(1.75)}; + } + `} + > + {icon} +
+ )} + {text} +
+ ); + }, +); diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.stories.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.stories.tsx index 80c5e9bdc3e9d..7c6bc15cf93f2 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.stories.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.stories.tsx @@ -18,6 +18,10 @@ dayjs.extend(timezone); const meta: Meta = { title: "components/WorkspaceScheduleForm", component: WorkspaceScheduleForm, + args: { + enableAutoStart: true, + enableAutoStop: true, + }, }; export default meta; @@ -38,6 +42,8 @@ export const AllDisabled: Story = { autostopEnabled: false, ttl: emptyTTL, }, + enableAutoStart: false, + enableAutoStop: false, }, }; @@ -49,6 +55,7 @@ export const Autostart: Story = { autostopEnabled: false, ttl: emptyTTL, }, + enableAutoStop: false, }, }; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx index ba779d37dc227..434d77ddcf143 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx @@ -30,6 +30,8 @@ import { ChangeEvent, FC } from "react"; import * as Yup from "yup"; import { getFormHelpers } from "utils/formUtils"; import { timeZones } from "utils/timeZones"; +import { Pill } from "components/Pill/Pill"; +import Tooltip from "@mui/material/Tooltip"; // REMARK: some plugins depend on utc, so it's listed first. Otherwise they're // sorted alphabetically. @@ -76,6 +78,8 @@ export interface WorkspaceScheduleFormProps { submitScheduleError?: unknown; initialValues: WorkspaceScheduleFormValues; isLoading: boolean; + enableAutoStop: boolean; + enableAutoStart: boolean; onCancel: () => void; onSubmit: (values: WorkspaceScheduleFormValues) => void; // for storybook @@ -193,6 +197,8 @@ export const WorkspaceScheduleForm: FC< onSubmit, initialTouched, defaultTTL, + enableAutoStop, + enableAutoStart, }) => { const styles = useStyles(); @@ -284,12 +290,25 @@ export const WorkspaceScheduleForm: FC< +
+ Select the time and days of week on which you want the workspace + starting automatically. +
+ {!enableAutoStart && ( + + + + )} + + } > +
+ Set how many hours should elapse after a workspace is started + before it automatically shuts down. If workspace connection + activity is detected, the autostop timer will be bumped by this + value. +
+ {!enableAutoStop && ( + + + + )} + + } > } label={Language.stopSwitch} diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx index 660bb80a6f9c8..db62003b32922 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx @@ -83,6 +83,8 @@ export const WorkspaceSchedulePage: FC = () => { (scheduleState.matches("presentForm") || scheduleState.matches("submittingSchedule")) && (