import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:siro_driver/constant/colors.dart'; import 'package:siro_driver/constant/info.dart'; import 'package:siro_driver/constant/style.dart'; import 'package:siro_driver/views/widgets/my_scafold.dart'; import 'package:siro_driver/views/widgets/mycircular.dart'; import 'package:intl/intl.dart'; import '../../controller/home/captin/duration_controller .dart'; class RideCalculateDriver extends StatelessWidget { RideCalculateDriver({super.key}); // DurationController durationController = Get.put(DurationController()); @override Widget build(BuildContext context) { Get.put(DurationController()); return MyScafolld( title: 'Ride Summaries'.tr, body: [ GetBuilder( builder: (durationController) { if (durationController.isLoading) { return const Center(child: MyCircularProgressIndicator()); } bool hasDurations = durationController.jsonData1.isNotEmpty && durationController.jsonData1['message'] != null && (durationController.jsonData1['message'] as List).isNotEmpty; bool hasRides = durationController.jsonData2.isNotEmpty && durationController.jsonData2['message'] != null && (durationController.jsonData2['message'] as List).isNotEmpty; bool hasStats = durationController.monthlyList.isNotEmpty; if (!hasDurations && !hasRides && !hasStats) { return Center( child: Text('No data yet!'.tr), ); } return ListView( children: [ if (hasDurations) ...[ Text( '${'Average of Hours of'.tr} ${AppInformation.appName}${' is ON for this month'.tr}${' ${durationController.jsonData1['message'][0]['day'].toString().split('-')[1]}'.tr}', style: AppStyle.title, textAlign: TextAlign.center, ), Padding( padding: const EdgeInsets.all(6), child: Container( decoration: AppStyle.boxDecoration1, height: Get.height * .4, child: LineChart( duration: const Duration(milliseconds: 150), curve: Curves.ease, LineChartData( lineBarsData: [ LineChartBarData( isStepLineChart: true, spots: durationController.chartData, isCurved: true, color: Colors.deepPurpleAccent, barWidth: 3, dotData: const FlDotData(show: true), belowBarData: BarAreaData( show: true, color: AppColor.deepPurpleAccent, ), isStrokeJoinRound: true, shadow: const BoxShadow( color: AppColor.yellowColor, blurRadius: 4, offset: Offset(2, 2), ), ), ], showingTooltipIndicators: const [], titlesData: FlTitlesData( show: true, topTitles: AxisTitles( axisNameWidget: Text('Days'.tr, style: AppStyle.title), axisNameSize: 30, ), bottomTitles: AxisTitles( axisNameWidget: Text( 'Total Hours on month'.tr, style: AppStyle.title), axisNameSize: 30, sideTitles: const SideTitles( reservedSize: 30, showTitles: true)), leftTitles: AxisTitles( axisNameWidget: Text( 'Counts of Hours on days'.tr, style: AppStyle.title), axisNameSize: 30, sideTitles: const SideTitles( reservedSize: 30, showTitles: true)), ), gridData: const FlGridData(show: true), borderData: FlBorderData( show: true, border: const Border( bottom: BorderSide(color: AppColor.accentColor), left: BorderSide(color: AppColor.accentColor), ), ), ), ), ), ), ], if (hasRides) ...[ const SizedBox(height: 5), Padding( padding: const EdgeInsets.all(6), child: Container( decoration: AppStyle.boxDecoration1, height: Get.height * .4, child: LineChart( duration: const Duration(milliseconds: 150), curve: Curves.ease, LineChartData( lineBarsData: [ LineChartBarData( spots: durationController.chartRideCount, color: Colors.deepPurpleAccent, barWidth: 3, dotData: const FlDotData(show: true), belowBarData: BarAreaData( show: true, color: AppColor.deepPurpleAccent, ), isStrokeJoinRound: true, shadow: const BoxShadow( color: AppColor.yellowColor, blurRadius: 4, offset: Offset(2, 2), ), ), ], showingTooltipIndicators: const [], titlesData: FlTitlesData( show: true, topTitles: AxisTitles( axisNameWidget: Text('Days'.tr, style: AppStyle.title), axisNameSize: 30, ), bottomTitles: AxisTitles( axisNameWidget: Text( '${"Total rides on month".tr} = ${durationController.jsonData2['message'][0]['totalCount'] ?? 0}' .tr, style: AppStyle.title, ), axisNameSize: 30, sideTitles: const SideTitles( reservedSize: 30, showTitles: true)), leftTitles: AxisTitles( axisNameWidget: Text( 'Counts of rides on days'.tr, style: AppStyle.title), axisNameSize: 30, sideTitles: const SideTitles( reservedSize: 30, showTitles: true)), ), gridData: const FlGridData(show: true), borderData: FlBorderData( show: true, border: const Border( bottom: BorderSide(color: AppColor.accentColor), left: BorderSide(color: AppColor.accentColor), ), ), ), ), ), ), const SizedBox(height: 5), Padding( padding: const EdgeInsets.all(6), child: Container( decoration: AppStyle.boxDecoration1, height: Get.height * .4, child: LineChart( duration: const Duration(milliseconds: 150), curve: Curves.ease, LineChartData( lineBarsData: [ LineChartBarData( isStepLineChart: true, spots: durationController.chartRidePriceDriver, isCurved: true, isStrokeCapRound: true, preventCurveOverShooting: true, color: Colors.deepPurpleAccent, barWidth: 3, dotData: const FlDotData(show: true), belowBarData: BarAreaData( show: true, color: AppColor.deepPurpleAccent, ), isStrokeJoinRound: true, shadow: const BoxShadow( color: AppColor.yellowColor, blurRadius: 4, offset: Offset(2, 2), ), ), ], showingTooltipIndicators: const [], titlesData: FlTitlesData( show: true, topTitles: AxisTitles( axisNameWidget: Text('Days'.tr, style: AppStyle.title), axisNameSize: 30, ), bottomTitles: AxisTitles( axisNameWidget: Text( '${"Total budgets on month".tr} = ${durationController.jsonData2['message'][0]['totalPrice'] ?? 0}' .tr, style: AppStyle.title, ), axisNameSize: 30, sideTitles: const SideTitles( reservedSize: 30, showTitles: true)), leftTitles: AxisTitles( axisNameWidget: Text( 'Counts of budgets on days'.tr, style: AppStyle.title), axisNameSize: 30, sideTitles: const SideTitles( reservedSize: 30, showTitles: true)), ), gridData: const FlGridData(show: true), borderData: FlBorderData( show: true, border: const Border( bottom: BorderSide(color: AppColor.accentColor), left: BorderSide(color: AppColor.accentColor), ), ), ), ), ), ), ], Padding( padding: const EdgeInsets.all(8.0), child: Container( decoration: AppStyle.boxDecoration1, child: !hasStats ? SizedBox( height: Get.height * .2, child: Center( child: Text( "No statistics yet".tr, style: AppStyle.title, ), ), ) : DriverStatsTable( monthlyList: durationController.monthlyList, ))) ], ); }, ) // BarChartWidget(), ], isleading: true); } } class DriverStatsTable extends StatelessWidget { final List monthlyList; const DriverStatsTable({Key? key, required this.monthlyList}) : super(key: key); @override Widget build(BuildContext context) { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), color: Colors.white, boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.5), spreadRadius: 2, blurRadius: 5, offset: const Offset(0, 3), ), ], ), padding: const EdgeInsets.all(16), child: DataTable( columnSpacing: 12, columns: [ DataColumn(label: Text('Statistic'.tr)), DataColumn(label: Text('Value'.tr)), ], rows: _buildRows(), ), ); } List _buildRows() { return [ DataRow(cells: [ DataCell(Text( 'Total Orders'.tr, style: AppStyle.title, )), DataCell(Text( monthlyList[0]['total_orders'].toString(), style: AppStyle.number, )), ]), DataRow(cells: [ DataCell(Text( 'Completed'.tr, style: AppStyle.title, )), DataCell(Text( monthlyList[0]['completed_orders'].toString(), style: AppStyle.number, )), ]), DataRow(cells: [ DataCell(Text( 'Canceled Orders'.tr, style: AppStyle.title, )), DataCell(Text( monthlyList[0]['canceled_orders'].toString(), style: AppStyle.number, )), ]), DataRow(cells: [ DataCell(Text( 'Rejected Orders'.tr, style: AppStyle.title, )), DataCell(Text( monthlyList[0]['rejected_orders'].toString(), style: AppStyle.number, )), ]), DataRow(cells: [ DataCell(Text( 'Percent Rejected'.tr, style: AppStyle.title, )), DataCell(Text( '${(monthlyList[0]['percent_rejected']).toString()}%', style: AppStyle.number.copyWith( color: double.parse(monthlyList[0]['percent_canceled']) < .3 ? AppColor.greenColor : AppColor.redColor), )), ]), DataRow(cells: [ DataCell(Text( 'Percent Canceled'.tr, style: AppStyle.title, )), DataCell(Text( '${(monthlyList[0]['percent_canceled']).toString()}%', style: AppStyle.number.copyWith( color: double.parse(monthlyList[0]['percent_canceled']) < .3 ? AppColor.greenColor : AppColor.redColor), )), ]), DataRow(cells: [ DataCell(Text( 'Percent Completed'.tr, style: AppStyle.title, )), DataCell(Text( '${(monthlyList[0]['percent_completed']).toString()}%', style: AppStyle.number.copyWith( color: double.parse(monthlyList[0]['percent_completed']) > .7 ? AppColor.greenColor : AppColor.redColor), )), ]), ]; } } class StaticDriverOrder extends StatelessWidget { const StaticDriverOrder({ Key? key, required this.title, required this.jsonTitle, }) : super(key: key); final String title, jsonTitle; @override Widget build(BuildContext context) { return Container( margin: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(16.0), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10.0), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.3), spreadRadius: 3, blurRadius: 5, offset: const Offset(0, 3), // changes position of shadow ), ], ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( title, style: const TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black54, ), ), const SizedBox(height: 8.0), Text( jsonTitle, style: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: Colors.black, ), ), ], ), ); } }