import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:sefer_driver/constant/colors.dart'; import 'package:sefer_driver/constant/info.dart'; import 'package:sefer_driver/constant/style.dart'; import 'package:sefer_driver/views/widgets/my_scafold.dart'; import 'package:sefer_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: [ Center( child: GetBuilder( builder: (durationController) => durationController.isLoading ? const Center(child: MyCircularProgressIndicator()) : durationController.jsonData1.isEmpty || durationController.jsonData2.isEmpty ? Center( child: Text('No data yet!'.tr), ) : ListView( // mainAxisAlignment: MainAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.center, children: [ 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, // Custom color barWidth: 3, // Thinner line dotData: const FlDotData( show: true), // Show dots on each point belowBarData: BarAreaData( // Add gradient fill below the line 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), ), ), ), ), ), ), 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, // isCurved: true, color: Colors .deepPurpleAccent, // Custom color barWidth: 3, // Thinner line dotData: const FlDotData( show: true), // Show dots on each point belowBarData: BarAreaData( // Add gradient fill below the line 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, // sideTitles: const SideTitles( // reservedSize: 30, showTitles: true), ), bottomTitles: AxisTitles( axisNameWidget: Text( '${"Total rides on month".tr} = ${durationController.jsonData2['message'][0]['totalCount'].toString()}' .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, // Custom color barWidth: 3, // Thinner line dotData: const FlDotData( show: true), // Show dots on each point belowBarData: BarAreaData( // Add gradient fill below the line 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, // sideTitles: const SideTitles( // reservedSize: 30, showTitles: true), ), bottomTitles: AxisTitles( axisNameWidget: Text( '${"Total budgets on month".tr} = ${durationController.jsonData2['message'][0]['totalPrice'].toString()}' .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: durationController.monthlyList.isEmpty ? SizedBox( height: Get.height * .2, child: Center( child: Text( "No data 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, ), ), ], ), ); } }