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 60ffb68f..2d12ed28 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 @@ -20,7 +20,11 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg spaces, ), ); - FetchEnergyManagementDataHelper.loadEnergyManagementData(context); + FetchEnergyManagementDataHelper.loadEnergyManagementData( + context, + communityId: community.uuid, + spaceId: spaces.isNotEmpty ? spaces.first.uuid ?? '' : '', + ); } @override @@ -36,7 +40,12 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg space.children, ), ); - FetchEnergyManagementDataHelper.loadEnergyManagementData(context); + + FetchEnergyManagementDataHelper.loadEnergyManagementData( + context, + communityId: community.uuid, + spaceId: space.uuid ?? '', + ); } @override @@ -45,14 +54,7 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg CommunityModel community, SpaceModel child, ) { - context.read().add( - OnSpaceSelected( - community, - child.uuid ?? '', - child.children, - ), - ); - FetchEnergyManagementDataHelper.loadEnergyManagementData(context); + // Do nothing } @override 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 bd7e7b13..588a125b 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 @@ -17,10 +17,14 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy { context.read().add( OnCommunitySelected( community.uuid, - spaces, + spaces.isNotEmpty ? [spaces.first] : [], ), ); - FetchOccupancyDataHelper.loadOccupancyData(context); + FetchOccupancyDataHelper.loadOccupancyData( + context, + communityId: community.uuid, + spaceId: spaces.isNotEmpty ? spaces.first.uuid ?? '' : '', + ); } @override @@ -29,14 +33,25 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy { CommunityModel community, SpaceModel space, ) { - context.read().add( - OnSpaceSelected( - community, - space.uuid ?? '', - space.children, - ), - ); - FetchOccupancyDataHelper.loadOccupancyData(context); + final spaceTreeBloc = context.read(); + final selectedSpacesIds = spaceTreeBloc.state.selectedSpaces; + final isSpaceSelected = selectedSpacesIds.contains(space.uuid); + + if (selectedSpacesIds.isEmpty) { + spaceTreeBloc.add(OnCommunitySelected(community.uuid, [space])); + } else if (isSpaceSelected) { + spaceTreeBloc.add(const SpaceTreeClearSelectionEvent()); + } else { + spaceTreeBloc + ..add(const SpaceTreeClearSelectionEvent()) + ..add(OnSpaceSelected(community, space.uuid ?? '', [])); + } + + FetchOccupancyDataHelper.loadOccupancyData( + context, + communityId: community.uuid, + spaceId: space.uuid ?? '', + ); } @override @@ -45,18 +60,12 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy { CommunityModel community, SpaceModel child, ) { - context.read().add( - OnSpaceSelected( - community, - child.uuid ?? '', - child.children, - ), - ); - FetchOccupancyDataHelper.loadOccupancyData(context); + // Do nothing } @override void clearData(BuildContext context) { context.read().add(const SpaceTreeClearSelectionEvent()); + // FetchOccupancyDataHelper.clearAllData(context); } } 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 e0a32837..b63c6411 100644 --- a/lib/pages/analytics/modules/analytics/widgets/analytics_communities_sidebar.dart +++ b/lib/pages/analytics/modules/analytics/widgets/analytics_communities_sidebar.dart @@ -9,26 +9,21 @@ class AnalyticsCommunitiesSidebar extends StatelessWidget { @override Widget build(BuildContext context) { - return Builder( - builder: (context) { - final selectedTab = context.read().state; - final strategy = - AnalyticsDataLoadingStrategyFactory.getStrategy(selectedTab); + final selectedTab = context.watch().state; + final strategy = AnalyticsDataLoadingStrategyFactory.getStrategy(selectedTab); - return Expanded( - child: AnalyticsSpaceTreeView( - onSelectCommunity: (community, spaces) { - strategy.onCommunitySelected(context, community, spaces); - }, - onSelectSpace: (community, space) { - strategy.onSpaceSelected(context, community, space); - }, - onSelectChildSpace: (community, child) { - strategy.onChildSpaceSelected(context, community, child); - }, - ), - ); - }, + return Expanded( + child: AnalyticsSpaceTreeView( + onSelectCommunity: (community, spaces) { + strategy.onCommunitySelected(context, community, spaces); + }, + onSelectSpace: (community, space) { + strategy.onSpaceSelected(context, community, space); + }, + onSelectChildSpace: (community, child) { + strategy.onChildSpaceSelected(context, community, child); + }, + ), ); } } diff --git a/lib/pages/analytics/modules/analytics/widgets/analytics_page_tabs_and_children.dart b/lib/pages/analytics/modules/analytics/widgets/analytics_page_tabs_and_children.dart index 8aaf72b4..2a063599 100644 --- a/lib/pages/analytics/modules/analytics/widgets/analytics_page_tabs_and_children.dart +++ b/lib/pages/analytics/modules/analytics/widgets/analytics_page_tabs_and_children.dart @@ -6,6 +6,7 @@ import 'package:syncrow_web/pages/analytics/modules/analytics/enums/analytics_pa import 'package:syncrow_web/pages/analytics/modules/analytics/widgets/analytics_date_filter_button.dart'; import 'package:syncrow_web/pages/analytics/modules/analytics/widgets/analytics_page_tab_button.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/helpers/fetch_energy_management_data_helper.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/utils/style.dart'; class AnalyticsPageTabsAndChildren extends StatelessWidget { @@ -13,6 +14,7 @@ class AnalyticsPageTabsAndChildren extends StatelessWidget { @override Widget build(BuildContext context) { + final spaceTreeState = context.read().state; return BlocBuilder( buildWhen: (previous, current) => previous != current, builder: (context, selectedTab) => Column( @@ -66,10 +68,14 @@ class AnalyticsPageTabsAndChildren extends StatelessWidget { context.read().add( UpdateAnalyticsDatePickerEvent(montlyDate: value), ); - FetchEnergyManagementDataHelper - .fetchEnergyManagementData( + FetchEnergyManagementDataHelper.loadEnergyManagementData( context, selectedDate: value, + communityId: + spaceTreeState.selectedCommunities.firstOrNull ?? + '', + spaceId: + spaceTreeState.selectedSpaces.firstOrNull ?? '', ); }, selectedDate: context diff --git a/lib/pages/analytics/modules/energy_management/helpers/fetch_energy_management_data_helper.dart b/lib/pages/analytics/modules/energy_management/helpers/fetch_energy_management_data_helper.dart index 7a170935..84afa77d 100644 --- a/lib/pages/analytics/modules/energy_management/helpers/fetch_energy_management_data_helper.dart +++ b/lib/pages/analytics/modules/energy_management/helpers/fetch_energy_management_data_helper.dart @@ -9,60 +9,38 @@ import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/tota import 'package:syncrow_web/pages/analytics/params/get_energy_consumption_by_phases_param.dart'; import 'package:syncrow_web/pages/analytics/params/get_energy_consumption_per_device_param.dart'; import 'package:syncrow_web/pages/analytics/params/get_total_energy_consumption_param.dart'; -import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; abstract final class FetchEnergyManagementDataHelper { const FetchEnergyManagementDataHelper._(); - static void fetchEnergyManagementData( + static const String _powerClampId = 'cb71d6ad-6e29-4eaa-ae3e-1a0d1c5f60fa'; + + static void loadEnergyManagementData( BuildContext context, { + required String communityId, + required String spaceId, DateTime? selectedDate, }) { - final (selectedCommunities, selectedSpaces) = - getSelectedCommunitiesAndSpaces(context); - - if (selectedCommunities.isEmpty && selectedSpaces.isEmpty) { + if (communityId.isEmpty && spaceId.isEmpty) { clearAllData(context); return; } + final datePickerState = context.read().state; + final selectedDate0 = selectedDate ?? datePickerState.monthlyDate; - loadTotalEnergyConsumption(context, selectedDate: datePickerState.monthlyDate); - loadEnergyConsumptionByPhases( + loadTotalEnergyConsumption( context, - selectedDate: datePickerState.monthlyDate, + selectedDate: selectedDate0, + communityId: communityId, + spaceId: spaceId, ); + + loadEnergyConsumptionByPhases(context, selectedDate: selectedDate); + loadEnergyConsumptionPerDevice(context); - return; - } - - static void loadEnergyManagementData(BuildContext context) { - final (selectedCommunities, selectedSpaces) = - FetchEnergyManagementDataHelper.getSelectedCommunitiesAndSpaces(context); - if (selectedCommunities.isEmpty && selectedSpaces.isEmpty) { - clearAllData(context); - } - - FetchEnergyManagementDataHelper.fetchEnergyManagementData(context, - selectedDate: DateTime.now()); - FetchEnergyManagementDataHelper.loadRealtimeDeviceChanges(context); - context.read().add(const ClearPowerClampInfoEvent()); - if (selectedCommunities.isEmpty && selectedSpaces.isEmpty) { - context.read().add( - const ClearPowerClampInfoEvent(), - ); - } else { - FetchEnergyManagementDataHelper.loadPowerClampInfo(context); - } - } - - static (List selectedCommunities, List selectedSpaces) - getSelectedCommunitiesAndSpaces(BuildContext context) { - final spaceTreeState = context.read().state; - final selectedCommunities = spaceTreeState.selectedCommunities; - final selectedSpaces = spaceTreeState.selectedSpaces; - - return (selectedCommunities, selectedSpaces); + loadRealtimeDeviceChanges(context); + loadPowerClampInfo(context); } static void loadEnergyConsumptionByPhases( @@ -81,13 +59,12 @@ abstract final class FetchEnergyManagementDataHelper { static void loadTotalEnergyConsumption( BuildContext context, { DateTime? selectedDate, + required String communityId, + required String spaceId, }) { - final (selectedCommunities, selectedSpaces) = - getSelectedCommunitiesAndSpaces(context); - final param = GetTotalEnergyConsumptionParam( - spaceId: selectedCommunities.firstOrNull, - communityId: selectedCommunities.firstOrNull, + spaceId: spaceId, + communityId: communityId, monthDate: selectedDate, ); context.read().add( @@ -104,13 +81,13 @@ abstract final class FetchEnergyManagementDataHelper { static void loadPowerClampInfo(BuildContext context) { context.read().add( - const LoadPowerClampInfoEvent('cb71d6ad-6e29-4eaa-ae3e-1a0d1c5f60fa'), + const LoadPowerClampInfoEvent(_powerClampId), ); } static void loadRealtimeDeviceChanges(BuildContext context) { context.read().add( - const RealtimeDeviceChangesStarted('cb71d6ad-6e29-4eaa-ae3e-1a0d1c5f60fa'), + const RealtimeDeviceChangesStarted(_powerClampId), ); } @@ -122,6 +99,7 @@ abstract final class FetchEnergyManagementDataHelper { context.read().add( const ClearPowerClampInfoEvent(), ); + context.read().add( const ClearEnergyConsumptionPerDeviceEvent(), ); diff --git a/lib/pages/analytics/modules/energy_management/views/analytics_energy_management_view.dart b/lib/pages/analytics/modules/energy_management/views/analytics_energy_management_view.dart index d3877e98..ffb09113 100644 --- a/lib/pages/analytics/modules/energy_management/views/analytics_energy_management_view.dart +++ b/lib/pages/analytics/modules/energy_management/views/analytics_energy_management_view.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/helpers/fetch_energy_management_data_helper.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_chart_box.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/power_clamp_energy_data_widget.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/total_energy_consumption_chart_box.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; class AnalyticsEnergyManagementView extends StatefulWidget { const AnalyticsEnergyManagementView({super.key}); @@ -16,7 +18,14 @@ class _AnalyticsEnergyManagementViewState extends State { @override void initState() { - FetchEnergyManagementDataHelper.loadEnergyManagementData(context); + final spaceTreeBloc = context.read(); + final communityId = spaceTreeBloc.state.selectedCommunities.firstOrNull; + final spaceId = spaceTreeBloc.state.selectedSpaces.firstOrNull; + FetchEnergyManagementDataHelper.loadEnergyManagementData( + context, + communityId: communityId ?? '', + spaceId: spaceId ?? '', + ); super.initState(); } diff --git a/lib/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart b/lib/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart index e0d62d7f..ffd52af1 100644 --- a/lib/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart +++ b/lib/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/analytics/blocs/analytics_date_picker_bloc/analytics_date_picker_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/realtime_device_changes/realtime_device_changes_bloc.dart'; -import 'package:syncrow_web/pages/analytics/modules/energy_management/helpers/fetch_energy_management_data_helper.dart'; import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart'; import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart'; import 'package:syncrow_web/pages/analytics/params/get_occupancy_heat_map_param.dart'; @@ -11,10 +10,12 @@ import 'package:syncrow_web/pages/analytics/params/get_occupancy_param.dart'; abstract final class FetchOccupancyDataHelper { const FetchOccupancyDataHelper._(); - static void loadOccupancyData(BuildContext context) { - final (selectedCommunities, selectedSpaces) = - FetchEnergyManagementDataHelper.getSelectedCommunitiesAndSpaces(context); - if (selectedCommunities.isEmpty && selectedSpaces.isEmpty) { + static void loadOccupancyData( + BuildContext context, { + required String communityId, + required String spaceId, + }) { + if (communityId.isEmpty && spaceId.isEmpty) { clearAllData(context); } @@ -25,8 +26,8 @@ abstract final class FetchOccupancyDataHelper { GetOccupancyParam( monthDate: '${datePickerState.monthlyDate.year}-${datePickerState.monthlyDate.month}', - spaceUuid: selectedSpaces.firstOrNull, - communityUuid: selectedCommunities.firstOrNull ?? '', + spaceUuid: spaceId, + communityUuid: communityId, ), ), ); @@ -34,9 +35,8 @@ abstract final class FetchOccupancyDataHelper { context.read().add( LoadOccupancyHeatMapEvent( GetOccupancyHeatMapParam( - spaceId: selectedSpaces.isNotEmpty ? selectedSpaces.first : '', - communityId: - selectedCommunities.isNotEmpty ? selectedCommunities.first : '', + spaceId: spaceId, + communityId: communityId, year: datePickerState.yearlyDate, ), ), diff --git a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart index b9fcbeeb..464a05dd 100644 --- a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart +++ b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart @@ -7,6 +7,7 @@ import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy/oc import 'package:syncrow_web/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart'; import 'package:syncrow_web/pages/analytics/modules/occupancy/widgets/occupancy_chart.dart'; import 'package:syncrow_web/pages/analytics/widgets/analytics_error_widget.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/utils/style.dart'; class OccupancyChartBox extends StatelessWidget { @@ -14,6 +15,7 @@ class OccupancyChartBox extends StatelessWidget { @override Widget build(BuildContext context) { + final spaceTreeState = context.watch().state; return BlocBuilder( builder: (context, state) { return Container( @@ -45,7 +47,11 @@ class OccupancyChartBox extends StatelessWidget { context.read().add( UpdateAnalyticsDatePickerEvent(montlyDate: value), ); - FetchOccupancyDataHelper.loadOccupancyData(context); + FetchOccupancyDataHelper.loadOccupancyData( + context, + communityId: spaceTreeState.selectedCommunities.firstOrNull ?? '', + spaceId: spaceTreeState.selectedSpaces.firstOrNull ?? '', + ); }, selectedDate: context .watch() diff --git a/lib/pages/analytics/modules/occupancy/widgets/occupancy_heat_map_box.dart b/lib/pages/analytics/modules/occupancy/widgets/occupancy_heat_map_box.dart index fa6eef47..c4cda268 100644 --- a/lib/pages/analytics/modules/occupancy/widgets/occupancy_heat_map_box.dart +++ b/lib/pages/analytics/modules/occupancy/widgets/occupancy_heat_map_box.dart @@ -7,6 +7,7 @@ import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy_he import 'package:syncrow_web/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart'; import 'package:syncrow_web/pages/analytics/modules/occupancy/widgets/occupancy_heat_map.dart'; import 'package:syncrow_web/pages/analytics/widgets/analytics_error_widget.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/utils/style.dart'; class OccupancyHeatMapBox extends StatelessWidget { @@ -14,6 +15,7 @@ class OccupancyHeatMapBox extends StatelessWidget { @override Widget build(BuildContext context) { + final spaceTreeState = context.watch().state; return BlocBuilder( builder: (context, state) { return Container( @@ -45,7 +47,12 @@ class OccupancyHeatMapBox extends StatelessWidget { context.read().add( UpdateAnalyticsDatePickerEvent(yearlyDate: value), ); - FetchOccupancyDataHelper.loadOccupancyData(context); + FetchOccupancyDataHelper.loadOccupancyData( + context, + communityId: + spaceTreeState.selectedCommunities.firstOrNull ?? '', + spaceId: spaceTreeState.selectedSpaces.firstOrNull ?? '', + ); }, datePickerType: DatePickerType.year, selectedDate: context