fleet/frontend/pages/ManageControlsPage/OSUpdates/components/CurrentVersionSection/CurrentVersionSection.tsx

157 lines
4.1 KiB
TypeScript
Raw Normal View History

import React from "react";
import { useQuery } from "react-query";
import { AxiosError } from "axios";
import { InjectedRouter } from "react-router";
import { IOperatingSystemVersion } from "interfaces/operating_system";
import {
getOSVersions,
IOSVersionsResponse,
} from "services/entities/operating_systems";
import LastUpdatedText from "components/LastUpdatedText";
import SectionHeader from "components/SectionHeader";
import DataError from "components/DataError";
import Spinner from "components/Spinner";
import OSVersionTable from "../OSVersionTable";
import { OSUpdatesSupportedPlatform } from "../../OSUpdates";
import OSVersionsEmptyState from "../OSVersionsEmptyState";
/** This overrides the `platform` attribute on IOperatingSystemVersion so that only our filtered platforms (currently
* "darwin" and "windows") values are included */
export type IFilteredOperatingSystemVersion = Omit<
IOperatingSystemVersion,
"platform"
> & {
platform: OSUpdatesSupportedPlatform;
};
const baseClass = "os-updates-current-version-section";
interface ICurrentVersionSectionProps {
router: InjectedRouter;
currentTeamId: number;
queryParams: ReturnType<typeof parseOSUpdatesCurrentVersionsQueryParams>;
}
const DEFAULT_SORT_DIRECTION = "desc";
const DEFAULT_SORT_HEADER = "hosts_count";
const DEFAULT_PAGE = 0;
const DEFAULT_PAGE_SIZE = 8;
export const parseOSUpdatesCurrentVersionsQueryParams = (queryParams: {
page?: string;
order_key?: string;
order_direction?: "asc" | "desc";
}) => {
const sortHeader = queryParams?.order_key ?? DEFAULT_SORT_HEADER;
const sortDirection = queryParams?.order_direction ?? DEFAULT_SORT_DIRECTION;
const page = queryParams?.page
? parseInt(queryParams.page, 10)
: DEFAULT_PAGE;
const pageSize = DEFAULT_PAGE_SIZE;
return {
page,
order_key: sortHeader,
order_direction: sortDirection,
per_page: pageSize,
};
};
const CurrentVersionSection = ({
router,
currentTeamId,
queryParams,
}: ICurrentVersionSectionProps) => {
const { data, isError, isLoading: isLoadingOsVersions } = useQuery<
IOSVersionsResponse,
AxiosError
>(
["os_versions", currentTeamId, queryParams],
() => getOSVersions({ teamId: currentTeamId, ...queryParams }),
{
retry: false,
refetchOnWindowFocus: false,
}
);
const generateSubTitleText = () => {
return (
<LastUpdatedText
lastUpdatedAt={data?.counts_updated_at}
customTooltipText={
<>
Fleet periodically queries all hosts to
<br />
retrieve operating systems. Click to
<br />
view hosts for the most up-to-date
<br />
lists.
</>
}
/>
);
};
const renderTable = () => {
if (isLoadingOsVersions) {
return <Spinner />;
}
if (isError) {
return (
<DataError
verticalPaddingSize="pad-xxxlarge"
description="Refresh the page to try again."
excludeIssueLink
/>
);
}
if (!data) {
return null;
}
if (!data.os_versions) {
return <OSVersionsEmptyState />;
}
// We only want to show windows mac, ios, ipados versions atm.
const filteredOSVersionData = data.os_versions.filter((osVersion) => {
return (
osVersion.platform === "windows" ||
osVersion.platform === "darwin" ||
osVersion.platform === "ios" ||
osVersion.platform === "ipados"
);
}) as IFilteredOperatingSystemVersion[];
return (
<OSVersionTable
router={router}
osVersionData={filteredOSVersionData}
currentTeamId={currentTeamId}
isLoading={isLoadingOsVersions}
queryParams={queryParams}
hasNextPage={data.meta.has_next_results}
/>
);
};
return (
<div className={baseClass}>
<SectionHeader
title="Current versions"
subTitle={isLoadingOsVersions ? null : generateSubTitleText()}
Linux disk encryption: frontend changes, backend missing private key errors, remove disk encryption endpoints dependence on MDM being enabled (#23714) ## 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** ![banners](https://github.com/user-attachments/assets/b76fbfbd-0969-40eb-b8b1-9fd0d4fd0f4f) **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** ![turning-on-enforcement](https://github.com/user-attachments/assets/005010b9-2238-46f8-9579-f07823898a78) **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** ![host-status-indicators](https://github.com/user-attachments/assets/5fc72c1e-816b-45b3-a650-5c1fcc48f09e) **Encryption key action and modal** ![de-key-action-and-modal](https://github.com/user-attachments/assets/632f7b2c-c07e-4e30-87ef-e6437ae42a78) - [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>
2024-11-20 19:58:47 +00:00
wrapperCustomClass={`${baseClass}__header`}
/>
{renderTable()}
</div>
);
};
export default CurrentVersionSection;