Skip to content

feat: unify organization and deployment management settings #13602

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 17 commits into from
Jul 1, 2024
Prev Previous commit
Next Next commit
🧹
  • Loading branch information
aslilac committed Jun 18, 2024
commit 6443abca640f61826e47c7352228ee33c4e02f20
2 changes: 1 addition & 1 deletion site/src/pages/DeploySettingsPage/DeploySettingsLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import { Margins } from "components/Margins/Margins";
import { Stack } from "components/Stack/Stack";
import { useAuthenticated } from "contexts/auth/RequireAuth";
import { RequirePermission } from "contexts/auth/RequirePermission";
import { Sidebar } from "../ManagementSettingsPage/Sidebar";
import { useDashboard } from "modules/dashboard/useDashboard";
import { ManagementSettingsLayout } from "pages/ManagementSettingsPage/ManagementSettingsLayout";
import { Sidebar } from "../ManagementSettingsPage/Sidebar";

type DeploySettingsContextValue = {
deploymentValues: DeploymentConfig;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import { type FC } from "react";
import type { FC } from "react";
import { useMutation, useQueryClient } from "react-query";
import { useNavigate } from "react-router-dom";
import {
createOrganization,
updateOrganization,
deleteOrganization,
} from "api/queries/organizations";
import { createOrganization } from "api/queries/organizations";
import { ErrorAlert } from "components/Alert/ErrorAlert";
import { displaySuccess } from "components/GlobalSnackbar/utils";
import { Stack } from "components/Stack/Stack";
import { useOrganizationSettings } from "./ManagementSettingsLayout";
import { CreateOrganizationPageView } from "./CreateOrganizationPageView";

const CreateOrganizationPage: FC = () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,22 @@
import type { Interpolation, Theme } from "@emotion/react";
import Button from "@mui/material/Button";
import TextField from "@mui/material/TextField";
import { useFormik } from "formik";
import { type FC, useState } from "react";
import { useMutation, useQueryClient } from "react-query";
import type { FC } from "react";
import * as Yup from "yup";
import {
createOrganization,
updateOrganization,
deleteOrganization,
} from "api/queries/organizations";
import type {
CreateOrganizationRequest,
Organization,
} from "api/typesGenerated";
import { ErrorAlert } from "components/Alert/ErrorAlert";
import type { CreateOrganizationRequest } from "api/typesGenerated";
import {
FormFields,
FormSection,
HorizontalForm,
FormFooter,
} from "components/Form/Form";
import { displaySuccess } from "components/GlobalSnackbar/utils";
import { IconField } from "components/IconField/IconField";
import { Margins } from "components/Margins/Margins";
import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader";
import { Stack } from "components/Stack/Stack";
import {
getFormHelpers,
nameValidator,
displayNameValidator,
onChangeTrimmed,
} from "utils/formUtils";
import { useOrganizationSettings } from "./ManagementSettingsLayout";

const MAX_DESCRIPTION_CHAR_LIMIT = 128;
const MAX_DESCRIPTION_MESSAGE = `Please enter a description that is no longer than ${MAX_DESCRIPTION_CHAR_LIMIT} characters.`;
Expand Down Expand Up @@ -118,30 +102,3 @@ export const CreateOrganizationPageView: FC<
</div>
);
};

const styles = {
dangerButton: (theme) => ({
"&.MuiButton-contained": {
backgroundColor: theme.roles.danger.fill.solid,
borderColor: theme.roles.danger.fill.outline,

"&:not(.MuiLoadingButton-loading)": {
color: theme.roles.danger.fill.text,
},

"&:hover:not(:disabled)": {
backgroundColor: theme.roles.danger.hover.fill.solid,
borderColor: theme.roles.danger.hover.fill.outline,
},

"&.Mui-disabled": {
backgroundColor: theme.roles.danger.disabled.background,
borderColor: theme.roles.danger.disabled.outline,

"&:not(.MuiLoadingButton-loading)": {
color: theme.roles.danger.disabled.fill.text,
},
},
},
}),
} satisfies Record<string, Interpolation<Theme>>;
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { createContext, type FC, Suspense, useContext } from "react";
import { useQuery } from "react-query";
import { Outlet, useLocation, useParams } from "react-router-dom";
import { deploymentConfig } from "api/queries/deployment";
import { myOrganizations } from "api/queries/users";
import type { Organization } from "api/typesGenerated";
import { Loader } from "components/Loader/Loader";
Expand All @@ -10,9 +11,8 @@ import { useAuthenticated } from "contexts/auth/RequireAuth";
import { RequirePermission } from "contexts/auth/RequirePermission";
import { useDashboard } from "modules/dashboard/useDashboard";
import NotFoundPage from "pages/404Page/404Page";
import { Sidebar } from "./Sidebar";
import { deploymentConfig } from "api/queries/deployment";
import { DeploySettingsContext } from "../DeploySettingsPage/DeploySettingsLayout";
import { Sidebar } from "./Sidebar";

type OrganizationSettingsContextValue = {
currentOrganizationId?: string;
Expand Down Expand Up @@ -43,8 +43,6 @@ export const ManagementSettingsLayout: FC = () => {

const multiOrgExperimentEnabled = experiments.includes("multi-organization");

console.log("oh jeez", organization);

const inOrganizationSettings =
location.pathname.startsWith("/organizations") &&
location.pathname !== "/organizations/new";
Expand Down
12 changes: 2 additions & 10 deletions site/src/pages/ManagementSettingsPage/OrganizationSettingsPage.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { type FC } from "react";
import type { FC } from "react";
import { useMutation, useQueryClient } from "react-query";
import { useNavigate } from "react-router-dom";
import {
createOrganization,
updateOrganization,
deleteOrganization,
} from "api/queries/organizations";
Expand All @@ -16,7 +15,6 @@ const OrganizationSettingsPage: FC = () => {
const navigate = useNavigate();

const queryClient = useQueryClient();
const addOrganizationMutation = useMutation(createOrganization(queryClient));
const updateOrganizationMutation = useMutation(
updateOrganization(queryClient),
);
Expand All @@ -29,9 +27,7 @@ const OrganizationSettingsPage: FC = () => {
const org = organizations.find((org) => org.id === currentOrganizationId);

const error =
updateOrganizationMutation.error ??
addOrganizationMutation.error ??
deleteOrganizationMutation.error;
updateOrganizationMutation.error ?? deleteOrganizationMutation.error;

if (!currentOrganizationId) {
return null;
Expand All @@ -55,10 +51,6 @@ const OrganizationSettingsPage: FC = () => {
});
displaySuccess("Organization settings updated.");
}}
onCreateOrg={(name) => {
addOrganizationMutation.mutate({ name });
navigate(`/organizations/${name}`);
}}
onDeleteOrg={() => {
deleteOrganizationMutation.mutate(org.id);
navigate("/organizations");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,26 @@ import type { Interpolation, Theme } from "@emotion/react";
import Button from "@mui/material/Button";
import TextField from "@mui/material/TextField";
import { useFormik } from "formik";
import { type FC, useState } from "react";
import { useMutation, useQueryClient } from "react-query";
import type { FC } from "react";
import * as Yup from "yup";
import {
createOrganization,
updateOrganization,
deleteOrganization,
} from "api/queries/organizations";
import type {
Organization,
UpdateOrganizationRequest,
} from "api/typesGenerated";
import { ErrorAlert } from "components/Alert/ErrorAlert";
import {
FormFields,
FormSection,
HorizontalForm,
FormFooter,
} from "components/Form/Form";
import { displaySuccess } from "components/GlobalSnackbar/utils";
import { IconField } from "components/IconField/IconField";
import { Margins } from "components/Margins/Margins";
import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader";
import { Stack } from "components/Stack/Stack";
import {
getFormHelpers,
nameValidator,
displayNameValidator,
onChangeTrimmed,
} from "utils/formUtils";
import { useOrganizationSettings } from "./ManagementSettingsLayout";

const MAX_DESCRIPTION_CHAR_LIMIT = 128;
const MAX_DESCRIPTION_MESSAGE = `Please enter a description that is no longer than ${MAX_DESCRIPTION_CHAR_LIMIT} characters.`;
Expand All @@ -51,13 +40,12 @@ interface OrganizationSettingsPageViewProps {
error: unknown;
onSubmit: (values: UpdateOrganizationRequest) => Promise<void>;

onCreateOrg: (name: string) => void;
onDeleteOrg: () => void;
}

export const OrganizationSettingsPageView: FC<
OrganizationSettingsPageViewProps
> = ({ org, error, onSubmit, onCreateOrg, onDeleteOrg }) => {
> = ({ org, error, onSubmit, onDeleteOrg }) => {
const form = useFormik<UpdateOrganizationRequest>({
initialValues: {
name: org.name,
Expand All @@ -71,8 +59,6 @@ export const OrganizationSettingsPageView: FC<
});
const getFieldHelpers = getFormHelpers(form, error);

const [newOrgName, setNewOrgName] = useState("");

return (
<div>
<PageHeader>
Expand Down Expand Up @@ -132,16 +118,6 @@ export const OrganizationSettingsPageView: FC<
Delete this organization
</Button>
)}

<Stack css={{ marginTop: 128 }}>
<TextField
label="New organization name"
onChange={(event) => setNewOrgName(event.target.value)}
/>
<Button onClick={() => onCreateOrg(newOrgName)}>
Create new organization
</Button>
</Stack>
</div>
);
};
Expand Down
10 changes: 3 additions & 7 deletions site/src/pages/ManagementSettingsPage/Sidebar.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { cx } from "@emotion/css";
import AddIcon from "@mui/icons-material/Add";
import SettingsIcon from "@mui/icons-material/Settings";
import type { FC, ReactNode } from "react";
import { Link, NavLink, useLocation } from "react-router-dom";
import type { Organization } from "api/typesGenerated";
Expand All @@ -7,8 +9,6 @@ import { Stack } from "components/Stack/Stack";
import { UserAvatar } from "components/UserAvatar/UserAvatar";
import { type ClassName, useClassName } from "hooks/useClassName";
import { useOrganizationSettings } from "./ManagementSettingsLayout";
import SettingsIcon from "@mui/icons-material/Settings";
import AddIcon from "@mui/icons-material/Add";

export const Sidebar: FC = () => {
const { currentOrganizationId, organizations } = useOrganizationSettings();
Expand Down Expand Up @@ -47,11 +47,7 @@ export const Sidebar: FC = () => {
);
};

interface DeploymentSettingsNavigationProps {}

const DeploymentSettingsNavigation: FC<
DeploymentSettingsNavigationProps
> = ({}) => {
const DeploymentSettingsNavigation: FC = () => {
const location = useLocation();
const active = location.pathname.startsWith("/deployment");

Expand Down
Loading