From f19df3ed66e1e39422ada4f1a7c52b9e15b06466 Mon Sep 17 00:00:00 2001 From: Kirtesh Suthar Date: Thu, 29 Oct 2026 21:24:35 +0530 Subject: [PATCH] fix(visual-builder): name the hovered entry in the reference map request The field label asked the editor for the whole reference map on every hover, which the editor builds by looking up every entry on the page. The request now carries the hovered field's entry uid, content type and locale, so the editor can answer for that entry alone, at once for the page entry. Editors that do not read the payload behave as before. Co-Authored-By: Claude Opus 5.5 --- ...dLabelWrapper.referenceMapRequest.test.tsx | 64 +++++++++++++++++++ .../components/fieldLabelWrapper.tsx | 12 +++- 2 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 src/visualBuilder/components/__test__/fieldlabelwrapper/fieldLabelWrapper.referenceMapRequest.test.tsx 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;