diff --git a/src/visualBuilder/components/__test__/fieldlabelwrapper/fieldLabelWrapper.referenceMapRequest.test.tsx b/src/visualBuilder/components/__test__/fieldlabelwrapper/fieldLabelWrapper.referenceMapRequest.test.tsx new file mode 100644 index 00000000..656a8496 --- /dev/null +++ b/src/visualBuilder/components/__test__/fieldlabelwrapper/fieldLabelWrapper.referenceMapRequest.test.tsx @@ -0,0 +1,64 @@ +import { render, waitFor, cleanup } from "@testing-library/preact"; +import FieldLabelWrapperComponent from "../../fieldLabelWrapper"; +import visualBuilderPostMessage from "../../../utils/visualBuilderPostMessage"; +import { VisualBuilderPostMessageEvents } from "../../../utils/types/postMessage.types"; +import React from "preact/compat"; +import { mockFieldMetadata } from "./fieldLabelWrapper.mocks"; + +vi.mock("../../../utils/visualBuilderPostMessage", () => ({ + default: { send: vi.fn().mockResolvedValue({}) }, +})); + +vi.mock("../../../utils/fieldSchemaMap", () => ({ + FieldSchemaMap: { + getFieldSchema: vi.fn().mockResolvedValue({ + display_name: "Title", + data_type: "text", + field_metadata: {}, + uid: "title", + }), + }, +})); + +vi.mock("../../../utils/fetchEntryPermissionsAndStageDetails", () => ({ + fetchEntryPermissionsAndStageDetails: vi.fn().mockResolvedValue({}), +})); + +// class names only; generating the real stylesheet slows jsdom down test after test +vi.mock("../../../visualBuilder.style", () => ({ + visualBuilderStyles: () => + new Proxy({}, { get: (_target, name) => String(name) }), +})); + +describe("FieldLabelWrapperComponent - reference map request", () => { + afterEach(() => { + cleanup(); + vi.clearAllMocks(); + }); + + test("names the hovered field's entry so the editor can skip building the whole map", async () => { + render( + document.createElement("div")} + /> + ); + + await waitFor(() => + expect(visualBuilderPostMessage!.send).toHaveBeenCalledWith( + VisualBuilderPostMessageEvents.REFERENCE_MAP, + { + entry_uid: mockFieldMetadata.entry_uid, + content_type_uid: mockFieldMetadata.content_type_uid, + locale: mockFieldMetadata.locale, + } + ) + ); + }); +}); diff --git a/src/visualBuilder/components/fieldLabelWrapper.tsx b/src/visualBuilder/components/fieldLabelWrapper.tsx index b92a2834..3c5fa0c4 100644 --- a/src/visualBuilder/components/fieldLabelWrapper.tsx +++ b/src/visualBuilder/components/fieldLabelWrapper.tsx @@ -50,9 +50,15 @@ async function getContentTypeName(contentTypeUid: string) { } } -async function getReferenceParentMap() { +// Naming the hovered entry lets the editor answer without building the whole +// map, e.g. at once for the page entry. Older editors ignore the payload. +async function getReferenceParentMap(fieldMetadata: CslpData) { try { - const result = await visualBuilderPostMessage?.send(VisualBuilderPostMessageEvents.REFERENCE_MAP, {}) ?? {}; + const result = await visualBuilderPostMessage?.send(VisualBuilderPostMessageEvents.REFERENCE_MAP, { + entry_uid: fieldMetadata.entry_uid, + content_type_uid: fieldMetadata.content_type_uid, + locale: fieldMetadata.locale, + }) ?? {}; return result; } catch(e) { console.warn("[getFieldLabelWrapper] Error getting reference parent map", e); @@ -240,7 +246,7 @@ function FieldLabelWrapperComponent( getContentTypeName( props.fieldMetadata.content_type_uid ), - getReferenceParentMap() + getReferenceParentMap(props.fieldMetadata) ]); const entryUid = props.fieldMetadata.entry_uid;