+
Exec Council Group Management
- {/* Member List */}
-
-
- Current Members
-
-
- {isLoading && }
- {!isLoading && (
-
- {members.map((member) => (
-
-
-
-
- {member.name} ({member.email})
-
- {toRemove.includes(member.email) && (
-
- Queued for removal
-
- )}
-
- handleRemoveMember(member.email)}
- data-testid={`remove-exec-member-${member.email}`}
- >
-
-
-
-
- ))}
- {toAdd.map((member) => (
-
-
-
- {member}
-
- Queued for addition
-
-
-
-
- ))}
-
- )}
-
-
+ {isLoading ? (
+
+ ) : (
+
+
+
+ Member
+ Status
+ Actions
+
+
+ {rows}
+
+ )}
- {/* Add Member */}
-
- setEmail(e.currentTarget.value)}
- placeholder="Enter email"
- label="Add Member"
- />
- }
- onClick={handleAddMember}
- disabled={isLoading}
- >
- Add Member
-
-
+
setEmail(e.currentTarget.value)}
+ placeholder="Enter email"
+ label="Add Member"
+ mt="md"
+ />
+ }
+ onClick={handleAddMember}
+ disabled={isLoading}
+ >
+ Add Member
+
- {/* Save Changes Button */}
- {/* Confirmation Modal */}
setConfirmationModal(false)}
title="Confirm Changes"
>
-
+
{toAdd.length > 0 && (
-
-
+
+
Members to Add:
-
- {toAdd.map((email) => (
- {email}
- ))}
-
-
+ {toAdd.map((email) => (
+ {email}
+ ))}
+
)}
{toRemove.length > 0 && (
-
-
+
+
Members to Remove:
-
- {toRemove.map((email) => (
- {email}
- ))}
-
-
+ {toRemove.map((email) => (
+ {email}
+ ))}
+
)}
-
+
-
+
);
};
diff --git a/src/ui/pages/iam/ManageIam.page.tsx b/src/ui/pages/iam/ManageIam.page.tsx
index e0e3b6a..5a60d2e 100644
--- a/src/ui/pages/iam/ManageIam.page.tsx
+++ b/src/ui/pages/iam/ManageIam.page.tsx
@@ -10,6 +10,7 @@ import {
GroupMemberGetResponse,
GroupModificationPatchRequest,
} from '@common/types/iam';
+import { transformCommaSeperatedName } from '@common/utils';
import { getRunEnvironmentConfig } from '@ui/config';
export const ManageIamPage = () => {
@@ -37,7 +38,13 @@ export const ManageIamPage = () => {
const getExecMembers = async () => {
try {
const response = await api.get(`/api/v1/iam/groups/${groupId}`);
- return response.data as GroupMemberGetResponse;
+ const responseMapped = response.data
+ .map((x: any) => ({
+ ...x,
+ name: transformCommaSeperatedName(x.name),
+ }))
+ .sort((x: any, y: any) => (x.name > y.name ? 1 : x.name < y.name ? -1 : 0));
+ return responseMapped as GroupMemberGetResponse;
} catch (error: any) {
console.error('Failed to get users:', error);
return [];
diff --git a/src/ui/pages/profile/ManageProfile.page.tsx b/src/ui/pages/profile/ManageProfile.page.tsx
new file mode 100644
index 0000000..b22da76
--- /dev/null
+++ b/src/ui/pages/profile/ManageProfile.page.tsx
@@ -0,0 +1,61 @@
+import React from 'react';
+import { Container, Title } from '@mantine/core';
+import { AuthGuard } from '@ui/components/AuthGuard';
+import { useApi } from '@ui/util/api';
+import { UserProfileData, UserProfileDataBase } from '@common/types/msGraphApi';
+import { ManageProfileComponent } from './ManageProfileComponent';
+import { useNavigate, useSearchParams } from 'react-router-dom';
+import { useAuth } from '@ui/components/AuthContext';
+
+export const ManageProfilePage: React.FC = () => {
+ const api = useApi('msGraphApi');
+ const { setLoginStatus } = useAuth();
+ const navigate = useNavigate();
+ const [searchParams] = useSearchParams();
+ const returnTo = searchParams.get('returnTo') || undefined;
+ const firstTime = searchParams.get('firstTime') === 'true' || false;
+ const getProfile = async () => {
+ const raw = (
+ await api.get(
+ '/v1.0/me?$select=userPrincipalName,givenName,surname,displayName,otherMails,mail'
+ )
+ ).data as UserProfileDataBase;
+ const discordUsername = raw.otherMails?.filter((x) => x.endsWith('@discord'));
+ const enhanced = raw as UserProfileData;
+ if (discordUsername?.length === 1) {
+ enhanced.discordUsername = discordUsername[0].replace('@discord', '');
+ enhanced.otherMails = enhanced.otherMails?.filter((x) => !x.endsWith('@discord'));
+ }
+ return enhanced;
+ };
+
+ const setProfile = async (data: UserProfileData) => {
+ const newOtherEmails = [data.mail || data.userPrincipalName];
+ if (data.discordUsername && data.discordUsername !== '') {
+ newOtherEmails.push(`${data.discordUsername}@discord`);
+ }
+ data.otherMails = newOtherEmails;
+ delete data.discordUsername;
+ const response = await api.patch('/v1.0/me', data);
+ if (response.status < 299 && firstTime) {
+ setLoginStatus(true);
+ }
+ if (returnTo) {
+ return navigate(returnTo);
+ }
+ return response.data;
+ };
+
+ return (
+