Skip to content

Commit 7a8bb8c

Browse files
Introduce AccountStatusBadge
1 parent 09cab43 commit 7a8bb8c

File tree

4 files changed

+65
-56
lines changed

4 files changed

+65
-56
lines changed

portal/src/graphql/adminapi/UserDetailSummary.tsx

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
11
import React from "react";
22
import cn from "classnames";
33
import { Link } from "react-router-dom";
4-
import { Persona, PersonaSize, Text, FontIcon, IStyle } from "@fluentui/react";
4+
import { Persona, PersonaSize, Text, FontIcon } from "@fluentui/react";
55
import { Context, FormattedMessage } from "@oursky/react-messageformat";
6-
76
import { formatDatetime } from "../../util/formatDatetime";
7+
import { AccountStatus, AccountStatusBadge } from "./UserDetailsAccountStatus";
88

99
import styles from "./UserDetailSummary.module.css";
1010

11-
const warnBadgeStyle: IStyle = {
12-
padding: 4,
13-
borderRadius: 4,
14-
color: "#ffffff",
15-
backgroundColor: "#e23d3d",
16-
};
17-
1811
interface UserDetailSummaryProps {
1912
className?: string;
2013
isAnonymous: boolean;
@@ -26,25 +19,7 @@ interface UserDetailSummaryProps {
2619
profileImageEditable: boolean;
2720
createdAtISO: string | null;
2821
lastLoginAtISO: string | null;
29-
badgeTextId: string | null;
30-
}
31-
32-
interface WarnUserStatusBadgeProps {
33-
badgeTextId: string;
34-
}
35-
36-
function WarnUserStatusBadge(props: WarnUserStatusBadgeProps) {
37-
const { badgeTextId } = props;
38-
return (
39-
<Text
40-
className={cn(styles.inlineGridItem)}
41-
styles={{
42-
root: warnBadgeStyle,
43-
}}
44-
>
45-
<FormattedMessage id={badgeTextId} />
46-
</Text>
47-
);
22+
accountStatus: AccountStatus;
4823
}
4924

5025
const UserDetailSummary: React.VFC<UserDetailSummaryProps> =
@@ -60,7 +35,7 @@ const UserDetailSummary: React.VFC<UserDetailSummaryProps> =
6035
createdAtISO,
6136
lastLoginAtISO,
6237
className,
63-
badgeTextId,
38+
accountStatus,
6439
} = props;
6540
const { locale } = React.useContext(Context);
6641
const formatedSignedUp = React.useMemo(() => {
@@ -100,9 +75,10 @@ const UserDetailSummary: React.VFC<UserDetailSummaryProps> =
10075
<Text className={styles.formattedName} variant="medium">
10176
{formattedName ? formattedName : ""}
10277
</Text>
103-
{badgeTextId ? (
104-
<WarnUserStatusBadge badgeTextId={badgeTextId} />
105-
) : null}
78+
<AccountStatusBadge
79+
className={styles.inlineGridItem}
80+
accountStatus={accountStatus}
81+
/>
10682
<Text variant="small">
10783
<FormattedMessage
10884
id="UserDetails.signed-up"

portal/src/graphql/adminapi/UserDetailsAccountStatus.tsx

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1707,4 +1707,53 @@ export function AccountStatusDialog(
17071707
);
17081708
}
17091709

1710+
export interface AccountStatusBadgeProps {
1711+
className?: string;
1712+
accountStatus: AccountStatus;
1713+
}
1714+
1715+
const warnBadgeStyle: IStyle = {
1716+
padding: 4,
1717+
borderRadius: 4,
1718+
color: "#ffffff",
1719+
backgroundColor: "#e23d3d",
1720+
};
1721+
1722+
export function AccountStatusBadge(
1723+
props: AccountStatusBadgeProps
1724+
): React.ReactElement | null {
1725+
const now = new Date();
1726+
const { accountStatus, className } = props;
1727+
const id =
1728+
accountStatus.deleteAt != null
1729+
? "AccountStatusBadge.scheduled-deletion"
1730+
: accountStatus.isAnonymized
1731+
? "AccountStatusBadge.anonymized"
1732+
: accountStatus.anonymizeAt != null
1733+
? "AccountStatusBadge.scheduled-anonymization"
1734+
: accountStatus.accountValidFrom != null &&
1735+
now.getTime() < new Date(accountStatus.accountValidFrom).getTime()
1736+
? "AccountStatusBadge.account-outside-valid-period"
1737+
: accountStatus.accountValidUntil != null &&
1738+
now.getTime() >= new Date(accountStatus.accountValidUntil).getTime()
1739+
? "AccountStatusBadge.account-outside-valid-period"
1740+
: accountStatus.isDisabled
1741+
? "AccountStatusBadge.disabled"
1742+
: null;
1743+
if (id == null) {
1744+
return null;
1745+
}
1746+
1747+
return (
1748+
<Text
1749+
className={className}
1750+
styles={{
1751+
root: warnBadgeStyle,
1752+
}}
1753+
>
1754+
<FormattedMessage id={id} />
1755+
</Text>
1756+
);
1757+
}
1758+
17101759
export default UserDetailsAccountStatus;

portal/src/graphql/adminapi/UserDetailsScreen.tsx

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -315,23 +315,6 @@ const UserDetails: React.VFC<UserDetailsProps> = function UserDetails(
315315
return level === "readwrite";
316316
}, [standardAttributeAccessControl]);
317317

318-
const dataStatusBadgeTextId = React.useMemo(() => {
319-
let badgeTextId = null;
320-
if (data.isDisabled) {
321-
badgeTextId = "UserDetails.disabled.badge";
322-
}
323-
if (data.anonymizeAt) {
324-
badgeTextId = "UserDetails.scheduled-anonymization.badge";
325-
}
326-
if (data.isAnonymized) {
327-
badgeTextId = "UserDetails.anonymized.badge";
328-
}
329-
if (data.deleteAt) {
330-
badgeTextId = "UserDetails.scheduled-removal.badge";
331-
}
332-
return badgeTextId;
333-
}, [data.isDisabled, data.anonymizeAt, data.isAnonymized, data.deleteAt]);
334-
335318
if (data.isAnonymized) {
336319
return (
337320
<div className={styles.widget}>
@@ -345,7 +328,7 @@ const UserDetails: React.VFC<UserDetailsProps> = function UserDetails(
345328
endUserAccountIdentifier={data.endUserAccountID ?? undefined}
346329
createdAtISO={data.createdAt ?? null}
347330
lastLoginAtISO={data.lastLoginAt ?? null}
348-
badgeTextId={dataStatusBadgeTextId}
331+
accountStatus={data}
349332
/>
350333
<MessageBar messageBarType={MessageBarType.info}>
351334
<FormattedMessage id="UserDetailsScreen.user-anonymized.message" />
@@ -381,7 +364,7 @@ const UserDetails: React.VFC<UserDetailsProps> = function UserDetails(
381364
endUserAccountIdentifier={data.endUserAccountID ?? undefined}
382365
createdAtISO={data.createdAt ?? null}
383366
lastLoginAtISO={data.lastLoginAt ?? null}
384-
badgeTextId={dataStatusBadgeTextId}
367+
accountStatus={data}
385368
/>
386369
<AGPivot
387370
styles={{

portal/src/locale-data/en.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -426,11 +426,6 @@
426426
"UserDetails.account-security.disabled": "(Disabled)",
427427
"UserDetails.account-status.header": "Account Status",
428428

429-
"UserDetails.disabled.badge": "Disabled",
430-
"UserDetails.scheduled-anonymization.badge": "Anonymization scheduled",
431-
"UserDetails.anonymized.badge": "Anonymized",
432-
"UserDetails.scheduled-removal.badge": "Removal scheduled",
433-
434429
"UserDetailsAccountStatus.title": "Account Status",
435430
"UserDetailsAccountStatus.disable-user.title": "Disable User",
436431
"UserDetailsAccountStatus.disable-user.body": "Temporarily disables the user’s account, preventing them from logging in or using the system. Active sessions will be removed.",
@@ -493,6 +488,12 @@
493488
"AccountStatusDialog.account-valid-period.action.save": "Save",
494489
"AccountStatusDialog.account-valid-period.action.edit": "Update valid period",
495490

491+
"AccountStatusBadge.disabled": "Disabled",
492+
"AccountStatusBadge.account-outside-valid-period": "Account outside valid period",
493+
"AccountStatusBadge.scheduled-anonymization": "Anonymization scheduled",
494+
"AccountStatusBadge.scheduled-deletion": "Removal scheduled",
495+
"AccountStatusBadge.anonymized": "Anonymized",
496+
496497
"Add2FAScreen.title.phone": "Add 2FA Phone",
497498
"Add2FAScreen.title.email": "Add 2FA Email",
498499
"Add2FAScreen.title.password": "Add 2FA Password",

0 commit comments

Comments
 (0)