Fleet UI: Clean up empty enroll secret bugs (#43233)

This commit is contained in:
RachelElysia 2026-04-09 11:04:53 -04:00 committed by GitHub
parent 1ccb0a53f7
commit 7b90f2dc75
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 103 additions and 111 deletions

View file

@ -171,6 +171,9 @@ describe("AddHostsModal", () => {
expect(text).toBeInTheDocument();
});
it("renders no enroll secret cta", async () => {
const onCancel = jest.fn();
const openEnrollSecretModal = jest.fn();
const render = createCustomRenderer({
withBackendMock: true,
context: {
@ -181,23 +184,27 @@ describe("AddHostsModal", () => {
},
});
render(
const { user } = render(
<AddHostsModal
isAnyTeamSelected={false}
currentTeamName="Apples"
isLoading={false}
onCancel={noop}
openEnrollSecretModal={noop}
onCancel={onCancel}
openEnrollSecretModal={openEnrollSecretModal}
/>
);
const text = screen.getByText("Something's gone wrong.");
const ctaButton = screen.getByRole("button", {
name: "Manage enroll secrets",
});
expect(screen.getByText("Something's gone wrong.")).toBeInTheDocument();
expect(
screen.getByText(/you have no enroll secrets\./i)
).toBeInTheDocument();
expect(text).toBeInTheDocument();
expect(ctaButton).toBeEnabled();
const cta = screen.getByText(/manage enroll secrets/i);
expect(cta).toBeInTheDocument();
await user.click(cta);
expect(onCancel).toHaveBeenCalledTimes(1);
expect(openEnrollSecretModal).toHaveBeenCalledTimes(1);
});
it("excludes `--enable-scripts` flag if `config.server_settings.scripts-disabled` is `true`", async () => {

View file

@ -3,7 +3,7 @@ import { useQuery } from "react-query";
import configAPI from "services/entities/config";
import { AppContext } from "context/app";
import Button from "components/buttons/Button";
import CustomLink from "components/CustomLink";
import DataError from "components/DataError";
import Modal from "components/Modal";
import Spinner from "components/Spinner";
@ -60,9 +60,10 @@ const AddHostsModal = ({
<span className="info__data">
You have no enroll secrets.{" "}
{openEnrollSecretModal ? (
<Button onClick={onManageEnrollSecretsClick} variant="inverse">
Manage enroll secrets
</Button>
<CustomLink
customClickHandler={onManageEnrollSecretsClick}
text="Manage enroll secrets"
/>
) : (
"Manage enroll secrets"
)}{" "}

View file

@ -52,12 +52,54 @@ const EnrollSecretModal = ({
title="Manage enroll secrets"
className={baseClass}
>
<div className={`${baseClass} form`}>
{teamInfo?.secrets?.length ? (
<>
<div className={`${baseClass}__header`}>
<div className={`${baseClass}__description`}>
Use these secret(s) to enroll hosts
{teamInfo?.secrets?.length ? (
<div className={`${baseClass} form`}>
<div className={`${baseClass}__header`}>
<div className={`${baseClass}__description`}>
Use these secret(s) to enroll hosts
{primoMode || teamInfo?.name === "Unassigned" ? (
""
) : (
<>
{" "}
to <b>{teamInfo?.name}</b>
</>
)}
.
</div>
<div className={`${baseClass}__add-secret`}>
<GitOpsModeTooltipWrapper
entityType="secrets"
position="right"
tipOffset={8}
renderChildren={(disableChildren) => (
<Button
disabled={disableChildren}
onClick={addNewSecretClick}
className={`${baseClass}__add-secret-btn`}
variant="brand-inverse-icon"
iconStroke
>
Add secret <Icon name="plus" color="core-fleet-green" />
</Button>
)}
/>
</div>
</div>
<EnrollSecretTable
secrets={teamInfo?.secrets}
toggleSecretEditorModal={toggleSecretEditorModal}
toggleDeleteSecretModal={toggleDeleteSecretModal}
setSelectedSecret={setSelectedSecret}
/>
</div>
) : (
<Card color="grey" paddingSize="small">
<EmptyTable
header="You have no enroll secrets."
info={
<>
Add secret(s) to enroll hosts
{primoMode || teamInfo?.name === "Unassigned" ? (
""
) : (
@ -67,75 +109,31 @@ const EnrollSecretModal = ({
</>
)}
.
</div>
<div className={`${baseClass}__add-secret`}>
<GitOpsModeTooltipWrapper
entityType="secrets"
position="right"
tipOffset={8}
renderChildren={(disableChildren) => (
<Button
disabled={disableChildren}
onClick={addNewSecretClick}
className={`${baseClass}__add-secret-btn`}
variant="brand-inverse-icon"
iconStroke
>
Add secret <Icon name="plus" color="core-fleet-green" />
</Button>
)}
/>
</div>
</div>
<EnrollSecretTable
secrets={teamInfo?.secrets}
toggleSecretEditorModal={toggleSecretEditorModal}
toggleDeleteSecretModal={toggleDeleteSecretModal}
setSelectedSecret={setSelectedSecret}
/>
</>
) : (
<Card color="grey" paddingSize="small">
<EmptyTable
header="You have no enroll secrets."
info={
<>
Add secret(s) to enroll hosts
{primoMode || teamInfo?.name === "Unassigned" ? (
""
) : (
<>
{" "}
to <b>{teamInfo?.name}</b>
</>
)}
.
</>
}
primaryButton={
<GitOpsModeTooltipWrapper
entityType="secrets"
position="right"
tipOffset={8}
renderChildren={(disableChildren) => (
<Button
disabled={disableChildren}
onClick={addNewSecretClick}
className={`${baseClass}__add-secret-btn`}
variant="brand-inverse-icon"
iconStroke
>
Add secret <Icon name="plus" color="core-fleet-green" />
</Button>
)}
/>
}
/>
</Card>
)}
<div className="modal-cta-wrap">
<Button onClick={onReturnToApp}>Close</Button>
</div>
</>
}
primaryButton={
<GitOpsModeTooltipWrapper
entityType="secrets"
position="right"
tipOffset={8}
renderChildren={(disableChildren) => (
<Button
disabled={disableChildren}
onClick={addNewSecretClick}
className={`${baseClass}__add-secret-btn`}
variant="brand-inverse-icon"
iconStroke
>
Add secret <Icon name="plus" color="core-fleet-green" />
</Button>
)}
/>
}
/>
</Card>
)}
<div className="modal-cta-wrap">
<Button onClick={onReturnToApp}>Close</Button>
</div>
</Modal>
);

View file

@ -4,16 +4,6 @@
text-decoration: none;
}
pre,
code {
background-color: $ui-off-white;
color: $core-fleet-blue;
border: 1px solid $ui-fleet-black-10;
border-radius: $border-radius;
padding: 7px $pad-medium;
margin: $pad-large 0 0 44px;
}
&__error {
color: $ui-error;
}

View file

@ -9,16 +9,6 @@
margin: $pad-medium 0 0 0;
}
pre,
code {
background-color: $ui-off-white;
color: $core-fleet-blue;
border: 1px solid $ui-fleet-black-10;
border-radius: $border-radius;
padding: 7px $pad-medium;
margin: $pad-large 0 0 44px;
}
&__error {
color: $ui-error;
}

View file

@ -85,6 +85,7 @@ import { strToBool } from "utilities/strings/stringUtils";
import Button from "components/buttons/Button";
import Icon from "components/Icon/Icon";
import CustomLink from "components/CustomLink";
import { SingleValue } from "react-select-5";
import DropdownWrapper from "components/forms/fields/DropdownWrapper";
import { CustomOptionType } from "components/forms/fields/DropdownWrapper/DropdownWrapper";
@ -1934,8 +1935,13 @@ const ManageHostsPage = ({
>
<div>
<span>
You have no enroll secrets. Manage enroll secrets to enroll hosts
to <b>{isAnyTeamSelected ? currentTeamName : "Fleet"}</b>.
You have no enroll secrets.{" "}
<CustomLink
customClickHandler={() => setShowEnrollSecretModal(true)}
text="Manage enroll secrets"
/>{" "}
to enroll hosts to{" "}
<b>{isAnyTeamSelected ? currentTeamName : "Fleet"}</b>.
</span>
</div>
</InfoBanner>