Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
3c2395d
chore(debug): debug data flow
Apr 7, 2023
5f867a2
refactor(datagrid-number-filter): extract filter state
Apr 7, 2023
5f817cc
refactor(datagrid-number-filter): add change effects
Apr 7, 2023
70eeecd
refactor(datagrid-number-filter): set focus on filter type change
Apr 7, 2023
d7d9b16
feat(datagrid-number-filter-web): add initial value setup
Apr 7, 2023
1c7ef69
fix: prevent unwanted props
Apr 7, 2023
feab6e0
refactor: use type alias
Apr 7, 2023
c62c676
refactor: pass delay from widget settings
Apr 7, 2023
92287f3
fix(debug): print all changed props
Apr 7, 2023
03f6c59
refactor: remove debugger code
Apr 7, 2023
645dcd8
refactor(datagrid-number-filter-web): dispatch change on every change
Apr 7, 2023
8a66171
test(datagrid-number-filter-web): fix tests to reflect new behavior
Apr 13, 2023
c16854a
refactor(datagrid-number-filter-web): rename prop
Apr 13, 2023
351a657
fix(datagrid-text-filter-web): stop syncing value and defaultValue
Apr 13, 2023
c509b03
fix(datagrid-dropdown-filter-web): stop syncing value and defaultValue
Apr 18, 2023
0916fcb
test(datagrid-dropdown-filter-web): update tests
Apr 18, 2023
aadf541
fix(datagrid-date-filter-web): stop syncing value and defaultValue
Apr 18, 2023
75400a3
fix: rename props
Apr 18, 2023
af27675
test(datagrid-text-filter-web): update unit tests
Apr 18, 2023
eaaccea
chore(data-widgets): bump version and update changelog
Apr 18, 2023
d9b8c52
chore(data-widgets): prepare 2.7.1 release
May 1, 2023
32dd867
style(data-widgets): align status check
May 1, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/modules/data-widgets/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "data-widgets",
"moduleName": "Data Widgets",
"version": "2.7.0",
"version": "2.7.1",
"license": "Apache-2.0",
"copyright": "© Mendix Technology BV 2023. All rights reserved.",
"private": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

## [Unreleased]

### Fixed

- We fixed an issue with widget rendering and performance.

### Breaking changes

- We introduce a breaking change that affects how widget is reacting on default value changes. Starting with this version, widget use the default value attribute only as an initial value, and any further changes to the default value attribute will be ignored.

## [2.4.2] - 2022-09-29

### Fixed
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "datagrid-date-filter-web",
"widgetName": "DatagridDateFilter",
"version": "2.4.2",
"version": "2.5.0",
"description": "",
"copyright": "© Mendix Technology BV 2023. All rights reserved.",
"private": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ export default function DatagridDateFilter(props: DatagridDateFilterContainerPro
return <Alert bootstrapStyle="danger">{errorMessage}</Alert>;
}

if (isLoadingDefaultValues(props)) {
return null;
}

return (
<FilterComponent
adjustable={props.adjustable}
Expand Down Expand Up @@ -245,3 +249,8 @@ function getFilterCondition(
return lessThanOrEqual(filterAttribute, literal(new Date(addDays(dateValue, 1).getTime() - 1)));
}
}

function isLoadingDefaultValues(props: DatagridDateFilterContainerProps): boolean {
const statusList = [props.defaultValue?.status, props.defaultStartDate?.status, props.defaultEndDate?.status];
return statusList.some(status => status === "loading");
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,22 +33,6 @@ export function FilterComponent(props: FilterComponentProps): ReactElement {
const [rangeValues, setRangeValues] = useState<RangeDateValue>([props.defaultStartDate, props.defaultEndDate]);
const pickerRef = useRef<DatePickerComponent | null>(null);

useEffect(() => {
setValue(prev => {
if (prev?.toISOString() === props.defaultValue?.toISOString()) {
return prev;
}

return props.defaultValue;
});
}, [props.defaultValue]);

useEffect(() => {
if (props.defaultStartDate || props.defaultEndDate) {
setRangeValues([props.defaultStartDate, props.defaultEndDate]);
}
}, [props.defaultStartDate, props.defaultEndDate]);

useEffect(() => {
props.updateFilters?.(value, rangeValues, type);
}, [value, rangeValues, type]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,17 +102,17 @@ describe("Date Filter", () => {
expect(screen.getByRole("textbox")).toHaveValue("01/01/2000");
});

it("sync value when defaultValue changes from undefined to date", async () => {
it("don't sync value when defaultValue changes from undefined to date", async () => {
// 946684800000 = 01.01.2000
const date = new Date(946684800000);
const { rerender } = render(<DatagridDateFilter {...commonProps} defaultValue={undefined} />);
expect(screen.getByRole("textbox")).toHaveValue("");

rerender(<DatagridDateFilter {...commonProps} defaultValue={dynamicValue<Date>(date)} />);
expect(screen.getByRole("textbox")).toHaveValue("01/01/2000");
expect(screen.getByRole("textbox")).toHaveValue("");
});

it("sync value when defaultValue changes from date to undefined", async () => {
it("don't sync value when defaultValue changes from date to undefined", async () => {
// 946684800000 = 01.01.2000
const date = new Date(946684800000);
const { rerender } = render(
Expand All @@ -121,7 +121,7 @@ describe("Date Filter", () => {
expect(screen.getByRole("textbox")).toHaveValue("01/01/2000");

rerender(<DatagridDateFilter {...commonProps} defaultValue={undefined} />);
expect(screen.getByRole("textbox")).toHaveValue("");
expect(screen.getByRole("textbox")).toHaveValue("01/01/2000");
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ describe("Filter component", () => {
});

describe("with defaultValue", () => {
it("call updateFilters when defaultValue get new value", () => {
it("don't call updateFilters when defaultValue get new value", () => {
const date = new Date(946684800000);
const updateFilters = jest.fn();
const { rerender } = render_fromTestingLibrary(
Expand All @@ -49,7 +49,7 @@ describe("Filter component", () => {

// First time updateFilters is called on initial mount
expect(updateFilters).toBeCalledTimes(1);
expect(updateFilters.mock.calls[0][0]).toBe(date);
expect(updateFilters).toHaveBeenLastCalledWith(date, [undefined, undefined], "equal");

const nextValue = new Date(999999900000);

Expand All @@ -62,8 +62,8 @@ describe("Filter component", () => {
/>
);

expect(updateFilters).toBeCalledTimes(2);
expect(updateFilters.mock.calls[1][0]).toBe(nextValue);
expect(updateFilters).toBeCalledTimes(1);
expect(updateFilters).toHaveBeenLastCalledWith(date, [undefined, undefined], "equal");
});

it("don't call updateFilters when defaultValue get same value", () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="http://www.mendix.com/package/1.0/">
<clientModule name="DatagridDateFilter" version="2.4.2" xmlns="http://www.mendix.com/clientModule/1.0/">
<clientModule name="DatagridDateFilter" version="2.5.0" xmlns="http://www.mendix.com/clientModule/1.0/">
<widgetFiles>
<widgetFile path="DatagridDateFilter.xml" />
</widgetFiles>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

## [Unreleased]

### Fixed

- We fixed an issue with widget rendering and performance.

### Breaking changes

- We introduce a breaking change that affects how widget is reacting on default value changes. Starting with this version, widget use the default value attribute only as an initial value, and any further changes to the default value attribute will be ignored.

## [2.3.0] - 2023-02-17

### Changed
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "datagrid-dropdown-filter-web",
"widgetName": "DatagridDropdownFilter",
"version": "2.3.0",
"version": "2.4.0",
"description": "",
"copyright": "© Mendix Technology BV 2023. All rights reserved.",
"private": true,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useFilterContextValue } from "@mendix/pluggable-widgets-commons/components/web";
import { createElement, ReactElement } from "react";
import { createElement, Fragment, ReactElement } from "react";
import { DatagridDropdownFilterContainerProps } from "../typings/DatagridDropdownFilterProps";
import { EnumerationFilter } from "./components/EnumerationFilter";
import { ErrorBox } from "./components/ErrorBox";
Expand All @@ -13,6 +13,10 @@ export default function DatagridDropdownFilter(props: DatagridDropdownFilterCont
return <ErrorBox error={new OutOfProviderError()} />;
}

if (props.defaultValue?.status === "loading") {
return <Fragment />;
}

const Filter = context.value.associationProperties ? AssociationFilter : EnumerationFilter;

return <Filter context={context.value} widgetProps={props} />;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ export function FilterComponent(props: FilterComponentProps): ReactElement {
const [selectedFilters, setSelectedFilters] = useState<FilterOption[]>([]);
const [show, setShow] = useState(false);
const [dropdownWidth, setDropdownWidth] = useState(0);
const { current: initialFilterValue } = useRef(defaultValue);
const defaultValuesLoaded = useRef<boolean>(false);

const componentRef = useRef<HTMLDivElement>(null);
Expand Down Expand Up @@ -108,8 +109,8 @@ export function FilterComponent(props: FilterComponentProps): ReactElement {
useEffect(() => {
if (!defaultValuesLoaded.current && options.length > 0) {
if (multiSelect) {
if (defaultValue) {
const initialOptions = defaultValue
if (initialFilterValue) {
const initialOptions = initialFilterValue
.split(",")
.map(value => options.find(option => option.value === value))
.filter(Boolean) as FilterOption[];
Expand All @@ -121,7 +122,7 @@ export function FilterComponent(props: FilterComponentProps): ReactElement {
}
} else {
// We want to add empty option caption
const initialOption = options.find(option => option.value === defaultValue) ?? options[0];
const initialOption = options.find(option => option.value === initialFilterValue) ?? options[0];

setValueInput(initialOption?.caption ?? "");
setSelectedFilters(prev => {
Expand All @@ -134,7 +135,7 @@ export function FilterComponent(props: FilterComponentProps): ReactElement {
}
defaultValuesLoaded.current = true;
}
}, [defaultValue, emptyOptionCaption, multiSelect, options, setMultiSelectFilters]);
}, [initialFilterValue, emptyOptionCaption, multiSelect, options, setMultiSelectFilters]);

useEffect(() => {
const emptyOption = multiSelect
Expand All @@ -155,7 +156,7 @@ export function FilterComponent(props: FilterComponentProps): ReactElement {

// Resets the option to reload default values
defaultValuesLoaded.current = false;
}, [emptyOptionCaption, multiSelect, optionsProp, defaultValue]);
}, [emptyOptionCaption, multiSelect, optionsProp, initialFilterValue]);

// This side effect meant to sync filter value with parents
// But, because updateFilters is might be "unstable" function
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ describe("Dropdown Filter", () => {
expect(screen.getByRole("textbox")).toHaveValue("enum_value_1");
});

it("sync defaultValue with state when defaultValue changes from undefined to string", async () => {
it("don't sync defaultValue with state when defaultValue changes from undefined to string", async () => {
const { rerender } = render(
<DatagridDropdownFilter
{...commonProps}
Expand Down Expand Up @@ -145,11 +145,11 @@ describe("Dropdown Filter", () => {
);

await waitFor(() => {
expect(screen.getByRole("textbox")).toHaveValue("enum_value_1");
expect(screen.getByRole("textbox")).toHaveValue("");
});
});

it("sync defaultValue with state when defaultValue changes from string to undefined", async () => {
it("don't sync defaultValue with state when defaultValue changes from string to undefined", async () => {
mockCtx(["xyz", "abc"]);
const { rerender } = render(
<DatagridDropdownFilter
Expand Down Expand Up @@ -184,7 +184,7 @@ describe("Dropdown Filter", () => {
);

await waitFor(() => {
expect(screen.getByRole("textbox")).toHaveValue("");
expect(screen.getByRole("textbox")).toHaveValue("xyz");
});
});
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="http://www.mendix.com/package/1.0/">
<clientModule name="DatagridDropdownFilter" version="2.3.0" xmlns="http://www.mendix.com/clientModule/1.0/">
<clientModule name="DatagridDropdownFilter" version="2.4.0" xmlns="http://www.mendix.com/clientModule/1.0/">
<widgetFiles>
<widgetFile path="DatagridDropdownFilter.xml" />
</widgetFiles>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

## [Unreleased]

### Fixed

- We fixed an issue with widget rendering and performance.

### Breaking changes

- We introduce a breaking change that affects how widget is reacting on default value changes. Starting with this version, widget use the default value attribute only as an initial value, and any further changes to the default value attribute will be ignored.

## [2.3.1] - 2022-08-11

### Fixed
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "datagrid-number-filter-web",
"widgetName": "DatagridNumberFilter",
"version": "2.3.1",
"version": "2.4.0",
"description": "",
"copyright": "© Mendix Technology BV 2023. All rights reserved.",
"private": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ export function preview(props: DatagridNumberFilterPreviewProps): ReactElement {
<FilterComponent
adjustable={props.adjustable}
className={props.className}
defaultFilter={props.defaultFilter}
delay={props.delay ?? 500}
initialFilterType={props.defaultFilter}
inputChangeDelay={props.delay ?? 500}
placeholder={props.placeholder}
screenReaderButtonCaption={props.screenReaderButtonCaption}
screenReaderInputCaption={props.screenReaderInputCaption}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { createElement, ReactElement, useRef } from "react";
import { DatagridNumberFilterContainerProps, DefaultFilterEnum } from "../typings/DatagridNumberFilterProps";

import { FilterComponent } from "./components/FilterComponent";
import { Alert, FilterType, getFilterDispatcher, generateUUID } from "@mendix/pluggable-widgets-commons/components/web";
import { Big } from "big.js";
Expand Down Expand Up @@ -75,26 +74,26 @@ export default function DatagridNumberFilter(props: DatagridNumberFilterContaine
return <Alert bootstrapStyle="danger">{errorMessage}</Alert>;
}

if (props.defaultValue?.status === "loading") {
return null;
}

return (
<FilterComponent
adjustable={props.adjustable}
className={props.class}
defaultFilter={defaultFilter?.type ?? props.defaultFilter}
delay={props.delay}
initialFilterType={defaultFilter?.type ?? props.defaultFilter}
initialFilterValue={defaultFilter?.value ?? props.defaultValue?.value}
inputChangeDelay={props.delay}
id={id.current}
placeholder={props.placeholder?.value}
screenReaderButtonCaption={props.screenReaderButtonCaption?.value}
screenReaderInputCaption={props.screenReaderInputCaption?.value}
styles={props.style}
tabIndex={props.tabIndex}
updateFilters={(value: Big | undefined, type: DefaultFilterEnum): void => {
if (
(value && !props.valueAttribute?.value?.eq(value)) ||
value !== props.valueAttribute?.value
) {
props.valueAttribute?.setValue(value);
props.onChange?.execute();
}
props.valueAttribute?.setValue(value);
props.onChange?.execute();
const conditions = attributes
?.map(attribute => getFilterCondition(attribute, value, type))
.filter((filter): filter is FilterCondition => filter !== undefined);
Expand All @@ -104,7 +103,6 @@ export default function DatagridNumberFilter(props: DatagridNumberFilterContaine
filterType: FilterType.NUMBER
});
}}
value={defaultFilter?.value ?? props.defaultValue?.value}
/>
);
}}
Expand Down
Loading