Skip to content

Commit 6790f98

Browse files
committed
feat: idp sync initial commit
1 parent 3338f32 commit 6790f98

File tree

5 files changed

+111
-20
lines changed

5 files changed

+111
-20
lines changed

site/src/api/api.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,27 @@ class ApiMethods {
704704
return response.data;
705705
};
706706

707+
getGroupIdpSyncSettingsByOrganization = async (
708+
organization: string,
709+
): Promise<TypesGen.GroupSyncSettings> => {
710+
const response = await this.axios.get<TypesGen.GroupSyncSettings>(
711+
`/api/v2/organizations/${organization}/settings/idpsync/groups`,
712+
);
713+
return response.data;
714+
};
715+
716+
/**
717+
* @param organization Can be the organization's ID or name
718+
*/
719+
getRoleIdpSyncSettingsByOrganization = async (
720+
organization: string,
721+
): Promise<TypesGen.RoleSyncSettings> => {
722+
const response = await this.axios.get<TypesGen.RoleSyncSettings>(
723+
`/api/v2/organizations/${organization}/settings/idpsync/roles`,
724+
);
725+
return response.data;
726+
};
727+
707728
getTemplate = async (templateId: string): Promise<TypesGen.Template> => {
708729
const response = await this.axios.get<TypesGen.Template>(
709730
`/api/v2/templates/${templateId}`,

site/src/api/queries/organizations.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,32 @@ export const provisionerDaemonGroups = (organization: string) => {
141141
};
142142
};
143143

144+
export const getGroupIdpSyncSettingsKey = (organization: string) => [
145+
"organization",
146+
organization,
147+
"groupIdpSyncSettings",
148+
];
149+
150+
export const groupIdpSyncSettings = (organization: string) => {
151+
return {
152+
queryKey: getGroupIdpSyncSettingsKey(organization),
153+
queryFn: () => API.getGroupIdpSyncSettingsByOrganization(organization),
154+
};
155+
};
156+
157+
export const getRoleIdpSyncSettingsKey = (organization: string) => [
158+
"organization",
159+
organization,
160+
"roleIdpSyncSettings",
161+
];
162+
163+
export const roleIdpSyncSettings = (organization: string) => {
164+
return {
165+
queryKey: getRoleIdpSyncSettingsKey(organization),
166+
queryFn: () => API.getRoleIdpSyncSettingsByOrganization(organization),
167+
};
168+
};
169+
144170
/**
145171
* Fetch permissions for a single organization.
146172
*

site/src/pages/DeploySettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export const AppearanceSettingsPageView: FC<
7474
<PopoverContent css={{ transform: "translateY(-28px)" }}>
7575
<PopoverPaywall
7676
message="Appearance"
77-
description="With a Premium license, you can customize the appearance of your deployment."
77+
description="With a Premium license, you can customize the appearance and branding of your deployment."
7878
documentationLink="https://coder.com/docs/admin/appearance"
7979
/>
8080
</PopoverContent>

site/src/pages/ManagementSettingsPage/IdpSyncPage/IdpSyncPage.tsx

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,20 @@ import { SettingsHeader } from "components/SettingsHeader/SettingsHeader";
55
import { Stack } from "components/Stack/Stack";
66
import type { FC } from "react";
77
import { Helmet } from "react-helmet-async";
8-
import { Link as RouterLink } from "react-router-dom";
8+
import { Link as RouterLink, useParams } from "react-router-dom";
99
import { docs } from "utils/docs";
1010
import { pageTitle } from "utils/page";
1111
import { IdpSyncHelpTooltip } from "./IdpSyncHelpTooltip";
1212
import IdpSyncPageView from "./IdpSyncPageView";
13+
import {
14+
organizationsPermissions,
15+
groupIdpSyncSettings,
16+
roleIdpSyncSettings,
17+
} from "api/queries/organizations";
18+
import { useQuery } from "react-query";
19+
import { useOrganizationSettings } from "../ManagementSettingsLayout";
20+
import { Loader } from "components/Loader/Loader";
21+
import { EmptyState } from "components/EmptyState/EmptyState";
1322

1423
const mockOIDCConfig = {
1524
allow_signups: true,
@@ -44,19 +53,39 @@ const mockOIDCConfig = {
4453
};
4554

4655
export const IdpSyncPage: FC = () => {
56+
const { organization: organizationName } = useParams() as {
57+
organization: string;
58+
};
59+
4760
// feature visibility and permissions to be implemented when integrating with backend
4861
// const feats = useFeatureVisibility();
4962
// const { organization: organizationName } = useParams() as {
5063
// organization: string;
5164
// };
52-
// const { organizations } = useOrganizationSettings();
53-
// const organization = organizations?.find((o) => o.name === organizationName);
54-
// const permissionsQuery = useQuery(organizationPermissions(organization?.id));
65+
const { organizations } = useOrganizationSettings();
66+
const organization = organizations?.find((o) => o.name === organizationName);
67+
const permissionsQuery = useQuery(
68+
organizationsPermissions(organizations?.map((o) => o.id)),
69+
);
70+
const groupIdpSyncSettingsQuery = useQuery(
71+
groupIdpSyncSettings(organizationName),
72+
);
73+
const roleIdpSyncSettingsQuery = useQuery(
74+
roleIdpSyncSettings(organizationName),
75+
);
5576
// const permissions = permissionsQuery.data;
5677

57-
// if (!permissions) {
58-
// return <Loader />;
59-
// }
78+
if (!organization) {
79+
return <EmptyState message="Organization not found" />;
80+
}
81+
82+
if (
83+
permissionsQuery.isLoading ||
84+
groupIdpSyncSettingsQuery.isLoading ||
85+
roleIdpSyncSettingsQuery.isLoading
86+
) {
87+
return <Loader />;
88+
}
6089

6190
return (
6291
<>
@@ -89,7 +118,11 @@ export const IdpSyncPage: FC = () => {
89118
</Stack>
90119
</Stack>
91120

92-
<IdpSyncPageView oidcConfig={mockOIDCConfig} />
121+
<IdpSyncPageView
122+
oidcConfig={mockOIDCConfig}
123+
groupSyncSettings={groupIdpSyncSettingsQuery.data}
124+
roleSyncSettings={roleIdpSyncSettingsQuery.data}
125+
/>
93126
</>
94127
);
95128
};

site/src/pages/ManagementSettingsPage/IdpSyncPage/IdpSyncPageView.tsx

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ import TableCell from "@mui/material/TableCell";
99
import TableContainer from "@mui/material/TableContainer";
1010
import TableHead from "@mui/material/TableHead";
1111
import TableRow from "@mui/material/TableRow";
12-
import type { OIDCConfig } from "api/typesGenerated";
12+
import type {
13+
OIDCConfig,
14+
GroupSyncSettings,
15+
RoleSyncSettings,
16+
} from "api/typesGenerated";
1317
import { ChooseOne, Cond } from "components/Conditionals/ChooseOne";
1418
import { EmptyState } from "components/EmptyState/EmptyState";
1519
import { Paywall } from "components/Paywall/Paywall";
@@ -25,16 +29,17 @@ import { docs } from "utils/docs";
2529

2630
export type IdpSyncPageViewProps = {
2731
oidcConfig: OIDCConfig | undefined;
32+
groupSyncSettings: GroupSyncSettings | undefined;
33+
roleSyncSettings: RoleSyncSettings | undefined;
2834
};
2935

30-
export const IdpSyncPageView: FC<IdpSyncPageViewProps> = ({ oidcConfig }) => {
36+
export const IdpSyncPageView: FC<IdpSyncPageViewProps> = ({
37+
oidcConfig,
38+
groupSyncSettings,
39+
roleSyncSettings,
40+
}) => {
3141
const theme = useTheme();
32-
const {
33-
groups_field,
34-
user_role_field,
35-
group_regex_filter,
36-
group_auto_create,
37-
} = oidcConfig || {};
42+
const { user_role_field } = oidcConfig || {};
3843
return (
3944
<>
4045
<ChooseOne>
@@ -54,16 +59,22 @@ export const IdpSyncPageView: FC<IdpSyncPageViewProps> = ({ oidcConfig }) => {
5459
<Stack direction={"row"} alignItems={"center"} spacing={8}>
5560
<IdpField
5661
name={"Sync Field"}
57-
fieldText={groups_field}
62+
fieldText={groupSyncSettings?.field}
5863
showStatusIndicator
5964
/>
6065
<IdpField
6166
name={"Regex Filter"}
62-
fieldText={group_regex_filter}
67+
fieldText={
68+
typeof groupSyncSettings?.regex_filter === "string"
69+
? groupSyncSettings?.regex_filter
70+
: ""
71+
}
6372
/>
6473
<IdpField
6574
name={"Auto Create"}
66-
fieldText={group_auto_create?.toString()}
75+
fieldText={String(
76+
groupSyncSettings?.auto_create_missing_groups,
77+
)}
6778
/>
6879
</Stack>
6980
</fieldset>

0 commit comments

Comments
 (0)