From 7d7c719effa08c01c40dc235faafc7fe4d758f94 Mon Sep 17 00:00:00 2001 From: Roman Vyakhirev Date: Fri, 7 Nov 2025 11:59:56 +0100 Subject: [PATCH 1/2] feat: improve single select with custom content --- .../combobox-web/CHANGELOG.md | 4 ++ .../src/__tests__/SingleSelection.spec.tsx | 25 +++++++++---- .../src/__tests__/StaticSelection.spec.tsx | 37 +++++++++++++------ .../SingleSelection.spec.tsx.snap | 3 +- .../StaticSelection.spec.tsx.snap | 3 +- .../SingleSelection/SingleSelection.tsx | 7 +++- .../hooks/useDownshiftSingleSelectProps.ts | 19 +++++----- .../combobox-web/src/ui/Combobox.scss | 31 +++++++++++----- 8 files changed, 86 insertions(+), 43 deletions(-) diff --git a/packages/pluggableWidgets/combobox-web/CHANGELOG.md b/packages/pluggableWidgets/combobox-web/CHANGELOG.md index ae917dccb7..6ce3264a24 100644 --- a/packages/pluggableWidgets/combobox-web/CHANGELOG.md +++ b/packages/pluggableWidgets/combobox-web/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Changed + +- We improved behaviour of single selection with custom content. + ## [2.6.2] - 2025-10-29 ### Fixed diff --git a/packages/pluggableWidgets/combobox-web/src/__tests__/SingleSelection.spec.tsx b/packages/pluggableWidgets/combobox-web/src/__tests__/SingleSelection.spec.tsx index 3b7f257318..88523b477d 100644 --- a/packages/pluggableWidgets/combobox-web/src/__tests__/SingleSelection.spec.tsx +++ b/packages/pluggableWidgets/combobox-web/src/__tests__/SingleSelection.spec.tsx @@ -21,6 +21,12 @@ async function getToggleButton(component: RenderResult): Promise { async function getInput(component: RenderResult): Promise { return (await component.findByRole("combobox")) as HTMLInputElement; } +async function getVisibleValueNode(component: RenderResult): Promise { + const custom = component.container.querySelector(".widget-combobox-placeholder-custom") as HTMLDivElement; + const text = component.container.querySelector(".widget-combobox-placeholder-text") as HTMLDivElement; + + return custom ?? text; +} describe("Combo box (Association)", () => { beforeAll(() => { @@ -108,12 +114,13 @@ describe("Combo box (Association)", () => { }); it("sets option to selected item", async () => { const component = render(); - const input = await getInput(component); + const value = await getVisibleValueNode(component); const toggleButton = await getToggleButton(component); fireEvent.click(toggleButton); const option1 = await component.findByText("obj_222"); fireEvent.click(option1); - expect(input.value).toEqual("obj_222"); + component.rerender(); + expect(value.textContent).toEqual("obj_222"); expect(defaultProps.attributeAssociation?.setValue).toHaveBeenCalled(); expect(component.queryAllByRole("option")).toHaveLength(0); expect(defaultProps.attributeAssociation?.value).toEqual({ id: "obj_222" }); @@ -121,17 +128,16 @@ describe("Combo box (Association)", () => { it("removes selected item", async () => { const component = render(); - const input = await getInput(component); - const labelText = await component.container.querySelector( - ".widget-combobox-placeholder-text .widget-combobox-caption-text" - ); const toggleButton = await getToggleButton(component); fireEvent.click(toggleButton); const option1 = await component.findByText("obj_222"); fireEvent.click(option1); - expect(input.value).toEqual("obj_222"); + component.rerender(); + + const value = await getVisibleValueNode(component); + expect(value.textContent).toEqual("obj_222"); expect(defaultProps.attributeAssociation?.setValue).toHaveBeenCalled(); expect(component.queryAllByRole("option")).toHaveLength(0); expect(defaultProps.attributeAssociation?.value).toEqual({ id: "obj_222" }); @@ -139,6 +145,11 @@ describe("Combo box (Association)", () => { const clearButton = await component.container.getElementsByClassName("widget-combobox-clear-button")[0]; fireEvent.click(clearButton); + component.rerender(); + + const labelText = await component.container.querySelector( + ".widget-combobox-placeholder-text .widget-combobox-caption-text" + ); expect(labelText?.innerHTML).toEqual(defaultProps.emptyOptionText?.value); expect(defaultProps.attributeAssociation?.value).toEqual(undefined); }); diff --git a/packages/pluggableWidgets/combobox-web/src/__tests__/StaticSelection.spec.tsx b/packages/pluggableWidgets/combobox-web/src/__tests__/StaticSelection.spec.tsx index a560f15de9..09d2565455 100644 --- a/packages/pluggableWidgets/combobox-web/src/__tests__/StaticSelection.spec.tsx +++ b/packages/pluggableWidgets/combobox-web/src/__tests__/StaticSelection.spec.tsx @@ -16,8 +16,16 @@ import Combobox from "../Combobox"; async function getToggleButton(component: RenderResult): Promise { return component.container.querySelector(".widget-combobox-down-arrow")!; } -async function getInput(component: RenderResult): Promise { - return (await component.findByRole("combobox")) as HTMLInputElement; + +async function getVisibleValueNode(component: RenderResult): Promise { + const custom = component.container.querySelector(".widget-combobox-placeholder-custom") as HTMLDivElement; + const text = component.container.querySelector(".widget-combobox-placeholder-text") as HTMLDivElement; + + return custom ?? text; +} + +async function findOptions(component: RenderResult): Promise { + return component.findAllByRole("option"); } describe("Combo box (Static values)", () => { @@ -89,8 +97,8 @@ describe("Combo box (Static values)", () => { }); it("renders combobox widget with selected value", async () => { const component = render(); - const input = await getInput(component); - expect(input.value).toEqual("caption1"); + const value = await getVisibleValueNode(component); + expect(value.textContent).toEqual("caption1"); }); it("toggles combobox menu on: input TOGGLE BUTTON", async () => { @@ -107,24 +115,29 @@ describe("Combo box (Static values)", () => { }); it("sets option to selected item", async () => { const component = render(); - const input = await getInput(component); + const value = await getVisibleValueNode(component); + expect(value.textContent).toEqual("caption1"); const toggleButton = await getToggleButton(component); fireEvent.click(toggleButton); - const option1 = await component.findByText("caption2"); - fireEvent.click(option1); - expect(input.value).toEqual("caption2"); + const options = await findOptions(component); + fireEvent.click(options[1]); + + component.rerender(); + + const value2 = await getVisibleValueNode(component); + expect(value2.textContent).toEqual("caption2"); expect(defaultProps.staticAttribute?.setValue).toHaveBeenCalled(); expect(component.queryAllByRole("option")).toHaveLength(0); expect(defaultProps.staticAttribute?.value).toEqual("value2"); }); it("removes selected item", async () => { const component = render(); - const input = await getInput(component); const toggleButton = await getToggleButton(component); fireEvent.click(toggleButton); - const options = await component.findAllByText("caption1"); - fireEvent.click(options[1]); - expect(input.value).toEqual("caption1"); + const options = await findOptions(component); + fireEvent.click(options[0]); + const value = await getVisibleValueNode(component); + expect(value.textContent).toEqual("caption1"); expect(component.queryAllByRole("option")).toHaveLength(0); expect(defaultProps.staticAttribute.value).toEqual("value1"); const clearButton = await component.container.getElementsByClassName("widget-combobox-clear-button")[0]; diff --git a/packages/pluggableWidgets/combobox-web/src/__tests__/__snapshots__/SingleSelection.spec.tsx.snap b/packages/pluggableWidgets/combobox-web/src/__tests__/__snapshots__/SingleSelection.spec.tsx.snap index 21eff47ec7..df6f233d70 100644 --- a/packages/pluggableWidgets/combobox-web/src/__tests__/__snapshots__/SingleSelection.spec.tsx.snap +++ b/packages/pluggableWidgets/combobox-web/src/__tests__/__snapshots__/SingleSelection.spec.tsx.snap @@ -23,9 +23,10 @@ exports[`Combo box (Association) renders combobox widget 1`] = ` class="widget-combobox-input" id="comboBox1" placeholder=" " + readonly="" role="combobox" tabindex="0" - value="obj_111" + value="" />
, actionAndChanges: UseComboboxStateChangeOptions) { const { changes, type } = actionAndChanges; switch (type) { + // clear input when user toggles (closes) dropdown. case useCombobox.stateChangeTypes.ToggleButtonClick: return { ...changes, - inputValue: - state.isOpen && selector.currentId ? selector.caption.get(selector.currentId) : "" + inputValue: "" }; + // when item is selected, downshift fills in input automatically, prevent that. + case useCombobox.stateChangeTypes.FunctionSelectItem: + case useCombobox.stateChangeTypes.ItemClick: case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem: + case useCombobox.stateChangeTypes.InputKeyDownEnter: return { ...changes, - inputValue: - changes.inputValue === selector.caption.emptyCaption - ? "" - : selector.caption.get(selector.currentId) + inputValue: "" }; case useCombobox.stateChangeTypes.InputFocus: @@ -88,15 +89,13 @@ export function useDownshiftSingleSelectProps( highlightedIndex: changes.selectedItem ? -1 : this.defaultHighlightedIndex }; + // clear input when user want to close the popup with escape (or it was closed programmatically) case useCombobox.stateChangeTypes.InputKeyDownEscape: case useCombobox.stateChangeTypes.FunctionCloseMenu: return { ...changes, isOpen: false, - inputValue: - changes.selectedItem || selector.currentId - ? selector.caption.get(selector.currentId) - : "" + inputValue: "" }; case useCombobox.stateChangeTypes.InputBlur: return state; diff --git a/packages/pluggableWidgets/combobox-web/src/ui/Combobox.scss b/packages/pluggableWidgets/combobox-web/src/ui/Combobox.scss index dffe8d97d6..f4d681c7fb 100644 --- a/packages/pluggableWidgets/combobox-web/src/ui/Combobox.scss +++ b/packages/pluggableWidgets/combobox-web/src/ui/Combobox.scss @@ -165,14 +165,27 @@ $cb-skeleton-dark: #d2d2d2; flex-grow: 1; border: none; padding: 0; - width: 100%; - &:not(:focus) { - opacity: 0; + // when there is no filter or the input is readonly + // collapse input so it it not visible + &-nofilter, + &:placeholder-shown:not(:focus) { + max-width: 0; + } + + &:placeholder-shown:focus:not(&-nofilter):has(+ .widget-combobox-placeholder-empty) { + max-width: 3px; + margin-right: -3px; } + } - &-nofilter { - cursor: pointer; + .widget-combobox-selected-items:not(.widget-combobox-boxes) { + .widget-combobox-input { + // when focused but empty - allow to show only cursor + &:placeholder-shown:focus:not(&-nofilter) { + max-width: 3px; + margin-right: -3px; + } } } @@ -233,11 +246,8 @@ $cb-skeleton-dark: #d2d2d2; &-text { color: var(--cb-text-color, var(--gray-darker, $cb-typography-color)); - position: absolute; inset-inline-start: 0; inset-inline-end: 0; - top: 0; - bottom: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; @@ -269,7 +279,7 @@ $cb-skeleton-dark: #d2d2d2; inset-inline-end: 0; bottom: 0; } - &:focus:not(:placeholder-shown) + .widget-combobox-placeholder-custom { + &:not(:placeholder-shown) + .widget-combobox-placeholder-custom { display: none; } } @@ -294,7 +304,8 @@ $cb-skeleton-dark: #d2d2d2; input:placeholder-shown, input:not(:focus) { & + .widget-combobox-placeholder-text { - display: block; + display: flex; + align-items: center; } } } From 64dadbc135fea5f46793fbeae65f972378dc9c8c Mon Sep 17 00:00:00 2001 From: Roman Vyakhirev Date: Wed, 12 Nov 2025 13:48:30 +0100 Subject: [PATCH 2/2] chore: update e2e screenshot, it became more centered --- ...boBoxRemoveAllSelection-chromium-linux.png | Bin 16733 -> 16752 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/pluggableWidgets/combobox-web/e2e/Combobox.spec.js-snapshots/comboBoxRemoveAllSelection-chromium-linux.png b/packages/pluggableWidgets/combobox-web/e2e/Combobox.spec.js-snapshots/comboBoxRemoveAllSelection-chromium-linux.png index bd463f8f04d6002a2c6478ab7a859ecd51f70ff9..9704b9f5cf14533d90901f4aae499e2f1f1d265e 100644 GIT binary patch literal 16752 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 literal 16733 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 F{SVd%J^lay