Merge pull request #176 from SyncrowIOT/SP-1510-FE-Build-Occupancy-Bar-Chart-Monthly-Consumption-View

Sp 1510 fe build occupancy bar chart monthly consumption view
This commit is contained in:
Faris Armoush
2025-05-08 16:32:21 +03:00
committed by GitHub
parent 53222bee81
commit 2e2bc99501
18 changed files with 585 additions and 49 deletions
@@ -5,7 +5,7 @@ import 'package:syncrow_web/pages/analytics/modules/analytics/enums/analytics_pa
part 'analytics_tab_event.dart';
class AnalyticsTabBloc extends Bloc<AnalyticsTabEvent, AnalyticsPageTab> {
AnalyticsTabBloc() : super(AnalyticsPageTab.energyManagement) {
AnalyticsTabBloc() : super(AnalyticsPageTab.occupancy) {
on<UpdateAnalyticsTabEvent>(_onUpdateAnalyticsTabEvent);
}
@@ -8,8 +8,10 @@ import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/ener
import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/power_clamp_info/power_clamp_info_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/total_energy_consumption/total_energy_consumption_bloc.dart';
import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart';
import 'package:syncrow_web/pages/analytics/services/energy_consumption_by_phases/fake_energy_consumption_by_phases_service.dart';
import 'package:syncrow_web/pages/analytics/services/energy_consumption_per_device/fake_energy_consumption_per_device_service.dart';
import 'package:syncrow_web/pages/analytics/services/occupacy/fake_occupacy_service.dart';
import 'package:syncrow_web/pages/analytics/services/power_clamp_info/remote_power_clamp_info_service.dart';
import 'package:syncrow_web/pages/analytics/services/realtime_device_service/firebase_realtime_device_service.dart';
import 'package:syncrow_web/pages/analytics/services/total_energy_consumption/fake_total_energy_consumption_service.dart';
@@ -53,6 +55,7 @@ class AnalyticsPage extends StatelessWidget {
FirebaseRealtimeDeviceService(),
),
),
BlocProvider(create: (context) => OccupancyBloc(FakeOccupacyService())),
],
child: const AnalyticsPageForm(),
);
@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/power_clamp_info/power_clamp_info_bloc.dart';
import 'package:syncrow_web/pages/analytics/modules/analytics/blocs/analytics_tab/analytics_tab_bloc.dart';
import 'package:syncrow_web/pages/analytics/modules/analytics/enums/analytics_page_tab.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/helpers/fetch_occupancy_data_helper.dart';
import 'package:syncrow_web/pages/space_tree/view/space_tree_view.dart';
class AnalyticsCommunitiesSidebar extends StatelessWidget {
@@ -17,34 +19,9 @@ class AnalyticsCommunitiesSidebar extends StatelessWidget {
shouldDisableDeselectingChildrenOfSelectedParent: true,
onSelect: () {
/// Necessary to wait for the state to update before fethcing the data.
Future.delayed(
const Duration(milliseconds: 100),
() {
if (context.mounted) {
FetchEnergyManagementDataHelper.fetchEnergyManagementData(
context,
);
FetchEnergyManagementDataHelper.loadRealtimeDeviceChanges(
context,
);
context.read<PowerClampInfoBloc>().add(
const ClearPowerClampInfoEvent(),
);
final (selectedCommunities, selectedSpaces) =
FetchEnergyManagementDataHelper
.getSelectedCommunitiesAndSpaces(context);
if (selectedCommunities.isEmpty && selectedSpaces.isEmpty) {
context.read<PowerClampInfoBloc>().add(
const ClearPowerClampInfoEvent(),
);
} else {
FetchEnergyManagementDataHelper.loadPowerClampInfo(
context,
);
}
}
},
);
Future.delayed(const Duration(milliseconds: 100), () {
if (context.mounted) _loadBasedOnSelectedTab(context);
});
},
isSide: false,
),
@@ -52,4 +29,16 @@ class AnalyticsCommunitiesSidebar extends StatelessWidget {
},
);
}
void _loadBasedOnSelectedTab(BuildContext context) {
final selectedTab = context.read<AnalyticsTabBloc>().state;
return switch (selectedTab) {
AnalyticsPageTab.energyManagement =>
FetchEnergyManagementDataHelper.loadEnergyManagementData(context),
AnalyticsPageTab.occupancy =>
FetchOccupancyDataHelper.loadOccupancyData(context),
// ignore: unreachable_switch_case
_ => () {},
};
}
}
@@ -38,9 +38,7 @@ class AnalyticsPageTabsAndChildren extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center,
children: [
...AnalyticsPageTab.values.map(
(tab) => AnimatedSwitcher(
switchInCurve: Curves.easeIn,
duration: const Duration(milliseconds: 200),
(tab) => _buildAnimation(
child: AnalyticsPageTabButton(
key: ValueKey(selectedTab),
tab: tab,
@@ -53,12 +51,18 @@ class AnalyticsPageTabsAndChildren extends StatelessWidget {
),
),
const Spacer(),
const Expanded(
flex: 2,
child: FittedBox(
fit: BoxFit.scaleDown,
alignment: AlignmentDirectional.centerEnd,
child: AnalyticsDateFilterButton(),
_buildAnimation(
child: Visibility(
key: ValueKey(selectedTab),
visible: selectedTab == AnalyticsPageTab.energyManagement,
child: const Expanded(
flex: 2,
child: FittedBox(
fit: BoxFit.scaleDown,
alignment: AlignmentDirectional.centerEnd,
child: AnalyticsDateFilterButton(),
),
),
),
),
],
@@ -67,14 +71,18 @@ class AnalyticsPageTabsAndChildren extends StatelessWidget {
),
Expanded(
flex: 8,
child: AnimatedSwitcher(
switchInCurve: Curves.easeIn,
duration: const Duration(milliseconds: 200),
child: selectedTab.child,
),
child: _buildAnimation(child: selectedTab.child),
),
],
),
);
}
Widget _buildAnimation({required Widget child}) {
return AnimatedSwitcher(
switchInCurve: Curves.easeIn,
duration: const Duration(milliseconds: 200),
child: child,
);
}
}