diff --git a/cli/errors.go b/cli/errors.go index 6f873f06f8..12567e0400 100644 --- a/cli/errors.go +++ b/cli/errors.go @@ -6,9 +6,10 @@ import ( "net/http/httptest" "os" + "golang.org/x/xerrors" + "github.com/coder/coder/v2/cli/clibase" "github.com/coder/coder/v2/codersdk" - "golang.org/x/xerrors" ) func (RootCmd) errorExample() *clibase.Cmd { diff --git a/site/src/components/PaginationWidget/PaginationWidget.tsx b/site/src/components/PaginationWidget/PaginationWidget.tsx index fff86071a2..60bf1b89ea 100644 --- a/site/src/components/PaginationWidget/PaginationWidget.tsx +++ b/site/src/components/PaginationWidget/PaginationWidget.tsx @@ -4,7 +4,6 @@ import useMediaQuery from "@mui/material/useMediaQuery"; import KeyboardArrowLeft from "@mui/icons-material/KeyboardArrowLeft"; import KeyboardArrowRight from "@mui/icons-material/KeyboardArrowRight"; import { useActor } from "@xstate/react"; -import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"; import { CSSProperties } from "react"; import { PaginationMachineRef } from "xServices/pagination/paginationXService"; import { PageButton } from "./PageButton"; @@ -54,35 +53,32 @@ export const PaginationWidget = ({
{prevLabel}
- - - - - - {buildPagedList(numPages, currentPage).map((page) => - typeof page !== "number" ? ( - - ) : ( - send({ type: "GO_TO_PAGE", page })} - /> - ), - )} - - + {isMobile ? ( + + ) : ( + buildPagedList(numPages, currentPage).map((page) => + typeof page !== "number" ? ( + + ) : ( + send({ type: "GO_TO_PAGE", page })} + /> + ), + ) + )} - - - - - - {buildPagedList(numPages, page).map((pageItem) => { - if (pageItem === "left" || pageItem === "right") { - return ( - - ); - } - + {isMobile ? ( + + ) : ( + buildPagedList(numPages, page).map((pageItem) => { + if (pageItem === "left" || pageItem === "right") { return ( onChange(pageItem)} + placeholder="..." + disabled /> ); - })} - - + } + + return ( + onChange(pageItem)} + /> + ); + }) + )} - - - ) - } - > - - {groupData?.display_name || groupData?.name} - - - {/* Show the name if it differs from the display name. */} - {groupData?.display_name && - groupData?.display_name !== groupData?.name - ? groupData?.name - : ""}{" "} - - - - - {canUpdateGroup && groupData && !isEveryoneGroup(groupData) && ( - { - try { - await addMemberMutation.mutateAsync({ - groupId, - userId: user.id, - }); - reset(); - } catch (error) { - displayError( - getErrorMessage(error, "Failed to add member."), - ); - } + + + + + + ) + } + > + + {groupData?.display_name || groupData?.name} + + + {/* Show the name if it differs from the display name. */} + {groupData?.display_name && + groupData?.display_name !== groupData?.name + ? groupData?.name + : ""}{" "} + + - - - - - User - - - + + {canUpdateGroup && groupData && !isEveryoneGroup(groupData) && ( + { + try { + await addMemberMutation.mutateAsync({ + groupId, + userId: user.id, + }); + reset(); + } catch (error) { + displayError(getErrorMessage(error, "Failed to add member.")); + } + }} + /> + )} + + + - - - - - - - - - + +
+ + + User + + + - - {groupData?.members.map((member) => ( - - ))} - - - -
-
-
- - - + + {groupData?.members.length === 0 ? ( + + + + + + ) : ( + groupData?.members.map((member) => ( + + )) + )} + + + + + {groupQuery.data && ( = ({ isLoading, isUpdating, }) => { - return ( - - - - + if (isLoading) { + return ; + } - - - - - - + return ( + + + ); }; diff --git a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx index 5c3ae473dd..898202bd51 100644 --- a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPage.tsx @@ -2,7 +2,6 @@ import Button from "@mui/material/Button"; import Link from "@mui/material/Link"; import ArrowRightAltOutlined from "@mui/icons-material/ArrowRightAltOutlined"; import { useMachine } from "@xstate/react"; -import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"; import { Paywall } from "components/Paywall/Paywall"; import { Stack } from "components/Stack/Stack"; import { useFeatureVisibility } from "hooks/useFeatureVisibility"; @@ -31,67 +30,60 @@ export const TemplatePermissionsPage: FC< {pageTitle([template.name, "Permissions"])} - - - - + + - - - Read the docs - - - } - /> - - - { - send("ADD_USER", { user, role, onDone: reset }); - }} - isAddingUser={state.matches("addingUser")} - onUpdateUser={(user, role) => { - send("UPDATE_USER_ROLE", { user, role }); - }} - updatingUser={userToBeUpdated} - onRemoveUser={(user) => { - send("REMOVE_USER", { user }); - }} - onAddGroup={(group, role, reset) => { - send("ADD_GROUP", { group, role, onDone: reset }); - }} - isAddingGroup={state.matches("addingGroup")} - onUpdateGroup={(group, role) => { - send("UPDATE_GROUP_ROLE", { group, role }); - }} - updatingGroup={groupToBeUpdated} - onRemoveGroup={(group) => { - send("REMOVE_GROUP", { group }); - }} - /> - - + See how to upgrade + + + + Read the docs + + + } + /> + ) : ( + { + send("ADD_USER", { user, role, onDone: reset }); + }} + isAddingUser={state.matches("addingUser")} + onUpdateUser={(user, role) => { + send("UPDATE_USER_ROLE", { user, role }); + }} + updatingUser={userToBeUpdated} + onRemoveUser={(user) => { + send("REMOVE_USER", { user }); + }} + onAddGroup={(group, role, reset) => { + send("ADD_GROUP", { group, role, onDone: reset }); + }} + isAddingGroup={state.matches("addingGroup")} + onUpdateGroup={(group, role) => { + send("UPDATE_GROUP_ROLE", { group, role }); + }} + updatingGroup={groupToBeUpdated} + onRemoveGroup={(group) => { + send("REMOVE_GROUP", { group }); + }} + /> + )} ); }; diff --git a/site/src/pages/TemplatesPage/TemplatesPageView.tsx b/site/src/pages/TemplatesPage/TemplatesPageView.tsx index 88ce3540c3..795ac844e1 100644 --- a/site/src/pages/TemplatesPage/TemplatesPageView.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPageView.tsx @@ -7,7 +7,6 @@ import TableContainer from "@mui/material/TableContainer"; import TableHead from "@mui/material/TableHead"; import TableRow from "@mui/material/TableRow"; import AddIcon from "@mui/icons-material/AddOutlined"; -import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"; import { FC } from "react"; import { useNavigate, Link as RouterLink } from "react-router-dom"; import { createDayString } from "utils/createDayString"; @@ -151,7 +150,7 @@ export const TemplatesPageView: FC = ({ canCreateTemplates, }) => { const isLoading = !templates; - const isEmpty = Boolean(templates && templates.length === 0); + const isEmpty = templates && templates.length === 0; return ( @@ -187,45 +186,37 @@ export const TemplatesPageView: FC = ({ )} - - - - + {error ? ( + + ) : ( + + + + + {Language.nameLabel} + {Language.usedByLabel} + {Language.buildTimeLabel} + {Language.lastUpdatedLabel} + + + + + {isLoading && } - - -
- - - {Language.nameLabel} - {Language.usedByLabel} - {Language.buildTimeLabel} - {Language.lastUpdatedLabel} - - - - - {isLoading && } - - - - - - - - {templates?.map((template) => ( - - ))} - - - -
-
- -
+ {isEmpty ? ( + + ) : ( + templates?.map((template) => ( + + )) + )} + + + + )}
); }; diff --git a/site/src/pages/WorkspacePage/Workspace.tsx b/site/src/pages/WorkspacePage/Workspace.tsx index f789171cb5..c2d178d7d1 100644 --- a/site/src/pages/WorkspacePage/Workspace.tsx +++ b/site/src/pages/WorkspacePage/Workspace.tsx @@ -27,7 +27,6 @@ import { TemplateVersionWarnings } from "components/TemplateVersionWarnings/Temp import { ErrorAlert } from "components/Alert/ErrorAlert"; import { DormantWorkspaceBanner } from "components/WorkspaceDeletion"; import { useLocalStorage } from "hooks"; -import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"; import AlertTitle from "@mui/material/AlertTitle"; import dayjs from "dayjs"; @@ -257,23 +256,19 @@ export const Workspace: FC> = ({ )} - - - navigate(`/templates`)} - /> - - - {/* determines its own visibility */} - saveLocal("dismissedWorkspace", workspace.id)} - /> - - + {workspace.latest_build.status === "deleted" && ( + navigate(`/templates`)} + /> + )} + {/* determines its own visibility */} + saveLocal("dismissedWorkspace", workspace.id)} + /> diff --git a/site/src/pages/WorkspacePage/WorkspacePage.tsx b/site/src/pages/WorkspacePage/WorkspacePage.tsx index 7cc6247dbe..44ab8e0fbe 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.tsx @@ -1,5 +1,4 @@ import { useMachine } from "@xstate/react"; -import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"; import { Loader } from "components/Loader/Loader"; import { FC } from "react"; import { useParams } from "react-router-dom"; @@ -32,35 +31,29 @@ export const WorkspacePage: FC = () => { const quotaQuery = useQuery(workspaceQuota(username)); const pageError = error ?? quotaQuery.error; + if (pageError) { + return ( + + + + ); + } + + if (!workspace || !workspaceState.matches("ready") || !quotaQuery.isSuccess) { + return ; + } + return ( - - - - - - - - - - - - - + ); }; diff --git a/site/src/pages/WorkspacesPage/WorkspacesTable.tsx b/site/src/pages/WorkspacesPage/WorkspacesTable.tsx index 8514ed4e73..63eb19d865 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesTable.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesTable.tsx @@ -13,7 +13,6 @@ import { } from "components/TableLoader/TableLoader"; import AddOutlined from "@mui/icons-material/AddOutlined"; import Button from "@mui/material/Button"; -import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"; import { Link as RouterLink, useNavigate } from "react-router-dom"; import { useClickableTableRow } from "hooks/useClickableTableRow"; import KeyboardArrowRight from "@mui/icons-material/KeyboardArrowRight"; @@ -94,12 +93,10 @@ export const WorkspacesTable: FC = ({ )} {workspaces && workspaces.length === 0 && ( - - + <> + {isUsingFilter ? ( - - - + ) : ( = ({ } /> - - + )} + )} {workspaces && workspaces.map((workspace) => {