From 3c03a3aec037972af651e04263fdff17dd98e29d Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Fri, 17 Jan 2025 19:46:28 -0500 Subject: [PATCH 1/4] fix: add groups to deployment settings (#16185) fixes #16182 Screenshot 2025-01-17 at 23 20 04 Screenshot 2025-01-17 at 23 20 12 Screenshot 2025-01-17 at 23 20 22 (cherry picked from commit fbc2a73bef3110709e95f495a39fd9298871cdc8) --- site/e2e/helpers.ts | 18 ++++--- site/src/modules/management/SidebarView.tsx | 3 ++ site/src/pages/GroupsPage/CreateGroupPage.tsx | 2 +- .../pages/GroupsPage/CreateGroupPageView.tsx | 2 +- site/src/pages/GroupsPage/GroupPage.tsx | 2 +- site/src/pages/GroupsPage/GroupsPageView.tsx | 4 +- .../pages/GroupsPage/SettingsGroupPage.tsx | 4 +- site/src/pages/UsersPage/UsersLayout.tsx | 51 ++----------------- site/src/router.tsx | 17 +++++-- 9 files changed, 39 insertions(+), 64 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 8f69b90900538..2fc0112a9d222 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -232,13 +232,15 @@ export const createTemplate = async ( * random name. */ export const createGroup = async (page: Page): Promise => { - await page.goto("/groups/create", { waitUntil: "domcontentloaded" }); - await expectUrl(page).toHavePathName("/groups/create"); + await page.goto("/deployment/groups/create", { + waitUntil: "domcontentloaded", + }); + await expectUrl(page).toHavePathName("/deployment/groups/create"); const name = randomName(); await page.getByLabel("Name", { exact: true }).fill(name); - await page.getByTestId("form-submit").click(); - await expectUrl(page).toHavePathName(`/groups/${name}`); + await page.getByRole("button", { name: /save/i }).click(); + await expectUrl(page).toHavePathName(`/deployment/groups/${name}`); return name; }; @@ -468,10 +470,10 @@ export const waitUntilUrlIsNotResponding = async (url: string) => { // Allows users to more easily define properties they want for agents and resources! type RecursivePartial = { [P in keyof T]?: T[P] extends (infer U)[] - ? RecursivePartial[] - : T[P] extends object | undefined - ? RecursivePartial - : T[P]; + ? RecursivePartial[] + : T[P] extends object | undefined + ? RecursivePartial + : T[P]; }; interface EchoProvisionerResponses { diff --git a/site/src/modules/management/SidebarView.tsx b/site/src/modules/management/SidebarView.tsx index eabcac8f30ccc..1b4ba2d7b501e 100644 --- a/site/src/modules/management/SidebarView.tsx +++ b/site/src/modules/management/SidebarView.tsx @@ -147,6 +147,9 @@ const DeploymentSettingsNavigation: FC = ({ {permissions.viewAllUsers && ( Users )} + {permissions.viewAnyGroup && ( + Groups + )} {permissions.viewNotificationTemplate && ( diff --git a/site/src/pages/GroupsPage/CreateGroupPage.tsx b/site/src/pages/GroupsPage/CreateGroupPage.tsx index 26c5aef6d53da..92f480d8ab959 100644 --- a/site/src/pages/GroupsPage/CreateGroupPage.tsx +++ b/site/src/pages/GroupsPage/CreateGroupPage.tsx @@ -19,7 +19,7 @@ export const CreateGroupPage: FC = () => { { const newGroup = await createGroupMutation.mutateAsync(data); - navigate(`/groups/${newGroup.name}`); + navigate(`/deployment/groups/${newGroup.name}`); }} error={createGroupMutation.error} isLoading={createGroupMutation.isLoading} diff --git a/site/src/pages/GroupsPage/CreateGroupPageView.tsx b/site/src/pages/GroupsPage/CreateGroupPageView.tsx index 389dc6e0e89cb..e14767e257f2c 100644 --- a/site/src/pages/GroupsPage/CreateGroupPageView.tsx +++ b/site/src/pages/GroupsPage/CreateGroupPageView.tsx @@ -44,7 +44,7 @@ export const CreateGroupPageView: FC = ({ initialTouched, }); const getFieldHelpers = getFormHelpers(form, error); - const onCancel = () => navigate("/groups"); + const onCancel = () => navigate("/deployment/groups"); return ( diff --git a/site/src/pages/GroupsPage/GroupPage.tsx b/site/src/pages/GroupsPage/GroupPage.tsx index 1244118aa3840..0fc4a8122b151 100644 --- a/site/src/pages/GroupsPage/GroupPage.tsx +++ b/site/src/pages/GroupsPage/GroupPage.tsx @@ -211,7 +211,7 @@ export const GroupPage: FC = () => { try { await deleteGroupMutation.mutateAsync(groupId); displaySuccess("Group deleted successfully."); - navigate("/groups"); + navigate("/deployment/groups"); } catch (error) { displayError(getErrorMessage(error, "Failed to delete group.")); } diff --git a/site/src/pages/GroupsPage/GroupsPageView.tsx b/site/src/pages/GroupsPage/GroupsPageView.tsx index 8c9f1f8e46601..17d15a7f44683 100644 --- a/site/src/pages/GroupsPage/GroupsPageView.tsx +++ b/site/src/pages/GroupsPage/GroupsPageView.tsx @@ -81,7 +81,7 @@ export const GroupsPageView: FC = ({ canCreateGroup && ( - )} +
{permissions.createGroup && feats.template_rbac && ( )} - +
} > - Users + Groups
- {!showOrganizations && ( - - - - - Users - - - Groups - - - - - )} - }> diff --git a/site/src/router.tsx b/site/src/router.tsx index 1b23b55245e8f..6fc18130fc170 100644 --- a/site/src/router.tsx +++ b/site/src/router.tsx @@ -342,7 +342,7 @@ const templateRouter = () => { ); }; -const groupsRouter = () => { +const organizationGroupsRouter = () => { return ( } /> @@ -420,7 +420,7 @@ export const router = createBrowserRouter( } /> } /> - {groupsRouter()} + {organizationGroupsRouter()} } /> } /> @@ -473,7 +473,18 @@ export const router = createBrowserRouter( } /> } /> - {groupsRouter()} + + }> + } /> + + + } /> + } /> + } + /> + }> From b14b1e3e1ba77c27905627c475f75ec95907e6e8 Mon Sep 17 00:00:00 2001 From: Ben Potter Date: Sat, 18 Jan 2025 01:59:29 +0000 Subject: [PATCH 2/4] fmt --- site/e2e/helpers.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 2fc0112a9d222..4a2e86abf70b4 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -470,10 +470,10 @@ export const waitUntilUrlIsNotResponding = async (url: string) => { // Allows users to more easily define properties they want for agents and resources! type RecursivePartial = { [P in keyof T]?: T[P] extends (infer U)[] - ? RecursivePartial[] - : T[P] extends object | undefined - ? RecursivePartial - : T[P]; + ? RecursivePartial[] + : T[P] extends object | undefined + ? RecursivePartial + : T[P]; }; interface EchoProvisionerResponses { From 6df14a6127be7d02bd47a9d80fdd2c8e217301d0 Mon Sep 17 00:00:00 2001 From: Ben Potter Date: Sat, 18 Jan 2025 02:14:18 +0000 Subject: [PATCH 3/4] fix create group test --- site/e2e/helpers.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 4a2e86abf70b4..16ec81a94f863 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -239,7 +239,7 @@ export const createGroup = async (page: Page): Promise => { const name = randomName(); await page.getByLabel("Name", { exact: true }).fill(name); - await page.getByRole("button", { name: /save/i }).click(); + await page.getByTestId("form-submit").click(); await expectUrl(page).toHavePathName(`/deployment/groups/${name}`); return name; }; @@ -470,10 +470,10 @@ export const waitUntilUrlIsNotResponding = async (url: string) => { // Allows users to more easily define properties they want for agents and resources! type RecursivePartial = { [P in keyof T]?: T[P] extends (infer U)[] - ? RecursivePartial[] - : T[P] extends object | undefined - ? RecursivePartial - : T[P]; + ? RecursivePartial[] + : T[P] extends object | undefined + ? RecursivePartial + : T[P]; }; interface EchoProvisionerResponses { From 465912b98996c180151aa291f4face8ffbafc76e Mon Sep 17 00:00:00 2001 From: Ben Potter Date: Sat, 18 Jan 2025 02:14:54 +0000 Subject: [PATCH 4/4] fmt --- site/e2e/helpers.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 16ec81a94f863..b79dd07e9de36 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -470,10 +470,10 @@ export const waitUntilUrlIsNotResponding = async (url: string) => { // Allows users to more easily define properties they want for agents and resources! type RecursivePartial = { [P in keyof T]?: T[P] extends (infer U)[] - ? RecursivePartial[] - : T[P] extends object | undefined - ? RecursivePartial - : T[P]; + ? RecursivePartial[] + : T[P] extends object | undefined + ? RecursivePartial + : T[P]; }; interface EchoProvisionerResponses {