mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2026-08-17 16:34:44 -05:00
fix: Schema Diff filter chip toggle broadcasting stale empty selection (#10172)
selectFilterOption() computed newOptions inside the functional
setSelectedFilters(prev => {...}) updater, then used that same
variable to dispatch TRIGGER_CHANGE_FILTER synchronously. Since the
updater runs lazily on next render, every chip toggle broadcast an
empty filter, so the tree always showed "No difference found" until
a full re-Compare.
Compute the new selection synchronously from current state and use
it for both the state update and the dispatched event.
Fixes #10102
This commit is contained in:
@@ -112,21 +112,22 @@ export function SchemaDiffButtonComponent({ sourceData, targetData, selectedRowI
|
||||
}, [filters]);
|
||||
|
||||
const selectFilterOption = (option) => {
|
||||
let newOptions = [];
|
||||
setSelectedFilters((prev) => {
|
||||
let newSelectdOptions = [...prev];
|
||||
let removeIndex = newSelectdOptions.indexOf(option);
|
||||
if (prev.includes(option)) {
|
||||
newSelectdOptions.splice(removeIndex, 1);
|
||||
} else {
|
||||
newSelectdOptions.push(option);
|
||||
}
|
||||
newOptions = [...newSelectdOptions];
|
||||
return newSelectdOptions;
|
||||
});
|
||||
// Derive the new selection synchronously from the current state.
|
||||
// The new array must be computed here (not inside a setState updater)
|
||||
// because React invokes functional updaters lazily during render, so a
|
||||
// value assigned inside the updater is not yet available when the event
|
||||
// below fires. Reading it there previously broadcast an empty filter
|
||||
// list, which blanked the results tree on every chip toggle. #10102
|
||||
let newSelectedOptions = [...selectedFilters];
|
||||
let removeIndex = newSelectedOptions.indexOf(option);
|
||||
if (removeIndex !== -1) {
|
||||
newSelectedOptions.splice(removeIndex, 1);
|
||||
} else {
|
||||
newSelectedOptions.push(option);
|
||||
}
|
||||
|
||||
let filterParam = newOptions;
|
||||
eventBus.fireEvent(SCHEMA_DIFF_EVENT.TRIGGER_CHANGE_FILTER, { filterParams: filterParam });
|
||||
setSelectedFilters(newSelectedOptions);
|
||||
eventBus.fireEvent(SCHEMA_DIFF_EVENT.TRIGGER_CHANGE_FILTER, { filterParams: newSelectedOptions });
|
||||
};
|
||||
|
||||
const selectCompareOption = (option) => {
|
||||
|
||||
Reference in New Issue
Block a user