diff --git a/assets/icons/landing_analytics.svg b/assets/icons/landing_analytics.svg new file mode 100644 index 00000000..6f9fbbf0 --- /dev/null +++ b/assets/icons/landing_analytics.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/web_Background.png b/assets/images/web_Background.png new file mode 100644 index 00000000..1d1dac6e Binary files /dev/null and b/assets/images/web_Background.png differ diff --git a/lib/pages/analytics/models/occupacy.dart b/lib/pages/analytics/models/occupacy.dart index ab53e5c2..b4b8dac9 100644 --- a/lib/pages/analytics/models/occupacy.dart +++ b/lib/pages/analytics/models/occupacy.dart @@ -1,18 +1,32 @@ import 'package:equatable/equatable.dart'; class Occupacy extends Equatable { - final String date; + final DateTime date; final String occupancy; + final String spaceUuid; + final int occupiedSeconds; - const Occupacy({required this.date, required this.occupancy}); + const Occupacy({ + required this.date, + required this.occupancy, + required this.spaceUuid, + required this.occupiedSeconds, + }); factory Occupacy.fromJson(Map json) { return Occupacy( - date: json['date'] as String, - occupancy: json['occupancy'] as String, + date: DateTime.parse(json['event_date'] as String? ?? '${DateTime.now()}'), + occupancy: (json['occupancy_percentage'] ?? 0).toString(), + spaceUuid: json['space_uuid'] as String? ?? '', + occupiedSeconds: json['occupied_seconds'] as int? ?? 0, ); } @override - List get props => [date, occupancy]; + List get props => [ + date, + occupancy, + spaceUuid, + occupiedSeconds, + ]; } diff --git a/lib/pages/analytics/modules/air_quality/helpers/fetch_air_quality_data_helper.dart b/lib/pages/analytics/modules/air_quality/helpers/fetch_air_quality_data_helper.dart new file mode 100644 index 00000000..dd646063 --- /dev/null +++ b/lib/pages/analytics/modules/air_quality/helpers/fetch_air_quality_data_helper.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/analytics/modules/analytics/blocs/analytics_devices/analytics_devices_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/params/get_analytics_devices_param.dart'; + +abstract final class FetchAirQualityDataHelper { + const FetchAirQualityDataHelper._(); + + static void loadAirQualityData( + BuildContext context, { + required String communityUuid, + required String spaceUuid, + }) { + loadAnalyticsDevices( + context, + communityUuid: communityUuid, + spaceUuid: spaceUuid, + ); + } + + static void clearAllData(BuildContext context) { + context.read().add( + const ClearAnalyticsDeviceEvent(), + ); + context.read().add( + const RealtimeDeviceChangesClosed(), + ); + } + + static void loadAnalyticsDevices( + BuildContext context, { + required String communityUuid, + required String spaceUuid, + }) { + context.read().add( + LoadAnalyticsDevicesEvent( + param: GetAnalyticsDevicesParam( + communityUuid: communityUuid, + spaceUuid: spaceUuid, + deviceTypes: ['AQI'], + requestType: AnalyticsDeviceRequestType.energyManagement, + ), + onSuccess: (device) { + context.read() + ..add(const RealtimeDeviceChangesClosed()) + ..add(RealtimeDeviceChangesStarted(device.uuid)); + }, + ), + ); + } +} diff --git a/lib/pages/analytics/modules/air_quality/views/air_quality_view.dart b/lib/pages/analytics/modules/air_quality/views/air_quality_view.dart new file mode 100644 index 00000000..38f62cd7 --- /dev/null +++ b/lib/pages/analytics/modules/air_quality/views/air_quality_view.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/air_quality_end_side_widget.dart'; + +class AirQualityView extends StatelessWidget { + const AirQualityView({super.key}); + + static const _padding = EdgeInsetsDirectional.all(32); + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + final isMediumOrLess = constraints.maxWidth <= 900; + final height = MediaQuery.sizeOf(context).height; + if (isMediumOrLess) { + return SingleChildScrollView( + padding: _padding, + child: Column( + spacing: 32, + children: [ + SizedBox( + height: height * 1.2, + child: const AirQualityEndSideWidget(), + ), + SizedBox(height: height * 0.5, child: const Placeholder()), + SizedBox(height: height * 0.5, child: const Placeholder()), + ], + ), + ); + } + + return SingleChildScrollView( + child: Container( + padding: _padding, + height: height, + child: const Column( + children: [ + Expanded( + child: Row( + spacing: 32, + children: [ + Expanded( + flex: 2, + child: Column( + spacing: 20, + children: [ + Expanded(child: Placeholder()), + Expanded(child: Placeholder()), + ], + ), + ), + Expanded(child: AirQualityEndSideWidget()), + ], + ), + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/lib/pages/analytics/modules/air_quality/widgets/air_quality_end_side_widget.dart b/lib/pages/analytics/modules/air_quality/widgets/air_quality_end_side_widget.dart new file mode 100644 index 00000000..2d6ace36 --- /dev/null +++ b/lib/pages/analytics/modules/air_quality/widgets/air_quality_end_side_widget.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/analytics/modules/analytics/blocs/analytics_devices/analytics_devices_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/analytics_device_dropdown.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; +import 'package:syncrow_web/utils/style.dart'; + +class AirQualityEndSideWidget extends StatelessWidget { + const AirQualityEndSideWidget({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + decoration: subSectionContainerDecoration.copyWith( + borderRadius: BorderRadius.circular(30), + ), + padding: const EdgeInsetsDirectional.all(32), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildHeader(context), + Text( + 'Device ID:', + style: context.textTheme.bodySmall?.copyWith( + color: ColorsManager.textPrimaryColor, + fontWeight: FontWeight.w400, + fontSize: 12, + ), + ), + const SizedBox(height: 6), + SelectableText( + context.watch().state.selectedDevice?.uuid ?? + 'N/A', + style: context.textTheme.bodySmall?.copyWith( + color: ColorsManager.blackColor, + fontWeight: FontWeight.w400, + fontSize: 12, + ), + ), + ], + ), + ); + } + + Widget _buildHeader(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Expanded( + flex: 3, + child: FittedBox( + fit: BoxFit.scaleDown, + alignment: AlignmentDirectional.centerStart, + child: SelectableText( + 'AQI Sensor', + style: context.textTheme.headlineSmall?.copyWith( + fontWeight: FontWeight.w700, + color: ColorsManager.vividBlue.withValues(alpha: 0.6), + fontSize: 18, + ), + ), + ), + ), + const Spacer(), + Expanded( + flex: 2, + child: FittedBox( + fit: BoxFit.scaleDown, + alignment: AlignmentDirectional.centerEnd, + child: AnalyticsDeviceDropdown( + onChanged: (value) { + context.read().add( + SelectAnalyticsDeviceEvent(value), + ); + FetchEnergyManagementDataHelper.loadRealtimeDeviceChanges( + context, + deviceUuid: value.uuid, + ); + }, + ), + ), + ), + ], + ); + } +} diff --git a/lib/pages/analytics/modules/analytics/enums/analytics_page_tab.dart b/lib/pages/analytics/modules/analytics/enums/analytics_page_tab.dart index b26cfc95..6552f6cf 100644 --- a/lib/pages/analytics/modules/analytics/enums/analytics_page_tab.dart +++ b/lib/pages/analytics/modules/analytics/enums/analytics_page_tab.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:syncrow_web/pages/analytics/modules/air_quality/views/air_quality_view.dart'; import 'package:syncrow_web/pages/analytics/modules/energy_management/views/analytics_energy_management_view.dart'; import 'package:syncrow_web/pages/analytics/modules/occupancy/views/analytics_occupancy_view.dart'; @@ -10,6 +11,10 @@ enum AnalyticsPageTab { occupancy( title: 'Occupancy', child: AnalyticsOccupancyView(), + ), + airQuality( + title: 'Air Quality', + child: AirQualityView(), ); const AnalyticsPageTab({ 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 new file mode 100644 index 00000000..dc3b1c5e --- /dev/null +++ b/lib/pages/analytics/modules/analytics/strategies/air_quality_data_loading_strategy.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/analytics/modules/air_quality/helpers/fetch_air_quality_data_helper.dart'; +import 'package:syncrow_web/pages/analytics/modules/analytics/strategies/analytics_data_loading_strategy.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_event.dart'; +import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart'; +import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model.dart'; + +final class AirQualityDataLoadingStrategy implements AnalyticsDataLoadingStrategy { + @override + void onCommunitySelected( + BuildContext context, + CommunityModel community, + List spaces, + ) { + // Do nothing + } + + @override + void onSpaceSelected( + BuildContext context, + CommunityModel community, + SpaceModel space, + ) { + final spaceTreeBloc = context.read(); + final isSpaceSelected = spaceTreeBloc.state.selectedSpaces.contains(space.uuid); + + if (isSpaceSelected) { + clearData(context); + return; + } + + spaceTreeBloc + ..add(const SpaceTreeClearSelectionEvent()) + ..add(OnSpaceSelected(community, space.uuid ?? '', [])); + + FetchAirQualityDataHelper.loadAirQualityData( + context, + communityUuid: community.uuid, + spaceUuid: space.uuid ?? '', + ); + } + + @override + void onChildSpaceSelected( + BuildContext context, + CommunityModel community, + SpaceModel child, + ) { + return onSpaceSelected(context, community, child); + } + + @override + void clearData(BuildContext context) { + context.read().add(const SpaceTreeClearSelectionEvent()); + FetchAirQualityDataHelper.clearAllData(context); + } +} diff --git a/lib/pages/analytics/modules/analytics/strategies/analytics_data_loading_strategy_factory.dart b/lib/pages/analytics/modules/analytics/strategies/analytics_data_loading_strategy_factory.dart index 8b8bb60f..19b0aff2 100644 --- a/lib/pages/analytics/modules/analytics/strategies/analytics_data_loading_strategy_factory.dart +++ b/lib/pages/analytics/modules/analytics/strategies/analytics_data_loading_strategy_factory.dart @@ -1,4 +1,5 @@ import 'package:syncrow_web/pages/analytics/modules/analytics/enums/analytics_page_tab.dart'; +import 'package:syncrow_web/pages/analytics/modules/analytics/strategies/air_quality_data_loading_strategy.dart'; import 'package:syncrow_web/pages/analytics/modules/analytics/strategies/analytics_data_loading_strategy.dart'; import 'package:syncrow_web/pages/analytics/modules/analytics/strategies/energy_management_data_loading_strategy.dart'; import 'package:syncrow_web/pages/analytics/modules/analytics/strategies/occupancy_data_loading_strategy.dart'; @@ -9,6 +10,7 @@ abstract final class AnalyticsDataLoadingStrategyFactory { return switch (tab) { AnalyticsPageTab.energyManagement => EnergyManagementDataLoadingStrategy(), AnalyticsPageTab.occupancy => OccupancyDataLoadingStrategy(), + AnalyticsPageTab.airQuality => AirQualityDataLoadingStrategy(), }; } } 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 1e251a41..e73b5179 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,7 +14,6 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg CommunityModel community, List spaces, ) { - // Add to space tree bloc first context.read().add( OnCommunitySelected( community.uuid, @@ -69,7 +68,7 @@ class EnergyManagementDataLoadingStrategy implements AnalyticsDataLoadingStrateg CommunityModel community, SpaceModel child, ) { - // Do nothing else as per original implementation + return onSpaceSelected(context, community, child); } @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 fb93ec30..5241564c 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 @@ -14,23 +14,7 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy { CommunityModel community, List spaces, ) { - context.read().add( - OnCommunitySelected( - community.uuid, - spaces.isNotEmpty ? [spaces.first] : [], - ), - ); - - final spaceTreeState = context.read().state; - if (spaceTreeState.selectedCommunities.contains(community.uuid)) { - clearData(context); - return; - } - FetchOccupancyDataHelper.loadOccupancyData( - context, - communityId: community.uuid, - spaceId: spaces.isNotEmpty ? spaces.first.uuid ?? '' : '', - ); + // Do Nothing } @override @@ -40,26 +24,17 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy { SpaceModel space, ) { final spaceTreeBloc = context.read(); - final selectedSpacesIds = spaceTreeBloc.state.selectedSpaces; - final isSpaceSelected = selectedSpacesIds.contains(space.uuid); + final isSpaceSelected = spaceTreeBloc.state.selectedSpaces.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 ?? '', [])); - } - - final spaceTreeState = context.read().state; - if (spaceTreeState.selectedCommunities.contains(community.uuid) || - spaceTreeState.selectedSpaces.contains(space.uuid)) { + if (isSpaceSelected) { clearData(context); return; } + spaceTreeBloc + ..add(const SpaceTreeClearSelectionEvent()) + ..add(OnSpaceSelected(community, space.uuid ?? '', [])); + FetchOccupancyDataHelper.loadOccupancyData( context, communityId: community.uuid, @@ -73,7 +48,7 @@ class OccupancyDataLoadingStrategy implements AnalyticsDataLoadingStrategy { CommunityModel community, SpaceModel child, ) { - // Do nothing + return onSpaceSelected(context, community, child); } @override diff --git a/lib/pages/analytics/modules/analytics/views/analytics_page.dart b/lib/pages/analytics/modules/analytics/views/analytics_page.dart index 72cc7d51..18f86a90 100644 --- a/lib/pages/analytics/modules/analytics/views/analytics_page.dart +++ b/lib/pages/analytics/modules/analytics/views/analytics_page.dart @@ -17,7 +17,7 @@ import 'package:syncrow_web/pages/analytics/services/analytics_devices/remote_en import 'package:syncrow_web/pages/analytics/services/analytics_devices/remote_occupancy_analytics_devices_service.dart'; import 'package:syncrow_web/pages/analytics/services/energy_consumption_by_phases/remote_energy_consumption_by_phases_service.dart'; import 'package:syncrow_web/pages/analytics/services/energy_consumption_per_device/remote_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/occupacy/remote_occupancy_service.dart'; import 'package:syncrow_web/pages/analytics/services/occupancy_heat_map/remote_occupancy_heat_map_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'; @@ -75,7 +75,11 @@ class _AnalyticsPageState extends State { FirebaseRealtimeDeviceService(), ), ), - BlocProvider(create: (context) => OccupancyBloc(FakeOccupacyService())), + BlocProvider( + create: (context) => OccupancyBloc( + RemoteOccupancyService(_httpService), + ), + ), BlocProvider( create: (context) => OccupancyHeatMapBloc( RemoteOccupancyHeatMapService(_httpService), diff --git a/lib/pages/analytics/modules/energy_management/helpers/energy_management_charts_helper.dart b/lib/pages/analytics/modules/energy_management/helpers/energy_management_charts_helper.dart index 567e03ed..11c088e8 100644 --- a/lib/pages/analytics/modules/energy_management/helpers/energy_management_charts_helper.dart +++ b/lib/pages/analytics/modules/energy_management/helpers/energy_management_charts_helper.dart @@ -38,7 +38,7 @@ abstract final class EnergyManagementChartsHelper { sideTitles: SideTitles( showTitles: true, maxIncluded: false, - minIncluded: true, + minIncluded: false, interval: leftTitlesInterval, reservedSize: 110, getTitlesWidget: (value, meta) => Padding( @@ -50,7 +50,7 @@ abstract final class EnergyManagementChartsHelper { value.formatNumberToKwh, style: context.textTheme.bodySmall?.copyWith( fontSize: 12, - color: ColorsManager.greyColor, + color: ColorsManager.lightGreyColor, ), ), ), diff --git a/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_by_phases_chart.dart b/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_by_phases_chart.dart index 1497d0fd..001f4d2c 100644 --- a/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_by_phases_chart.dart +++ b/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_by_phases_chart.dart @@ -170,7 +170,7 @@ class EnergyConsumptionByPhasesChart extends StatelessWidget { child: Text( month, style: context.textTheme.bodySmall?.copyWith( - color: ColorsManager.greyColor, + color: ColorsManager.lightGreyColor, fontSize: 11, ), ), diff --git a/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_by_phases_chart_box.dart b/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_by_phases_chart_box.dart index 1766266c..1bd1ed9e 100644 --- a/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_by_phases_chart_box.dart +++ b/lib/pages/analytics/modules/energy_management/widgets/energy_consumption_by_phases_chart_box.dart @@ -19,10 +19,12 @@ class EnergyConsumptionByPhasesChartBox extends StatelessWidget { decoration: secondarySection, child: Column( mainAxisSize: MainAxisSize.min, - spacing: 20, children: [ AnalyticsErrorWidget(state.errorMessage), - EnergyConsumptionByPhasesTitle(isLoading: state.status == EnergyConsumptionByPhasesStatus.loading,), + EnergyConsumptionByPhasesTitle( + isLoading: state.status == EnergyConsumptionByPhasesStatus.loading, + ), + const SizedBox(height: 20), Expanded( child: EnergyConsumptionByPhasesChart( energyData: state.chartData, diff --git a/lib/pages/analytics/modules/energy_management/widgets/power_clamp_energy_data_widget.dart b/lib/pages/analytics/modules/energy_management/widgets/power_clamp_energy_data_widget.dart index 8ae6cd7f..e8f802cd 100644 --- a/lib/pages/analytics/modules/energy_management/widgets/power_clamp_energy_data_widget.dart +++ b/lib/pages/analytics/modules/energy_management/widgets/power_clamp_energy_data_widget.dart @@ -69,13 +69,18 @@ class PowerClampEnergyDataWidget extends StatelessWidget { PowerClampEnergyStatus( iconPath: Assets.powerActiveIcon, title: 'Active', - value: _valueFromCode('EnergyConsumed', generalDataPoints), + value: _valueFromCode('ActivePower', generalDataPoints), unit: 'W', ), PowerClampEnergyStatus( iconPath: Assets.voltMeterIcon, title: 'Current', - value: _valueFromCode('Current', generalDataPoints), + value: _valueFromCode('Current', generalDataPoints) + .replaceAllMapped( + RegExp(r'(\d{1,3})(?=(\d{3})+(?!\d))'), + (Match m) => '${m[1]}.', + ) + .replaceAll('.0', ''), unit: 'A', ), PowerClampEnergyStatus( diff --git a/lib/pages/analytics/modules/energy_management/widgets/power_clamp_phases_data_widget.dart b/lib/pages/analytics/modules/energy_management/widgets/power_clamp_phases_data_widget.dart index 1cb20aac..a96a7298 100644 --- a/lib/pages/analytics/modules/energy_management/widgets/power_clamp_phases_data_widget.dart +++ b/lib/pages/analytics/modules/energy_management/widgets/power_clamp_phases_data_widget.dart @@ -55,7 +55,7 @@ class PowerClampPhasesDataWidget extends StatelessWidget { iconPath: Assets.powerActiveIcon, title: 'Active Power', value: _valueFromCode( - code: 'ReactivePower$phaseSuffix', + code: 'ActivePower$phaseSuffix', points: phase?.dataPoints, ), unit: 'W', @@ -125,7 +125,48 @@ class PowerClampPhasesDataWidget extends StatelessWidget { (e) => e.code == code, orElse: () => DataPoint(value: '--'), ); + final value = element?.value; + if (code.contains('Current')) { + return _formatCurrentValue(value?.toString()); + } + if (code.contains('PowerFactor')) { + return _formatPowerFactor(value?.toString()); + } + if (code.contains('Voltage')) { + return _formatVoltage(value?.toString()); + } + return value?.toString() ?? '--'; + } - return element?.value.toString() ?? '--'; + String _formatCurrentValue(String? value) { + if (value == null) return '--'; + String str = value; + if (str.isEmpty || str == '--') return '--'; + str = str.replaceAll(RegExp(r'[^0-9]'), ''); + if (str.isEmpty) return '--'; + if (str.length == 1) return '${str[0]}.0'; + return '${str[0]}.${str.substring(1)}'; + } + + String _formatPowerFactor(String? value) { + if (value == null) return '--'; + String str = value; + if (str.isEmpty || str == '--') return '--'; + str = str.replaceAll(RegExp(r'[^0-9]'), ''); + if (str.isEmpty) return '--'; + final intValue = int.tryParse(str); + if (intValue == null) return '--'; + final doubleValue = intValue / 100; + return doubleValue.toStringAsFixed(2); + } + + String _formatVoltage(String? value) { + if (value == null) return '--'; + String str = value; + if (str.isEmpty || str == '--') return '--'; + str = str.replaceAll(RegExp(r'[^0-9]'), ''); + if (str.isEmpty) return '--'; + if (str.length == 1) return '0.${str[0]}'; + return '${str.substring(0, str.length - 1)}.${str.substring(str.length - 1)}'; } } 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 5882ada5..0b01fda2 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 @@ -30,7 +30,6 @@ abstract final class FetchOccupancyDataHelper { loadOccupancyChartData( context, - communityUuid: communityId, spaceUuid: spaceId, date: datePickerState.monthlyDate, ); @@ -59,16 +58,14 @@ abstract final class FetchOccupancyDataHelper { static void loadOccupancyChartData( BuildContext context, { - required String communityUuid, required String spaceUuid, required DateTime date, }) { context.read().add( LoadOccupancyEvent( GetOccupancyParam( - monthDate: '${date.year}-${date.month}', + monthDate: '${date.year}-${date.month.toString().padLeft(2, '0')}', spaceUuid: spaceUuid, - communityUuid: communityUuid, ), ), ); diff --git a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart.dart b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart.dart index 3e362f5d..4ff85841 100644 --- a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart.dart +++ b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart.dart @@ -16,10 +16,10 @@ class OccupancyChart extends StatelessWidget { Widget build(BuildContext context) { return BarChart( BarChartData( - maxY: 1.0, + maxY: 100.0, gridData: EnergyManagementChartsHelper.gridData().copyWith( checkToShowHorizontalLine: (value) => true, - horizontalInterval: 0.2, + horizontalInterval: 20, ), borderData: EnergyManagementChartsHelper.borderData(), barTouchData: _barTouchData(context), @@ -33,20 +33,21 @@ class OccupancyChart extends StatelessWidget { ), barGroups: List.generate(chartData.length, (index) { final actual = chartData[index]; + final occupancyValue = double.parse(actual.occupancy); return BarChartGroupData( x: index, barsSpace: 0, groupVertically: true, barRods: [ BarChartRodData( - toY: 1.0, - fromY: double.parse(actual.occupancy) + 0.025, + toY: 100.0, + fromY: occupancyValue == 0 ? occupancyValue : occupancyValue + 2.5, color: ColorsManager.graysColor, width: _chartWidth, borderRadius: BorderRadius.circular(10), ), BarChartRodData( - toY: double.parse(actual.occupancy), + toY: occupancyValue, color: ColorsManager.vividBlue.withValues(alpha: 0.8), width: _chartWidth, borderRadius: BorderRadius.circular(10), @@ -88,7 +89,7 @@ class OccupancyChart extends StatelessWidget { final data = chartData; final occupancyValue = double.parse(data[group.x.toInt()].occupancy); - final percentage = '${(occupancyValue * 100).toStringAsFixed(0)}%'; + final percentage = '${(occupancyValue).toStringAsFixed(0)}%'; return BarTooltipItem( percentage, @@ -108,14 +109,14 @@ class OccupancyChart extends StatelessWidget { final leftTitles = titlesData.leftTitles.copyWith( sideTitles: titlesData.leftTitles.sideTitles.copyWith( reservedSize: 70, - interval: 0.2, + interval: 20, getTitlesWidget: (value, meta) => Padding( padding: const EdgeInsetsDirectional.only(end: 12), child: FittedBox( alignment: AlignmentDirectional.centerStart, fit: BoxFit.scaleDown, child: Text( - '${(value * 100).toStringAsFixed(0)}%', + '${(value).toStringAsFixed(0)}%', style: context.textTheme.bodySmall?.copyWith( fontSize: 12, color: ColorsManager.greyColor, 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 8c41da48..ab1d1699 100644 --- a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart +++ b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart @@ -50,9 +50,6 @@ class OccupancyChartBox extends StatelessWidget { if (spaceTreeState.selectedSpaces.isNotEmpty) { FetchOccupancyDataHelper.loadOccupancyChartData( context, - communityUuid: - spaceTreeState.selectedCommunities.firstOrNull ?? - '', spaceUuid: spaceTreeState.selectedSpaces.firstOrNull ?? '', date: value, diff --git a/lib/pages/analytics/params/get_occupancy_param.dart b/lib/pages/analytics/params/get_occupancy_param.dart index ed1b9375..b083197b 100644 --- a/lib/pages/analytics/params/get_occupancy_param.dart +++ b/lib/pages/analytics/params/get_occupancy_param.dart @@ -1,19 +1,11 @@ class GetOccupancyParam { final String monthDate; final String? spaceUuid; - final String communityUuid; GetOccupancyParam({ required this.monthDate, required this.spaceUuid, - required this.communityUuid, }); - Map toJson() { - return { - 'monthDate': monthDate, - 'spaceUuid': spaceUuid, - 'communityUuid': communityUuid, - }; - } + Map toJson() => {'monthDate': monthDate}; } diff --git a/lib/pages/analytics/services/occupacy/fake_occupacy_service.dart b/lib/pages/analytics/services/occupacy/fake_occupacy_service.dart deleted file mode 100644 index 503a358b..00000000 --- a/lib/pages/analytics/services/occupacy/fake_occupacy_service.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:syncrow_web/pages/analytics/models/occupacy.dart'; -import 'package:syncrow_web/pages/analytics/params/get_occupancy_param.dart'; -import 'package:syncrow_web/pages/analytics/services/occupacy/occupacy_service.dart'; - -class FakeOccupacyService implements OccupacyService { - @override - Future> load(GetOccupancyParam param) async { - return await Future.delayed( - const Duration(seconds: 1), - () => List.generate( - 30, - (index) => Occupacy( - date: DateTime.now().subtract(Duration(days: index)).toString(), - occupancy: ((index / 100)).toString(), - ), - ), - ); - } -} diff --git a/lib/pages/analytics/services/occupacy/remote_occupancy_service.dart b/lib/pages/analytics/services/occupacy/remote_occupancy_service.dart new file mode 100644 index 00000000..b8cce70a --- /dev/null +++ b/lib/pages/analytics/services/occupacy/remote_occupancy_service.dart @@ -0,0 +1,32 @@ +import 'package:syncrow_web/pages/analytics/models/occupacy.dart'; +import 'package:syncrow_web/pages/analytics/params/get_occupancy_param.dart'; +import 'package:syncrow_web/pages/analytics/services/occupacy/occupacy_service.dart'; +import 'package:syncrow_web/services/api/http_service.dart'; + +final class RemoteOccupancyService implements OccupacyService { + const RemoteOccupancyService(this._httpService); + + final HTTPService _httpService; + + @override + Future> load(GetOccupancyParam param) async { + try { + final response = await _httpService.get( + path: '/occupancy/duration/space/${param.spaceUuid}', + showServerMessage: true, + queryParameters: param.toJson(), + expectedResponseModel: (data) { + final json = data as Map? ?? {}; + final mappedData = json['data'] as List? ?? []; + return mappedData.map((e) { + final jsonData = e as Map; + return Occupacy.fromJson(jsonData); + }).toList(); + }, + ); + return response; + } catch (e) { + throw Exception('Failed to load energy consumption per phase: $e'); + } + } +} \ No newline at end of file diff --git a/lib/pages/common/custom_table.dart b/lib/pages/common/custom_table.dart index 3ec902ef..04334393 100644 --- a/lib/pages/common/custom_table.dart +++ b/lib/pages/common/custom_table.dart @@ -112,8 +112,8 @@ class _DynamicTableState extends State { trackVisibility: true, child: Scrollbar( controller: _horizontalScrollController, - thumbVisibility: false, - trackVisibility: false, + thumbVisibility: true, + trackVisibility: true, notificationPredicate: (notif) => notif.depth == 1, child: SingleChildScrollView( controller: _verticalScrollController, diff --git a/lib/pages/home/bloc/home_bloc.dart b/lib/pages/home/bloc/home_bloc.dart index 33d55628..f6aab9eb 100644 --- a/lib/pages/home/bloc/home_bloc.dart +++ b/lib/pages/home/bloc/home_bloc.dart @@ -11,16 +11,11 @@ import 'package:syncrow_web/pages/routines/bloc/routine_bloc/routine_bloc.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_event.dart'; import 'package:syncrow_web/services/home_api.dart'; -import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/constants/routes_const.dart'; import 'package:syncrow_web/utils/navigation_service.dart'; class HomeBloc extends Bloc { - // final Graph graph = Graph()..isTree = true; - // final BuchheimWalkerConfiguration builder = BuchheimWalkerConfiguration(); - // List sourcesList = []; - // List destinationsList = []; UserModel? user; String terms = ''; String policy = ''; @@ -33,22 +28,6 @@ class HomeBloc extends Bloc { on(_confirmUserAgreement); } - // void _createNode(CreateNewNode event, Emitter emit) async { - // emit(HomeInitial()); - // sourcesList.add(event.sourceNode); - // destinationsList.add(event.destinationNode); - // for (int i = 0; i < sourcesList.length; i++) { - // graph.addEdge(sourcesList[i], destinationsList[i]); - // } - - // builder - // ..siblingSeparation = (100) - // ..levelSeparation = (150) - // ..subtreeSeparation = (150) - // ..orientation = (BuchheimWalkerConfiguration.ORIENTATION_TOP_BOTTOM); - // emit(HomeUpdateTree(graph: graph, builder: builder)); - // } - Future _fetchUserInfo(FetchUserInfo event, Emitter emit) async { try { var uuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey); @@ -99,16 +78,6 @@ class HomeBloc extends Bloc { } } -// static Future fetchUserInfo() async { -// try { -// var uuid = -// await const FlutterSecureStorage().read(key: UserModel.userUuidKey); -// user = await HomeApi().fetchUserInfo(uuid); -// } catch (e) { -// return; -// } -// } - List homeItems = [ HomeItemModel( title: 'Access Management', @@ -118,7 +87,7 @@ class HomeBloc extends Bloc { context.read().add(ClearCachedData()); context.go(RoutesConst.accessManagementPage); }, - color: null, + color: const Color(0xFF0036E6), ), HomeItemModel( title: 'Space Management', @@ -128,7 +97,7 @@ class HomeBloc extends Bloc { context.read().add(ClearCachedData()); context.go(RoutesConst.spacesManagementPage); }, - color: ColorsManager.primaryColor, + color: const Color(0xFF0026A2), ), HomeItemModel( title: 'Devices Management', @@ -140,12 +109,11 @@ class HomeBloc extends Bloc { .add(const TriggerSwitchTabsEvent(isRoutineTab: false)); context.go(RoutesConst.deviceManagementPage); }, - color: ColorsManager.primaryColor, + color: const Color(0xFF00165E), ), - HomeItemModel( title: 'Syncrow Analytics', - icon: Assets.devicesIcon, + icon: Assets.analyticsIcon, active: true, onPress: (context) { context.read().add(ClearCachedData()); @@ -153,43 +121,7 @@ class HomeBloc extends Bloc { .add(const TriggerSwitchTabsEvent(isRoutineTab: false)); context.go(RoutesConst.analytics); }, - color: ColorsManager.primaryColor, + color: const Color(0xFF023DFE), ), - - // HomeItemModel( - // title: 'Move in', - // icon: Assets.moveinIcon, - // active: false, - // onPress: (context) {}, - // color: ColorsManager.primaryColor, - // ), - // HomeItemModel( - // title: 'Construction', - // icon: Assets.constructionIcon, - // active: false, - // onPress: (context) {}, - // color: ColorsManager.primaryColor, - // ), - // HomeItemModel( - // title: 'Energy', - // icon: Assets.energyIcon, - // active: false, - // onPress: (context) {}, - // color: ColorsManager.slidingBlueColor.withOpacity(0.2), - // ), - // HomeItemModel( - // title: 'Integrations', - // icon: Assets.integrationsIcon, - // active: false, - // onPress: (context) {}, - // color: ColorsManager.slidingBlueColor.withOpacity(0.2), - // ), - // HomeItemModel( - // title: 'Asset', - // icon: Assets.assetIcon, - // active: false, - // onPress: (context) {}, - // color: ColorsManager.slidingBlueColor.withOpacity(0.2), - // ), ]; } diff --git a/lib/pages/home/view/home_card.dart b/lib/pages/home/view/home_card.dart index d2e71608..ef3bd8de 100644 --- a/lib/pages/home/view/home_card.dart +++ b/lib/pages/home/view/home_card.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:syncrow_web/utils/color_manager.dart'; class HomeCard extends StatelessWidget { final bool active; @@ -8,6 +7,7 @@ class HomeCard extends StatelessWidget { final int index; final String name; final Function()? onTap; + final Color? color; const HomeCard({ super.key, required this.name, @@ -15,28 +15,16 @@ class HomeCard extends StatelessWidget { this.active = false, required this.img, required this.onTap, + required this.color, }); @override Widget build(BuildContext context) { - // bool evenNumbers = index % 2 == 0; return InkWell( onTap: active ? onTap : null, child: Container( padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10), decoration: BoxDecoration( - color: index == 0 && active - ? ColorsManager.blue1.withOpacity(0.9) - : index == 1 && active - ? ColorsManager.blue2.withOpacity(0.9) - : index == 2 && active - ? ColorsManager.blue3 - : index == 4 && active == false - ? ColorsManager.blue4.withOpacity(0.2) - : index == 7 && active == false - ? ColorsManager.blue4.withOpacity(0.2) - : ColorsManager.blueColor.withOpacity(0.2), - // (active ?ColorsManager.blueColor - // : ColorsManager.blueColor.withOpacity(0.2)), + color: color, borderRadius: BorderRadius.circular(30), ), child: Column( @@ -64,15 +52,9 @@ class HomeCard extends StatelessWidget { ), const SizedBox(height: 10), Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - SizedBox( - child: SvgPicture.asset( - img, - ), - ), - ], + child: Align( + alignment: AlignmentDirectional.bottomEnd, + child: SvgPicture.asset(img), ), ), ], diff --git a/lib/pages/home/view/home_page_mobile.dart b/lib/pages/home/view/home_page_mobile.dart index d0719c3e..ad019ea8 100644 --- a/lib/pages/home/view/home_page_mobile.dart +++ b/lib/pages/home/view/home_page_mobile.dart @@ -50,7 +50,7 @@ class HomeMobilePage extends StatelessWidget { height: size.height * 0.6, width: size.width * 0.68, child: GridView.builder( - itemCount: homeItems.length, + itemCount: homeBloc.homeItems.length, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, @@ -61,7 +61,8 @@ class HomeMobilePage extends StatelessWidget { itemBuilder: (context, index) { return HomeCard( index: index, - active: homeBloc.homeItems[index].active!, + active: true, + color: homeBloc.homeItems[index].color, name: homeBloc.homeItems[index].title!, img: homeBloc.homeItems[index].icon!, onTap: () => @@ -78,56 +79,4 @@ class HomeMobilePage extends StatelessWidget { ), ); } - - final dynamic homeItems = [ - { - 'title': 'Access', - 'icon': Assets.accessIcon, - 'active': true, - }, - { - 'title': 'Space\nManagement', - 'icon': Assets.spaseManagementIcon, - 'color': ColorsManager.primaryColor, - 'active': true, - }, - { - 'title': 'Devices', - 'icon': Assets.devicesIcon, - 'active': true, - }, - { - 'title': 'Syncrow Analytics', - 'icon': Assets.iconEdit, - 'active': true, - }, - // { - // 'title': 'Move in', - // 'icon': Assets.moveinIcon, - // 'active': false, - // }, - // { - // 'title': 'Construction', - // 'icon': Assets.constructionIcon, - // 'active': false, - // }, - // { - // 'title': 'Energy', - // 'icon': Assets.energyIcon, - // 'color': ColorsManager.slidingBlueColor.withOpacity(0.2), - // 'active': false, - // }, - // { - // 'title': 'Integrations', - // 'icon': Assets.integrationsIcon, - // 'color': ColorsManager.slidingBlueColor.withOpacity(0.2), - // 'active': false, - // }, - // { - // 'title': 'Asset', - // 'icon': Assets.assetIcon, - // 'color': ColorsManager.slidingBlueColor.withOpacity(0.2), - // 'active': false, - // }, - ]; } diff --git a/lib/pages/home/view/home_page_web.dart b/lib/pages/home/view/home_page_web.dart index 9a59f51c..fb35fa04 100644 --- a/lib/pages/home/view/home_page_web.dart +++ b/lib/pages/home/view/home_page_web.dart @@ -106,6 +106,7 @@ class _HomeWebPageState extends State { ), itemBuilder: (context, index) { return HomeCard( + color: homeBloc.homeItems[index].color, index: index, active: homeBloc.homeItems[index].active!, name: homeBloc.homeItems[index].title!, diff --git a/lib/pages/visitor_password/view/visitor_password_dialog.dart b/lib/pages/visitor_password/view/visitor_password_dialog.dart index 4db5017c..1e43af46 100644 --- a/lib/pages/visitor_password/view/visitor_password_dialog.dart +++ b/lib/pages/visitor_password/view/visitor_password_dialog.dart @@ -32,13 +32,13 @@ class VisitorPasswordDialog extends StatelessWidget { .stateDialog( context: context, message: 'Password Created Successfully', - title: 'Send Success', + title: 'Sent Successfully', widgeta: Column( children: [ if (visitorBloc.passwordStatus!.failedOperations.isNotEmpty) Column( children: [ - const Text('Failed Devises'), + const Text('Failed Devices'), SizedBox( width: 200, height: 50, @@ -63,7 +63,7 @@ class VisitorPasswordDialog extends StatelessWidget { if (visitorBloc.passwordStatus!.successOperations.isNotEmpty) Column( children: [ - const Text('Success Devises'), + const Text('Success Devices'), SizedBox( width: 200, height: 50, @@ -95,7 +95,7 @@ class VisitorPasswordDialog extends StatelessWidget { visitorBloc.stateDialog( context: context, message: state.message, - title: 'Something Wrong', + title: 'Something went wrong', ); } }, diff --git a/lib/utils/constants/assets.dart b/lib/utils/constants/assets.dart index 8707e7fd..13d51ea5 100644 --- a/lib/utils/constants/assets.dart +++ b/lib/utils/constants/assets.dart @@ -2,6 +2,7 @@ class Assets { Assets._(); static const String background = "assets/images/Background.png"; static const String webBackground = "assets/images/web_Background.svg"; + static const String webBackgroundPng = "assets/images/web_Background.png"; static const String blackLogo = "assets/images/black-logo.png"; static const String logo = "assets/images/Logo.svg"; static const String logoHorizontal = "assets/images/logo_horizontal.png"; @@ -13,13 +14,14 @@ class Assets { static const String rightLine = "assets/images/right_line.png"; static const String google = "assets/images/google.svg"; static const String facebook = "assets/images/facebook.svg"; - static const String invisiblePassword = - "assets/images/Password_invisible.svg"; + static const String invisiblePassword = "assets/images/Password_invisible.svg"; static const String visiblePassword = "assets/images/password_visible.svg"; static const String accessIcon = "assets/images/access_icon.svg"; static const String spaseManagementIcon = "assets/images/spase_management_icon.svg"; static const String devicesIcon = "assets/images/devices_icon.svg"; + static const String analyticsIcon = "assets/icons/landing_analytics.svg"; + static const String moveinIcon = "assets/images/movein_icon.svg"; static const String constructionIcon = "assets/images/construction_icon.svg"; static const String energyIcon = "assets/images/energy_icon.svg"; @@ -31,8 +33,7 @@ class Assets { static const String emptyTable = "assets/images/empty_table.svg"; // General assets - static const String motionlessDetection = - "assets/icons/motionless_detection.svg"; + static const String motionlessDetection = "assets/icons/motionless_detection.svg"; static const String acHeating = "assets/icons/ac_heating.svg"; static const String acPowerOff = "assets/icons/ac_power_off.svg"; static const String acFanMiddle = "assets/icons/ac_fan_middle.svg"; @@ -69,22 +70,19 @@ class Assets { "assets/icons/automation_functions/temp_password_unlock.svg"; static const String doorlockNormalOpen = "assets/icons/automation_functions/doorlock_normal_open.svg"; - static const String doorbell = - "assets/icons/automation_functions/doorbell.svg"; + static const String doorbell = "assets/icons/automation_functions/doorbell.svg"; static const String remoteUnlockViaApp = "assets/icons/automation_functions/remote_unlock_via_app.svg"; static const String doubleLock = "assets/icons/automation_functions/double_lock.svg"; static const String selfTestResult = "assets/icons/automation_functions/self_test_result.svg"; - static const String lockAlarm = - "assets/icons/automation_functions/lock_alarm.svg"; + static const String lockAlarm = "assets/icons/automation_functions/lock_alarm.svg"; static const String presenceState = "assets/icons/automation_functions/presence_state.svg"; static const String currentTemp = "assets/icons/automation_functions/current_temp.svg"; - static const String presence = - "assets/icons/automation_functions/presence.svg"; + static const String presence = "assets/icons/automation_functions/presence.svg"; static const String residualElectricity = "assets/icons/automation_functions/residual_electricity.svg"; static const String hijackAlarm = @@ -101,15 +99,12 @@ class Assets { // Presence Sensor Assets static const String sensorMotionIcon = "assets/icons/sensor_motion_ic.svg"; - static const String sensorPresenceIcon = - "assets/icons/sensor_presence_ic.svg"; + static const String sensorPresenceIcon = "assets/icons/sensor_presence_ic.svg"; static const String sensorVacantIcon = "assets/icons/sensor_vacant_ic.svg"; static const String illuminanceRecordIcon = "assets/icons/illuminance_record_ic.svg"; - static const String presenceRecordIcon = - "assets/icons/presence_record_ic.svg"; - static const String helpDescriptionIcon = - "assets/icons/help_description_ic.svg"; + static const String presenceRecordIcon = "assets/icons/presence_record_ic.svg"; + static const String helpDescriptionIcon = "assets/icons/help_description_ic.svg"; static const String lightPulp = "assets/icons/light_pulb.svg"; static const String acDevice = "assets/icons/ac_device.svg"; @@ -159,12 +154,10 @@ class Assets { static const String unit = 'assets/icons/unit_icon.svg'; static const String villa = 'assets/icons/villa_icon.svg'; static const String iconEdit = 'assets/icons/icon_edit_icon.svg'; - static const String textFieldSearch = - 'assets/icons/textfield_search_icon.svg'; + static const String textFieldSearch = 'assets/icons/textfield_search_icon.svg'; static const String roundedAddIcon = 'assets/icons/rounded_add_icon.svg'; static const String addIcon = 'assets/icons/add_icon.svg'; - static const String smartThermostatIcon = - 'assets/icons/smart_thermostat_icon.svg'; + static const String smartThermostatIcon = 'assets/icons/smart_thermostat_icon.svg'; static const String smartLightIcon = 'assets/icons/smart_light_icon.svg'; static const String presenceSensor = 'assets/icons/presence_sensor.svg'; static const String Gang3SwitchIcon = 'assets/icons/3_Gang_switch_icon.svg'; @@ -212,8 +205,7 @@ class Assets { //assets/icons/water_leak_normal.svg static const String waterLeakNormal = 'assets/icons/water_leak_normal.svg'; //assets/icons/water_leak_detected.svg - static const String waterLeakDetected = - 'assets/icons/water_leak_detected.svg'; + static const String waterLeakDetected = 'assets/icons/water_leak_detected.svg'; //assets/icons/automation_records.svg static const String automationRecords = 'assets/icons/automation_records.svg'; @@ -284,16 +276,13 @@ class Assets { "assets/icons/functions_icons/sensitivity.svg"; static const String assetsSensitivityOperationIcon = "assets/icons/functions_icons/sesitivity_operation_icon.svg"; - static const String assetsAcPower = - "assets/icons/functions_icons/ac_power.svg"; + static const String assetsAcPower = "assets/icons/functions_icons/ac_power.svg"; static const String assetsAcPowerOFF = "assets/icons/functions_icons/ac_power_off.svg"; static const String assetsChildLock = "assets/icons/functions_icons/child_lock.svg"; - static const String assetsFreezing = - "assets/icons/functions_icons/freezing.svg"; - static const String assetsFanSpeed = - "assets/icons/functions_icons/fan_speed.svg"; + static const String assetsFreezing = "assets/icons/functions_icons/freezing.svg"; + static const String assetsFanSpeed = "assets/icons/functions_icons/fan_speed.svg"; static const String assetsAcCooling = "assets/icons/functions_icons/ac_cooling.svg"; static const String assetsAcHeating = @@ -302,8 +291,7 @@ class Assets { "assets/icons/functions_icons/celsius_degrees.svg"; static const String assetsTempreture = "assets/icons/functions_icons/tempreture.svg"; - static const String assetsAcFanLow = - "assets/icons/functions_icons/ac_fan_low.svg"; + static const String assetsAcFanLow = "assets/icons/functions_icons/ac_fan_low.svg"; static const String assetsAcFanMiddle = "assets/icons/functions_icons/ac_fan_middle.svg"; static const String assetsAcFanHigh = @@ -322,8 +310,7 @@ class Assets { "assets/icons/functions_icons/far_detection.svg"; static const String assetsFarDetectionFunction = "assets/icons/functions_icons/far_detection_function.svg"; - static const String assetsIndicator = - "assets/icons/functions_icons/indicator.svg"; + static const String assetsIndicator = "assets/icons/functions_icons/indicator.svg"; static const String assetsMotionDetection = "assets/icons/functions_icons/motion_detection.svg"; static const String assetsMotionlessDetection = @@ -336,8 +323,7 @@ class Assets { "assets/icons/functions_icons/master_state.svg"; static const String assetsSwitchAlarmSound = "assets/icons/functions_icons/switch_alarm_sound.svg"; - static const String assetsResetOff = - "assets/icons/functions_icons/reset_off.svg"; + static const String assetsResetOff = "assets/icons/functions_icons/reset_off.svg"; // Assets for automation_functions static const String assetsCardUnlock = @@ -381,14 +367,12 @@ class Assets { static const String activeUser = 'assets/icons/active_user.svg'; static const String deActiveUser = 'assets/icons/deactive_user.svg'; static const String invitedIcon = 'assets/icons/invited_icon.svg'; - static const String rectangleCheckBox = - 'assets/icons/rectangle_check_box.png'; + static const String rectangleCheckBox = 'assets/icons/rectangle_check_box.png'; static const String CheckBoxChecked = 'assets/icons/box_checked.png'; static const String emptyBox = 'assets/icons/empty_box.png'; static const String completeProcessIcon = 'assets/icons/compleate_process_icon.svg'; - static const String currentProcessIcon = - 'assets/icons/current_process_icon.svg'; + static const String currentProcessIcon = 'assets/icons/current_process_icon.svg'; static const String uncomplete_ProcessIcon = 'assets/icons/uncompleate_process_icon.svg'; static const String wrongProcessIcon = 'assets/icons/wrong_process_icon.svg'; @@ -409,11 +393,9 @@ class Assets { static const String successIcon = 'assets/icons/success_icon.svg'; static const String spaceLocationIcon = 'assets/icons/spaseLocationIcon.svg'; static const String scenesPlayIcon = 'assets/icons/scenesPlayIcon.png'; - static const String scenesPlayIconCheck = - 'assets/icons/scenesPlayIconCheck.png'; + static const String scenesPlayIconCheck = 'assets/icons/scenesPlayIconCheck.png'; static const String presenceStateIcon = 'assets/icons/presence_state.svg'; - static const String currentDistanceIcon = - 'assets/icons/current_distance_icon.svg'; + static const String currentDistanceIcon = 'assets/icons/current_distance_icon.svg'; static const String farDetectionIcon = 'assets/icons/far_detection_icon.svg'; static const String motionDetectionSensitivityIcon = @@ -436,44 +418,29 @@ class Assets { static const String cpsMode4 = 'assets/icons/cps_mode4.svg'; static const String closeToMotion = 'assets/icons/close_to_motion.svg'; static const String farAwayMotion = 'assets/icons/far_away_motion.svg'; - static const String communicationFault = - 'assets/icons/communication_fault.svg'; + static const String communicationFault = 'assets/icons/communication_fault.svg'; static const String radarFault = 'assets/icons/radar_fault.svg'; - static const String selfTestingSuccess = - 'assets/icons/self_testing_success.svg'; - static const String selfTestingFailure = - 'assets/icons/self_testing_failure.svg'; - static const String selfTestingTimeout = - 'assets/icons/self_testing_timeout.svg'; + static const String selfTestingSuccess = 'assets/icons/self_testing_success.svg'; + static const String selfTestingFailure = 'assets/icons/self_testing_failure.svg'; + static const String selfTestingTimeout = 'assets/icons/self_testing_timeout.svg'; static const String movingSpeed = 'assets/icons/moving_speed.svg'; static const String boundary = 'assets/icons/boundary.svg'; static const String motionMeter = 'assets/icons/motion_meter.svg'; - static const String spatialStaticValue = - 'assets/icons/spatial_static_value.svg'; - static const String spatialMotionValue = - 'assets/icons/spatial_motion_value.svg'; + static const String spatialStaticValue = 'assets/icons/spatial_static_value.svg'; + static const String spatialMotionValue = 'assets/icons/spatial_motion_value.svg'; static const String presenceJudgementThrshold = 'assets/icons/presence_judgement_threshold.svg'; static const String spaceType = 'assets/icons/space_type.svg'; static const String sportsPara = 'assets/icons/sports_para.svg'; - static const String sensitivityFeature1 = - 'assets/icons/sensitivity_feature_1.svg'; - static const String sensitivityFeature2 = - 'assets/icons/sensitivity_feature_2.svg'; - static const String sensitivityFeature3 = - 'assets/icons/sensitivity_feature_3.svg'; - static const String sensitivityFeature4 = - 'assets/icons/sensitivity_feature_4.svg'; - static const String sensitivityFeature5 = - 'assets/icons/sensitivity_feature_5.svg'; - static const String sensitivityFeature6 = - 'assets/icons/sensitivity_feature_6.svg'; - static const String sensitivityFeature7 = - 'assets/icons/sensitivity_feature_7.svg'; - static const String sensitivityFeature8 = - 'assets/icons/sensitivity_feature_8.svg'; - static const String sensitivityFeature9 = - 'assets/icons/sensitivity_feature_9.svg'; + static const String sensitivityFeature1 = 'assets/icons/sensitivity_feature_1.svg'; + static const String sensitivityFeature2 = 'assets/icons/sensitivity_feature_2.svg'; + static const String sensitivityFeature3 = 'assets/icons/sensitivity_feature_3.svg'; + static const String sensitivityFeature4 = 'assets/icons/sensitivity_feature_4.svg'; + static const String sensitivityFeature5 = 'assets/icons/sensitivity_feature_5.svg'; + static const String sensitivityFeature6 = 'assets/icons/sensitivity_feature_6.svg'; + static const String sensitivityFeature7 = 'assets/icons/sensitivity_feature_7.svg'; + static const String sensitivityFeature8 = 'assets/icons/sensitivity_feature_8.svg'; + static const String sensitivityFeature9 = 'assets/icons/sensitivity_feature_9.svg'; static const String deviceTagIcon = 'assets/icons/device_tag_ic.svg'; static const String targetConfirmTimeIcon = 'assets/icons/target_confirm_time_icon.svg'; diff --git a/lib/web_layout/web_scaffold.dart b/lib/web_layout/web_scaffold.dart index c1d6075f..a37727db 100644 --- a/lib/web_layout/web_scaffold.dart +++ b/lib/web_layout/web_scaffold.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; import 'package:syncrow_web/web_layout/web_app_bar.dart'; + import 'menu_sidebar.dart'; class WebScaffold extends StatelessWidget with HelperResponsiveLayout { @@ -28,14 +28,11 @@ class WebScaffold extends StatelessWidget with HelperResponsiveLayout { SizedBox( width: MediaQuery.sizeOf(context).width, height: MediaQuery.sizeOf(context).height, - child: SvgPicture.asset( - Assets.webBackground, + child: Image.asset( + Assets.webBackgroundPng, fit: BoxFit.cover, ), ), - Container( - color: Colors.white.withOpacity(0.7), - ), Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [