Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd68340b

Browse files
authored
feat: manage groups from deployment settings for single-org deployments (#14016)
1 parent68fa34f commitd68340b

File tree

11 files changed

+137
-125
lines changed

11 files changed

+137
-125
lines changed

‎site/src/api/queries/groups.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,28 @@ import type {
66
PatchGroupRequest,
77
}from"api/typesGenerated";
88

9-
constGROUPS_QUERY_KEY=["groups"];
109
typeGroupSortOrder="asc"|"desc";
1110

12-
constgetGroupQueryKey=(organizationId:string,groupName:string)=>[
11+
constgetGroupsQueryKey=(organizationId:string)=>[
12+
"organization",
1313
organizationId,
14-
"group",
15-
groupName,
14+
"groups",
1615
];
1716

1817
exportconstgroups=(organizationId:string)=>{
1918
return{
20-
queryKey:GROUPS_QUERY_KEY,
19+
queryKey:getGroupsQueryKey(organizationId),
2120
queryFn:()=>API.getGroups(organizationId),
2221
}satisfiesUseQueryOptions<Group[]>;
2322
};
2423

24+
constgetGroupQueryKey=(organizationId:string,groupName:string)=>[
25+
"organization",
26+
organizationId,
27+
"group",
28+
groupName,
29+
];
30+
2531
exportconstgroup=(organizationId:string,groupName:string)=>{
2632
return{
2733
queryKey:getGroupQueryKey(organizationId,groupName),
@@ -97,7 +103,7 @@ export const createGroup = (
97103
mutationFn:(request:CreateGroupRequest)=>
98104
API.createGroup(organizationId,request),
99105
onSuccess:async()=>{
100-
awaitqueryClient.invalidateQueries(GROUPS_QUERY_KEY);
106+
awaitqueryClient.invalidateQueries(getGroupsQueryKey(organizationId));
101107
},
102108
};
103109
};
@@ -146,7 +152,7 @@ export const invalidateGroup = (
146152
groupId:string,
147153
)=>
148154
Promise.all([
149-
queryClient.invalidateQueries(GROUPS_QUERY_KEY),
155+
queryClient.invalidateQueries(getGroupsQueryKey(organizationId)),
150156
queryClient.invalidateQueries(getGroupQueryKey(organizationId,groupId)),
151157
]);
152158

‎site/src/modules/dashboard/Navbar/Navbar.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ export const Navbar: FC = () => {
1818
constcanViewAuditLog=
1919
featureVisibility["audit_log"]&&Boolean(permissions.viewAuditLog);
2020
constcanViewDeployment=Boolean(permissions.viewDeploymentValues);
21+
constcanViewOrganizations=
22+
featureVisibility.multiple_organizations&&
23+
experiments.includes("multi-organization");
2124
constcanViewAllUsers=Boolean(permissions.readAllUsers);
2225
constproxyContextValue=useProxy();
2326
constcanViewHealth=canViewDeployment;
@@ -30,7 +33,7 @@ export const Navbar: FC = () => {
3033
supportLinks={appearance.support_links}
3134
onSignOut={signOut}
3235
canViewDeployment={canViewDeployment}
33-
canViewOrganizations={experiments.includes("multi-organization")}
36+
canViewOrganizations={canViewOrganizations}
3437
canViewAllUsers={canViewAllUsers}
3538
canViewHealth={canViewHealth}
3639
canViewAuditLog={canViewAuditLog}

‎site/src/pages/ManagementSettingsPage/GroupsPage/CreateGroupPage.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export const CreateGroupPage: FC = () => {
1111
constnavigate=useNavigate();
1212
const{ organization}=useParams()as{organization:string};
1313
constcreateGroupMutation=useMutation(
14-
createGroup(queryClient,organization),
14+
createGroup(queryClient,organization??"default"),
1515
);
1616

1717
return(
@@ -22,7 +22,11 @@ export const CreateGroupPage: FC = () => {
2222
<CreateGroupPageView
2323
onSubmit={async(data)=>{
2424
constnewGroup=awaitcreateGroupMutation.mutateAsync(data);
25-
navigate(`/organizations/${organization}/groups/${newGroup.name}`);
25+
navigate(
26+
organization
27+
?`/organizations/${organization}/groups/${newGroup.name}`
28+
:`/deployment/groups/${newGroup.name}`,
29+
);
2630
}}
2731
error={createGroupMutation.error}
2832
isLoading={createGroupMutation.isLoading}

‎site/src/pages/ManagementSettingsPage/GroupsPage/GroupPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ import { isEveryoneGroup } from "utils/groups";
5050
import{pageTitle}from"utils/page";
5151

5252
exportconstGroupPage:FC=()=>{
53-
const{ organization, groupName}=useParams()as{
53+
const{ organization="default", groupName}=useParams()as{
5454
organization:string;
5555
groupName:string;
5656
};

‎site/src/pages/ManagementSettingsPage/GroupsPage/GroupSettingsPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { pageTitle } from "utils/page";
1111
importGroupSettingsPageViewfrom"./GroupSettingsPageView";
1212

1313
exportconstGroupSettingsPage:FC=()=>{
14-
const{ organization, groupName}=useParams()as{
14+
const{ organization="default", groupName}=useParams()as{
1515
organization:string;
1616
groupName:string;
1717
};

‎site/src/pages/ManagementSettingsPage/GroupsPage/GroupsPage.tsx

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,36 @@ import Button from "@mui/material/Button";
33
import{typeFC,useEffect}from"react";
44
import{Helmet}from"react-helmet-async";
55
import{useQuery}from"react-query";
6-
import{LinkasRouterLink}from"react-router-dom";
6+
import{
7+
Navigate,
8+
LinkasRouterLink,
9+
useLocation,
10+
useParams,
11+
}from"react-router-dom";
712
import{getErrorMessage}from"api/errors";
813
import{groups}from"api/queries/groups";
14+
importtype{Organization}from"api/typesGenerated";
915
import{displayError}from"components/GlobalSnackbar/utils";
1016
import{PageHeader,PageHeaderTitle}from"components/PageHeader/PageHeader";
1117
import{useAuthenticated}from"contexts/auth/RequireAuth";
18+
import{useDashboard}from"modules/dashboard/useDashboard";
1219
import{useFeatureVisibility}from"modules/dashboard/useFeatureVisibility";
1320
import{pageTitle}from"utils/page";
1421
import{useOrganizationSettings}from"../ManagementSettingsLayout";
1522
importGroupsPageViewfrom"./GroupsPageView";
1623

1724
exportconstGroupsPage:FC=()=>{
1825
const{ permissions}=useAuthenticated();
19-
const{ currentOrganizationId}=useOrganizationSettings();
2026
const{createGroup:canCreateGroup}=permissions;
21-
const{template_rbac:isTemplateRBACEnabled}=useFeatureVisibility();
22-
constgroupsQuery=useQuery(groups(currentOrganizationId!));
27+
const{
28+
multiple_organizations:organizationsEnabled,
29+
template_rbac:isTemplateRBACEnabled,
30+
}=useFeatureVisibility();
31+
const{ experiments}=useDashboard();
32+
constlocation=useLocation();
33+
const{ organization="default"}=useParams()as{organization:string};
34+
constgroupsQuery=useQuery(groups(organization));
35+
const{ organizations}=useOrganizationSettings();
2336

2437
useEffect(()=>{
2538
if(groupsQuery.error){
@@ -29,6 +42,16 @@ export const GroupsPage: FC = () => {
2942
}
3043
},[groupsQuery.error]);
3144

45+
if(
46+
organizationsEnabled&&
47+
experiments.includes("multi-organization")&&
48+
location.pathname==="/deployment/groups"
49+
){
50+
constdefaultName=
51+
getOrganizationNameByDefault(organizations)??"default";
52+
return<Navigateto={`/organizations/${defaultName}/groups`}replace/>;
53+
}
54+
3255
return(
3356
<>
3457
<Helmet>
@@ -63,3 +86,6 @@ export const GroupsPage: FC = () => {
6386
};
6487

6588
exportdefaultGroupsPage;
89+
90+
exportconstgetOrganizationNameByDefault=(organizations:Organization[])=>
91+
organizations.find((org)=>org.is_default)?.name;

‎site/src/pages/ManagementSettingsPage/ManagementSettingsLayout.tsx

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import{createContext,typeFC,Suspense,useContext}from"react";
22
import{useQuery}from"react-query";
3-
import{Outlet,useLocation,useParams}from"react-router-dom";
3+
import{Outlet}from"react-router-dom";
44
import{deploymentConfig}from"api/queries/deployment";
55
import{organizations}from"api/queries/organizations";
66
importtype{Organization}from"api/typesGenerated";
@@ -15,7 +15,6 @@ import { DeploySettingsContext } from "../DeploySettingsPage/DeploySettingsLayou
1515
import{Sidebar}from"./Sidebar";
1616

1717
typeOrganizationSettingsContextValue={
18-
currentOrganizationId?:string;
1918
organizations:Organization[];
2019
};
2120

@@ -34,19 +33,13 @@ export const useOrganizationSettings = (): OrganizationSettingsContextValue => {
3433
};
3534

3635
exportconstManagementSettingsLayout:FC=()=>{
37-
constlocation=useLocation();
3836
const{ permissions}=useAuthenticated();
3937
const{ experiments}=useDashboard();
40-
const{ organization}=useParams()as{organization:string};
4138
constdeploymentConfigQuery=useQuery(deploymentConfig());
4239
constorganizationsQuery=useQuery(organizations());
4340

4441
constmultiOrgExperimentEnabled=experiments.includes("multi-organization");
4542

46-
constinOrganizationSettings=
47-
location.pathname.startsWith("/organizations")&&
48-
location.pathname!=="/organizations/new";
49-
5043
if(!multiOrgExperimentEnabled){
5144
return<NotFoundPage/>;
5245
}
@@ -57,17 +50,7 @@ export const ManagementSettingsLayout: FC = () => {
5750
<Stackcss={{padding:"48px 0"}}direction="row"spacing={6}>
5851
{organizationsQuery.data ?(
5952
<OrganizationSettingsContext.Provider
60-
value={{
61-
currentOrganizationId:!inOrganizationSettings
62-
?undefined
63-
:!organization
64-
?getOrganizationIdByDefault(organizationsQuery.data)
65-
:getOrganizationIdByName(
66-
organizationsQuery.data,
67-
organization,
68-
),
69-
organizations:organizationsQuery.data,
70-
}}
53+
value={{organizations:organizationsQuery.data}}
7154
>
7255
<Sidebar/>
7356
<maincss={{width:"100%"}}>
@@ -94,9 +77,3 @@ export const ManagementSettingsLayout: FC = () => {
9477
</RequirePermission>
9578
);
9679
};
97-
98-
constgetOrganizationIdByName=(organizations:Organization[],name:string)=>
99-
organizations.find((org)=>org.name===name)?.id;
100-
101-
constgetOrganizationIdByDefault=(organizations:Organization[])=>
102-
organizations.find((org)=>org.is_default)?.id;

‎site/src/pages/ManagementSettingsPage/OrganizationSettingsPage.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
importtype{FC}from"react";
22
import{useMutation,useQueryClient}from"react-query";
3-
import{useNavigate}from"react-router-dom";
3+
import{useNavigate,useParams}from"react-router-dom";
44
import{
55
updateOrganization,
66
deleteOrganization,
77
}from"api/queries/organizations";
8+
importtype{Organization}from"api/typesGenerated";
89
import{EmptyState}from"components/EmptyState/EmptyState";
910
import{displaySuccess}from"components/GlobalSnackbar/utils";
1011
import{useOrganizationSettings}from"./ManagementSettingsLayout";
1112
import{OrganizationSettingsPageView}from"./OrganizationSettingsPageView";
1213

1314
constOrganizationSettingsPage:FC=()=>{
14-
constnavigate=useNavigate();
15+
const{organization:organizationName}=useParams()as{
16+
organization?:string;
17+
};
18+
const{ organizations}=useOrganizationSettings();
1519

20+
constnavigate=useNavigate();
1621
constqueryClient=useQueryClient();
1722
constupdateOrganizationMutation=useMutation(
1823
updateOrganization(queryClient),
@@ -21,14 +26,14 @@ const OrganizationSettingsPage: FC = () => {
2126
deleteOrganization(queryClient),
2227
);
2328

24-
const{ currentOrganizationId, organizations}=useOrganizationSettings();
25-
26-
constorg=organizations.find((org)=>org.id===currentOrganizationId);
29+
constorg=organizationName
30+
?getOrganizationByName(organizations,organizationName)
31+
:getOrganizationByDefault(organizations);
2732

2833
consterror=
2934
updateOrganizationMutation.error??deleteOrganizationMutation.error;
3035

31-
if(!currentOrganizationId||!org){
36+
if(!org){
3237
return<EmptyStatemessage="Organization not found"/>;
3338
}
3439

@@ -55,3 +60,9 @@ const OrganizationSettingsPage: FC = () => {
5560
};
5661

5762
exportdefaultOrganizationSettingsPage;
63+
64+
constgetOrganizationByDefault=(organizations:Organization[])=>
65+
organizations.find((org)=>org.is_default);
66+
67+
constgetOrganizationByName=(organizations:Organization[],name:string)=>
68+
organizations.find((org)=>org.name===name);

‎site/src/pages/ManagementSettingsPage/OrganizationSettingsPlaceholder.tsx

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp