Skip to content

Commit a40ba7d

Browse files
committed
feat: idp sync initial commit
1 parent 661d226 commit a40ba7d

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
@@ -6,11 +6,20 @@ import { SettingsHeader } from "components/SettingsHeader/SettingsHeader";
66
import { Stack } from "components/Stack/Stack";
77
import type { FC } from "react";
88
import { Helmet } from "react-helmet-async";
9-
import { Link as RouterLink } from "react-router-dom";
9+
import { Link as RouterLink, useParams } from "react-router-dom";
1010
import { docs } from "utils/docs";
1111
import { pageTitle } from "utils/page";
1212
import { IdpSyncHelpTooltip } from "./IdpSyncHelpTooltip";
1313
import IdpSyncPageView from "./IdpSyncPageView";
14+
import {
15+
organizationsPermissions,
16+
groupIdpSyncSettings,
17+
roleIdpSyncSettings,
18+
} from "api/queries/organizations";
19+
import { useQuery } from "react-query";
20+
import { useOrganizationSettings } from "../ManagementSettingsLayout";
21+
import { Loader } from "components/Loader/Loader";
22+
import { EmptyState } from "components/EmptyState/EmptyState";
1423

1524
const mockOIDCConfig = {
1625
allow_signups: true,
@@ -45,19 +54,39 @@ const mockOIDCConfig = {
4554
};
4655

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

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

6291
return (
6392
<>
@@ -91,7 +120,11 @@ export const IdpSyncPage: FC = () => {
91120
</Stack>
92121
</Stack>
93122

94-
<IdpSyncPageView oidcConfig={mockOIDCConfig} />
123+
<IdpSyncPageView
124+
oidcConfig={mockOIDCConfig}
125+
groupSyncSettings={groupIdpSyncSettingsQuery.data}
126+
roleSyncSettings={roleIdpSyncSettingsQuery.data}
127+
/>
95128
</>
96129
);
97130
};

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)