mirror of
https://github.com/fleetdm/fleet
synced 2026-05-24 09:28:54 +00:00
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** For #41030 # Details This PR updates front-end routes and redirects the old routes to the new ones. While I typically have shied away from renaming vars and constants in this phase of the renaming work, I chose to rename the path constants here because they're a lot less useful when they have names that don't correspond to the paths they're representing. I did the renames using VSCode's "Rename Symbol" feature which automatically finds and fixes any references. I then asked Claude to verify the changes and it didn't find any dangling references (also the code would fail to compile unless all the new names collided with old ones). # Checklist for submitter If some of the following don't apply, delete the relevant line. - [ ] Changes file added for user-visible changes in `changes/`, `orbit/changes/` or `ee/fleetd-chrome/changes`. See [Changes files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files) for more information. n/a ## Testing - [ ] Added/updated automated tests no relevant tests exist - [X] QA'd all new/changed functionality manually ## Reports (formerly Queries) **New routes:** - [x] /reports/manage — Reports list page - [x] /reports/new — New report editor - [x] /reports/new/live — New report live query - [x] /reports/:id — Report details - [x] /reports/:id/edit — Edit report - [x] /reports/:id/live — Live report run **Redirects from old routes:** - [x] /queries → /reports - [x] /queries/manage → /reports/manage - [x] /queries/new → /reports/new - [x] /queries/new/live → /reports/new/live - [x] /queries/:id → /reports/:id - [x] /queries/:id/edit → /reports/:id/edit - [x] /queries/:id/live → /reports/:id/live ## Host Reports (formerly Host Queries) **New routes:** - [x] /hosts/:host_id/reports/:query_id — Host report results **Redirects from old routes:** - [ ] ~/hosts/:host_id/schedule → /hosts/:host_id/reports~ <- this is not a real URL; removed current broken redirect - [x] /hosts/:host_id/queries/:query_id → /hosts/:host_id/reports/:query_id ## Fleets (formerly Teams) **New routes:** - [x] /settings/fleets — Fleets list page - [x] /settings/fleets/users?fleet_id=:id — Fleet users - [x] /settings/fleets/options?fleet_id=:id — Fleet agent options - [x] /settings/fleets/settings?fleet_id=:id — Fleet settings **Redirects from old routes:** - [x] /settings/teams → /settings/fleets - [x] /settings/teams/users → /settings/fleets/users - [x] /settings/teams/options → /settings/fleets/options - [x] /settings/teams/settings → /settings/fleets/settings - [x] /settings/teams/:team_id → /settings/fleets - [x] /settings/teams/:team_id/users → /settings/fleets - [x] /settings/teams/:team_id/options → /settings/fleets **Navigation & Links** - [x] Top nav "Reports" link goes to /reports/manage - [x] User menu team switcher navigates to /settings/fleets/users?fleet_id=:id - [x] Admin sidebar "Fleets" tab goes to /settings/fleets - [x] "Create a fleet" links (user form, transfer host modal) go to /settings/fleets - [x] "Back to fleets" button on fleet details goes to /settings/fleets - [x] Fleet table name links go to /settings/fleets/users?fleet_id=:id - [x] Host details "Add query" button goes to /reports/new - [x] Select query modal links go to /reports/new and /reports/:id/edit - [x] Query report "full report" link goes to /reports/:id - [x] Browser tab titles show correct names for report pages **Query params preserved through redirects** - [x] /queries/:id?fleet_id=1 → /reports/:id?fleet_id=1 - [x] /settings/teams/users?fleet_id=1 → /settings/fleets/users?fleet_id=1 For unreleased bug fixes in a release candidate, one of: - [X] Confirmed that the fix is not expected to adversely impact load test results
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.FLEET_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 };
|