diff --git a/src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-spreadsheet-equipments.ts b/src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-spreadsheet-equipments.ts index d27c986883..df79bc9622 100644 --- a/src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-spreadsheet-equipments.ts +++ b/src/components/spreadsheet-view/spreadsheet/spreadsheet-content/hooks/use-spreadsheet-equipments.ts @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { NotificationsUrlKeys, useNotificationsListener } from '@gridsuite/commons-ui'; +import { NotificationsUrlKeys, useNotificationsListener, useSnackMessage } from '@gridsuite/commons-ui'; import type { UUID } from 'crypto'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; @@ -37,6 +37,7 @@ export const useSpreadsheetEquipments = ( nodeAliases: NodeAlias[] | undefined, active: boolean = false ) => { + const { snackError } = useSnackMessage(); const dispatch = useDispatch(); const allEquipments = useSelector((state: AppState) => state.spreadsheetNetwork); const equipments = useSelector((state: AppState) => state.spreadsheetNetwork[type]); @@ -186,13 +187,29 @@ export const useSpreadsheetEquipments = ( Promise.allSettled(promises).then((results) => { const updates: UpdateEquipmentsAction['equipments'] = {}; if (results[0].status === 'rejected') { - //TODO show snackbar error? + console.error( + `(re)loading of spreadsheet data of type ${type} ${results[0].status}`, + results[0].reason + ); + snackError({ + headerId: 'spreadsheet/loading/error_fetching_type_title', + headerValues: { type }, + messageTxt: `Details: ${results[0].reason}`, + }); } else { updates[type] = results[0].value; } if (results.length > 1) { if (results[1].status === 'rejected') { - //TODO show snackbar error? + console.error( + `(re)loading of spreadsheet data of type ${type} ${results[1].status}`, + results[1].reason + ); + snackError({ + headerId: 'spreadsheet/loading/error_fetching_type_title', + headerValues: { type: SpreadsheetEquipmentType.BRANCH }, + messageTxt: `Details: ${results[1].reason}`, + }); } else { updates[SpreadsheetEquipmentType.BRANCH] = results[1].value; } @@ -238,6 +255,7 @@ export const useSpreadsheetEquipments = ( allEquipments, equipmentToUpdateId, highlightUpdatedEquipment, + snackError, ] ); diff --git a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/global-filter/spreadsheet-global-filter.tsx b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/global-filter/spreadsheet-global-filter.tsx index ab31cc4b57..a151b28350 100644 --- a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/global-filter/spreadsheet-global-filter.tsx +++ b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/global-filter/spreadsheet-global-filter.tsx @@ -14,7 +14,9 @@ import { type AppState } from '../../../../../redux/reducer'; import { setGlobalFiltersToSpreadsheetConfig } from 'services/study/study-config'; import type { GlobalFilter } from '../../../../results/common/global-filter/global-filter-types'; import { FilterType } from '../../../../results/common/utils'; -import GlobalFilterSelector from '../../../../results/common/global-filter/global-filter-selector'; +import GlobalFilterSelector, { + type GlobalFilterSelectorProps, +} from '../../../../results/common/global-filter/global-filter-selector'; import { EQUIPMENT_TYPES } from '@powsybl/network-viewer'; import { addToRecentGlobalFilters } from '../../../../../redux/actions'; import { useGlobalFilterOptions } from '../../../../results/common/global-filter/use-global-filter-options'; @@ -52,15 +54,26 @@ export default function SpreadsheetGlobalFilter({ tableDefinition }: Readonly( () => [ - ...(tableDefinition.type === SpreadsheetEquipmentType.SUBSTATION ? voltageLevelsFilter : []), + ...(tableDefinition.type === SpreadsheetEquipmentType.SUBSTATION ? [] : voltageLevelsFilter), ...countriesFilter, ...propertiesFilter, ], [countriesFilter, propertiesFilter, tableDefinition.type, voltageLevelsFilter] ); + const filterTypes = useMemo( + () => [ + ...(tableDefinition.type === SpreadsheetEquipmentType.BRANCH + ? [EQUIPMENT_TYPES.LINE, EQUIPMENT_TYPES.TWO_WINDINGS_TRANSFORMER] + : [tableDefinition.type as unknown as EQUIPMENT_TYPES]), + EQUIPMENT_TYPES.SUBSTATION, + EQUIPMENT_TYPES.VOLTAGE_LEVEL, + ], + [tableDefinition.type] + ); + useEffect(() => { if (globalFilterSpreadsheetState) { dispatch( @@ -73,11 +86,7 @@ export default function SpreadsheetGlobalFilter({ tableDefinition }: Readonly ({ equipmentID: eqId })), }; }, diff --git a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/spreadsheet-toolbar.tsx b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/spreadsheet-toolbar.tsx index 229857b01b..cd93c0d7dd 100644 --- a/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/spreadsheet-toolbar.tsx +++ b/src/components/spreadsheet-view/spreadsheet/spreadsheet-toolbar/spreadsheet-toolbar.tsx @@ -5,8 +5,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import type { RefObject } from 'react'; import { CustomColDef } from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; -import { SpreadsheetTabDefinition } from '../../types/spreadsheet.type'; +import { SpreadsheetEquipmentType, type SpreadsheetTabDefinition } from '../../types/spreadsheet.type'; import { AgGridReact } from 'ag-grid-react'; import { Grid, Theme } from '@mui/material'; import { ColumnsConfig } from './columns-config'; @@ -32,7 +33,7 @@ const styles = { }; interface SpreadsheetToolbarProps { - gridRef: React.RefObject; + gridRef: RefObject; tableDefinition: SpreadsheetTabDefinition; rowCounterInfos: UseFilteredRowCounterInfoReturn; columns: CustomColDef[]; @@ -51,7 +52,9 @@ export const SpreadsheetToolbar = ({ return ( - + {tableDefinition.type !== SpreadsheetEquipmentType.BRANCH && ( + + )} diff --git a/src/components/spreadsheet-view/spreadsheet/spreadsheet.tsx b/src/components/spreadsheet-view/spreadsheet/spreadsheet.tsx index a0cdf95806..f1dc34b42b 100644 --- a/src/components/spreadsheet-view/spreadsheet/spreadsheet.tsx +++ b/src/components/spreadsheet-view/spreadsheet/spreadsheet.tsx @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import React, { useMemo, useRef } from 'react'; +import { memo, useMemo, useRef } from 'react'; import { CustomColDef } from 'components/custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type'; import { rowIndexColumnDefinition } from '../columns/common-column-definitions'; import { SpreadsheetTabDefinition } from '../types/spreadsheet.type'; @@ -29,7 +29,7 @@ interface SpreadsheetProps { active: boolean; } -export const Spreadsheet = React.memo( +export const Spreadsheet = memo( ({ currentNode, tableDefinition, diff --git a/src/translations/spreadsheet-en.ts b/src/translations/spreadsheet-en.ts index 921e85a569..5f6d900b24 100644 --- a/src/translations/spreadsheet-en.ts +++ b/src/translations/spreadsheet-en.ts @@ -118,6 +118,7 @@ const spreadsheetEn = { 'spreadsheet/rename_spreadsheet_error': 'Error while renaming spreadsheet', 'spreadsheet/rename_dialog_title': 'Rename spreadsheet', 'spreadsheet/spreadsheet_name_le_60': 'Spreadsheet name must be at most 60 characters', + 'spreadsheet/loading/error_fetching_type_title': 'Error during (re)load of spreadsheet(s) of type {type}', 'spreadsheet/global-model-edition/edit': 'Model edition', 'spreadsheet/global-model-edition/column_id': 'ID', diff --git a/src/translations/spreadsheet-fr.ts b/src/translations/spreadsheet-fr.ts index a0e87ff524..28eaf9a7a8 100644 --- a/src/translations/spreadsheet-fr.ts +++ b/src/translations/spreadsheet-fr.ts @@ -118,12 +118,13 @@ const spreadsheetFr = { 'spreadsheet/reset_filters_error': 'Erreur lors de la réinitialisation des filtres du tableur', 'spreadsheet/rename/label': 'Renommer', 'spreadsheet/delete/label': 'Supprimer', - 'spreadsheet/edit/label': 'Editer', + 'spreadsheet/edit/label': 'Éditer', 'spreadsheet/rename_spreadsheet_error': 'Erreur lors du renommage du tableur', 'spreadsheet/rename_dialog_title': 'Renommer le tableur', 'spreadsheet/spreadsheet_name_le_60': 'Le nom du tableur ne peut dépasser 60 caractères', + 'spreadsheet/loading/error_fetching_type_title': 'Erreur lors du (re)chargement du/des tableaux de type {type}', - 'spreadsheet/global-model-edition/edit': 'Editer le modèle', + 'spreadsheet/global-model-edition/edit': 'Éditer le modèle', 'spreadsheet/global-model-edition/column_id': 'ID', 'spreadsheet/global-model-edition/column_name': 'Nom', 'spreadsheet/global-model-edition/column_type': 'Type',