Keep catalog method section editors after a Customize title override so Core Principle and related copy are not replaced by an empty custom-policy body.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -12,6 +12,8 @@ import "@testing-library/jest-dom/vitest";
|
||||
import { CommunicationMethodsScreen } from "../../app/(app)/create/screens/card/CommunicationMethodsScreen";
|
||||
import { useCreateFlow } from "../../app/(app)/create/context/CreateFlowContext";
|
||||
import type { CreateFlowState } from "../../app/(app)/create/types";
|
||||
import { communicationPresetFor } from "../../lib/create/finalReviewChipPresets";
|
||||
import messages from "../../messages/en/index";
|
||||
|
||||
afterEach(() => {
|
||||
cleanup();
|
||||
@@ -158,6 +160,48 @@ describe("CommunicationMethodsScreen — Add Platform persistence", () => {
|
||||
expect(textareas[2].value).toBe("Saved coc");
|
||||
});
|
||||
|
||||
it("keeps catalog section editors when a title override exists and there are no custom fields", async () => {
|
||||
const details = communicationPresetFor("video-meetings");
|
||||
const noFieldsHint =
|
||||
messages.create.customRule.customMethodCardWizard.editModal
|
||||
.noCustomFieldsYet;
|
||||
render(
|
||||
<ScreenWithStateProbe
|
||||
onState={() => {
|
||||
/* noop */
|
||||
}}
|
||||
initial={{
|
||||
selectedCommunicationMethodIds: ["video-meetings"],
|
||||
customMethodCardMetaById: {
|
||||
"video-meetings": {
|
||||
label: "Video Meetings",
|
||||
supportText:
|
||||
"Synchronous video calls for remote face-to-face interaction.",
|
||||
},
|
||||
},
|
||||
communicationMethodDetailsById: {
|
||||
"video-meetings": details,
|
||||
},
|
||||
}}
|
||||
/>,
|
||||
);
|
||||
|
||||
fireEvent.click(
|
||||
screen.getAllByRole("button", {
|
||||
name: /Video Meetings: Synchronous video/,
|
||||
})[0],
|
||||
);
|
||||
const dialog = await screen.findByRole("dialog");
|
||||
const textareas = within(dialog).getAllByRole(
|
||||
"textbox",
|
||||
) as HTMLTextAreaElement[];
|
||||
expect(textareas).toHaveLength(3);
|
||||
expect(textareas[0].value).toBe(details.corePrinciple);
|
||||
expect(textareas[1].value).toBe(details.logisticsAdmin);
|
||||
expect(textareas[2].value).toBe(details.codeOfConduct);
|
||||
expect(within(dialog).queryByText(noFieldsHint)).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("opens meaning fields editable without Customize", async () => {
|
||||
render(
|
||||
<ScreenWithStateProbe
|
||||
|
||||
@@ -214,6 +214,39 @@ describe("FinalReviewScreen — chip detail modal", () => {
|
||||
).toBeGreaterThanOrEqual(1);
|
||||
});
|
||||
|
||||
it("keeps catalog section editors when a title override exists and there are no custom fields", async () => {
|
||||
render(
|
||||
<FinalReviewWithStateProbe
|
||||
onState={() => {
|
||||
/* noop */
|
||||
}}
|
||||
initial={{
|
||||
title: "Oak Park Commons",
|
||||
selectedCommunicationMethodIds: ["video-meetings"],
|
||||
customMethodCardMetaById: {
|
||||
"video-meetings": {
|
||||
label: "Video Meetings",
|
||||
supportText:
|
||||
"Synchronous video calls for remote face-to-face interaction.",
|
||||
},
|
||||
},
|
||||
}}
|
||||
/>,
|
||||
);
|
||||
|
||||
fireEvent.click(
|
||||
await screen.findByRole("button", { name: "Video Meetings" }),
|
||||
);
|
||||
const dialog = await screen.findByRole("dialog");
|
||||
expect(within(dialog).getAllByRole("textbox")).toHaveLength(3);
|
||||
expect(
|
||||
within(dialog).queryByText("No custom fields yet."),
|
||||
).not.toBeInTheDocument();
|
||||
expect(
|
||||
within(dialog).getByText(/core principle/i),
|
||||
).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("method chip modal kebab offers Customize but not Duplicate", async () => {
|
||||
render(<FinalReviewWithCustomizeSelections />);
|
||||
fireEvent.click(await screen.findByRole("button", { name: "Signal" }));
|
||||
|
||||
@@ -4,6 +4,7 @@ import {
|
||||
createFlowStepForCustomRuleFacetGroup,
|
||||
CUSTOM_RULE_FACETS,
|
||||
CUSTOM_RULE_FACET_BY_GROUP,
|
||||
isCatalogMethodCardId,
|
||||
METHOD_FACET_API_SECTION_IDS,
|
||||
PUBLISHED_CUSTOM_RULE_SELECTION_KEYS,
|
||||
readMethodPresetsForFacetGroup,
|
||||
@@ -75,4 +76,12 @@ describe("customRuleFacets (CR-92)", () => {
|
||||
expect(m.length).toBeGreaterThan(0);
|
||||
expect(typeof m[0]!.id).toBe("string");
|
||||
});
|
||||
|
||||
it("isCatalogMethodCardId is true for shipped slugs and false for UUIDs", () => {
|
||||
expect(isCatalogMethodCardId("video-meetings")).toBe(true);
|
||||
expect(isCatalogMethodCardId("signal")).toBe(true);
|
||||
expect(
|
||||
isCatalogMethodCardId("550e8400-e29b-41d4-a716-446655440000"),
|
||||
).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -125,4 +125,40 @@ describe("usesWizardFieldBlocksModalBody", () => {
|
||||
}),
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
it("is false for catalog ids with a title-override meta row and no field blocks", () => {
|
||||
expect(
|
||||
usesWizardFieldBlocksModalBody({
|
||||
methodId: "video-meetings",
|
||||
meta: {
|
||||
"video-meetings": {
|
||||
label: "Video Meetings",
|
||||
supportText: "Synchronous video calls.",
|
||||
},
|
||||
},
|
||||
fieldBlocksById: { "video-meetings": [] },
|
||||
modalEditUnlocked: false,
|
||||
draftFieldBlocks: null,
|
||||
customFacetDetailsMatchPreset: true,
|
||||
}),
|
||||
).toBe(false);
|
||||
});
|
||||
|
||||
it("is true for catalog ids when persisted field blocks exist", () => {
|
||||
expect(
|
||||
usesWizardFieldBlocksModalBody({
|
||||
methodId: "video-meetings",
|
||||
meta: {
|
||||
"video-meetings": {
|
||||
label: "Video Meetings",
|
||||
supportText: "Synchronous video calls.",
|
||||
},
|
||||
},
|
||||
fieldBlocksById: { "video-meetings": blocks },
|
||||
modalEditUnlocked: false,
|
||||
draftFieldBlocks: null,
|
||||
customFacetDetailsMatchPreset: true,
|
||||
}),
|
||||
).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user