From 94847fa93639c9367d2643c83aa60b56cb2275fe Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Sun, 1 Jun 2025 15:36:52 +0300 Subject: [PATCH 1/3] SP-1664-Fe-Sider-bar-tree-behavior-issues-on-Analytics-page. --- ...ergy_management_data_loading_strategy.dart | 56 ++++++++++--------- .../occupancy_data_loading_strategy.dart | 12 ++-- .../space_tree/bloc/space_tree_bloc.dart | 17 ++++++ .../space_tree/bloc/space_tree_event.dart | 4 ++ 4 files changed, 57 insertions(+), 32 deletions(-) diff --git a/lib/pages/analytics/modules/analytics/strategies/energy_management_data_loading_strategy.dart b/lib/pages/analytics/modules/analytics/strategies/energy_management_data_loading_strategy.dart index e73b5179..caaf9540 100644 --- a/lib/pages/analytics/modules/analytics/strategies/energy_management_data_loading_strategy.dart +++ b/lib/pages/analytics/modules/analytics/strategies/energy_management_data_loading_strategy.dart @@ -14,24 +14,14 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg CommunityModel community, List spaces, ) { - context.read().add( - OnCommunitySelected( - community.uuid, - spaces, - ), - ); + final spaceTreeBloc = context.read(); + final isCommunitySelected = + spaceTreeBloc.state.selectedCommunities.contains(community.uuid); - final spaceTreeState = context.read().state; - if (spaceTreeState.selectedCommunities.contains(community.uuid)) { + if (isCommunitySelected) { clearData(context); return; } - - FetchEnergyManagementDataHelper.loadEnergyManagementData( - context, - communityId: community.uuid, - spaceId: spaces.isNotEmpty ? spaces.first.uuid ?? '' : '', - ); } @override @@ -40,21 +30,31 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg CommunityModel community, SpaceModel space, ) { - context.read().add( - OnSpaceSelected( - community, - space.uuid ?? '', - space.children, - ), - ); + final spaceTreeBloc = context.read(); + final isSpaceSelected = spaceTreeBloc.state.selectedSpaces.contains(space.uuid); + final hasSelectedSpaces = spaceTreeBloc.state.selectedSpaces.isNotEmpty; - final spaceTreeState = context.read().state; - if (spaceTreeState.selectedCommunities.contains(community.uuid) || - spaceTreeState.selectedSpaces.contains(space.uuid)) { - clearData(context); + if (isSpaceSelected) { + final firstSelectedSpace = spaceTreeBloc.state.selectedSpaces.first; + final isTheFirstSelectedSpace = firstSelectedSpace == space.uuid; + if (isTheFirstSelectedSpace) { + clearData(context); + } return; } + if (hasSelectedSpaces) { + clearData(context); + } + + spaceTreeBloc.add( + OnSpaceSelected( + community, + space.uuid ?? '', + space.children, + ), + ); + FetchEnergyManagementDataHelper.loadEnergyManagementData( context, communityId: community.uuid, @@ -68,12 +68,14 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg CommunityModel community, SpaceModel child, ) { - return onSpaceSelected(context, community, child); + onSpaceSelected(context, community, child); } @override void clearData(BuildContext context) { - context.read().add(const SpaceTreeClearSelectionEvent()); + context.read().add( + const AnalyticsClearAllSpaceTreeSelectionsEvent(), + ); FetchEnergyManagementDataHelper.clearAllData(context); } } diff --git a/lib/pages/analytics/modules/analytics/strategies/occupancy_data_loading_strategy.dart b/lib/pages/analytics/modules/analytics/strategies/occupancy_data_loading_strategy.dart index 5241564c..239e3cd3 100644 --- a/lib/pages/analytics/modules/analytics/strategies/occupancy_data_loading_strategy.dart +++ b/lib/pages/analytics/modules/analytics/strategies/occupancy_data_loading_strategy.dart @@ -26,10 +26,10 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy { final spaceTreeBloc = context.read(); final isSpaceSelected = spaceTreeBloc.state.selectedSpaces.contains(space.uuid); - if (isSpaceSelected) { - clearData(context); - return; - } + final hasSelectedSpaces = spaceTreeBloc.state.selectedSpaces.isNotEmpty; + if (hasSelectedSpaces) clearData(context); + + if (isSpaceSelected) return; spaceTreeBloc ..add(const SpaceTreeClearSelectionEvent()) @@ -53,7 +53,9 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy { @override void clearData(BuildContext context) { - context.read().add(const SpaceTreeClearSelectionEvent()); + context.read().add( + const AnalyticsClearAllSpaceTreeSelectionsEvent(), + ); FetchOccupancyDataHelper.clearAllData(context); } } diff --git a/lib/pages/space_tree/bloc/space_tree_bloc.dart b/lib/pages/space_tree/bloc/space_tree_bloc.dart index a3a29004..e8c2e015 100644 --- a/lib/pages/space_tree/bloc/space_tree_bloc.dart +++ b/lib/pages/space_tree/bloc/space_tree_bloc.dart @@ -24,6 +24,9 @@ class SpaceTreeBloc extends Bloc { on(_fetchPaginationSpaces); on(_onDebouncedSearch); on(_onSpaceTreeClearSelectionEvent); + on( + _onAnalyticsClearAllSpaceTreeSelectionsEvent, + ); } Timer _timer = Timer(const Duration(microseconds: 0), () {}); @@ -493,6 +496,20 @@ class SpaceTreeBloc extends Bloc { ); } + void _onAnalyticsClearAllSpaceTreeSelectionsEvent( + AnalyticsClearAllSpaceTreeSelectionsEvent event, + Emitter emit, + ) async { + emit( + state.copyWith( + selectedCommunities: [], + selectedCommunityAndSpaces: {}, + selectedSpaces: [], + soldCheck: [], + ), + ); + } + @override Future close() async { _timer.cancel(); diff --git a/lib/pages/space_tree/bloc/space_tree_event.dart b/lib/pages/space_tree/bloc/space_tree_event.dart index 9c2342fc..6e1687af 100644 --- a/lib/pages/space_tree/bloc/space_tree_event.dart +++ b/lib/pages/space_tree/bloc/space_tree_event.dart @@ -112,3 +112,7 @@ class ClearCachedData extends SpaceTreeEvent {} class SpaceTreeClearSelectionEvent extends SpaceTreeEvent { const SpaceTreeClearSelectionEvent(); } + +final class AnalyticsClearAllSpaceTreeSelectionsEvent extends SpaceTreeEvent { + const AnalyticsClearAllSpaceTreeSelectionsEvent(); +} From a56e93d0d79415843dd2fe8088c6dc873bb872d7 Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Sun, 1 Jun 2025 15:38:14 +0300 Subject: [PATCH 2/3] removed the interface method `onSelectChildSpace`, because all the clients dont use it and instead pass the `onSpaceSelected`, which isn't a good design. --- .../strategies/air_quality_data_loading_strategy.dart | 9 --------- .../strategies/analytics_data_loading_strategy.dart | 5 ----- .../energy_management_data_loading_strategy.dart | 9 --------- .../strategies/occupancy_data_loading_strategy.dart | 9 --------- .../analytics/widgets/analytics_communities_sidebar.dart | 2 +- 5 files changed, 1 insertion(+), 33 deletions(-) diff --git a/lib/pages/analytics/modules/analytics/strategies/air_quality_data_loading_strategy.dart b/lib/pages/analytics/modules/analytics/strategies/air_quality_data_loading_strategy.dart index dc3b1c5e..cd5f4e46 100644 --- a/lib/pages/analytics/modules/analytics/strategies/air_quality_data_loading_strategy.dart +++ b/lib/pages/analytics/modules/analytics/strategies/air_quality_data_loading_strategy.dart @@ -42,15 +42,6 @@ final class AirQualityDataLoadingStrategy implements AnalyticsDataLoadingStrateg ); } - @override - void onChildSpaceSelected( - BuildContext context, - CommunityModel community, - SpaceModel child, - ) { - return onSpaceSelected(context, community, child); - } - @override void clearData(BuildContext context) { context.read().add(const SpaceTreeClearSelectionEvent()); diff --git a/lib/pages/analytics/modules/analytics/strategies/analytics_data_loading_strategy.dart b/lib/pages/analytics/modules/analytics/strategies/analytics_data_loading_strategy.dart index 2c2194ba..654455b2 100644 --- a/lib/pages/analytics/modules/analytics/strategies/analytics_data_loading_strategy.dart +++ b/lib/pages/analytics/modules/analytics/strategies/analytics_data_loading_strategy.dart @@ -13,10 +13,5 @@ abstract class AnalyticsDataLoadingStrategy { CommunityModel community, SpaceModel space, ); - void onChildSpaceSelected( - BuildContext context, - CommunityModel community, - SpaceModel child, - ); void clearData(BuildContext context); } diff --git a/lib/pages/analytics/modules/analytics/strategies/energy_management_data_loading_strategy.dart b/lib/pages/analytics/modules/analytics/strategies/energy_management_data_loading_strategy.dart index caaf9540..757b2a9a 100644 --- a/lib/pages/analytics/modules/analytics/strategies/energy_management_data_loading_strategy.dart +++ b/lib/pages/analytics/modules/analytics/strategies/energy_management_data_loading_strategy.dart @@ -62,15 +62,6 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg ); } - @override - void onChildSpaceSelected( - BuildContext context, - CommunityModel community, - SpaceModel child, - ) { - onSpaceSelected(context, community, child); - } - @override void clearData(BuildContext context) { context.read().add( diff --git a/lib/pages/analytics/modules/analytics/strategies/occupancy_data_loading_strategy.dart b/lib/pages/analytics/modules/analytics/strategies/occupancy_data_loading_strategy.dart index 239e3cd3..9bffe3b4 100644 --- a/lib/pages/analytics/modules/analytics/strategies/occupancy_data_loading_strategy.dart +++ b/lib/pages/analytics/modules/analytics/strategies/occupancy_data_loading_strategy.dart @@ -42,15 +42,6 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy { ); } - @override - void onChildSpaceSelected( - BuildContext context, - CommunityModel community, - SpaceModel child, - ) { - return onSpaceSelected(context, community, child); - } - @override void clearData(BuildContext context) { context.read().add( diff --git a/lib/pages/analytics/modules/analytics/widgets/analytics_communities_sidebar.dart b/lib/pages/analytics/modules/analytics/widgets/analytics_communities_sidebar.dart index b63c6411..ab07737a 100644 --- a/lib/pages/analytics/modules/analytics/widgets/analytics_communities_sidebar.dart +++ b/lib/pages/analytics/modules/analytics/widgets/analytics_communities_sidebar.dart @@ -21,7 +21,7 @@ class AnalyticsCommunitiesSidebar extends StatelessWidget { strategy.onSpaceSelected(context, community, space); }, onSelectChildSpace: (community, child) { - strategy.onChildSpaceSelected(context, community, child); + strategy.onSpaceSelected(context, community, child); }, ), ); From 393a5361f08d125222553e8125425221ccc8338b Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Sun, 1 Jun 2025 15:40:12 +0300 Subject: [PATCH 3/3] Apply correct business logic in `AirQualityDataLoadingStrategy`. --- .../air_quality_data_loading_strategy.dart | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/pages/analytics/modules/analytics/strategies/air_quality_data_loading_strategy.dart b/lib/pages/analytics/modules/analytics/strategies/air_quality_data_loading_strategy.dart index cd5f4e46..a8993cc3 100644 --- a/lib/pages/analytics/modules/analytics/strategies/air_quality_data_loading_strategy.dart +++ b/lib/pages/analytics/modules/analytics/strategies/air_quality_data_loading_strategy.dart @@ -26,10 +26,10 @@ final class AirQualityDataLoadingStrategy implements AnalyticsDataLoadingStrateg final spaceTreeBloc = context.read(); final isSpaceSelected = spaceTreeBloc.state.selectedSpaces.contains(space.uuid); - if (isSpaceSelected) { - clearData(context); - return; - } + final hasSelectedSpaces = spaceTreeBloc.state.selectedSpaces.isNotEmpty; + if (hasSelectedSpaces) clearData(context); + + if (isSpaceSelected) return; spaceTreeBloc ..add(const SpaceTreeClearSelectionEvent()) @@ -44,7 +44,9 @@ final class AirQualityDataLoadingStrategy implements AnalyticsDataLoadingStrateg @override void clearData(BuildContext context) { - context.read().add(const SpaceTreeClearSelectionEvent()); + context.read().add( + const AnalyticsClearAllSpaceTreeSelectionsEvent(), + ); FetchAirQualityDataHelper.clearAllData(context); } }