mirror of
https://github.com/fleetdm/fleet
synced 2026-05-20 23:48:52 +00:00
156 lines
3.8 KiB
TypeScript
156 lines
3.8 KiB
TypeScript
import React from "react";
|
|
|
|
import { ITeam } from "interfaces/team";
|
|
import { IDropdownOption } from "interfaces/dropdownOption";
|
|
import PATHS from "router/paths";
|
|
|
|
import LinkCell from "components/TableContainer/DataTable/LinkCell";
|
|
import TextCell from "components/TableContainer/DataTable/TextCell";
|
|
import ActionsDropdown from "components/ActionsDropdown";
|
|
import GitOpsModeTooltipWrapper from "components/GitOpsModeTooltipWrapper";
|
|
|
|
interface IHeaderProps {
|
|
column: {
|
|
title: string;
|
|
isSortedDesc: boolean;
|
|
};
|
|
}
|
|
|
|
interface IRowProps {
|
|
row: {
|
|
original: ITeam;
|
|
};
|
|
}
|
|
interface ICellProps extends IRowProps {
|
|
cell: {
|
|
value: string;
|
|
};
|
|
}
|
|
|
|
interface IDropdownCellProps extends IRowProps {
|
|
cell: {
|
|
value: IDropdownOption[];
|
|
};
|
|
}
|
|
|
|
interface IDataColumn {
|
|
title: string;
|
|
Header: ((props: IHeaderProps) => JSX.Element) | string;
|
|
accessor: string;
|
|
Cell:
|
|
| ((props: ICellProps) => JSX.Element)
|
|
| ((props: IDropdownCellProps) => JSX.Element);
|
|
disableHidden?: boolean;
|
|
disableSortBy?: boolean;
|
|
sortType?: string;
|
|
}
|
|
|
|
interface ITeamTableData extends ITeam {
|
|
actions: IDropdownOption[];
|
|
}
|
|
|
|
// NOTE: cellProps come from react-table
|
|
// more info here https://react-table.tanstack.com/docs/api/useTable#cell-properties
|
|
const generateTableHeaders = (
|
|
actionSelectHandler: (value: string, team: ITeam) => void
|
|
): IDataColumn[] => {
|
|
return [
|
|
{
|
|
title: "Name",
|
|
Header: "Name",
|
|
disableSortBy: true,
|
|
sortType: "caseInsensitive",
|
|
accessor: "name",
|
|
Cell: (cellProps: ICellProps) => (
|
|
<LinkCell
|
|
value={cellProps.cell.value}
|
|
path={PATHS.TEAM_DETAILS_USERS(cellProps.row.original.id)}
|
|
/>
|
|
),
|
|
},
|
|
// TODO: need to add this info to API
|
|
{
|
|
title: "Hosts",
|
|
Header: "Hosts",
|
|
disableSortBy: true,
|
|
accessor: "host_count",
|
|
Cell: (cellProps: ICellProps) => (
|
|
<TextCell value={cellProps.cell.value} />
|
|
),
|
|
},
|
|
{
|
|
title: "Users",
|
|
Header: "Users",
|
|
disableSortBy: true,
|
|
accessor: "user_count",
|
|
Cell: (cellProps: ICellProps) => (
|
|
<TextCell value={cellProps.cell.value} />
|
|
),
|
|
},
|
|
{
|
|
title: "Actions",
|
|
Header: "",
|
|
disableSortBy: true,
|
|
accessor: "actions",
|
|
Cell: (cellProps: IDropdownCellProps) => (
|
|
<GitOpsModeTooltipWrapper
|
|
position="left"
|
|
renderChildren={(disableChildren) => (
|
|
<div
|
|
className={
|
|
disableChildren
|
|
? "disabled-by-gitops-mode team-actions-wrapper"
|
|
: "team-actions-wrapper"
|
|
}
|
|
>
|
|
<ActionsDropdown
|
|
options={cellProps.cell.value}
|
|
onChange={(value: string) =>
|
|
actionSelectHandler(value, cellProps.row.original)
|
|
}
|
|
placeholder="Actions"
|
|
disabled={disableChildren}
|
|
variant="small-button"
|
|
/>
|
|
</div>
|
|
)}
|
|
/>
|
|
),
|
|
},
|
|
];
|
|
};
|
|
|
|
// NOTE: may need current user ID later for permission on actions.
|
|
const generateActionDropdownOptions = (): IDropdownOption[] => {
|
|
return [
|
|
{
|
|
label: "Rename",
|
|
disabled: false,
|
|
value: "rename",
|
|
},
|
|
{
|
|
label: "Delete",
|
|
disabled: false,
|
|
value: "delete",
|
|
},
|
|
];
|
|
};
|
|
|
|
const enhanceTeamData = (teams: ITeam[]): ITeamTableData[] => {
|
|
return Object.values(teams).map((team) => {
|
|
return {
|
|
description: team.description,
|
|
name: team.name,
|
|
host_count: team.host_count,
|
|
user_count: team.user_count,
|
|
actions: generateActionDropdownOptions(),
|
|
id: team.id,
|
|
};
|
|
});
|
|
};
|
|
|
|
const generateDataSet = (teams: ITeam[]): ITeamTableData[] => {
|
|
return [...enhanceTeamData(teams)];
|
|
};
|
|
|
|
export { generateTableHeaders, generateDataSet };
|