From 1eb9d26da9e2d5614c80166dff5bde369f19a2e2 Mon Sep 17 00:00:00 2001 From: Vehbi Karaagac <42275242+Xapollon430@users.noreply.github.com> Date: Thu, 12 Nov 2026 11:40:25 -0500 Subject: [PATCH] Ignore popup selection after disabling Combobox or Multiselect --- packages/react-widgets/src/Combobox.tsx | 2 ++ packages/react-widgets/src/Multiselect.tsx | 2 ++ packages/react-widgets/test/Combobox-test.js | 28 +++++++++++++++++++ .../react-widgets/test/Multiselect-test.js | 28 +++++++++++++++++++ 4 files changed, 60 insertions(+) diff --git a/packages/react-widgets/src/Combobox.tsx b/packages/react-widgets/src/Combobox.tsx index 8914bfb89..d2c8c3831 100644 --- a/packages/react-widgets/src/Combobox.tsx +++ b/packages/react-widgets/src/Combobox.tsx @@ -288,6 +288,8 @@ const ComboboxImpl: Combobox = React.forwardRef(function Combobox( data: string | TDataItem, originalEvent: React.SyntheticEvent, ) => { + if (isDisabled) return + toggle.close() shouldFilter.current = false diff --git a/packages/react-widgets/src/Multiselect.tsx b/packages/react-widgets/src/Multiselect.tsx index ba7a52fef..dcd1b3eaa 100644 --- a/packages/react-widgets/src/Multiselect.tsx +++ b/packages/react-widgets/src/Multiselect.tsx @@ -447,6 +447,8 @@ const Multiselect: Multiselect = React.forwardRef(function Multiselect< dataItem: TDataItem | undefined, originalEvent: React.SyntheticEvent, ) => { + if (isDisabled) return + if (dataItem === undefined) return originalEvent.preventDefault() diff --git a/packages/react-widgets/test/Combobox-test.js b/packages/react-widgets/test/Combobox-test.js index 4da85fc93..45e1ae9de 100644 --- a/packages/react-widgets/test/Combobox-test.js +++ b/packages/react-widgets/test/Combobox-test.js @@ -10,6 +10,34 @@ describe('Combobox', function () { { label: 'suzy smith', id: 3 }, ] + it('ignores option clicks after the open widget becomes disabled', () => { + const onChange = sinon.spy() + const onSelect = sinon.spy() + const widget = mount( + , + ) + + expect( + widget + .find('[role="option"]') + .someWhere((option) => option.text() === 'Orange'), + ).to.equal(true) + widget.setProps({ disabled: true }) + widget + .find('[role="option"]') + .filterWhere((option) => option.text() === 'Orange') + .simulate('click') + + expect(onChange.called).to.equal(false) + expect(onSelect.called).to.equal(false) + }) + it('should set initial values', function () { mount( {}} />) .find('input.rw-input') diff --git a/packages/react-widgets/test/Multiselect-test.js b/packages/react-widgets/test/Multiselect-test.js index c3478e9ff..2ecb4f3f0 100644 --- a/packages/react-widgets/test/Multiselect-test.js +++ b/packages/react-widgets/test/Multiselect-test.js @@ -11,6 +11,34 @@ describe('Multiselect', function () { { label: 'pat', id: 2 }, ] + it('ignores option clicks after the open widget becomes disabled', () => { + const onChange = sinon.spy() + const onSelect = sinon.spy() + const widget = mount( + , + ) + + expect( + widget + .find('[role="option"]') + .someWhere((option) => option.text() === 'Orange'), + ).to.equal(true) + widget.setProps({ disabled: true }) + widget + .find('[role="option"]') + .filterWhere((option) => option.text() === 'Orange') + .simulate('click') + + expect(onChange.called).to.equal(false) + expect(onSelect.called).to.equal(false) + }) + it('should set initial values', function () { mount( {}} />) .find(MultiselectTag)