From ba34351f4b2b282fd217e55d1dd0480c68187616 Mon Sep 17 00:00:00 2001 From: Jacob Shandling <61553566+jacobshandling@users.noreply.github.com> Date: Wed, 22 Feb 2023 10:42:40 -0800 Subject: [PATCH] UI: Implement new activity types for macOS profiles (#9894) # Addresses #9595 # Implements - new Activity types: - CreatedMacOSProfile - DeletedMacOSProfile - EditedMacOSProfile - Activity message depends on isPremium: - true: '...macOS hosts with no team' or '...macOS hosts assigned to the **Team Name** team {?via fleetctl}.' - false: '...{to | from | for} all macOS hosts.' # Checklist for submitter If some of the following don't apply, delete the relevant line. - [x] Changes file added for user-visible changes in `changes/` - [ ] Manual QA for all new/changed functionality --------- Co-authored-by: Jacob Shandling --- changes/9595-macOS-profiles-activity-types | 1 + frontend/interfaces/activity.ts | 5 ++ .../ActivityItem/ActivityItem.tsx | 62 +++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 changes/9595-macOS-profiles-activity-types diff --git a/changes/9595-macOS-profiles-activity-types b/changes/9595-macOS-profiles-activity-types new file mode 100644 index 0000000000..4f6192ee0b --- /dev/null +++ b/changes/9595-macOS-profiles-activity-types @@ -0,0 +1 @@ +* Create activity feed types for the creation, update, and deletion of macOS profiles (settings) via MDM diff --git a/frontend/interfaces/activity.ts b/frontend/interfaces/activity.ts index bbaabd7e4e..4820ace718 100644 --- a/frontend/interfaces/activity.ts +++ b/frontend/interfaces/activity.ts @@ -33,6 +33,9 @@ export enum ActivityType { MdmUnenrolled = "mdm_unenrolled", EditedMacosMinVersion = "edited_macos_min_version", ReadHostDiskEncryptionKey = "read_host_disk_encryption_key", + CreatedMacOSProfile = "created_macos_profile", + DeletedMacOSProfile = "deleted_macos_profile", + EditedMacOSProfile = "edited_macos_profile", } export interface IActivity { created_at: string; @@ -67,4 +70,6 @@ export interface IActivityDetails { installed_from_dep?: boolean; minimum_version?: string; deadline?: string; + profile_name?: string; + profile_identifier?: string; } diff --git a/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tsx b/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tsx index 8eafd963bf..4022dbb9ca 100644 --- a/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tsx +++ b/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tsx @@ -9,9 +9,27 @@ import Avatar from "components/Avatar"; import Button from "components/buttons/Button"; import Icon from "components/Icon"; import ReactTooltip from "react-tooltip"; +import { actions } from "react-table"; const baseClass = "activity-item"; +const getProfileMessageSuffix = ( + isPremiumTier: boolean, + teamName?: string | null +) => { + let messageSuffix = <>all macOS hosts; + if (isPremiumTier) { + messageSuffix = teamName ? ( + <> + macOS hosts assigned to the {teamName} team + + ) : ( + <>macOS hosts with no team + ); + } + return messageSuffix; +}; + const TAGGED_TEMPLATES = { liveQueryActivityTemplate: ( activity: IActivity, @@ -210,6 +228,41 @@ const TAGGED_TEMPLATES = { ); }, + createMacOSProfile: (activity: IActivity, isPremiumTier: boolean) => { + return ( + <> + {" "} + added configuration profile {activity.details?.profile_name} to{" "} + {getProfileMessageSuffix(isPremiumTier, activity.details?.team_name)}. + + ); + }, + + deleteMacOSProfile: (activity: IActivity, isPremiumTier: boolean) => { + return ( + <> + {" "} + deleted configuration profile { + activity.details?.host_display_name + } from{" "} + {getProfileMessageSuffix(isPremiumTier, activity.details?.team_name)}. + + ); + }, + + editMacOSProfile: (activity: IActivity, isPremiumTier: boolean) => { + return ( + <> + {" "} + edited configuration profiles for{" "} + {getProfileMessageSuffix( + isPremiumTier, + activity.details?.team_name + )}{" "} + via fleetctl. + + ); + }, defaultActivityTemplate: (activity: IActivity) => { const entityName = find(activity.details, (_, key) => key.includes("_name") @@ -293,6 +346,15 @@ const getDetail = ( case ActivityType.ReadHostDiskEncryptionKey: { return TAGGED_TEMPLATES.readHostDiskEncryptionKey(activity); } + case ActivityType.CreatedMacOSProfile: { + return TAGGED_TEMPLATES.createMacOSProfile(activity, isPremiumTier); + } + case ActivityType.DeletedMacOSProfile: { + return TAGGED_TEMPLATES.createMacOSProfile(activity, isPremiumTier); + } + case ActivityType.EditedMacOSProfile: { + return TAGGED_TEMPLATES.createMacOSProfile(activity, isPremiumTier); + } default: { return TAGGED_TEMPLATES.defaultActivityTemplate(activity); }