diff --git a/frontend/components/ActivityDetails/InstallDetails/VppInstallDetailsModal/VppInstallDetailsModal.tsx b/frontend/components/ActivityDetails/InstallDetails/VppInstallDetailsModal/VppInstallDetailsModal.tsx
index 9d3f7ccd76..9b666d96d8 100644
--- a/frontend/components/ActivityDetails/InstallDetails/VppInstallDetailsModal/VppInstallDetailsModal.tsx
+++ b/frontend/components/ActivityDetails/InstallDetails/VppInstallDetailsModal/VppInstallDetailsModal.tsx
@@ -29,6 +29,8 @@ import {
interface IGetStatusMessageProps {
isDUP?: boolean;
+ /** "pending" is an edge case here where VPP install activities that were added to the feed prior to v4.57
+ * (when we split pending into pending_install/pending_uninstall) will list the status as "pending" rather than "pending_install" */
displayStatus: SoftwareInstallStatus | "pending";
isMDMStatusNotNow: boolean;
isMDMStatusAcknowledged: boolean;
@@ -56,6 +58,21 @@ export const getStatusMessage = ({
})})`
: null;
+ // Handles "pending" value prior to 4.57
+ const isPendingInstall = ["pending_install", "pending"].includes(
+ displayStatus
+ );
+
+ // Handles the case where software is installed manually by the user and not through Fleet
+ // This app_store_app modal matches software_packages installed manually shown with SoftwareInstallDetailsModal
+ if (displayStatus === "installed" && !commandUpdatedAt) {
+ return (
+ <>
+ {appName} is installed.
+ >
+ );
+ }
+
// Handle NotNow case separately
if (isMDMStatusNotNow) {
return (
@@ -75,7 +92,7 @@ export const getStatusMessage = ({
}
// VPP Verify command pending state
- if (displayStatus === "pending_install" && isMDMStatusAcknowledged) {
+ if (isPendingInstall && isMDMStatusAcknowledged) {
return (
<>
The MDM command (request) to install {appName}
@@ -117,7 +134,7 @@ export const getStatusMessage = ({
<>
{" "}
on {formattedHost}
- {displayStatus === "pending_install" && " when it comes online"}
+ {isPendingInstall && " when it comes online"}
{displayTimeStamp && <> {displayTimeStamp}>}
>
);
@@ -216,8 +233,9 @@ export const VppInstallDetailsModal = ({
}
);
+ // Fallback to "installed" if no status is provided as Installed
const displayStatus =
- (fleetInstallStatus as SoftwareInstallStatus) || "pending_install";
+ (fleetInstallStatus as SoftwareInstallStatus) || "installed";
const iconName = INSTALL_DETAILS_STATUS_ICONS[displayStatus];
// Note: We need to reconcile status values from two different sources. From props, we