2021-04-14 16:52:15 +00:00
|
|
|
import React from "react";
|
2021-03-24 13:18:56 +00:00
|
|
|
|
2021-04-14 16:52:15 +00:00
|
|
|
import HeaderCell from "components/TableContainer/DataTable/HeaderCell/HeaderCell";
|
2022-12-13 18:04:07 +00:00
|
|
|
import StatusIndicator from "components/StatusIndicator";
|
2021-04-14 16:52:15 +00:00
|
|
|
import TextCell from "components/TableContainer/DataTable/TextCell/TextCell";
|
|
|
|
|
import { IInvite } from "interfaces/invite";
|
|
|
|
|
import { IUser } from "interfaces/user";
|
|
|
|
|
import { IDropdownOption } from "interfaces/dropdownOption";
|
2022-04-22 16:45:35 +00:00
|
|
|
import { generateRole, generateTeam, greyCell } from "utilities/helpers";
|
2023-02-21 14:16:38 +00:00
|
|
|
import { DEFAULT_EMPTY_CELL_VALUE } from "utilities/constants";
|
2022-07-19 18:55:47 +00:00
|
|
|
import DropdownCell from "../../../../../components/TableContainer/DataTable/DropdownCell";
|
2021-03-24 13:18:56 +00:00
|
|
|
|
|
|
|
|
interface IHeaderProps {
|
|
|
|
|
column: {
|
|
|
|
|
title: string;
|
|
|
|
|
isSortedDesc: boolean;
|
2021-04-14 16:52:15 +00:00
|
|
|
};
|
2021-03-24 13:18:56 +00:00
|
|
|
}
|
|
|
|
|
|
2022-03-10 15:10:44 +00:00
|
|
|
interface IRowProps {
|
2021-03-24 13:18:56 +00:00
|
|
|
row: {
|
2021-04-09 10:44:57 +00:00
|
|
|
original: IUser | IInvite;
|
2021-03-24 13:18:56 +00:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-10 15:10:44 +00:00
|
|
|
interface ICellProps extends IRowProps {
|
|
|
|
|
cell: {
|
|
|
|
|
value: string;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface IDropdownCellProps extends IRowProps {
|
|
|
|
|
cell: {
|
|
|
|
|
value: IDropdownOption[];
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-24 13:18:56 +00:00
|
|
|
interface IDataColumn {
|
|
|
|
|
title: string;
|
|
|
|
|
Header: ((props: IHeaderProps) => JSX.Element) | string;
|
|
|
|
|
accessor: string;
|
2022-03-10 15:10:44 +00:00
|
|
|
Cell:
|
|
|
|
|
| ((props: ICellProps) => JSX.Element)
|
|
|
|
|
| ((props: IDropdownCellProps) => JSX.Element);
|
2021-03-24 13:18:56 +00:00
|
|
|
disableHidden?: boolean;
|
|
|
|
|
disableSortBy?: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-10 15:10:44 +00:00
|
|
|
export interface IUserTableData {
|
2021-04-09 10:44:57 +00:00
|
|
|
name: string;
|
|
|
|
|
status: string;
|
|
|
|
|
email: string;
|
|
|
|
|
teams: string;
|
2022-04-07 19:12:38 +00:00
|
|
|
role: string;
|
2021-04-14 16:52:15 +00:00
|
|
|
actions: IDropdownOption[];
|
|
|
|
|
id: number;
|
|
|
|
|
type: string;
|
2021-04-09 10:44:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NOTE: cellProps come from react-table
|
|
|
|
|
// more info here https://react-table.tanstack.com/docs/api/useTable#cell-properties
|
2021-04-14 16:52:15 +00:00
|
|
|
const generateTableHeaders = (
|
2021-06-08 23:14:52 +00:00
|
|
|
actionSelectHandler: (value: string, user: IUser | IInvite) => void,
|
2022-01-13 23:11:45 +00:00
|
|
|
isPremiumTier: boolean | undefined
|
2021-04-14 16:52:15 +00:00
|
|
|
): IDataColumn[] => {
|
2021-06-08 23:14:52 +00:00
|
|
|
const tableHeaders: IDataColumn[] = [
|
2021-04-09 10:44:57 +00:00
|
|
|
{
|
2021-04-14 16:52:15 +00:00
|
|
|
title: "Name",
|
2022-04-07 19:12:38 +00:00
|
|
|
Header: "Name",
|
|
|
|
|
disableSortBy: true,
|
2021-04-14 16:52:15 +00:00
|
|
|
accessor: "name",
|
2022-03-10 15:10:44 +00:00
|
|
|
Cell: (cellProps: ICellProps) => (
|
|
|
|
|
<TextCell value={cellProps.cell.value} />
|
|
|
|
|
),
|
2021-04-09 10:44:57 +00:00
|
|
|
},
|
|
|
|
|
{
|
2022-04-07 19:12:38 +00:00
|
|
|
title: "Role",
|
|
|
|
|
Header: "Role",
|
|
|
|
|
accessor: "role",
|
2021-04-09 10:44:57 +00:00
|
|
|
disableSortBy: true,
|
2022-03-10 15:10:44 +00:00
|
|
|
Cell: (cellProps: ICellProps) => (
|
2022-04-07 19:12:38 +00:00
|
|
|
<TextCell
|
|
|
|
|
value={cellProps.cell.value}
|
|
|
|
|
greyed={greyCell(cellProps.cell.value)}
|
|
|
|
|
/>
|
2022-03-10 15:10:44 +00:00
|
|
|
),
|
2021-04-09 10:44:57 +00:00
|
|
|
},
|
|
|
|
|
{
|
2022-04-07 19:12:38 +00:00
|
|
|
title: "Status",
|
|
|
|
|
Header: (cellProps) => (
|
2021-04-14 16:52:15 +00:00
|
|
|
<HeaderCell
|
|
|
|
|
value={cellProps.column.title}
|
|
|
|
|
isSortedDesc={cellProps.column.isSortedDesc}
|
|
|
|
|
/>
|
|
|
|
|
),
|
2022-04-07 19:12:38 +00:00
|
|
|
accessor: "status",
|
2022-03-10 15:10:44 +00:00
|
|
|
Cell: (cellProps: ICellProps) => (
|
2022-12-13 18:04:07 +00:00
|
|
|
<StatusIndicator value={cellProps.cell.value} />
|
2022-03-10 15:10:44 +00:00
|
|
|
),
|
2021-04-09 10:44:57 +00:00
|
|
|
},
|
|
|
|
|
{
|
2022-04-07 19:12:38 +00:00
|
|
|
title: "Email",
|
|
|
|
|
Header: "Email",
|
2021-04-09 10:44:57 +00:00
|
|
|
disableSortBy: true,
|
2022-04-07 19:12:38 +00:00
|
|
|
accessor: "email",
|
2022-03-10 15:10:44 +00:00
|
|
|
Cell: (cellProps: ICellProps) => (
|
2022-04-07 19:12:38 +00:00
|
|
|
<TextCell value={cellProps.cell.value} />
|
2021-08-16 16:25:51 +00:00
|
|
|
),
|
2021-04-09 10:44:57 +00:00
|
|
|
},
|
|
|
|
|
{
|
2021-04-14 16:52:15 +00:00
|
|
|
title: "Actions",
|
2021-07-26 17:01:58 +00:00
|
|
|
Header: "",
|
2021-04-09 10:44:57 +00:00
|
|
|
disableSortBy: true,
|
2021-04-14 16:52:15 +00:00
|
|
|
accessor: "actions",
|
2022-03-10 15:10:44 +00:00
|
|
|
Cell: (cellProps: IDropdownCellProps) => (
|
2021-04-09 10:44:57 +00:00
|
|
|
<DropdownCell
|
|
|
|
|
options={cellProps.cell.value}
|
2021-04-14 16:52:15 +00:00
|
|
|
onChange={(value: string) =>
|
|
|
|
|
actionSelectHandler(value, cellProps.row.original)
|
|
|
|
|
}
|
|
|
|
|
placeholder={"Actions"}
|
2021-04-09 10:44:57 +00:00
|
|
|
/>
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
];
|
2021-06-08 23:14:52 +00:00
|
|
|
|
2021-09-03 16:05:23 +00:00
|
|
|
// Add Teams tab for premium tier only
|
|
|
|
|
if (isPremiumTier) {
|
2022-04-07 19:12:38 +00:00
|
|
|
tableHeaders.splice(2, 0, {
|
2021-06-08 23:14:52 +00:00
|
|
|
title: "Teams",
|
|
|
|
|
Header: "Teams",
|
|
|
|
|
accessor: "teams",
|
|
|
|
|
disableSortBy: true,
|
2022-03-10 15:10:44 +00:00
|
|
|
Cell: (cellProps: ICellProps) => (
|
2021-08-16 16:25:51 +00:00
|
|
|
<TextCell
|
|
|
|
|
value={cellProps.cell.value}
|
|
|
|
|
greyed={greyCell(cellProps.cell.value)}
|
|
|
|
|
/>
|
|
|
|
|
),
|
2021-06-08 23:14:52 +00:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return tableHeaders;
|
2021-04-09 10:44:57 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const generateStatus = (type: string, data: IUser | IInvite): string => {
|
|
|
|
|
const { teams, global_role } = data;
|
|
|
|
|
if (global_role === null && teams.length === 0) {
|
2021-04-14 16:52:15 +00:00
|
|
|
return "No Access";
|
2021-04-09 10:44:57 +00:00
|
|
|
}
|
|
|
|
|
|
2021-04-14 16:52:15 +00:00
|
|
|
return type === "invite" ? "Invite pending" : "Active";
|
2021-04-09 10:44:57 +00:00
|
|
|
};
|
|
|
|
|
|
2021-04-14 16:52:15 +00:00
|
|
|
const generateActionDropdownOptions = (
|
2021-06-28 15:20:32 +00:00
|
|
|
isCurrentUser: boolean,
|
|
|
|
|
isInvitePending: boolean,
|
2021-07-12 21:39:43 +00:00
|
|
|
isSsoEnabled: boolean
|
2021-04-14 16:52:15 +00:00
|
|
|
): IDropdownOption[] => {
|
2021-06-28 15:20:32 +00:00
|
|
|
let dropdownOptions = [
|
2021-04-09 10:44:57 +00:00
|
|
|
{
|
2021-04-14 16:52:15 +00:00
|
|
|
label: "Edit",
|
2021-11-15 17:32:28 +00:00
|
|
|
disabled: false,
|
2021-06-28 15:20:32 +00:00
|
|
|
value: isCurrentUser ? "editMyAccount" : "edit",
|
2021-04-09 10:44:57 +00:00
|
|
|
},
|
|
|
|
|
{
|
2021-04-14 16:52:15 +00:00
|
|
|
label: "Require password reset",
|
2021-06-28 15:20:32 +00:00
|
|
|
disabled: isInvitePending,
|
2021-04-14 16:52:15 +00:00
|
|
|
value: "passwordReset",
|
2021-04-09 10:44:57 +00:00
|
|
|
},
|
|
|
|
|
{
|
2021-06-28 15:20:32 +00:00
|
|
|
label: "Reset sessions",
|
|
|
|
|
disabled: isInvitePending,
|
|
|
|
|
value: "resetSessions",
|
2021-04-09 10:44:57 +00:00
|
|
|
},
|
|
|
|
|
{
|
2021-04-14 16:52:15 +00:00
|
|
|
label: "Delete",
|
2021-06-28 15:20:32 +00:00
|
|
|
disabled: isCurrentUser,
|
2021-04-14 16:52:15 +00:00
|
|
|
value: "delete",
|
2021-04-09 10:44:57 +00:00
|
|
|
},
|
|
|
|
|
];
|
2021-07-12 21:39:43 +00:00
|
|
|
if (isSsoEnabled) {
|
2021-06-28 15:20:32 +00:00
|
|
|
// remove "Require password reset" from dropdownOptions
|
|
|
|
|
dropdownOptions = dropdownOptions.filter(
|
|
|
|
|
(option) => option.label !== "Require password reset"
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
return dropdownOptions;
|
2021-04-09 10:44:57 +00:00
|
|
|
};
|
|
|
|
|
|
2021-04-14 16:52:15 +00:00
|
|
|
const enhanceUserData = (
|
|
|
|
|
users: IUser[],
|
|
|
|
|
currentUserId: number
|
|
|
|
|
): IUserTableData[] => {
|
2021-04-09 10:44:57 +00:00
|
|
|
return users.map((user) => {
|
|
|
|
|
return {
|
2023-02-21 14:16:38 +00:00
|
|
|
name: user.name || DEFAULT_EMPTY_CELL_VALUE,
|
2021-04-14 16:52:15 +00:00
|
|
|
status: generateStatus("user", user),
|
2021-04-09 10:44:57 +00:00
|
|
|
email: user.email,
|
|
|
|
|
teams: generateTeam(user.teams, user.global_role),
|
2022-04-07 19:12:38 +00:00
|
|
|
role: generateRole(user.teams, user.global_role),
|
2021-06-28 15:20:32 +00:00
|
|
|
actions: generateActionDropdownOptions(
|
|
|
|
|
user.id === currentUserId,
|
|
|
|
|
false,
|
|
|
|
|
user.sso_enabled
|
|
|
|
|
),
|
2021-04-09 10:44:57 +00:00
|
|
|
id: user.id,
|
2021-04-14 16:52:15 +00:00
|
|
|
type: "user",
|
2021-04-09 10:44:57 +00:00
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const enhanceInviteData = (invites: IInvite[]): IUserTableData[] => {
|
|
|
|
|
return invites.map((invite) => {
|
|
|
|
|
return {
|
2023-02-21 14:16:38 +00:00
|
|
|
name: invite.name || DEFAULT_EMPTY_CELL_VALUE,
|
2021-04-14 16:52:15 +00:00
|
|
|
status: generateStatus("invite", invite),
|
2021-04-09 10:44:57 +00:00
|
|
|
email: invite.email,
|
|
|
|
|
teams: generateTeam(invite.teams, invite.global_role),
|
2022-04-07 19:12:38 +00:00
|
|
|
role: generateRole(invite.teams, invite.global_role),
|
2021-06-28 15:20:32 +00:00
|
|
|
actions: generateActionDropdownOptions(false, true, invite.sso_enabled),
|
2021-04-09 10:44:57 +00:00
|
|
|
id: invite.id,
|
2021-04-14 16:52:15 +00:00
|
|
|
type: "invite",
|
2021-04-09 10:44:57 +00:00
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
2021-04-14 16:52:15 +00:00
|
|
|
const combineDataSets = (
|
|
|
|
|
users: IUser[],
|
|
|
|
|
invites: IInvite[],
|
|
|
|
|
currentUserId: number
|
|
|
|
|
): IUserTableData[] => {
|
|
|
|
|
return [
|
|
|
|
|
...enhanceUserData(users, currentUserId),
|
|
|
|
|
...enhanceInviteData(invites),
|
|
|
|
|
];
|
2021-04-09 10:44:57 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export { generateTableHeaders, combineDataSets };
|