diff --git a/.changeset/wild-parents-suffer.md b/.changeset/wild-parents-suffer.md new file mode 100644 index 000000000..7c7f847f8 --- /dev/null +++ b/.changeset/wild-parents-suffer.md @@ -0,0 +1,5 @@ +--- +'@cube-dev/ui-kit': minor +--- + +Form logic internal fixes. diff --git a/src/components/content/Tag/Tag.tsx b/src/components/content/Tag/Tag.tsx index 7476070a5..c40fae10c 100644 --- a/src/components/content/Tag/Tag.tsx +++ b/src/components/content/Tag/Tag.tsx @@ -34,7 +34,7 @@ const TagElement = tasty({ closable: '0 (2.5x - 1bw) 0 (1x - 1bw)', }, fill: { - '': '#dark.04', + '': '#light', ...Object.keys(THEMES).reduce((map, type) => { map[`[data-type="${type}"]`] = THEMES[type].fill; diff --git a/src/components/fields/Checkbox/checkbox-group.test.tsx b/src/components/fields/Checkbox/checkbox-group.test.tsx index 8cbedd896..2c2d937a8 100644 --- a/src/components/fields/Checkbox/checkbox-group.test.tsx +++ b/src/components/fields/Checkbox/checkbox-group.test.tsx @@ -1,4 +1,4 @@ -import { act, render, renderWithForm, userEvent } from '../../../test'; +import { render, renderWithForm, userEvent } from '../../../test'; import { Field, Checkbox } from '../../../index'; jest.mock('../../../_internal/hooks/use-warn'); @@ -20,17 +20,24 @@ describe('', () => { it('should work with new
', async () => { const { formInstance, getAllByRole } = renderWithForm( - + One Two , + { + formProps: { + defaultValues: { + test: ['one'], + }, + }, + }, ); const checkbox = getAllByRole('checkbox'); expect(checkbox[0]).toBeChecked(); expect(checkbox[1]).not.toBeChecked(); - await act(async () => await userEvent.click(checkbox[1])); + await userEvent.click(checkbox[1]); expect(checkbox[0]).toBeChecked(); expect(checkbox[1]).toBeChecked(); @@ -40,17 +47,24 @@ describe('', () => { it('should interop with ', async () => { const { getAllByRole, formInstance } = renderWithForm( - + Buy milk Buy coffee Buy bread , + { + formProps: { + defaultValues: { + test: ['two'], + }, + }, + }, ); const checkbox = getAllByRole('checkbox'); - await act(async () => await userEvent.click(checkbox[0])); + await userEvent.click(checkbox[0]); expect(checkbox[0]).toBeChecked(); expect(checkbox[1]).toBeChecked(); diff --git a/src/components/fields/Checkbox/checkbox.test.tsx b/src/components/fields/Checkbox/checkbox.test.tsx index 98b53bdf1..ad8d4d149 100644 --- a/src/components/fields/Checkbox/checkbox.test.tsx +++ b/src/components/fields/Checkbox/checkbox.test.tsx @@ -1,6 +1,6 @@ import userEvent from '@testing-library/user-event'; -import { act, render, renderWithForm } from '../../../test'; +import { render, renderWithForm } from '../../../test'; import { Field } from '../../form'; import { Checkbox } from './Checkbox'; @@ -12,7 +12,7 @@ describe('', () => { const { getByRole } = render(Test); const checkboxElement = getByRole('checkbox'); - await act(async () => await userEvent.click(checkboxElement)); + await userEvent.click(checkboxElement); expect(checkboxElement).toBeChecked(); }); @@ -24,7 +24,7 @@ describe('', () => { const checkboxElement = getByRole('checkbox'); - await act(async () => await userEvent.click(checkboxElement)); + await userEvent.click(checkboxElement); expect(checkboxElement).toBeChecked(); expect(formInstance.getFieldValue('test')).toBe(true); @@ -39,7 +39,7 @@ describe('', () => { const checkboxElement = getByRole('checkbox'); - await act(async () => await userEvent.click(checkboxElement)); + await userEvent.click(checkboxElement); expect(checkboxElement).toBeChecked(); expect(formInstance.getFieldValue('test')).toBe(true); diff --git a/src/components/fields/ComboBox/ComboBox.stories.tsx b/src/components/fields/ComboBox/ComboBox.stories.tsx index faa2069e5..3c7f350c7 100644 --- a/src/components/fields/ComboBox/ComboBox.stories.tsx +++ b/src/components/fields/ComboBox/ComboBox.stories.tsx @@ -4,6 +4,7 @@ import { userEvent, within } from '@storybook/test'; import { SELECTED_KEY_ARG } from '../../../stories/FormFieldArgs'; import { baseProps } from '../../../stories/lists/baseProps'; +import { Form, useForm } from '../../form/index'; import { ComboBox, CubeComboBoxProps } from './ComboBox'; @@ -32,6 +33,26 @@ const Template: StoryFn> = ( ); +const FormTemplate: StoryFn> = ( + args: CubeComboBoxProps, +) => { + const [form] = useForm(); + + return ( + + + Red + Orange + Yellow + Green + Blue + Purple + Violet + + + ); +}; + export const Default = Template.bind({}); Default.args = {}; @@ -101,3 +122,5 @@ With1LongOptionFiltered.play = async ({ canvasElement }) => { await userEvent.type(combobox, 'Red'); }; + +export const WithinForm = FormTemplate.bind({}); diff --git a/src/components/fields/ComboBox/ComboBox.tsx b/src/components/fields/ComboBox/ComboBox.tsx index 7f7821ab5..f5408e6a0 100644 --- a/src/components/fields/ComboBox/ComboBox.tsx +++ b/src/components/fields/ComboBox/ComboBox.tsx @@ -5,6 +5,7 @@ import { ReactElement, RefObject, useMemo, + useState, } from 'react'; import { useButton, @@ -133,12 +134,19 @@ export const ComboBox = forwardRef(function ComboBox( props: CubeComboBoxProps, ref: ForwardedRef, ) { + const [rerender, setRerender] = useState({}); + props = useProviderProps(props); props = useFormProps(props); props = useFieldProps(props, { valuePropsMapper: ({ value, onChange }) => ({ inputValue: value != null ? value : '', - onInputChange: (val) => onChange(val, !props.allowsCustomValue), + onInputChange: (val) => { + onChange(val, !props.allowsCustomValue); + if (rerender) { + setRerender({}); + } + }, onSelectionChange: onChange, }), }); diff --git a/src/components/fields/RadioGroup/Radio.tsx b/src/components/fields/RadioGroup/Radio.tsx index dc18c3750..9661ec691 100644 --- a/src/components/fields/RadioGroup/Radio.tsx +++ b/src/components/fields/RadioGroup/Radio.tsx @@ -162,6 +162,8 @@ export interface CubeRadioProps inputStyles?: Styles; /* The visual type of the radio button */ type?: 'button' | 'radio'; + value?: string; + onChange?: (value: string) => void; } function Radio(props: CubeRadioProps, ref) { diff --git a/src/components/fields/RadioGroup/radio.test.tsx b/src/components/fields/RadioGroup/radio.test.tsx index 4a1eb5a93..f0ff5ab1e 100644 --- a/src/components/fields/RadioGroup/radio.test.tsx +++ b/src/components/fields/RadioGroup/radio.test.tsx @@ -1,5 +1,4 @@ import { - act, renderWithForm, renderWithRoot, screen, @@ -19,7 +18,7 @@ describe(' and ', () => { , ); const radio = getAllByRole('radio'); - await act(async () => await userEvent.click(radio[0])); + await userEvent.click(radio[0]); expect(radio[0]).toBeChecked(); }); @@ -33,7 +32,7 @@ describe(' and ', () => { ); const radio = screen.getAllByRole('radio'); - await act(async () => await userEvent.click(radio[0])); + await userEvent.click(radio[0]); expect(radio[0]).toBeChecked(); diff --git a/src/components/fields/Select/select.test.tsx b/src/components/fields/Select/select.test.tsx index ff39f440f..b18f5f628 100644 --- a/src/components/fields/Select/select.test.tsx +++ b/src/components/fields/Select/select.test.tsx @@ -1,9 +1,4 @@ -import { - act, - renderWithForm, - renderWithRoot, - userEvent, -} from '../../../test/index'; +import { renderWithForm, renderWithRoot, userEvent } from '../../../test'; import { Field } from '../../form'; import { Select } from './Select'; @@ -21,10 +16,10 @@ describe('', () => { ); const select = getByRole('button'); - await act(async () => await userEvent.click(select)); + await userEvent.click(select); const options = getAllByRole('option'); - await act(async () => await userEvent.click(options[1])); + await userEvent.click(options[1]); expect(select).toHaveTextContent('Red'); expect(formInstance.getFieldValue('test')).toBe('2'); @@ -60,10 +55,10 @@ describe('