From e5175f488bf8ba6d7932483d3b85b8d0dacc2161 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 28 Oct 2026 07:01:41 +0000 Subject: [PATCH 1/4] feat(field-toolbar): show the Edit button for Taxonomy fields Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01PhGzeBieWdXYBvXLHnWDDf --- .../components/__test__/fieldToolbar.test.tsx | 54 +++++++++++++++++++ .../components/icons/fields/index.ts | 1 + src/visualBuilder/utils/constants.ts | 1 + 3 files changed, 56 insertions(+) diff --git a/src/visualBuilder/components/__test__/fieldToolbar.test.tsx b/src/visualBuilder/components/__test__/fieldToolbar.test.tsx index 4d8ccbea..dc479f22 100644 --- a/src/visualBuilder/components/__test__/fieldToolbar.test.tsx +++ b/src/visualBuilder/components/__test__/fieldToolbar.test.tsx @@ -796,4 +796,58 @@ describe("FieldToolbarComponent", () => { ).toBeDisabled(); }); }); + + describe("Taxonomy field toolbar", () => { + const taxonomySchema = { + data_type: "taxonomy", + display_name: "Taxonomies", + uid: "taxonomies", + multiple: true, + mandatory: false, + non_localizable: false, + unique: false, + taxonomies: [{ taxonomy_uid: "colors", non_localizable: false }], + } as unknown as ISchemaFieldMap; + + const termMetadata: CslpData = { + ...mockMultipleFieldMetadata, + fieldPath: "taxonomies", + fieldPathWithIndex: "taxonomies", + multipleFieldMetadata: { + index: 1, + parentDetails: { + parentPath: "taxonomies", + parentCslpValue: "entry.ct.en-us", + }, + }, + instance: { fieldPathWithIndex: "taxonomies.1" }, + }; + + test("renders the Edit button for a Taxonomy field", async () => { + vi.mocked(FieldSchemaMap.getFieldSchema).mockImplementation(() => + Promise.resolve(taxonomySchema) + ); + const { container } = render( + + ); + await act(async () => { + await new Promise((r) => setTimeout(r, 0)); + }); + + expect( + await findByTestId( + container, + "visual-builder__focused-toolbar__multiple-field-toolbar__edit-button", + {}, + { timeout: 1000 } + ) + ).toBeInTheDocument(); + }); + }); }); diff --git a/src/visualBuilder/components/icons/fields/index.ts b/src/visualBuilder/components/icons/fields/index.ts index 3bdcdfd9..21428463 100644 --- a/src/visualBuilder/components/icons/fields/index.ts +++ b/src/visualBuilder/components/icons/fields/index.ts @@ -11,4 +11,5 @@ export const fieldIcons: Partial> = { isodate: EditIcon, url: EditIcon, select: EditIcon, + taxonomy: EditIcon, }; diff --git a/src/visualBuilder/utils/constants.ts b/src/visualBuilder/utils/constants.ts index 82576dea..5ecee1d6 100644 --- a/src/visualBuilder/utils/constants.ts +++ b/src/visualBuilder/utils/constants.ts @@ -46,6 +46,7 @@ export const ALLOWED_MODAL_EDITABLE_FIELD: FieldDataType[] = [ FieldDataType.ISODATE, FieldDataType.URL, FieldDataType.SELECT, + FieldDataType.TAXONOMY, ]; export const ALLOWED_REPLACE_FIELDS: FieldDataType[] = [ From a84b2c21de75564e182cb521fd37853786dc3226 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 28 Oct 2026 07:06:41 +0000 Subject: [PATCH 2/4] feat(field-toolbar): give Taxonomy fields the whole-field toolbar Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01PhGzeBieWdXYBvXLHnWDDf --- src/visualBuilder/components/FieldToolbar.tsx | 16 ++-- .../components/__test__/fieldToolbar.test.tsx | 90 +++++++++++++++++++ .../__test__/handleIndividualFields.test.ts | 17 ++++ 3 files changed, 116 insertions(+), 7 deletions(-) diff --git a/src/visualBuilder/components/FieldToolbar.tsx b/src/visualBuilder/components/FieldToolbar.tsx index a72b6538..dc5318a9 100644 --- a/src/visualBuilder/components/FieldToolbar.tsx +++ b/src/visualBuilder/components/FieldToolbar.tsx @@ -151,7 +151,7 @@ function FieldToolbarComponent( let Icon = null; let fieldType = null; let isWholeMultipleField = false; - let isMultipleSelect = false; + let isEditedAsOneValue = false; const APP_LIST_MIN_WIDTH = 230; let disableFieldActions = false; @@ -196,10 +196,12 @@ function FieldToolbarComponent( isCustomFieldWholeMultiple = fieldType === FieldDataType.CUSTOM_FIELD && isMultiple && isWholeMultipleField; - // A multiple Select edits as one field, so a value click gets the whole-field toolbar. - isMultipleSelect = fieldType === FieldDataType.SELECT && isMultiple; + // A multiple Select or Taxonomy edits as one value, so a value click gets the whole-field toolbar. + isEditedAsOneValue = + (fieldType === FieldDataType.SELECT && isMultiple) || + fieldType === FieldDataType.TAXONOMY; - if (isCustomFieldWholeMultiple || isMultipleSelect) { + if (isCustomFieldWholeMultiple || isEditedAsOneValue) { isModalEditable = true; } else { isModalEditable = ALLOWED_MODAL_EDITABLE_FIELD.includes(fieldType) && !isWholeMultipleField; @@ -263,9 +265,9 @@ function FieldToolbarComponent( // propagation to be stopped, should ideally only attach onClick to fieldpath dropdown e.preventDefault(); e.stopPropagation(); - // Multiple Select is edited as one value; a value click must not bind to its index + // Multiple Select and Taxonomy are edited as one value; a value click must not bind to its index handleEdit( - isMultipleSelect + isEditedAsOneValue ? { ...fieldMetadata, instance: { @@ -514,7 +516,7 @@ function FieldToolbarComponent( disabled={disableFieldActions} /> ) : null} - {isMultiple && !isWholeMultipleField && !isMultipleSelect ? ( + {isMultiple && !isWholeMultipleField && !isEditedAsOneValue ? ( <>