From a1f2960fad17f202e6adc4b62ce3f4c475626987 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 20 Jun 2023 23:33:18 +0300 Subject: [PATCH] Enhancements --- .../create_sub_workorder_page.dart | 7 +- .../spare_parts_details_bottom_sheet.dart | 173 +++++++++--------- lib/views/widgets/parts/part_item.dart | 107 +++++------ 3 files changed, 146 insertions(+), 141 deletions(-) diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 79fcbef0..16481e6e 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -16,6 +16,7 @@ import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import '../../../models/subtitle.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_back_button.dart'; @@ -49,6 +50,9 @@ class _CreateSubWorkOrderPageState extends State { void initState() { _subWorkOrders = SearchWorkOrder(assignedEmployee: widget.workOrder.assignedEmployee, callRequest: CallRequest()); _serviceReport = ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus); + if (context.mounted) { + Provider.of(context, listen: false).reset(); + } super.initState(); } @@ -182,7 +186,7 @@ class _CreateSubWorkOrderPageState extends State { height: 4, ), ServiceReportFaultDescription( - requestId: widget.workOrder?.id?.toString(), + requestId: widget.workOrder?.callRequest?.id?.toString(), initialValue: _subWorkOrders.faultDescription, onSelect: (status) { _subWorkOrders.faultDescription = status; @@ -261,6 +265,7 @@ class _CreateSubWorkOrderPageState extends State { image: _image, onPick: (image) { _image = image; + _subWorkOrders.attachmentsWorkOrder ??= []; _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}")); }, ), diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index bf022cc0..d6586592 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -1,11 +1,14 @@ import 'package:flutter/material.dart'; +import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/views/app_style/colors.dart'; import '../../../controllers/localization/localization.dart'; import '../../../models/subtitle.dart'; -import '../../widgets/app_text_form_field.dart'; +import '../../app_style/sizing.dart'; import '../../widgets/buttons/app_button.dart'; +import '../../widgets/parts/auto_complete_parts_field.dart'; +import '../../widgets/parts/part_item.dart'; import '../../widgets/titles/app_sub_title.dart'; class SparePartsBottomSheet extends StatefulWidget { @@ -19,6 +22,7 @@ class SparePartsBottomSheet extends StatefulWidget { class _SparePartsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); final SearchWorkOrder _workOrder = SearchWorkOrder(); + bool _validate = false; @override void initState() { @@ -53,97 +57,92 @@ class _SparePartsBottomSheetState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: SingleChildScrollView( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 8), - if (_workOrder.sparePartsWorkOrders?.length != null) - ListView.builder( - itemCount: _workOrder.sparePartsWorkOrders?.length, - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemBuilder: (context, index) { - final wo = _workOrder.sparePartsWorkOrders[index]; - return Column( - children: [ - ATextFormField( - labelText: _workOrder?.sparePartsWorkOrders[index]?.sparePart?.partNo ?? "Part No.", - onChange: (value) { - _workOrder.sparePartsWorkOrders[index].sparePart = SparePart(partNo: value); - }, - ), - // const SizedBox(height: 8), - // ATextFormField( - // labelText: "Description", - // hintText: "Add Some Text", - // textInputType: TextInputType.multiline, - // onSaved: (value) { - // _workOrder.sparePartsWorkOrders[index].sparePart = value; - // }, - // ), - const SizedBox(height: 8), - ATextFormField( - labelText: _workOrder?.sparePartsWorkOrders[index]?.qty?.toString() ?? "Quantity", - textInputType: TextInputType.number, - onSaved: (value) { - _workOrder.sparePartsWorkOrders[index].qty = double.tryParse(value ?? ""); - }, - ), - const SizedBox(height: 8), - InkWell( - onTap: () { - _workOrder.sparePartsWorkOrders.removeWhere( - (element) => (element.sparePart?.partNo == wo.sparePart?.partNo && element.id == wo.id), - ); - setState(() {}); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - const Icon(Icons.delete, color: Colors.red), - Text( - "Remove this part", - style: Theme.of(context).textTheme.bodySmall, - ), - ], - ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + margin: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: const [ + BoxShadow( + color: AColors.grey, + offset: Offset(0, -1), + ) + ]), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(subtitle.partNumber), + _validate && _workOrder.sparePartsWorkOrders == null + ? ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox(height: 4), + AutoCompletePartsField( + onPick: (part) { + _workOrder.sparePartsWorkOrders ??= []; + _workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders( + id: part.id, + qty: part.quantity, + sparePart: SparePart(id: part.reportPartID, partName: part.name, partNo: part.code), + )); + }, + ), + ], ), - const SizedBox(height: 8), - ], - ); - }, - ), - const Divider(), - const SizedBox(height: 8), - InkWell( - onTap: () { - _workOrder.sparePartsWorkOrders ??= []; - _workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders()); - setState(() {}); - }, - child: Container( - decoration: BoxDecoration( - color: AColors.primaryColor.withOpacity(0.15), - borderRadius: BorderRadius.circular(10), - border: Border.all(color: AColors.primaryColor), + ), + ], + ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), ), - child: ListTile( - title: Text( - "Add Part", - style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: AColors.primaryColor), + if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false) + Row( + children: [ + Expanded(flex: 3, child: Text(subtitle.number)), + Expanded(flex: 1, child: Text(subtitle.quantity)), + ], ), - trailing: const Icon( - Icons.add_circle, - color: AColors.primaryColor, - size: 20, + if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false) + Column( + children: List.generate(_workOrder.sparePartsWorkOrders?.length, (index) { + final spare = _workOrder.sparePartsWorkOrders[index]; + Part part = Part( + id: spare.id, + reportPartID: spare.sparePart?.id, + code: spare.sparePart?.partNo, + name: spare.sparePart?.partName, + quantity: spare.qty, + ); + return PartItem( + part: part, + onDelete: (part) { + _workOrder.sparePartsWorkOrders.remove(SparePartsWorkOrders( + id: part.id, + qty: part.quantity, + sparePart: SparePart(id: part.reportPartID, partName: part.name, partNo: part.code), + )); + setState(() {}); + }, + ); + }), ), - ), - ), + const SizedBox(height: 16), + ], ), - const SizedBox(height: 24), - ], - ), + ), + const SizedBox(height: 24), + ], ), ), ), diff --git a/lib/views/widgets/parts/part_item.dart b/lib/views/widgets/parts/part_item.dart index 63d411e4..33575018 100644 --- a/lib/views/widgets/parts/part_item.dart +++ b/lib/views/widgets/parts/part_item.dart @@ -19,64 +19,65 @@ class _PartItemState extends State { //final _subtitle = AppLocalization.of(context).subtitle; return Column( children: [ - Divider(), + const Divider(), Row( children: [ Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Text( - widget.part.code, - style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.bold), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: Text( + widget?.part?.code ?? "", + style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.bold), + ), ), - ), - AIconButton2( - iconData: Icons.add, - color: Theme.of(context).primaryColor, - onPressed: () { - widget.part.quantity++; - setState(() {}); - }, - ), - AIconButton2( - iconData: Icons.remove, - color: Theme.of(context).primaryColor, - onPressed: widget.part.quantity < 2 - ? null - : () { - widget.part.quantity--; - setState(() {}); - }, - ), - SizedBox( - width: 8 * AppStyle.getScaleFactor(context), - ), - Text( - widget.part.quantity.toString(), - style: Theme.of(context).textTheme.headline6.copyWith( - //fontSize: 12, - //fontWeight: FontWeight.bold - ), - ), - SizedBox( - width: 8 * AppStyle.getScaleFactor(context), - ), - ], - ), - widget.part.name == null - ? SizedBox.shrink() - : Text( - widget.part.name, - style: Theme.of(context).textTheme.caption.copyWith(fontSize: 11, fontWeight: FontWeight.bold), - maxLines: 1, - overflow: TextOverflow.ellipsis, + AIconButton2( + iconData: Icons.add, + color: Theme.of(context).primaryColor, + onPressed: () { + widget.part.quantity++; + setState(() {}); + }, ), - ], - )), + AIconButton2( + iconData: Icons.remove, + color: Theme.of(context).primaryColor, + onPressed: widget.part.quantity < 2 + ? null + : () { + widget.part.quantity--; + setState(() {}); + }, + ), + SizedBox( + width: 8 * AppStyle.getScaleFactor(context), + ), + Text( + widget.part.quantity.toString(), + style: Theme.of(context).textTheme.headline6.copyWith( + //fontSize: 12, + //fontWeight: FontWeight.bold + ), + ), + SizedBox( + width: 8 * AppStyle.getScaleFactor(context), + ), + ], + ), + widget.part.name == null + ? const SizedBox.shrink() + : Text( + widget.part.name, + style: Theme.of(context).textTheme.caption.copyWith(fontSize: 11, fontWeight: FontWeight.bold), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), AIconButton2( iconData: Icons.close, color: Colors.red,