From 8d7cb14dede081831aff9af4e80e21318ba44505 Mon Sep 17 00:00:00 2001 From: Ivana Huckova Date: Wed, 24 Jan 2024 14:18:36 +0100 Subject: [PATCH 1/2] LabelFilters: Fix bug with running incomplete query --- .../components/LabelFilterItem.tsx | 7 ++----- .../components/LabelFilters.test.tsx | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/VisualQueryBuilder/components/LabelFilterItem.tsx b/src/VisualQueryBuilder/components/LabelFilterItem.tsx index 276feba..1608455 100644 --- a/src/VisualQueryBuilder/components/LabelFilterItem.tsx +++ b/src/VisualQueryBuilder/components/LabelFilterItem.tsx @@ -14,7 +14,7 @@ interface Props { defaultOp: string; item: Partial; items: Array>; - onChange: (value: QueryBuilderLabelFilter) => void; + onChange: (value: Partial) => void; onGetLabelNames: (forLabel: Partial) => Promise>>; onGetLabelValues: (forLabel: Partial) => Promise>>; onDelete: () => void; @@ -98,7 +98,6 @@ export function LabelFilterItem({ if (change.value) { onChange({ ...item, - value: item.value ?? '', op: item.op ?? defaultOp, label: change.value, }); @@ -116,9 +115,8 @@ export function LabelFilterItem({ if (change.value) { onChange({ ...item, - label: item.label ?? '', op: change.value, - value: isMultiSelect(change.value) ? (item.value ?? '') : getSelectOptionsFromString(item?.value)[0], + value: isMultiSelect(change.value) ? item.value : getSelectOptionsFromString(item?.value)[0], }); } }} @@ -159,7 +157,6 @@ export function LabelFilterItem({ ...item, value: change.value, op: item.op ?? defaultOp, - label: item.label ?? '', }); } else { // otherwise, we're dealing with a multi-value select which is array of options diff --git a/src/VisualQueryBuilder/components/LabelFilters.test.tsx b/src/VisualQueryBuilder/components/LabelFilters.test.tsx index ded9b24..08a16a5 100644 --- a/src/VisualQueryBuilder/components/LabelFilters.test.tsx +++ b/src/VisualQueryBuilder/components/LabelFilters.test.tsx @@ -89,6 +89,23 @@ describe('LabelFilters', () => { setup({ labelsFilters: [], labelFilterRequired: true }); expect(screen.getByText(MISSING_LABEL_FILTER_ERROR_MESSAGE)).toBeInTheDocument(); }); + + it('runs onChange after all selects are changed', async () => { + const { onChange } = setup({ labelsFilters: [{ label: 'foo', op: '=', value: 'bar' }] }); + await userEvent.click(getAddButton()); + expect(screen.getAllByText('Select label')).toHaveLength(1); + expect(screen.getAllByText('Select value')).toHaveLength(1); + const { name, value, op } = getLabelSelects(1); + await selectOptionInTest(name, 'baz'); + expect(onChange).not.toBeCalled(); + await selectOptionInTest(op, '!='); + expect(onChange).not.toBeCalled(); + await selectOptionInTest(value, 'qux'); + expect(onChange).toBeCalledWith([ + { label: "foo", op: "=", value: "bar" }, + { label: "baz", op: "!=", value: "qux" } + ]); + }); }); function setup(propOverrides?: Partial>) { @@ -122,6 +139,7 @@ function getLabelSelects(index = 0) { const selects = getAllByRole(labels.parentElement!.parentElement!.parentElement!, 'combobox'); return { name: selects[3 * index], + op: selects[3 * index + 1], value: selects[3 * index + 2], }; } From db4932e041fb4b270ce8d18aad930c741bc3c91e Mon Sep 17 00:00:00 2001 From: Ivana Huckova Date: Wed, 24 Jan 2024 15:10:38 +0100 Subject: [PATCH 2/2] Update to not add label as empty string --- src/VisualQueryBuilder/components/LabelFilterItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VisualQueryBuilder/components/LabelFilterItem.tsx b/src/VisualQueryBuilder/components/LabelFilterItem.tsx index 1608455..6cc2054 100644 --- a/src/VisualQueryBuilder/components/LabelFilterItem.tsx +++ b/src/VisualQueryBuilder/components/LabelFilterItem.tsx @@ -170,7 +170,7 @@ export function LabelFilterItem({ }) .filter((val: string | undefined) => val !== undefined) .join(multiValueSeparator); - onChange({ ...item, label: item.label ?? '', value: changes, op: item.op ?? defaultOp }); + onChange({ ...item, value: changes, op: item.op ?? defaultOp }); } }} invalid={isConflicting || invalidValue}