mirror of
https://github.com/fleetdm/fleet
synced 2026-05-24 09:28:54 +00:00
## Addresses #22702, #23713, #23756, #23746, #23747, and #23876 _-Note that much of this code as is will render as expected only once integrated with the backend or if manipulated manually for testing purposes_ **Frontend**: - Update banners on my device page, tests - Build new logic for calling endpoint to trigger linux key escrow on clicking `Create key` - Add `CreateLinuxKeyModal` to inform user of next steps after clicking `Create key` - Update banners on host details page, tests - Update the Controls > OS settings section with new logic related to linux disk encryption - Expect and include counts of Linux hosts in aggregate disk encryption stats UI - Add "Linux" column to the disk encryption table - Show disk encryption related UI for supported Linux platforms - TODO: confirm platform string matching functionality in manual e2e testing - Expand capabilities of `SectionHeader` component, apply to new UI - Flash "missing private key" error, with clickable link, when trying to update disk encryption enabled while no server private key is present. - TODO: QA this once other endpoints on Controls > Disk encryption are enabled even when MDM not turned on - Update Disk encryption key modal copy -Other TODO: - Confirm when integrated with API: - Aggregate disk encryption counts - Disk encryption table Linux column - Show disk encryption key action on host details page when expected - Opens Disk encryption key modal, displays key as expected **Backend**: - For "No team" and teams, error when trying to update disk encryption enabled while no server private key is present. - Remove requirement of mdm being enabled for use of various endpoints related to Linux disk encryption - Update tests _________ **Host details and my device page banners**  **Create key modal** <img width="1799" alt="create-key-modal" src="https://github.com/user-attachments/assets/81a55ccb-b6b9-4eb6-b2ff-a463c60724c0"> **Enabling disk encryption**  **Disk encryption: Fleet free** <img width="1912" alt="free" src="https://github.com/user-attachments/assets/9f9cace3-8955-47c2-87d9-24ff9387ac1a"> **Custom settings: turn on MDM** <img width="1912" alt="turn on mdm" src="https://github.com/user-attachments/assets/4d3ad47b-4035-4d93-86f0-dc2691b38bb4"> **Device status indicators**  **Encryption key action and modal**  - [x] Changes file added for user-visible changes in `changes/` - [x] Added/updated tests - [x] Manual QA for all new/changed functionality - [ ] Full e2e testing to do when integrated with backend --------- Co-authored-by: Jacob Shandling <jacob@fleetdm.com> Co-authored-by: Ian Littman <iansltx@gmail.com>
93 lines
2.6 KiB
TypeScript
93 lines
2.6 KiB
TypeScript
import React, { useContext } from "react";
|
|
import { InjectedRouter, Params } from "react-router/lib/Router";
|
|
import { useQuery } from "react-query";
|
|
|
|
import { AppContext } from "context/app";
|
|
import SideNav from "pages/admin/components/SideNav";
|
|
import { API_NO_TEAM_ID, APP_CONTEXT_NO_TEAM_ID } from "interfaces/team";
|
|
import mdmAPI from "services/entities/mdm";
|
|
|
|
import OS_SETTINGS_NAV_ITEMS from "./OSSettingsNavItems";
|
|
import ProfileStatusAggregate from "./ProfileStatusAggregate";
|
|
|
|
const baseClass = "os-settings";
|
|
|
|
interface IOSSettingsProps {
|
|
params: Params;
|
|
router: InjectedRouter;
|
|
currentPage: number;
|
|
location: {
|
|
search: string;
|
|
};
|
|
}
|
|
|
|
const OSSettings = ({
|
|
router,
|
|
currentPage,
|
|
location: { search: queryString },
|
|
params,
|
|
}: IOSSettingsProps) => {
|
|
const { section } = params;
|
|
const { currentTeam } = useContext(AppContext);
|
|
|
|
// TODO: consider using useTeamIdParam hook here instead in the future
|
|
const teamId =
|
|
currentTeam?.id === undefined || currentTeam.id < APP_CONTEXT_NO_TEAM_ID
|
|
? API_NO_TEAM_ID // coerce undefined and -1 to 0 for 'No team'
|
|
: currentTeam.id;
|
|
|
|
const {
|
|
data: aggregateProfileStatusData,
|
|
refetch: refetchAggregateProfileStatus,
|
|
isError: isErrorAggregateProfileStatus,
|
|
isLoading: isLoadingAggregateProfileStatus,
|
|
} = useQuery(
|
|
["aggregateProfileStatuses", teamId],
|
|
() => mdmAPI.getProfilesStatusSummary(teamId),
|
|
{
|
|
refetchOnWindowFocus: false,
|
|
retry: false,
|
|
}
|
|
);
|
|
|
|
const DEFAULT_SETTINGS_SECTION = OS_SETTINGS_NAV_ITEMS[0];
|
|
|
|
const currentFormSection =
|
|
OS_SETTINGS_NAV_ITEMS.find((item) => item.urlSection === section) ??
|
|
DEFAULT_SETTINGS_SECTION;
|
|
|
|
const CurrentCard = currentFormSection.Card;
|
|
|
|
return (
|
|
<div className={baseClass}>
|
|
<p className={`${baseClass}__description`}>
|
|
Remotely enforce OS settings on hosts assigned to this team.
|
|
</p>
|
|
<ProfileStatusAggregate
|
|
isLoading={isLoadingAggregateProfileStatus}
|
|
isError={isErrorAggregateProfileStatus}
|
|
teamId={teamId}
|
|
aggregateProfileStatusData={aggregateProfileStatusData}
|
|
/>
|
|
<SideNav
|
|
className={`${baseClass}__side-nav`}
|
|
navItems={OS_SETTINGS_NAV_ITEMS.map((navItem) => ({
|
|
...navItem,
|
|
path: navItem.path.concat(queryString),
|
|
}))}
|
|
activeItem={currentFormSection.urlSection}
|
|
CurrentCard={
|
|
<CurrentCard
|
|
key={teamId}
|
|
currentTeamId={teamId}
|
|
onMutation={refetchAggregateProfileStatus}
|
|
router={router}
|
|
currentPage={currentPage}
|
|
/>
|
|
}
|
|
/>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default OSSettings;
|