From c666a5ea7237287e6fae8df525de8e66da992831 Mon Sep 17 00:00:00 2001 From: Abdelsalem Date: Tue, 10 Feb 2026 13:20:17 +0100 Subject: [PATCH 1/3] reset pagination on global filter changes Signed-off-by: Abdelsalem --- .../global-filter/global-filter-provider.tsx | 8 +++-- .../global-filter/global-filter-selector.tsx | 5 ++- .../use-computation-global-filters.ts | 3 +- .../results/pccmin/pcc-min-result-tab.tsx | 12 ++++++- .../security-analysis-result-tab.tsx | 7 ++++ .../sensitivity-analysis-result-tab.tsx | 25 ++++++++++++-- .../shortcircuit-analysis-result-tab.tsx | 34 ++++++++++++++++--- 7 files changed, 81 insertions(+), 13 deletions(-) diff --git a/src/components/results/common/global-filter/global-filter-provider.tsx b/src/components/results/common/global-filter/global-filter-provider.tsx index 365529ec48..bd2a70b47e 100644 --- a/src/components/results/common/global-filter/global-filter-provider.tsx +++ b/src/components/results/common/global-filter/global-filter-provider.tsx @@ -29,12 +29,14 @@ export default function GlobalFilterProvider({ filterCategories, genericFiltersStrictMode = false, equipmentTypes = undefined, + afterChange, }: PropsWithChildren & { - onChange: (globalFilters: GlobalFilter[]) => void; + onChange: (globalFilters: GlobalFilter[], afterChange?: () => void) => void; filterCategories: string[]; preloadedGlobalFilters?: GlobalFilter[]; genericFiltersStrictMode: boolean; equipmentTypes: string[] | undefined; + afterChange?: () => void; }) { const dispatch = useDispatch(); const { snackError } = useSnackMessage(); @@ -110,10 +112,10 @@ export default function GlobalFilterProvider({ checkSelectedFiltersPromise(selectedFilters).then((validSelectedGlobalFilters) => { setSelectedGlobalFilters(validSelectedGlobalFilters); // propagate only valid selected filters - handleChange(validSelectedGlobalFilters); + handleChange(validSelectedGlobalFilters, afterChange); }); }, - [checkSelectedFiltersPromise, setSelectedGlobalFilters, handleChange] + [checkSelectedFiltersPromise, setSelectedGlobalFilters, handleChange, afterChange] ); const value = useMemo( diff --git a/src/components/results/common/global-filter/global-filter-selector.tsx b/src/components/results/common/global-filter/global-filter-selector.tsx index d396bd816c..3ac307c6d8 100644 --- a/src/components/results/common/global-filter/global-filter-selector.tsx +++ b/src/components/results/common/global-filter/global-filter-selector.tsx @@ -12,10 +12,11 @@ import { useMemo } from 'react'; import { FilterType } from '../utils'; export type GlobalFilterSelectorProps = GlobalFilterAutocompleteProps & { - onChange: (globalFilters: GlobalFilter[]) => void; + onChange: (globalFilters: GlobalFilter[], afterChange?: () => void) => void; preloadedGlobalFilters?: GlobalFilter[]; genericFiltersStrictMode: boolean; disableGenericFilters?: boolean; + afterChange?: () => void; }; export default function GlobalFilterSelector({ onChange, @@ -25,6 +26,7 @@ export default function GlobalFilterSelector({ //If this parameter is enabled, only generic filters of the same type as those provided in filterableEquipmentTypes will be available genericFiltersStrictMode = false, disableGenericFilters = false, + afterChange, }: Readonly) { // Global filter autocomplete displayed categories are dynamically provided from the on hand filters, GENERIC_FILTER gets manually added const filterCategories = useMemo(() => { @@ -41,6 +43,7 @@ export default function GlobalFilterSelector({ return ( { + (rawGlobalFilters: GlobalFilter[], afterChange?: () => void) => { dispatch(updateGlobalFiltersAction(filterType, rawGlobalFilters)); studyUuid && updateComputationResultFilters(studyUuid, filterType, rawGlobalFilters).then(); + afterChange?.(); }, [dispatch, filterType, studyUuid] ); diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index f3c4ecb684..778e4e0e53 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -22,7 +22,9 @@ import { useGlobalFilterOptions } from '../common/global-filter/use-global-filte import { PccMinResultTabProps } from './pcc-min-result.type'; import { PccMinResult } from './pcc-min-result'; import { useComputationGlobalFilters } from '../common/global-filter/use-computation-global-filters'; -import { FilterType as AgGridFilterType } from '../../../types/custom-aggrid-types'; +import { FilterType as AgGridFilterType, PaginationType } from '../../../types/custom-aggrid-types'; +import { usePaginationSelector } from '../../../hooks/use-pagination-selector'; +import { PCCMIN_RESULT } from '../../../utils/store-sort-filter-fields'; export const PccMinResultTab: FunctionComponent = ({ studyUuid, @@ -39,6 +41,13 @@ export const PccMinResultTab: FunctionComponent = ({ const { globalFiltersFromState, updateGlobalFilters } = useComputationGlobalFilters(AgGridFilterType.PccMin); const { countriesFilter, voltageLevelsFilter, propertiesFilter } = useGlobalFilterOptions(); + const { pagination, dispatchPagination } = usePaginationSelector(PaginationType.PccMin, PCCMIN_RESULT); + const { rowsPerPage } = pagination; + + const resetPagination = useCallback(() => { + dispatchPagination({ page: 0, rowsPerPage }); + }, [dispatchPagination, rowsPerPage]); + const handleSubTabChange = useCallback((event: SyntheticEvent, newIndex: number) => { setResultOrLogIndex(newIndex); }, []); @@ -68,6 +77,7 @@ export const PccMinResultTab: FunctionComponent = ({ { + if (tabIndex === NMK_RESULTS_TAB_INDEX) { + dispatchPagination({ page: 0, rowsPerPage }); + } + }, [dispatchPagination, tabIndex, rowsPerPage]); + const queryParams: SecurityAnalysisQueryParams = useMemo(() => { const params: SecurityAnalysisQueryParams = { resultType, @@ -302,6 +308,7 @@ export const SecurityAnalysisResultTab: FunctionComponent { + dispatchPagination({ page: 0, rowsPerPage }); + }, [dispatchPagination, rowsPerPage]); + const openLoader = useOpenLoaderShortWait({ isLoading: sensitivityAnalysisStatus === RunningStatus.RUNNING, delay: RESULTS_LOADING_DELAY, @@ -97,6 +115,7 @@ function SensitivityAnalysisResultTab({ { + if (tabIndex !== ShortCircuitAnalysisResultTabs.ALL_BUSES) { + return; + } + if (resultOrLogIndex !== RESULTS_TAB_INDEX) { + return; + } + if (page === 0) { + return; + } + dispatchPagination({ page: 0, rowsPerPage }); + }, [tabIndex, resultOrLogIndex, page, dispatchPagination, rowsPerPage]); + const AllBusesShortCircuitStatus = useSelector( (state: AppState) => state.computingStatus[ComputingType.SHORT_CIRCUIT] ); @@ -87,9 +115,6 @@ export const ShortCircuitAnalysisResultTab: FunctionComponent Date: Wed, 11 Feb 2026 12:00:53 +0100 Subject: [PATCH 2/3] review fixes Signed-off-by: Abdelsalem --- .../common/global-filter/global-filter-provider.tsx | 9 +++++---- .../common/global-filter/global-filter-selector.tsx | 8 ++++---- .../global-filter/use-computation-global-filters.ts | 3 +-- src/components/results/pccmin/pcc-min-result-tab.tsx | 2 +- .../securityanalysis/security-analysis-result-tab.tsx | 2 +- .../sensitivity-analysis-result-tab.tsx | 2 +- .../shortcircuit/shortcircuit-analysis-result-tab.tsx | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/components/results/common/global-filter/global-filter-provider.tsx b/src/components/results/common/global-filter/global-filter-provider.tsx index bd2a70b47e..09423c5798 100644 --- a/src/components/results/common/global-filter/global-filter-provider.tsx +++ b/src/components/results/common/global-filter/global-filter-provider.tsx @@ -29,14 +29,14 @@ export default function GlobalFilterProvider({ filterCategories, genericFiltersStrictMode = false, equipmentTypes = undefined, - afterChange, + onAfterChange, }: PropsWithChildren & { onChange: (globalFilters: GlobalFilter[], afterChange?: () => void) => void; filterCategories: string[]; preloadedGlobalFilters?: GlobalFilter[]; genericFiltersStrictMode: boolean; equipmentTypes: string[] | undefined; - afterChange?: () => void; + onAfterChange?: () => void; }) { const dispatch = useDispatch(); const { snackError } = useSnackMessage(); @@ -112,10 +112,11 @@ export default function GlobalFilterProvider({ checkSelectedFiltersPromise(selectedFilters).then((validSelectedGlobalFilters) => { setSelectedGlobalFilters(validSelectedGlobalFilters); // propagate only valid selected filters - handleChange(validSelectedGlobalFilters, afterChange); + handleChange(validSelectedGlobalFilters); + onAfterChange?.(); }); }, - [checkSelectedFiltersPromise, setSelectedGlobalFilters, handleChange, afterChange] + [checkSelectedFiltersPromise, setSelectedGlobalFilters, handleChange, onAfterChange] ); const value = useMemo( diff --git a/src/components/results/common/global-filter/global-filter-selector.tsx b/src/components/results/common/global-filter/global-filter-selector.tsx index 3ac307c6d8..b161e61729 100644 --- a/src/components/results/common/global-filter/global-filter-selector.tsx +++ b/src/components/results/common/global-filter/global-filter-selector.tsx @@ -12,11 +12,11 @@ import { useMemo } from 'react'; import { FilterType } from '../utils'; export type GlobalFilterSelectorProps = GlobalFilterAutocompleteProps & { - onChange: (globalFilters: GlobalFilter[], afterChange?: () => void) => void; + onChange: (globalFilters: GlobalFilter[]) => void; preloadedGlobalFilters?: GlobalFilter[]; genericFiltersStrictMode: boolean; disableGenericFilters?: boolean; - afterChange?: () => void; + onAfterChange?: () => void; }; export default function GlobalFilterSelector({ onChange, @@ -26,7 +26,7 @@ export default function GlobalFilterSelector({ //If this parameter is enabled, only generic filters of the same type as those provided in filterableEquipmentTypes will be available genericFiltersStrictMode = false, disableGenericFilters = false, - afterChange, + onAfterChange, }: Readonly) { // Global filter autocomplete displayed categories are dynamically provided from the on hand filters, GENERIC_FILTER gets manually added const filterCategories = useMemo(() => { @@ -43,7 +43,7 @@ export default function GlobalFilterSelector({ return ( void) => { + (rawGlobalFilters: GlobalFilter[]) => { dispatch(updateGlobalFiltersAction(filterType, rawGlobalFilters)); studyUuid && updateComputationResultFilters(studyUuid, filterType, rawGlobalFilters).then(); - afterChange?.(); }, [dispatch, filterType, studyUuid] ); diff --git a/src/components/results/pccmin/pcc-min-result-tab.tsx b/src/components/results/pccmin/pcc-min-result-tab.tsx index 778e4e0e53..808d12fc18 100644 --- a/src/components/results/pccmin/pcc-min-result-tab.tsx +++ b/src/components/results/pccmin/pcc-min-result-tab.tsx @@ -77,7 +77,7 @@ export const PccMinResultTab: FunctionComponent = ({ Date: Wed, 11 Feb 2026 13:03:04 +0100 Subject: [PATCH 3/3] cleaning Signed-off-by: Abdelsalem --- .../results/common/global-filter/global-filter-provider.tsx | 2 +- .../sensitivity-analysis/sensitivity-analysis-result-tab.tsx | 2 +- .../sensitivity-analysis-result-utils.ts | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/results/common/global-filter/global-filter-provider.tsx b/src/components/results/common/global-filter/global-filter-provider.tsx index 09423c5798..2fb6274782 100644 --- a/src/components/results/common/global-filter/global-filter-provider.tsx +++ b/src/components/results/common/global-filter/global-filter-provider.tsx @@ -31,7 +31,7 @@ export default function GlobalFilterProvider({ equipmentTypes = undefined, onAfterChange, }: PropsWithChildren & { - onChange: (globalFilters: GlobalFilter[], afterChange?: () => void) => void; + onChange: (globalFilters: GlobalFilter[]) => void; filterCategories: string[]; preloadedGlobalFilters?: GlobalFilter[]; genericFiltersStrictMode: boolean; diff --git a/src/components/results/sensitivity-analysis/sensitivity-analysis-result-tab.tsx b/src/components/results/sensitivity-analysis/sensitivity-analysis-result-tab.tsx index 122f1e517f..fdc4d46a24 100644 --- a/src/components/results/sensitivity-analysis/sensitivity-analysis-result-tab.tsx +++ b/src/components/results/sensitivity-analysis/sensitivity-analysis-result-tab.tsx @@ -65,7 +65,7 @@ function SensitivityAnalysisResultTab({ const { pagination, dispatchPagination } = usePaginationSelector( PaginationType.SensitivityAnalysis, - mappingTabs(sensiKindForPagination, nOrNkIndex) as SensitivityAnalysisTab + mappingTabs(sensiKindForPagination, nOrNkIndex) ); const { rowsPerPage } = pagination; diff --git a/src/components/results/sensitivity-analysis/sensitivity-analysis-result-utils.ts b/src/components/results/sensitivity-analysis/sensitivity-analysis-result-utils.ts index 4c8e157d7d..e68ce12c2b 100644 --- a/src/components/results/sensitivity-analysis/sensitivity-analysis-result-utils.ts +++ b/src/components/results/sensitivity-analysis/sensitivity-analysis-result-utils.ts @@ -20,6 +20,7 @@ import { SENSITIVITY_IN_DELTA_A, SENSITIVITY_IN_DELTA_MW, } from './sensitivity-analysis-result.type'; +import { SensitivityAnalysisTab } from '../../../types/custom-aggrid-types'; export const SensitivityResultTabs = [ { id: 'N', label: 'N' }, @@ -63,7 +64,7 @@ export const DATA_KEY_TO_SORT_KEY = { functionReferenceAfter: 'POST_REFERENCE', valueAfter: 'POST_SENSITIVITY', }; -export const mappingTabs = (sensiResultKind: SensiKind, nOrNkIndex: number) => { +export const mappingTabs = (sensiResultKind: SensiKind, nOrNkIndex: number) : SensitivityAnalysisTab => { switch (sensiResultKind) { case SENSITIVITY_IN_DELTA_MW: return nOrNkIndex === 0 ? SENSITIVITY_IN_DELTA_MW_N : SENSITIVITY_IN_DELTA_MW_N_K; @@ -71,8 +72,6 @@ export const mappingTabs = (sensiResultKind: SensiKind, nOrNkIndex: number) => { return nOrNkIndex === 0 ? SENSITIVITY_IN_DELTA_A_N : SENSITIVITY_IN_DELTA_A_N_K; case SENSITIVITY_AT_NODE: return nOrNkIndex === 0 ? SENSITIVITY_AT_NODE_N : SENSITIVITY_AT_NODE_N_K; - default: - return ''; } };