From a403fb002806f42f35831395672a95e363e03c77 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 15 Nov 2023 15:45:04 +0300 Subject: [PATCH 1/4] Device Transfer Issued Fixed For Sender & Receiver --- .../api/asset_transfer_provider.dart | 18 +++++++-- lib/models/device/asset_transfer.dart | 28 ++++++++++---- lib/views/app_style/colors.dart | 2 + .../device_transfer_details.dart | 37 +++---------------- .../update_device_transfer.dart | 35 ++++++++---------- 5 files changed, 57 insertions(+), 63 deletions(-) diff --git a/lib/controllers/providers/api/asset_transfer_provider.dart b/lib/controllers/providers/api/asset_transfer_provider.dart index e55b2829..bab4ce25 100644 --- a/lib/controllers/providers/api/asset_transfer_provider.dart +++ b/lib/controllers/providers/api/asset_transfer_provider.dart @@ -148,12 +148,16 @@ class AssetTransferProvider extends ChangeNotifier { } } - Future updateRequest({@required AssetTransfer assetTransfer}) async { + Future updateRequest(BuildContext context, {@required AssetTransfer assetTransfer}) async { Response response; try { - assetTransfer.receiverStartDate = assetTransfer.timer?.startAt?.toIso8601String(); - assetTransfer.receiverEndDate = assetTransfer.timer?.endAt?.toIso8601String(); - assetTransfer.receiverWorkingHours = (((assetTransfer.timer?.durationInSecond ?? 0) / 60) / 60).toStringAsFixed(2); + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + assetTransfer.receiverStartDate = assetTransfer.receiverTimer?.startAt?.toIso8601String(); + assetTransfer.receiverEndDate = assetTransfer.receiverTimer?.endAt?.toIso8601String(); + assetTransfer.receiverWorkingHours = (((assetTransfer.receiverTimer?.durationInSecond ?? 0) * 60) * 60).toStringAsFixed(2); + assetTransfer.senderStartDate = assetTransfer.senderTimer?.startAt?.toIso8601String(); + assetTransfer.senderEndDate = assetTransfer.senderTimer?.endAt?.toIso8601String(); + assetTransfer.senderWorkingHours = (((assetTransfer.senderTimer?.durationInSecond ?? 0) * 60) * 60).toStringAsFixed(2); response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: assetTransfer.toJson()); print(response.body); @@ -166,15 +170,21 @@ class AssetTransferProvider extends ChangeNotifier { stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { reset(); + Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); + Navigator.of(context).pop(); // oldModel.fromDeviceTransfer( // DeviceTransfer.fromJson( // json.decode(utf8.decode(response.bodyBytes))[0] // ) // ); notifyListeners(); + } else { + Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest} :${json.decode(response.body)['message']}"); } + Navigator.pop(context); return response.statusCode; } catch (error) { + Navigator.pop(context); return -1; } } diff --git a/lib/models/device/asset_transfer.dart b/lib/models/device/asset_transfer.dart index 146bb602..26e27476 100644 --- a/lib/models/device/asset_transfer.dart +++ b/lib/models/device/asset_transfer.dart @@ -66,7 +66,8 @@ class AssetTransfer { this.senderSiteName, this.supplierId, this.supplierName, - this.timer, + this.senderTimer, + this.receiverTimer, }); AssetTransfer.fromJson(dynamic json) { @@ -107,10 +108,15 @@ class AssetTransfer { receiverTravelingHours = json['receiverTravelingHours']; receiverEngSignature = json['receiverEngSignature']; try { - timer = TimerModel(startAt: DateTime.tryParse(receiverStartDate ?? ""), endAt: DateTime.tryParse(receiverEndDate)); - if (timer.endAt != null && timer.startAt != null) { - timer.durationInSecond = (timer.endAt.difference(timer.startAt))?.inSeconds; - receiverWorkingHours = (((timer.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2); + receiverTimer = TimerModel(startAt: DateTime.tryParse(receiverStartDate ?? ""), endAt: DateTime.tryParse(receiverEndDate)); + senderTimer = TimerModel(startAt: DateTime.tryParse(senderStartDate ?? ""), endAt: DateTime.tryParse(senderEndDate)); + if (receiverTimer.endAt != null && receiverTimer.startAt != null) { + receiverTimer.durationInSecond = (receiverTimer.endAt.difference(receiverTimer.startAt))?.inSeconds; + receiverWorkingHours = (((receiverTimer.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2); + } + if (senderTimer.endAt != null && senderTimer.startAt != null) { + senderTimer.durationInSecond = (senderTimer.endAt.difference(senderTimer.startAt))?.inSeconds; + senderWorkingHours = (((senderTimer.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2); } } catch (e) { print(e); @@ -206,7 +212,8 @@ class AssetTransfer { bool applied; String createdOn; String modifiedOn; - TimerModel timer = TimerModel(); + TimerModel senderTimer = TimerModel(); + TimerModel receiverTimer = TimerModel(); AssetTransfer copyWith({ num id, @@ -268,7 +275,8 @@ class AssetTransfer { int manufacturerId, String manufacturerName, String destDepartmentName, - TimerModel timer, + TimerModel senderTimer, + TimerModel receiverTimer, }) => AssetTransfer( id: id ?? this.id, @@ -328,7 +336,8 @@ class AssetTransfer { modelId: modelId ?? this.modelId, modelName: modelName ?? this.modelName, manufacturerId: manufacturerId ?? this.manufacturerId, - timer: timer ?? this.timer, + senderTimer: senderTimer ?? this.senderTimer, + receiverTimer: receiverTimer ?? this.receiverTimer, manufacturerName: manufacturerName ?? this.manufacturerName); Map toJson() { final map = {}; @@ -439,6 +448,7 @@ class AssetTransfer { } fromDetails(AssetTransfer assetTransfer) { + if (assetTransfer == null) return; id = assetTransfer.id; transferNo = assetTransfer.transferNo; transferCode = assetTransfer.transferCode; @@ -497,6 +507,8 @@ class AssetTransfer { modelName = assetTransfer.modelName; manufacturerId = assetTransfer.manufacturerId; manufacturerName = assetTransfer.manufacturerName; + senderTimer = assetTransfer.senderTimer; + receiverTimer = assetTransfer.receiverTimer; } Future validate(BuildContext context) async { diff --git a/lib/views/app_style/colors.dart b/lib/views/app_style/colors.dart index a3752f35..7620de95 100644 --- a/lib/views/app_style/colors.dart +++ b/lib/views/app_style/colors.dart @@ -45,6 +45,8 @@ class AColors { static Color getRequestStatusColorByName(String status) { switch ((status ?? "").toLowerCase()) { + case "medium": + return AColors.statusBlue; case "in progress": return AColors.statusYellowLight; case "complete": diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 9290e58f..1d6ab135 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/asset_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -9,7 +8,6 @@ import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/asset_transfer.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/device_transfer/update_device_transfer.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; @@ -124,8 +122,8 @@ class _DeviceTransferDetailsState extends State { ? StatusLabel( label: _model?.senderMachineStatusName, id: _model?.senderMachineStatusId, - textColor: AColors.getRequestStatusTextColor(getIdstatus(_model.senderMachineStatusName)), - backgroundColor: AColors.getRequestStatusColor(getIdstatus(_model.senderMachineStatusName))) + textColor: AColors.getRequestStatusTextColorByName(_model.senderMachineStatusName), + backgroundColor: AColors.getRequestStatusColorByName(_model.senderMachineStatusName)) : null, ), 8.height, @@ -143,8 +141,8 @@ class _DeviceTransferDetailsState extends State { ? StatusLabel( label: _model?.receiverMachineStatusName ?? "", id: _model?.receiverMachineStatusId, - textColor: AColors.getRequestStatusTextColor(getIdstatus(_model.receiverMachineStatusName)), - backgroundColor: AColors.getRequestStatusColor(getIdstatus(_model.receiverMachineStatusName))) + textColor: AColors.getRequestStatusTextColorByName(_model.receiverMachineStatusName), + backgroundColor: AColors.getRequestStatusColorByName(_model.receiverMachineStatusName)) : null, ), ], @@ -185,18 +183,7 @@ class _DeviceTransferDetailsState extends State { if (isSender ? (_model?.senderMachineStatusName?.toLowerCase() != "closed" && _model?.senderMachineStatusName?.toLowerCase() != "completed") : (_model?.receiverMachineStatusName?.toLowerCase() != "closed" && _model?.receiverMachineStatusName?.toLowerCase() != "completed")) - CircleAvatar( - radius: 25, - backgroundColor: AppColor.neutral30, - child: CircleAvatar( - radius: 24, - backgroundColor: Colors.white, - child: Padding( - padding: const EdgeInsets.only(left: 3.0), - child: SvgPicture.asset('assets/images/update.svg'), - ), - ), - ).onPress(isSender + "edit".toSvgAsset(height: 48, width: 48).onPress(isSender ? () { Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateDeviceTransfer(model: _model, isSender: isSender))); } @@ -216,18 +203,4 @@ class _DeviceTransferDetailsState extends State { ], ).toShadowContainer(context); } - - int getIdstatus(String status) { - switch (status) { - case "Closed": - return 3; - break; - case "Open": - return 1; - break; - case "In Progress": - return 2; - break; - } - } } diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index a5aa5e2d..2f8c172d 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -48,11 +49,11 @@ class _UpdateDeviceTransferState extends State { final GlobalKey _scaffoldKey = GlobalKey(); _update() async { - if (_formModel?.timer?.startAt == null) { + if ((widget.isSender && _formModel?.senderTimer?.startAt == null) || (!widget.isSender && _formModel?.receiverTimer?.startAt == null)) { await Fluttertoast.showToast(msg: "Working Hours Required"); return false; } - if (_formModel?.timer?.endAt == null) { + if ((widget.isSender && _formModel?.senderTimer?.endAt == null) || (!widget.isSender && _formModel?.receiverTimer?.startAt == null)) { await Fluttertoast.showToast(msg: "Please Stop The Timer"); return false; } @@ -62,19 +63,7 @@ class _UpdateDeviceTransferState extends State { return false; } _formKey.currentState.save(); - - _isLoading = true; - setState(() {}); - int status = await _deviceTransferProvider.updateRequest(assetTransfer: _formModel); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast( - msg: context.translation.successfulRequestMessage, - ); - _validate = false; - Navigator.of(context).pop(); - } + await _deviceTransferProvider.updateRequest(context, assetTransfer: _formModel); } // @override @@ -122,6 +111,10 @@ class _UpdateDeviceTransferState extends State { AppTextFormField( initialValue: widget.isSender ? _formModel.senderTravelingHours : _formModel.receiverTravelingHours, labelText: context.translation.travelingHours, + onChange: (text) { + log(widget.isSender ? _formModel.senderStartDate : _formModel.receiverStartDate); + log(widget.isSender ? _formModel.senderEndDate : _formModel.receiverEndDate); + }, onSaved: (value) { widget.isSender ? _formModel.senderTravelingHours : _formModel.receiverTravelingHours = value; //_formModel?.workingHours = double.tryParse(value); @@ -133,10 +126,14 @@ class _UpdateDeviceTransferState extends State { 8.height, AppTimer( label: context.translation.workingHours, - timer: _formModel.timer, - enabled: _formModel.receiverEndDate == null, + timer: widget.isSender ? _formModel.senderTimer : _formModel.receiverTimer, + enabled: widget.isSender ? _formModel.senderEndDate == null : _formModel.receiverEndDate == null, onChange: (timer) async { - _formModel.timer = timer; + if (widget.isSender) { + _formModel.senderTimer = timer; + } else { + _formModel.receiverTimer = timer; + } return true; }, ), @@ -175,7 +172,7 @@ class _UpdateDeviceTransferState extends State { 8.height, ESignature( title: "Signature", - oldSignature: widget.isSender ? widget.model.senderEngSignature : widget.model.receiverEngSignature, + oldSignature: widget.isSender ? widget.model?.senderEngSignature : widget.model?.receiverEngSignature, newSignature: _signature, onSaved: (signature) { _signature = signature; From 7d50ac3f81845a8c353f7f5520383065c7080323 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 15 Nov 2023 15:55:19 +0300 Subject: [PATCH 2/4] FAB : Eng can only create transfer asset requests --- .../common_widgets/app_floating_action_button.dart | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/new_views/common_widgets/app_floating_action_button.dart b/lib/new_views/common_widgets/app_floating_action_button.dart index a465b5aa..f5864933 100644 --- a/lib/new_views/common_widgets/app_floating_action_button.dart +++ b/lib/new_views/common_widgets/app_floating_action_button.dart @@ -1,9 +1,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/new_views/pages/new_gas_refill_request_page.dart'; import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart'; import 'package:test_sa/views/pages/user/requests/create_service_request_page.dart'; @@ -32,6 +35,7 @@ class _AppFloatingActionButtonState extends State { @override Widget build(BuildContext context) { + final user = Provider.of(context, listen: false).user; const duration = Duration(milliseconds: 250); return Column( mainAxisAlignment: MainAxisAlignment.end, @@ -58,11 +62,11 @@ class _AppFloatingActionButtonState extends State { child: Column( mainAxisSize: MainAxisSize.min, children: [ - fabItem(context.translation.gasRefillRequest, "gas_refill_request", NewGasRefillRequestPage.routeName), - 1.divider.paddingOnly(top: 16, bottom: 16), + if (user.type == UsersTypes.normal_user) fabItem(context.translation.gasRefillRequest, "gas_refill_request", NewGasRefillRequestPage.routeName), + if (user.type == UsersTypes.normal_user) 1.divider.paddingOnly(top: 16, bottom: 16), fabItem(context.translation.transferRequest, "transfer_request", RequestDeviceTransfer.id), - 1.divider.paddingOnly(top: 16, bottom: 16), - fabItem(context.translation.serviceRequest, "service_request", CreateServiceRequestPage.id), + if (user.type == UsersTypes.normal_user) 1.divider.paddingOnly(top: 16, bottom: 16), + if (user.type == UsersTypes.normal_user) fabItem(context.translation.serviceRequest, "service_request", CreateServiceRequestPage.id), ], ), ), From 686c70e3db0c1f0b9ae8e8fc1f7e32f3dc3cd615 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 15 Nov 2023 16:25:36 +0300 Subject: [PATCH 3/4] profile image improvement & notificaiton --- .../providers/api/notifications_provider.dart | 6 +++--- lib/new_views/common_widgets/app_drawer.dart | 8 ++++---- lib/new_views/pages/land_page/dashboard_page.dart | 10 ++++++---- lib/views/pages/user/profile_page.dart | 8 ++++---- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/lib/controllers/providers/api/notifications_provider.dart b/lib/controllers/providers/api/notifications_provider.dart index f7970e3a..0d27022d 100644 --- a/lib/controllers/providers/api/notifications_provider.dart +++ b/lib/controllers/providers/api/notifications_provider.dart @@ -40,9 +40,9 @@ class NotificationsProvider extends ChangeNotifier { /// for more details check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart Future getSystemNotifications({ - @required String host, - @required User user, - @required int hospitalId, + String host, + User user, + int hospitalId, }) async { if (isLoading == true) return -2; isLoading = true; diff --git a/lib/new_views/common_widgets/app_drawer.dart b/lib/new_views/common_widgets/app_drawer.dart index 57ee0c21..0e7e8a21 100644 --- a/lib/new_views/common_widgets/app_drawer.dart +++ b/lib/new_views/common_widgets/app_drawer.dart @@ -40,11 +40,11 @@ class AppDrawer extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(1), // Border radius child: ClipOval( - child: (snapshot.user.profilePhotoName?.isNotEmpty ?? false) - ? Image.network(snapshot.user.profilePhotoName) - : snapshot.profileImage != null + child: snapshot.profileImage != null ? Image.file(snapshot.profileImage) - : const Icon( + : (snapshot.user.profilePhotoName?.isNotEmpty ?? false) + ? Image.network(snapshot.user.profilePhotoName) + : const Icon( Icons.person, size: 50, color: Colors.white, diff --git a/lib/new_views/pages/land_page/dashboard_page.dart b/lib/new_views/pages/land_page/dashboard_page.dart index efa27cce..80d10a2e 100644 --- a/lib/new_views/pages/land_page/dashboard_page.dart +++ b/lib/new_views/pages/land_page/dashboard_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; @@ -28,6 +29,7 @@ class _DashboardPageState extends State { void initState() { super.initState(); Provider.of(context, listen: false).getRequests(); + Provider.of(context, listen: false).getSystemNotifications(); } @override @@ -54,10 +56,10 @@ class _DashboardPageState extends State { child: Padding( padding: const EdgeInsets.all(1), // Border radius child: ClipOval( - child: (snapshot.user.profilePhotoName?.isNotEmpty ?? false) - ? Image.network(snapshot.user.profilePhotoName) - : snapshot.profileImage != null - ? Image.file(snapshot.profileImage) + child: snapshot.profileImage != null + ? Image.file(snapshot.profileImage) + : (snapshot.user.profilePhotoName?.isNotEmpty ?? false) + ? Image.network(snapshot.user.profilePhotoName) : const Icon( Icons.person, size: 24, diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index fb466f96..dcc51e86 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -71,11 +71,11 @@ class _ProfilePageState extends State { child: Padding( padding: const EdgeInsets.all(1), // Border radius child: ClipOval( - child: (snapshot.user.profilePhotoName?.isNotEmpty ?? false) - ? Image.network(snapshot.user.profilePhotoName) - : snapshot.profileImage != null + child: snapshot.profileImage != null ? Image.file(snapshot.profileImage) - : const Icon( + : (snapshot.user.profilePhotoName?.isNotEmpty ?? false) + ? Image.network(snapshot.user.profilePhotoName) + : const Icon( Icons.person, size: 50, color: Colors.white, From a1307801934f237bd29ddeb390baf9c1a59c4de1 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 15 Nov 2023 16:41:38 +0300 Subject: [PATCH 4/4] chart improvement --- .../progress_fragment.dart | 135 +++++++++--------- 1 file changed, 70 insertions(+), 65 deletions(-) diff --git a/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart b/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart index 8a956ce9..7a97d79a 100644 --- a/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart +++ b/lib/new_views/pages/land_page/dashboard_fragments/progress_fragment.dart @@ -21,73 +21,78 @@ class ProgressFragment extends StatelessWidget { @override Widget build(BuildContext context) { - const Map statuses = { - "Completed": 12, - "In Progress": 12, - "Open": 12, - }; return Consumer( - builder: (context, snapshot, _) => Column( - children: [ - AspectRatio( - aspectRatio: 398 / 237, - child: PieChart( - dataMap: statuses, - animationDuration: const Duration(milliseconds: 500), - chartRadius: 190.toScreenWidth, - colorList: [AColors.statusGreen, AColors.statusBlue, AColors.statusYellowLight], - initialAngleInDegree: 270, - chartType: ChartType.ring, - ringStrokeWidth: 40.toScreenWidth, - centerText: "${context.translation.total}\n20", - centerTextStyle: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), - legendOptions: const LegendOptions(showLegends: false), - chartValuesOptions: ChartValuesOptions( - chartValueBackgroundColor: Colors.transparent, - chartValueStyle: AppTextStyles.heading6.copyWith(color: AppColor.neutral20), - showChartValuesOutside: true, - ), - ).toShimmer(isShow: snapshot.isOpenLoading || snapshot.isInProgressLoading || snapshot.isCompleteLoading, radius: 300).paddingAll(12).toShadowContainer(context), - ).paddingOnly(start: 16, end: 16, bottom: 16), - DefaultTabController( - length: 3, - child: Column( - children: [ - Container( - margin: const EdgeInsets.only(left: 16, right: 16), - decoration: BoxDecoration(color: AppColor.neutral30, borderRadius: BorderRadius.circular(16)), - child: TabBar( - //controller: _tabController, - padding: EdgeInsets.zero, - labelColor: AppColor.neutral60, - unselectedLabelColor: AppColor.neutral20, - unselectedLabelStyle: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)), - labelStyle: AppTextStyles.bodyText.copyWith(color: AppColor.neutral60), - indicatorPadding: const EdgeInsets.all(4), - indicator: BoxDecoration(color: context.isDark? AppColor.neutral20:Theme.of(context).cardColor, borderRadius: BorderRadius.circular(13)), - onTap: (index) { - // setState(() {}); - }, - tabs: [ - Tab(text: context.translation.open, height: 57.toScreenHeight), - Tab(text: context.translation.inProgress, height: 57.toScreenHeight), - Tab(text: context.translation.completed, height: 57.toScreenHeight), - ], - ), + builder: (context, snapshot, _) { + Map statuses = { + "Completed": snapshot.completedRequests?.requestsDetails?.length?.toDouble() ?? 0.0, + "In Progress": snapshot.inProgressRequests?.requestsDetails?.length?.toDouble() ?? 0.0, + "Open": snapshot.openRequests.requestsDetails?.length?.toDouble() ?? 0.0, + }; + int total = (snapshot.completedRequests?.requestsDetails?.length ?? 0) + (snapshot.inProgressRequests?.requestsDetails?.length ?? 0) + (snapshot.openRequests?.requestsDetails?.length ?? 0); + + return Column( + children: [ + AspectRatio( + aspectRatio: 398 / 237, + child: PieChart( + dataMap: statuses, + animationDuration: const Duration(milliseconds: 500), + chartRadius: 190.toScreenWidth, + colorList: [AColors.statusGreen, AColors.statusBlue, AColors.statusYellowLight], + initialAngleInDegree: 270, + chartType: ChartType.ring, + ringStrokeWidth: 40.toScreenWidth, + centerText: "${context.translation.total}\n$total", + centerTextStyle: AppTextStyles.heading5.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + legendOptions: const LegendOptions(showLegends: false), + chartValuesOptions: ChartValuesOptions( + chartValueBackgroundColor: Colors.white, + showChartValuesInPercentage: true, + chartValueStyle: AppTextStyles.heading6.copyWith(color: AppColor.neutral20), + showChartValuesOutside: true, ), - 8.height, - TabBarView( - children: [ - RequestItemViewList(snapshot.openRequests?.requestsDetails ?? [], snapshot.isOpenLoading), - RequestItemViewList(snapshot.inProgressRequests?.requestsDetails ?? [], snapshot.isInProgressLoading), - RequestItemViewList(snapshot.completedRequests?.requestsDetails ?? [], snapshot.isCompleteLoading), - ], - ).expanded, - ], - ), - ).expanded, - ], - ), + ).toShimmer(isShow: snapshot.isOpenLoading || snapshot.isInProgressLoading || snapshot.isCompleteLoading, radius: 300).paddingAll(12).toShadowContainer(context), + ).paddingOnly(start: 16, end: 16, bottom: 16), + DefaultTabController( + length: 3, + child: Column( + children: [ + Container( + margin: const EdgeInsets.only(left: 16, right: 16), + decoration: BoxDecoration(color: AppColor.neutral30, borderRadius: BorderRadius.circular(16)), + child: TabBar( + //controller: _tabController, + padding: EdgeInsets.zero, + labelColor: AppColor.neutral60, + unselectedLabelColor: AppColor.neutral20, + unselectedLabelStyle: AppTextStyles.bodyText.copyWith(color: const Color(0xFF757575)), + labelStyle: AppTextStyles.bodyText.copyWith(color: AppColor.neutral60), + indicatorPadding: const EdgeInsets.all(4), + indicator: BoxDecoration(color: context.isDark ? AppColor.neutral20 : Theme.of(context).cardColor, borderRadius: BorderRadius.circular(13)), + onTap: (index) { + // setState(() {}); + }, + tabs: [ + Tab(text: context.translation.open, height: 57.toScreenHeight), + Tab(text: context.translation.inProgress, height: 57.toScreenHeight), + Tab(text: context.translation.completed, height: 57.toScreenHeight), + ], + ), + ), + 8.height, + TabBarView( + children: [ + RequestItemViewList(snapshot.openRequests?.requestsDetails ?? [], snapshot.isOpenLoading), + RequestItemViewList(snapshot.inProgressRequests?.requestsDetails ?? [], snapshot.isInProgressLoading), + RequestItemViewList(snapshot.completedRequests?.requestsDetails ?? [], snapshot.isCompleteLoading), + ], + ).expanded, + ], + ), + ).expanded, + ], + ); + }, ); } //