diff --git a/frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostInstallerActionCell/HostInstallerActionCell.tests.tsx b/frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostInstallerActionCell/HostInstallerActionCell.tests.tsx
index 0241e1a213..3bb61b7db8 100644
--- a/frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostInstallerActionCell/HostInstallerActionCell.tests.tsx
+++ b/frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostInstallerActionCell/HostInstallerActionCell.tests.tsx
@@ -578,4 +578,102 @@ describe("HostInstallerActionCell component", () => {
expect(screen.getByTestId("trash-icon")).toBeInTheDocument();
expect(uninstallBtn.closest("button")).toBeDisabled();
});
+ it("renders Reinstall and Uninstall buttons for tgz package with no installed_versions", () => {
+ render(
+
+ );
+
+ const installBtn = screen.getByTestId(`${baseClass}__install-button--test`);
+ expect(installBtn).toHaveTextContent("Reinstall");
+ expect(screen.getByTestId("refresh-icon")).toBeInTheDocument();
+ expect(installBtn.closest("button")).toBeEnabled();
+
+ const uninstallBtn = screen.getByTestId(
+ `${baseClass}__uninstall-button--test`
+ );
+ expect(uninstallBtn).toHaveTextContent("Uninstall");
+ expect(screen.getByTestId("trash-icon")).toBeInTheDocument();
+ expect(uninstallBtn.closest("button")).toBeEnabled();
+ });
+ it("renders disabled Reinstall and disabled Uninstall buttons for tgz package with no installed_versions when uninstall pending", () => {
+ render(
+
+ );
+
+ const installBtn = screen.getByTestId(`${baseClass}__install-button--test`);
+ expect(installBtn).toHaveTextContent("Reinstall");
+ expect(screen.getByTestId("refresh-icon")).toBeInTheDocument();
+ expect(installBtn.closest("button")).toBeDisabled();
+
+ const uninstallBtn = screen.getByTestId(
+ `${baseClass}__uninstall-button--test`
+ );
+ expect(uninstallBtn).toHaveTextContent("Uninstall");
+ expect(screen.getByTestId("trash-icon")).toBeInTheDocument();
+ expect(uninstallBtn.closest("button")).toBeDisabled();
+ });
+ it("renders Reinstall and Retry uninstall buttons for tgz package with no installed_versions when uninstall failed", () => {
+ render(
+
+ );
+
+ const installBtn = screen.getByTestId(`${baseClass}__install-button--test`);
+ expect(installBtn).toHaveTextContent("Reinstall");
+ expect(installBtn.closest("button")).toBeEnabled();
+
+ const uninstallBtn = screen.getByTestId(
+ `${baseClass}__uninstall-button--test`
+ );
+ expect(uninstallBtn).toHaveTextContent("Retry uninstall");
+ expect(uninstallBtn.closest("button")).toBeEnabled();
+
+ // Both reinstall and retry uninstall have the same icon
+ const refreshIcons = screen.getAllByTestId("refresh-icon");
+ expect(refreshIcons).toHaveLength(2);
+ });
});
diff --git a/frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostInstallerActionCell/HostInstallerActionCell.tsx b/frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostInstallerActionCell/HostInstallerActionCell.tsx
index 97e1125228..502feaa6d3 100644
--- a/frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostInstallerActionCell/HostInstallerActionCell.tsx
+++ b/frontend/pages/hosts/details/cards/HostSoftwareLibrary/HostInstallerActionCell/HostInstallerActionCell.tsx
@@ -201,11 +201,20 @@ export const HostInstallerActionCell = ({
}
}, [status, ui_status]);
+ const installedVersionsDetected =
+ installed_versions && installed_versions.length > 0;
+
+ const installedTgzPackageDetected =
+ software.source === "tgz_packages" &&
+ (ui_status === "installed" ||
+ ui_status === "pending_uninstall" ||
+ ui_status === "uninstalling" ||
+ ui_status === "failed_uninstall");
+
const canUninstallSoftware =
!app_store_app &&
!!software_package &&
- installed_versions &&
- installed_versions.length > 0;
+ (installedVersionsDetected || installedTgzPackageDetected);
return (