fleet/frontend/components/DiskSpaceGraph/DiskSpaceGraph.tsx
Jacob Shandling a578e20930
UI: Add macOS settings (profiles) indicator and modal with data table (#9809)
# Addresses #9413

# Implements
https://www.loom.com/share/d1b66a3076b94bf2add4fcf8666649a4

- macOS settings indicator on host details and device user pages. Only
displayed if (1) the host is enrolled in a Fleet MDM server and (2) the
host has at least one setting (profile) enforced.
- macOS settings modal, toggled by clicking on above indicator. Contains
a data table with the name, status, and error messages, if any, of each
enforced macOS setting on the host.

# Notes
- To aid in reviewing, you'll probably want to focus on:
-
[DeviceUserPage.tsx](https://github.com/fleetdm/fleet/pull/9809/files#diff-be9f14d3cee9f345058212985c26b3452688c6d75853a5e9dcb968a69dfcbbd7)
and
[HostDetailsPage.tsx](https://github.com/fleetdm/fleet/pull/9809/files#diff-72f7403682d211fc8a84a411fc39c4a33c3eb6a33549a33f1179dd7da6a893cc)
-
[HostSummary.tsx](https://github.com/fleetdm/fleet/pull/9809/files#diff-435e720f1ad82e892bec00fbc9c14e01e9488b776ae293f9158500c66d85bd0d)
-
[MacSettingsIndicator.tsx](https://github.com/fleetdm/fleet/pull/9809/files#diff-e23079f72b13bd34eb978eded467265dad4f366a6fece60cd52c887f355f92d1)
-
[MacSettingsModal.tsx](https://github.com/fleetdm/fleet/pull/9809/files#diff-75a08aa5b66cc2b63fc616d8ba012e552376f23d3c3df01d875586857f326f53)
-
[MacSettingsTable.tsx](https://github.com/fleetdm/fleet/pull/9809/files#diff-5dc441b06f770f112bb32bb618e2140e9bbccb7ebf80d86ee57c2754e067a421)
and its associated
[MacSettingsTableConfig.tsx](https://github.com/fleetdm/fleet/pull/9809/files#diff-0ab0cb34e249e2a41bf51508d38bea018dc5e683b705308250241c42549ab093)
   
- Currently using mock data. Once #9599 is completed, #9888 will change
these components to use the real data
- 2/21 - removed mock data. Until the API returns the host.mdm.profiles
data, settings indicator and modal will not render
# Checklist

- [x] Changes file added
- [x] Manual QA
- [x] Updated testing inventory

---------

Co-authored-by: Jacob Shandling <jacob@fleetdm.com>
2023-02-22 08:13:12 -08:00

89 lines
2.6 KiB
TypeScript

import React from "react";
import ReactTooltip from "react-tooltip";
interface IDiskSpaceGraphProps {
baseClass: string;
gigsDiskSpaceAvailable: number | string;
percentDiskSpaceAvailable: number;
id: string;
platform: string;
tooltipPosition?: "top" | "bottom";
}
const DiskSpaceGraph = ({
baseClass,
gigsDiskSpaceAvailable,
percentDiskSpaceAvailable,
id,
platform,
tooltipPosition = "top",
}: IDiskSpaceGraphProps): JSX.Element => {
const getDiskSpaceIndicatorColor = (): string => {
// return space-dependent graph colors for mac and windows hosts, green for linux
if (platform === "darwin" || platform === "windows") {
if (gigsDiskSpaceAvailable < 16) {
return "red";
} else if (gigsDiskSpaceAvailable < 32) {
return "yellow";
}
}
return "green";
};
const diskSpaceTooltipText = ((): string | undefined => {
if (platform === "darwin" || platform === "windows") {
if (gigsDiskSpaceAvailable < 16) {
return "Not enough disk space available to install most small operating systems updates.";
} else if (gigsDiskSpaceAvailable < 32) {
return "Not enough disk space available to install most large operating systems updates.";
}
return "Enough disk space available to install most operating systems updates.";
}
return undefined;
})();
if (gigsDiskSpaceAvailable === 0 || gigsDiskSpaceAvailable === "---") {
return <span className={`${baseClass}__data`}>No data available</span>;
}
return (
<span className={`${baseClass}__data`}>
<div
className={`${baseClass}__disk-space-wrapper tooltip`}
data-tip
data-for={`tooltip-${id}`}
>
<div className={`${baseClass}__disk-space`}>
<div
className={`${baseClass}__disk-space--${getDiskSpaceIndicatorColor()}`}
style={{
width: `${percentDiskSpaceAvailable}%`,
}}
title="disk space indicator"
/>
</div>
</div>
{diskSpaceTooltipText && (
<ReactTooltip
className={"disk-space-tooltip"}
place={tooltipPosition}
type="dark"
effect="solid"
id={`tooltip-${id}`}
backgroundColor="#3e4771"
>
<span
className={`${baseClass}__tooltip-text`}
title="disk space tooltip"
>
{diskSpaceTooltipText}
</span>
</ReactTooltip>
)}
{gigsDiskSpaceAvailable} GB{baseClass === "info-flex" && " available"}
</span>
);
};
export default DiskSpaceGraph;