import React from "react"; import ReactTooltip from "react-tooltip"; import { uniqueId } from "lodash"; import Icon from "components/Icon"; import { IconNames } from "components/icons"; import TextCell from "components/TableContainer/DataTable/TextCell"; import { FLEET_FILEVAULT_PROFILE_DISPLAY_NAME, MacMdmProfileOperationType, } from "interfaces/mdm"; import { MacSettingsTableStatusValue } from "../MacSettingsTableConfig"; import TooltipContent, { TooltipInnerContentFunc, TooltipInnerContentOption, } from "./components/Tooltip/TooltipContent"; import TooltipInnerContentActionRequired from "./components/Tooltip/ActionRequired"; const baseClass = "mac-setting-status-cell"; type ProfileDisplayOption = { statusText: string; iconName: IconNames; tooltip: TooltipInnerContentOption | null; } | null; type OperationTypeOption = Record< MacSettingsTableStatusValue, ProfileDisplayOption >; type ProfileDisplayConfig = Record< MacMdmProfileOperationType, OperationTypeOption >; const PROFILE_DISPLAY_CONFIG: ProfileDisplayConfig = { install: { pending: { statusText: "Enforcing (pending)", iconName: "pending-partial", tooltip: (innerProps) => innerProps.isDiskEncryptionProfile ? "The host will receive the MDM command to install the disk encryption profile when the " + "host comes online." : "The host will receive the MDM command to install the configuration profile when the " + "host comes online.", }, action_required: { statusText: "Action required (pending)", iconName: "pending-partial", tooltip: TooltipInnerContentActionRequired as TooltipInnerContentFunc, }, verified: { statusText: "Verified", iconName: "success", tooltip: (innerProps) => innerProps.isDiskEncryptionProfile ? "The host turned disk encryption on and " + "sent their key to Fleet. Fleet verified with osquery." : "The host installed the configuration profile. Fleet verified with osquery.", }, verifying: { statusText: "Verifying", iconName: "success-partial", tooltip: (innerProps) => innerProps.isDiskEncryptionProfile ? "The host acknowledged the MDM command to install disk encryption profile. Fleet is " + "verifying with osquery and retrieving the disk encryption key. This may take up to one hour." : "The host acknowledged the MDM command to install the configuration profile. Fleet is " + "verifying with osquery.", }, failed: { statusText: "Failed", iconName: "error", tooltip: null, }, }, remove: { pending: { statusText: "Removing enforcement (pending)", iconName: "pending-partial", tooltip: (innerProps) => innerProps.isDiskEncryptionProfile ? "The host will receive the MDM command to remove the disk encryption profile when the " + "host comes online." : "The host will receive the MDM command to remove the configuration profile when the host " + "comes online.", }, action_required: null, // should not be reached verified: null, // should not be reached verifying: null, // should not be reached failed: { statusText: "Failed", iconName: "error", tooltip: null, }, }, }; interface IMacSettingStatusCellProps { status: MacSettingsTableStatusValue; operationType: MacMdmProfileOperationType; profileName: string; } const MacSettingStatusCell = ({ status, operationType, profileName = "", }: IMacSettingStatusCellProps): JSX.Element => { const diplayOption = PROFILE_DISPLAY_CONFIG[operationType]?.[status]; const isDeviceUser = window.location.pathname .toLowerCase() .includes("/device/"); const isDiskEncryptionProfile = profileName === FLEET_FILEVAULT_PROFILE_DISPLAY_NAME; if (diplayOption) { const { statusText, iconName, tooltip } = diplayOption; const tooltipId = uniqueId(); return ( {tooltip ? ( <> {statusText} {status !== "action_required" ? ( ) : ( )} ) : ( statusText )} ); } // graceful error - this state should not be reached based on the API spec return ; }; export default MacSettingStatusCell;