Applies correct business logic of the sidebar.

This commit is contained in:
Faris Armoush
2025-05-13 16:46:34 +03:00
parent c7fef11aec
commit e8f7c29652
9 changed files with 120 additions and 108 deletions

View File

@ -20,7 +20,11 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg
spaces, spaces,
), ),
); );
FetchEnergyManagementDataHelper.loadEnergyManagementData(context); FetchEnergyManagementDataHelper.loadEnergyManagementData(
context,
communityId: community.uuid,
spaceId: spaces.isNotEmpty ? spaces.first.uuid ?? '' : '',
);
} }
@override @override
@ -36,7 +40,12 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg
space.children, space.children,
), ),
); );
FetchEnergyManagementDataHelper.loadEnergyManagementData(context);
FetchEnergyManagementDataHelper.loadEnergyManagementData(
context,
communityId: community.uuid,
spaceId: space.uuid ?? '',
);
} }
@override @override
@ -45,14 +54,7 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg
CommunityModel community, CommunityModel community,
SpaceModel child, SpaceModel child,
) { ) {
context.read<SpaceTreeBloc>().add( // Do nothing
OnSpaceSelected(
community,
child.uuid ?? '',
child.children,
),
);
FetchEnergyManagementDataHelper.loadEnergyManagementData(context);
} }
@override @override

View File

@ -17,10 +17,14 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy {
context.read<SpaceTreeBloc>().add( context.read<SpaceTreeBloc>().add(
OnCommunitySelected( OnCommunitySelected(
community.uuid, community.uuid,
spaces, spaces.isNotEmpty ? [spaces.first] : [],
), ),
); );
FetchOccupancyDataHelper.loadOccupancyData(context); FetchOccupancyDataHelper.loadOccupancyData(
context,
communityId: community.uuid,
spaceId: spaces.isNotEmpty ? spaces.first.uuid ?? '' : '',
);
} }
@override @override
@ -29,14 +33,25 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy {
CommunityModel community, CommunityModel community,
SpaceModel space, SpaceModel space,
) { ) {
context.read<SpaceTreeBloc>().add( final spaceTreeBloc = context.read<SpaceTreeBloc>();
OnSpaceSelected( final selectedSpacesIds = spaceTreeBloc.state.selectedSpaces;
community, final isSpaceSelected = selectedSpacesIds.contains(space.uuid);
space.uuid ?? '',
space.children, if (selectedSpacesIds.isEmpty) {
), spaceTreeBloc.add(OnCommunitySelected(community.uuid, [space]));
); } else if (isSpaceSelected) {
FetchOccupancyDataHelper.loadOccupancyData(context); spaceTreeBloc.add(const SpaceTreeClearSelectionEvent());
} else {
spaceTreeBloc
..add(const SpaceTreeClearSelectionEvent())
..add(OnSpaceSelected(community, space.uuid ?? '', []));
}
FetchOccupancyDataHelper.loadOccupancyData(
context,
communityId: community.uuid,
spaceId: space.uuid ?? '',
);
} }
@override @override
@ -45,18 +60,12 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy {
CommunityModel community, CommunityModel community,
SpaceModel child, SpaceModel child,
) { ) {
context.read<SpaceTreeBloc>().add( // Do nothing
OnSpaceSelected(
community,
child.uuid ?? '',
child.children,
),
);
FetchOccupancyDataHelper.loadOccupancyData(context);
} }
@override @override
void clearData(BuildContext context) { void clearData(BuildContext context) {
context.read<SpaceTreeBloc>().add(const SpaceTreeClearSelectionEvent()); context.read<SpaceTreeBloc>().add(const SpaceTreeClearSelectionEvent());
// FetchOccupancyDataHelper.clearAllData(context);
} }
} }

View File

@ -9,26 +9,21 @@ class AnalyticsCommunitiesSidebar extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Builder( final selectedTab = context.watch<AnalyticsTabBloc>().state;
builder: (context) { final strategy = AnalyticsDataLoadingStrategyFactory.getStrategy(selectedTab);
final selectedTab = context.read<AnalyticsTabBloc>().state;
final strategy =
AnalyticsDataLoadingStrategyFactory.getStrategy(selectedTab);
return Expanded( return Expanded(
child: AnalyticsSpaceTreeView( child: AnalyticsSpaceTreeView(
onSelectCommunity: (community, spaces) { onSelectCommunity: (community, spaces) {
strategy.onCommunitySelected(context, community, spaces); strategy.onCommunitySelected(context, community, spaces);
}, },
onSelectSpace: (community, space) { onSelectSpace: (community, space) {
strategy.onSpaceSelected(context, community, space); strategy.onSpaceSelected(context, community, space);
}, },
onSelectChildSpace: (community, child) { onSelectChildSpace: (community, child) {
strategy.onChildSpaceSelected(context, community, child); strategy.onChildSpaceSelected(context, community, child);
}, },
), ),
);
},
); );
} }
} }

View File

@ -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_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/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/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'; import 'package:syncrow_web/utils/style.dart';
class AnalyticsPageTabsAndChildren extends StatelessWidget { class AnalyticsPageTabsAndChildren extends StatelessWidget {
@ -13,6 +14,7 @@ class AnalyticsPageTabsAndChildren extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final spaceTreeState = context.read<SpaceTreeBloc>().state;
return BlocBuilder<AnalyticsTabBloc, AnalyticsPageTab>( return BlocBuilder<AnalyticsTabBloc, AnalyticsPageTab>(
buildWhen: (previous, current) => previous != current, buildWhen: (previous, current) => previous != current,
builder: (context, selectedTab) => Column( builder: (context, selectedTab) => Column(
@ -66,10 +68,14 @@ class AnalyticsPageTabsAndChildren extends StatelessWidget {
context.read<AnalyticsDatePickerBloc>().add( context.read<AnalyticsDatePickerBloc>().add(
UpdateAnalyticsDatePickerEvent(montlyDate: value), UpdateAnalyticsDatePickerEvent(montlyDate: value),
); );
FetchEnergyManagementDataHelper FetchEnergyManagementDataHelper.loadEnergyManagementData(
.fetchEnergyManagementData(
context, context,
selectedDate: value, selectedDate: value,
communityId:
spaceTreeState.selectedCommunities.firstOrNull ??
'',
spaceId:
spaceTreeState.selectedSpaces.firstOrNull ?? '',
); );
}, },
selectedDate: context selectedDate: context

View File

@ -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_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_energy_consumption_per_device_param.dart';
import 'package:syncrow_web/pages/analytics/params/get_total_energy_consumption_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 { abstract final class FetchEnergyManagementDataHelper {
const FetchEnergyManagementDataHelper._(); const FetchEnergyManagementDataHelper._();
static void fetchEnergyManagementData( static const String _powerClampId = 'cb71d6ad-6e29-4eaa-ae3e-1a0d1c5f60fa';
static void loadEnergyManagementData(
BuildContext context, { BuildContext context, {
required String communityId,
required String spaceId,
DateTime? selectedDate, DateTime? selectedDate,
}) { }) {
final (selectedCommunities, selectedSpaces) = if (communityId.isEmpty && spaceId.isEmpty) {
getSelectedCommunitiesAndSpaces(context);
if (selectedCommunities.isEmpty && selectedSpaces.isEmpty) {
clearAllData(context); clearAllData(context);
return; return;
} }
final datePickerState = context.read<AnalyticsDatePickerBloc>().state; final datePickerState = context.read<AnalyticsDatePickerBloc>().state;
final selectedDate0 = selectedDate ?? datePickerState.monthlyDate;
loadTotalEnergyConsumption(context, selectedDate: datePickerState.monthlyDate); loadTotalEnergyConsumption(
loadEnergyConsumptionByPhases(
context, context,
selectedDate: datePickerState.monthlyDate, selectedDate: selectedDate0,
communityId: communityId,
spaceId: spaceId,
); );
loadEnergyConsumptionByPhases(context, selectedDate: selectedDate);
loadEnergyConsumptionPerDevice(context); loadEnergyConsumptionPerDevice(context);
return; loadRealtimeDeviceChanges(context);
} loadPowerClampInfo(context);
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<PowerClampInfoBloc>().add(const ClearPowerClampInfoEvent());
if (selectedCommunities.isEmpty && selectedSpaces.isEmpty) {
context.read<PowerClampInfoBloc>().add(
const ClearPowerClampInfoEvent(),
);
} else {
FetchEnergyManagementDataHelper.loadPowerClampInfo(context);
}
}
static (List<String> selectedCommunities, List<String> selectedSpaces)
getSelectedCommunitiesAndSpaces(BuildContext context) {
final spaceTreeState = context.read<SpaceTreeBloc>().state;
final selectedCommunities = spaceTreeState.selectedCommunities;
final selectedSpaces = spaceTreeState.selectedSpaces;
return (selectedCommunities, selectedSpaces);
} }
static void loadEnergyConsumptionByPhases( static void loadEnergyConsumptionByPhases(
@ -81,13 +59,12 @@ abstract final class FetchEnergyManagementDataHelper {
static void loadTotalEnergyConsumption( static void loadTotalEnergyConsumption(
BuildContext context, { BuildContext context, {
DateTime? selectedDate, DateTime? selectedDate,
required String communityId,
required String spaceId,
}) { }) {
final (selectedCommunities, selectedSpaces) =
getSelectedCommunitiesAndSpaces(context);
final param = GetTotalEnergyConsumptionParam( final param = GetTotalEnergyConsumptionParam(
spaceId: selectedCommunities.firstOrNull, spaceId: spaceId,
communityId: selectedCommunities.firstOrNull, communityId: communityId,
monthDate: selectedDate, monthDate: selectedDate,
); );
context.read<TotalEnergyConsumptionBloc>().add( context.read<TotalEnergyConsumptionBloc>().add(
@ -104,13 +81,13 @@ abstract final class FetchEnergyManagementDataHelper {
static void loadPowerClampInfo(BuildContext context) { static void loadPowerClampInfo(BuildContext context) {
context.read<PowerClampInfoBloc>().add( context.read<PowerClampInfoBloc>().add(
const LoadPowerClampInfoEvent('cb71d6ad-6e29-4eaa-ae3e-1a0d1c5f60fa'), const LoadPowerClampInfoEvent(_powerClampId),
); );
} }
static void loadRealtimeDeviceChanges(BuildContext context) { static void loadRealtimeDeviceChanges(BuildContext context) {
context.read<RealtimeDeviceChangesBloc>().add( context.read<RealtimeDeviceChangesBloc>().add(
const RealtimeDeviceChangesStarted('cb71d6ad-6e29-4eaa-ae3e-1a0d1c5f60fa'), const RealtimeDeviceChangesStarted(_powerClampId),
); );
} }
@ -122,6 +99,7 @@ abstract final class FetchEnergyManagementDataHelper {
context.read<PowerClampInfoBloc>().add( context.read<PowerClampInfoBloc>().add(
const ClearPowerClampInfoEvent(), const ClearPowerClampInfoEvent(),
); );
context.read<EnergyConsumptionPerDeviceBloc>().add( context.read<EnergyConsumptionPerDeviceBloc>().add(
const ClearEnergyConsumptionPerDeviceEvent(), const ClearEnergyConsumptionPerDeviceEvent(),
); );

View File

@ -1,8 +1,10 @@
import 'package:flutter/material.dart'; 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/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/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/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/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 { class AnalyticsEnergyManagementView extends StatefulWidget {
const AnalyticsEnergyManagementView({super.key}); const AnalyticsEnergyManagementView({super.key});
@ -16,7 +18,14 @@ class _AnalyticsEnergyManagementViewState
extends State<AnalyticsEnergyManagementView> { extends State<AnalyticsEnergyManagementView> {
@override @override
void initState() { void initState() {
FetchEnergyManagementDataHelper.loadEnergyManagementData(context); final spaceTreeBloc = context.read<SpaceTreeBloc>();
final communityId = spaceTreeBloc.state.selectedCommunities.firstOrNull;
final spaceId = spaceTreeBloc.state.selectedSpaces.firstOrNull;
FetchEnergyManagementDataHelper.loadEnergyManagementData(
context,
communityId: communityId ?? '',
spaceId: spaceId ?? '',
);
super.initState(); super.initState();
} }

View File

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.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/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/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/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/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart';
import 'package:syncrow_web/pages/analytics/params/get_occupancy_heat_map_param.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 { abstract final class FetchOccupancyDataHelper {
const FetchOccupancyDataHelper._(); const FetchOccupancyDataHelper._();
static void loadOccupancyData(BuildContext context) { static void loadOccupancyData(
final (selectedCommunities, selectedSpaces) = BuildContext context, {
FetchEnergyManagementDataHelper.getSelectedCommunitiesAndSpaces(context); required String communityId,
if (selectedCommunities.isEmpty && selectedSpaces.isEmpty) { required String spaceId,
}) {
if (communityId.isEmpty && spaceId.isEmpty) {
clearAllData(context); clearAllData(context);
} }
@ -25,8 +26,8 @@ abstract final class FetchOccupancyDataHelper {
GetOccupancyParam( GetOccupancyParam(
monthDate: monthDate:
'${datePickerState.monthlyDate.year}-${datePickerState.monthlyDate.month}', '${datePickerState.monthlyDate.year}-${datePickerState.monthlyDate.month}',
spaceUuid: selectedSpaces.firstOrNull, spaceUuid: spaceId,
communityUuid: selectedCommunities.firstOrNull ?? '', communityUuid: communityId,
), ),
), ),
); );
@ -34,9 +35,8 @@ abstract final class FetchOccupancyDataHelper {
context.read<OccupancyHeatMapBloc>().add( context.read<OccupancyHeatMapBloc>().add(
LoadOccupancyHeatMapEvent( LoadOccupancyHeatMapEvent(
GetOccupancyHeatMapParam( GetOccupancyHeatMapParam(
spaceId: selectedSpaces.isNotEmpty ? selectedSpaces.first : '', spaceId: spaceId,
communityId: communityId: communityId,
selectedCommunities.isNotEmpty ? selectedCommunities.first : '',
year: datePickerState.yearlyDate, year: datePickerState.yearlyDate,
), ),
), ),

View File

@ -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/helpers/fetch_occupancy_data_helper.dart';
import 'package:syncrow_web/pages/analytics/modules/occupancy/widgets/occupancy_chart.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/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'; import 'package:syncrow_web/utils/style.dart';
class OccupancyChartBox extends StatelessWidget { class OccupancyChartBox extends StatelessWidget {
@ -14,6 +15,7 @@ class OccupancyChartBox extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final spaceTreeState = context.watch<SpaceTreeBloc>().state;
return BlocBuilder<OccupancyBloc, OccupancyState>( return BlocBuilder<OccupancyBloc, OccupancyState>(
builder: (context, state) { builder: (context, state) {
return Container( return Container(
@ -45,7 +47,11 @@ class OccupancyChartBox extends StatelessWidget {
context.read<AnalyticsDatePickerBloc>().add( context.read<AnalyticsDatePickerBloc>().add(
UpdateAnalyticsDatePickerEvent(montlyDate: value), UpdateAnalyticsDatePickerEvent(montlyDate: value),
); );
FetchOccupancyDataHelper.loadOccupancyData(context); FetchOccupancyDataHelper.loadOccupancyData(
context,
communityId: spaceTreeState.selectedCommunities.firstOrNull ?? '',
spaceId: spaceTreeState.selectedSpaces.firstOrNull ?? '',
);
}, },
selectedDate: context selectedDate: context
.watch<AnalyticsDatePickerBloc>() .watch<AnalyticsDatePickerBloc>()

View File

@ -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/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/modules/occupancy/widgets/occupancy_heat_map.dart';
import 'package:syncrow_web/pages/analytics/widgets/analytics_error_widget.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'; import 'package:syncrow_web/utils/style.dart';
class OccupancyHeatMapBox extends StatelessWidget { class OccupancyHeatMapBox extends StatelessWidget {
@ -14,6 +15,7 @@ class OccupancyHeatMapBox extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final spaceTreeState = context.watch<SpaceTreeBloc>().state;
return BlocBuilder<OccupancyHeatMapBloc, OccupancyHeatMapState>( return BlocBuilder<OccupancyHeatMapBloc, OccupancyHeatMapState>(
builder: (context, state) { builder: (context, state) {
return Container( return Container(
@ -45,7 +47,12 @@ class OccupancyHeatMapBox extends StatelessWidget {
context.read<AnalyticsDatePickerBloc>().add( context.read<AnalyticsDatePickerBloc>().add(
UpdateAnalyticsDatePickerEvent(yearlyDate: value), UpdateAnalyticsDatePickerEvent(yearlyDate: value),
); );
FetchOccupancyDataHelper.loadOccupancyData(context); FetchOccupancyDataHelper.loadOccupancyData(
context,
communityId:
spaceTreeState.selectedCommunities.firstOrNull ?? '',
spaceId: spaceTreeState.selectedSpaces.firstOrNull ?? '',
);
}, },
datePickerType: DatePickerType.year, datePickerType: DatePickerType.year,
selectedDate: context selectedDate: context