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)}
+ />
+ );
+ })
+ )}
- {
- setIsDeletingGroup(true);
- }}
- startIcon={}
- className={styles.removeButton}
- >
- Delete…
-
- >
- )
- }
- >
-
- {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."),
- );
- }
+
+
+ }
+ to="settings"
+ component={RouterLink}
+ >
+ Settings
+
+ {
+ setIsDeletingGroup(true);
}}
- />
- )}
-
-
-
+ startIcon={}
+ className={styles.removeButton}
+ >
+ Delete…
+
+ >
+ )
+ }
+ >
+
+ {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"])}
-
-
-
-
+
+ }
+ variant="contained"
>
- }
- variant="contained"
- >
- 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 });
- }}
- />
-
-
+ 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) => {