diff --git a/changes/issue-12297-ui-transferred-hosts-activity b/changes/issue-12297-ui-transferred-hosts-activity
new file mode 100644
index 0000000000..cbfcf1e25f
--- /dev/null
+++ b/changes/issue-12297-ui-transferred-hosts-activity
@@ -0,0 +1 @@
+- Updated UI for transferred hosts activity items.
\ No newline at end of file
diff --git a/frontend/interfaces/activity.ts b/frontend/interfaces/activity.ts
index ad17881a7f..668436aacf 100644
--- a/frontend/interfaces/activity.ts
+++ b/frontend/interfaces/activity.ts
@@ -45,6 +45,7 @@ export enum ActivityType {
DeletedMacOSSetupAssistant = "deleted_macos_setup_assistant",
EnabledMacOSSetupEndUserAuth = "enabled_macos_setup_end_user_auth",
DisabledMacOSSetupEndUserAuth = "disabled_macos_setup_end_user_auth",
+ TransferredHosts = "transferred_hosts",
}
export interface IActivity {
created_at: string;
@@ -76,6 +77,8 @@ export interface IActivityDetails {
role?: UserRole;
host_serial?: string;
host_display_name?: string;
+ host_display_names?: string[];
+ host_ids?: number[];
installed_from_dep?: boolean;
minimum_version?: string;
deadline?: string;
diff --git a/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tests.tsx b/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tests.tsx
index a4333f86b5..ec6389c781 100644
--- a/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tests.tsx
+++ b/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tests.tsx
@@ -634,4 +634,78 @@ describe("Activity Feed", () => {
)
).toBeInTheDocument();
});
+
+ it("renders a 'transferred_hosts' type activity for one host transferred to no team.", () => {
+ const activity = createMockActivity({
+ type: ActivityType.TransferredHosts,
+ details: {
+ host_ids: [1],
+ host_display_names: ["foo"],
+ },
+ });
+ render();
+
+ expect(
+ screen.getByText("transferred host", { exact: false })
+ ).toBeInTheDocument();
+ expect(screen.getByText("foo", { exact: false })).toBeInTheDocument();
+ expect(screen.getByText("no team", { exact: false })).toBeInTheDocument();
+ });
+
+ it("renders a 'transferred_hosts' type activity for one host transferred to a team.", () => {
+ const activity = createMockActivity({
+ type: ActivityType.TransferredHosts,
+ details: {
+ host_ids: [1],
+ host_display_names: ["foo"],
+ team_name: "Alphas",
+ },
+ });
+ render();
+
+ expect(
+ screen.getByText("transferred host", { exact: false })
+ ).toBeInTheDocument();
+ expect(screen.getByText("foo", { exact: false })).toBeInTheDocument();
+ expect(screen.getByText("Alphas", { exact: false })).toBeInTheDocument();
+ });
+
+ it("renders a 'transferred_hosts' type activity for multiple hosts transferred to no team.", () => {
+ const activity = createMockActivity({
+ type: ActivityType.TransferredHosts,
+ details: {
+ host_ids: [1, 2, 3],
+ host_display_names: ["foo", "bar", "baz"],
+ },
+ });
+ render();
+
+ expect(
+ screen.getByText("transferred 3 hosts", { exact: false })
+ ).toBeInTheDocument();
+ expect(screen.queryByText("foo")).toBeNull();
+ expect(screen.queryByText("bar")).toBeNull();
+ expect(screen.queryByText("baz")).toBeNull();
+ expect(screen.getByText("no team", { exact: false })).toBeInTheDocument();
+ });
+
+ it("renders a 'transferred_hosts' type activity for multiple hosts transferred to a team.", () => {
+ const activity = createMockActivity({
+ type: ActivityType.TransferredHosts,
+ details: {
+ host_ids: [1, 2, 3],
+ host_display_names: ["foo", "bar", "baz"],
+ team_name: "Alphas",
+ },
+ });
+ render();
+
+ expect(
+ screen.getByText("transferred 3 hosts", { exact: false })
+ ).toBeInTheDocument();
+ expect(screen.queryByText("foo")).toBeNull();
+ expect(screen.queryByText("bar")).toBeNull();
+ expect(screen.queryByText("baz")).toBeNull();
+ expect(screen.getByText("Alphas", { exact: false })).toBeInTheDocument();
+ });
});
diff --git a/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tsx b/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tsx
index b9d91ed740..db8950535c 100644
--- a/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tsx
+++ b/frontend/pages/DashboardPage/cards/ActivityFeed/ActivityItem/ActivityItem.tsx
@@ -24,6 +24,7 @@ const PREMIUM_ACTIVITIES = new Set([
"disabled_macos_disk_encryption",
"enabled_macos_setup_end_user_auth",
"disabled_macos_setup_end_user_auth",
+ "tranferred_hosts",
]);
const getProfileMessageSuffix = (
@@ -443,6 +444,26 @@ const TAGGED_TEMPLATES = {
>
);
},
+ transferredHosts: (activity: IActivity) => {
+ const hostNames = activity.details?.host_display_names || [];
+ const teamName = activity.details?.team_name;
+ if (hostNames.length === 1) {
+ return (
+ <>
+ {" "}
+ transferred host {hostNames[0]} to {teamName ? "team " : ""}
+ {teamName || "no team"}.
+ >
+ );
+ }
+ return (
+ <>
+ {" "}
+ transferred {hostNames.length} hosts to {teamName ? "team " : ""}
+ {teamName || "no team"}.
+ >
+ );
+ },
};
const getDetail = (
@@ -544,6 +565,9 @@ const getDetail = (
case ActivityType.DisabledMacOSSetupEndUserAuth: {
return TAGGED_TEMPLATES.disabledMacOSSetupEndUserAuth(activity);
}
+ case ActivityType.TransferredHosts: {
+ return TAGGED_TEMPLATES.transferredHosts(activity);
+ }
default: {
return TAGGED_TEMPLATES.defaultActivityTemplate(activity);
}