mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 07:07:19 +00:00
analytics-empty-state.
This commit is contained in:
@ -3,7 +3,9 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
|||||||
import 'package:syncrow_web/pages/analytics/modules/air_quality/blocs/air_quality_distribution/air_quality_distribution_bloc.dart';
|
import 'package:syncrow_web/pages/analytics/modules/air_quality/blocs/air_quality_distribution/air_quality_distribution_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/aqi_distribution_chart.dart';
|
import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/aqi_distribution_chart.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/aqi_distribution_chart_title.dart';
|
import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/aqi_distribution_chart_title.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/widgets/analytics_chart_empty_state_widget.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/utils/constants/assets.dart';
|
||||||
import 'package:syncrow_web/utils/style.dart';
|
import 'package:syncrow_web/utils/style.dart';
|
||||||
|
|
||||||
class AqiDistributionChartBox extends StatelessWidget {
|
class AqiDistributionChartBox extends StatelessWidget {
|
||||||
@ -32,8 +34,20 @@ class AqiDistributionChartBox extends StatelessWidget {
|
|||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
Expanded(
|
Visibility(
|
||||||
child: AqiDistributionChart(chartData: state.chartData),
|
visible: state.chartData.isNotEmpty,
|
||||||
|
replacement: AnalyticsChartEmptyStateWidget(
|
||||||
|
isLoading: state.status == AirQualityDistributionStatus.loading,
|
||||||
|
isError: state.status == AirQualityDistributionStatus.failure,
|
||||||
|
isInitial: state.status == AirQualityDistributionStatus.initial,
|
||||||
|
errorMessage: state.errorMessage,
|
||||||
|
iconPath: Assets.emptyBarredChart,
|
||||||
|
),
|
||||||
|
child: Expanded(
|
||||||
|
child: AqiDistributionChart(
|
||||||
|
chartData: state.chartData,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -3,7 +3,9 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
|||||||
import 'package:syncrow_web/pages/analytics/modules/air_quality/blocs/range_of_aqi/range_of_aqi_bloc.dart';
|
import 'package:syncrow_web/pages/analytics/modules/air_quality/blocs/range_of_aqi/range_of_aqi_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart.dart';
|
import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart_title.dart';
|
import 'package:syncrow_web/pages/analytics/modules/air_quality/widgets/range_of_aqi_chart_title.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/widgets/analytics_chart_empty_state_widget.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/utils/constants/assets.dart';
|
||||||
import 'package:syncrow_web/utils/style.dart';
|
import 'package:syncrow_web/utils/style.dart';
|
||||||
|
|
||||||
class RangeOfAqiChartBox extends StatelessWidget {
|
class RangeOfAqiChartBox extends StatelessWidget {
|
||||||
@ -32,12 +34,22 @@ class RangeOfAqiChartBox extends StatelessWidget {
|
|||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
Expanded(
|
Visibility(
|
||||||
|
visible: state.filteredRangeOfAqi.isNotEmpty,
|
||||||
|
replacement: AnalyticsChartEmptyStateWidget(
|
||||||
|
isLoading: state.status == RangeOfAqiStatus.loading,
|
||||||
|
isError: state.status == RangeOfAqiStatus.failure,
|
||||||
|
isInitial: state.status == RangeOfAqiStatus.initial,
|
||||||
|
errorMessage: state.errorMessage,
|
||||||
|
iconPath: Assets.emptyRangeOfAqi,
|
||||||
|
),
|
||||||
|
child: Expanded(
|
||||||
child: RangeOfAqiChart(
|
child: RangeOfAqiChart(
|
||||||
chartData: state.filteredRangeOfAqi,
|
chartData: state.filteredRangeOfAqi,
|
||||||
selectedAqiType: state.selectedAqiType,
|
selectedAqiType: state.selectedAqiType,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -5,8 +5,10 @@ import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/ener
|
|||||||
import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/chart_title.dart';
|
import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/chart_title.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_chart.dart';
|
import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_chart.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_devices_list.dart';
|
import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/energy_consumption_per_device_devices_list.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/widgets/analytics_chart_empty_state_widget.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/analytics/widgets/charts_loading_widget.dart';
|
import 'package:syncrow_web/pages/analytics/widgets/charts_loading_widget.dart';
|
||||||
|
import 'package:syncrow_web/utils/constants/assets.dart';
|
||||||
import 'package:syncrow_web/utils/style.dart';
|
import 'package:syncrow_web/utils/style.dart';
|
||||||
|
|
||||||
class EnergyConsumptionPerDeviceChartBox extends StatelessWidget {
|
class EnergyConsumptionPerDeviceChartBox extends StatelessWidget {
|
||||||
@ -54,8 +56,24 @@ class EnergyConsumptionPerDeviceChartBox extends StatelessWidget {
|
|||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
const Divider(height: 0),
|
const Divider(height: 0),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
Expanded(
|
Visibility(
|
||||||
child: EnergyConsumptionPerDeviceChart(chartData: state.chartData),
|
visible: state.chartData.isNotEmpty &&
|
||||||
|
state.chartData
|
||||||
|
.every((e) => e.energy.every((e) => e.value != 0)),
|
||||||
|
replacement: AnalyticsChartEmptyStateWidget(
|
||||||
|
isLoading:
|
||||||
|
state.status == EnergyConsumptionPerDeviceStatus.loading,
|
||||||
|
isError: state.status == EnergyConsumptionPerDeviceStatus.failure,
|
||||||
|
isInitial:
|
||||||
|
state.status == EnergyConsumptionPerDeviceStatus.initial,
|
||||||
|
errorMessage: state.errorMessage,
|
||||||
|
iconPath: Assets.emptyEnergyManagementPerDevice,
|
||||||
|
),
|
||||||
|
child: Expanded(
|
||||||
|
child: EnergyConsumptionPerDeviceChart(
|
||||||
|
chartData: state.chartData,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -6,8 +6,10 @@ import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/ch
|
|||||||
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/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_chart_empty_state_widget.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/pages/space_tree/bloc/space_tree_bloc.dart';
|
||||||
|
import 'package:syncrow_web/utils/constants/assets.dart';
|
||||||
import 'package:syncrow_web/utils/style.dart';
|
import 'package:syncrow_web/utils/style.dart';
|
||||||
|
|
||||||
class OccupancyChartBox extends StatelessWidget {
|
class OccupancyChartBox extends StatelessWidget {
|
||||||
@ -67,7 +69,24 @@ class OccupancyChartBox extends StatelessWidget {
|
|||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
Expanded(child: OccupancyChart(chartData: state.chartData)),
|
Visibility(
|
||||||
|
visible: state.chartData.isNotEmpty &&
|
||||||
|
state.chartData.every(
|
||||||
|
(e) => e.occupancy.isNotEmpty,
|
||||||
|
),
|
||||||
|
replacement: AnalyticsChartEmptyStateWidget(
|
||||||
|
isLoading: state.status == OccupancyStatus.loading,
|
||||||
|
isError: state.status == OccupancyStatus.failure,
|
||||||
|
isInitial: state.status == OccupancyStatus.initial,
|
||||||
|
errorMessage: state.errorMessage,
|
||||||
|
iconPath: Assets.emptyBarredChart,
|
||||||
|
),
|
||||||
|
child: Expanded(
|
||||||
|
child: OccupancyChart(
|
||||||
|
chartData: state.chartData,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -6,8 +6,10 @@ import 'package:syncrow_web/pages/analytics/modules/energy_management/widgets/ch
|
|||||||
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/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_chart_empty_state_widget.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/pages/space_tree/bloc/space_tree_bloc.dart';
|
||||||
|
import 'package:syncrow_web/utils/constants/assets.dart';
|
||||||
import 'package:syncrow_web/utils/style.dart';
|
import 'package:syncrow_web/utils/style.dart';
|
||||||
|
|
||||||
class OccupancyHeatMapBox extends StatelessWidget {
|
class OccupancyHeatMapBox extends StatelessWidget {
|
||||||
@ -68,7 +70,19 @@ class OccupancyHeatMapBox extends StatelessWidget {
|
|||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
Expanded(
|
Visibility(
|
||||||
|
visible: state.heatMapData.isNotEmpty &&
|
||||||
|
state.heatMapData.every(
|
||||||
|
(e) => e.countTotalPresenceDetected != 0,
|
||||||
|
),
|
||||||
|
replacement: AnalyticsChartEmptyStateWidget(
|
||||||
|
isLoading: state.status == OccupancyHeatMapStatus.loading,
|
||||||
|
isError: state.status == OccupancyHeatMapStatus.failure,
|
||||||
|
isInitial: state.status == OccupancyHeatMapStatus.initial,
|
||||||
|
errorMessage: state.errorMessage,
|
||||||
|
iconPath: Assets.emptyHeatmap,
|
||||||
|
),
|
||||||
|
child: Expanded(
|
||||||
child: OccupancyHeatMap(
|
child: OccupancyHeatMap(
|
||||||
selectedDate:
|
selectedDate:
|
||||||
context.watch<AnalyticsDatePickerBloc>().state.yearlyDate,
|
context.watch<AnalyticsDatePickerBloc>().state.yearlyDate,
|
||||||
@ -80,6 +94,7 @@ class OccupancyHeatMapBox extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -27,53 +27,37 @@ class AnalyticsChartEmptyStateWidget extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Expanded(
|
return Expanded(
|
||||||
child: () {
|
child: _buildWidgetBasedOnState(context),
|
||||||
if (isLoading) {
|
|
||||||
return const AppLoadingIndicator();
|
|
||||||
} else if (isError) {
|
|
||||||
return _buildState(
|
|
||||||
context,
|
|
||||||
message: errorMessage ?? 'Something went wrong',
|
|
||||||
color: ColorsManager.red,
|
|
||||||
);
|
|
||||||
} else if (isInitial) {
|
|
||||||
return _buildState(context, message: initialMessage);
|
|
||||||
} else {
|
|
||||||
return _buildState(context, message: noDataMessage);
|
|
||||||
}
|
|
||||||
}(),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildState(
|
Widget _buildWidgetBasedOnState(BuildContext context) {
|
||||||
BuildContext context, {
|
final widgetsMap = {
|
||||||
required String message,
|
isLoading: const AppLoadingIndicator(),
|
||||||
Color? color,
|
isInitial: _buildState(context, initialMessage),
|
||||||
}) {
|
isError: _buildState(context, errorMessage ?? 'Something went wrong'),
|
||||||
final disabledColor = context.theme.disabledColor;
|
};
|
||||||
|
|
||||||
|
return widgetsMap[true] ?? _buildState(context, noDataMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildState(BuildContext context, String message) {
|
||||||
return Center(
|
return Center(
|
||||||
child: Column(
|
child: Column(
|
||||||
spacing: 16,
|
spacing: 16,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
Expanded(
|
Expanded(child: SvgPicture.asset(iconPath, fit: BoxFit.contain)),
|
||||||
child: SvgPicture.asset(
|
|
||||||
iconPath,
|
|
||||||
fit: BoxFit.contain,
|
|
||||||
colorFilter: ColorFilter.mode(
|
|
||||||
color ?? disabledColor,
|
|
||||||
BlendMode.srcIn,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SelectableText(
|
SelectableText(
|
||||||
message,
|
message,
|
||||||
style: context.textTheme.bodyMedium?.copyWith(
|
style: isError
|
||||||
color: color ?? disabledColor,
|
? context.textTheme.bodyMedium?.copyWith(
|
||||||
|
color: ColorsManager.red,
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
fontWeight: FontWeight.w700,
|
fontWeight: FontWeight.w700,
|
||||||
),
|
)
|
||||||
|
: null,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
|
Reference in New Issue
Block a user