From 828ae74e48cd6643e0379cf0c8103abc70aed333 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 26 Feb 2024 11:16:33 +0300 Subject: [PATCH] bug 309, 297, 293 fixed. --- lib/main.dart | 4 +- .../search_sub_workorder_page.dart | 444 +++++++++--------- .../pages/sub_workorder/workorder_list.dart | 196 ++++---- .../requests/first_action_bottom_sheet.dart | 20 +- .../work_order/create_service_report.dart | 14 +- 5 files changed, 346 insertions(+), 332 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 066ac55f..05f9f0bb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -246,7 +246,9 @@ class MyApp extends StatelessWidget { TrackGasRefillPage.id: (_) => const TrackGasRefillPage(), RequestDeviceTransfer.id: (_) => const RequestDeviceTransfer(), TrackDeviceTransferPage.id: (_) => const TrackDeviceTransferPage(), - SearchSubWorkOrderPage.id: (_) => const SearchSubWorkOrderPage(), + + // todo remove this class after work + // SearchSubWorkOrderPage.id: (_) => const SearchSubWorkOrderPage(), CreateSubWorkOrderPage.id: (_) => const CreateSubWorkOrderPage(), WorkOrderListPage.id: (_) => WorkOrderListPage(), AssetDetailPage.id: (_) => AssetDetailPage(), diff --git a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart index 39992c12..8facb7bd 100644 --- a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -1,222 +1,222 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/models/employee.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/service_request/search_work_order.dart'; -import 'package:test_sa/views/pages/sub_workorder/workorder_list.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; -import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field_new.dart'; - -import '../../../controllers/api_routes/http_status_manger.dart'; -import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart'; -import '../../../models/new_models/assigned_employee.dart'; -import '../../widgets/buttons/app_back_button.dart'; -import '../../widgets/buttons/app_button.dart'; -import '../../widgets/status/report/service_report_all_users.dart'; -import '../../widgets/status/report/service_report_maintenance_situation.dart'; -import '../../widgets/status/report/service_report_visit_date_operator.dart'; -import '../../widgets/titles/app_sub_title.dart'; - -class SearchSubWorkOrderPage extends StatefulWidget { - static String id = "/SubWorkOrderPage"; - - const SearchSubWorkOrderPage({Key key}) : super(key: key); - - @override - State createState() => _SearchSubWorkOrderPageState(); -} - -class _SearchSubWorkOrderPageState extends State { - final GlobalKey _formKey = GlobalKey(); - final SearchWorkOrder _searchWorkOrders = SearchWorkOrder(); - - bool _isLoading = false; - String _callerId = "", _site = ""; - Lookup _dateOperator; - - @override - void initState() { - super.initState(); - if (context.mounted) { - Provider.of(context, listen: false).reset(); - } - } - - @override - Widget build(BuildContext context) { - return Scaffold( - body: SafeArea( - child: SingleChildScrollView( - child: Column( - children: [ - Container( - // color: AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Column( - children: [ - Row( - children: [ - const ABackButton(), - Expanded( - child: Center( - child: Text( - "Search Work Order", - // style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), - ), - ), - ), - const SizedBox( - width: 48, - ) - ], - ), - ], - ), - ), - const SizedBox(height: 8), - Form( - key: _formKey, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ATextFormField( - labelText: "Call ID", - onSaved: (value) { - _callerId = value; - }, - ), - const SizedBox(height: 16), - ATextFormField( - labelText: "Asset S.N.", - textInputType: TextInputType.number, - onSaved: (value) { - if (value != null) { - _searchWorkOrders.assetType = Lookup(name: value); - } - }, - ), - const SizedBox(height: 16), - ATextFormField( - labelText: "Work Order No.", - onSaved: (value) { - _searchWorkOrders.workOrderNo = value; - }, - ), - const SizedBox(height: 16), - ASubTitle(context.translation.assignedEmployee), - const SizedBox(height: 4), - ServiceReportAllUsers( - initialValue: _searchWorkOrders.assignedEmployee == null ? null : Employee(id: _searchWorkOrders.assignedEmployee.id, name: _searchWorkOrders.assignedEmployee.name), - onSelect: (engineer) { - _searchWorkOrders.assignedEmployee = AssignedEmployee(id: engineer.id, name: engineer.name); - }, - ), - const SizedBox(height: 16), - const ASubTitle("Maintenance Situation"), - const SizedBox(height: 4), - ServiceReportMaintenanceSituation( - initialValue: _searchWorkOrders.calllastSituation, - onSelect: (status) { - if (status?.value == 12 || _searchWorkOrders.calllastSituation?.value == 12) { - _searchWorkOrders.calllastSituation = status; - setState(() {}); - } else { - _searchWorkOrders.calllastSituation = status; - } - }, - woId: _searchWorkOrders.id?.toString(), - ), - const SizedBox(height: 16), - HospitalAutoCompleteField( - initialValue: _site, - onSearch: (value) { - _site = value.name; - setState(() {}); - }, - ), - const SizedBox(height: 16), - ASubTitle(context.translation.visitDate), - const SizedBox(height: 4), - ServiceReportVisitDateOperator( - initialValue: _dateOperator, - onSelect: (status) { - _dateOperator = status; - }, - ), - Row( - children: [ - Expanded( - child: ADatePicker( - date: DateTime.tryParse(_searchWorkOrders.visitDate ?? ""), - from: DateTime(1950), - onDatePicker: (date) { - _searchWorkOrders.visitDate = date?.toIso8601String(); - setState(() {}); - }, - ), - ), - ], - ), - ], - ), - ), - ), - const SizedBox(height: 100), - ], - ), - ), - ), - floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, - floatingActionButton: _isLoading - ? const CircularProgressIndicator() - : Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: AButton( - text: context.translation.search, - onPressed: () async { - _isLoading = true; - setState(() {}); - if (_formKey.currentState?.validate() ?? false) {} - _formKey.currentState?.save(); - final serviceRequestsProvider = Provider.of(context, listen: false); - serviceRequestsProvider.reset(); - final List woList = await serviceRequestsProvider.searchForWorkOrders( - _searchWorkOrders, - _callerId, - _dateOperator, - _site, - ); - _isLoading = false; - setState(() {}); - if (serviceRequestsProvider.stateCode >= 200 && serviceRequestsProvider.stateCode < 300) { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => WorkOrderList( - items: woList, - onLazyLoading: () async { - return await serviceRequestsProvider.searchForWorkOrders( - _searchWorkOrders, - _callerId, - _dateOperator, - _site, - ); - }, - ), - ), - ); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: context.translation); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); - } - }, - ), - ), - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:provider/provider.dart'; +// import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +// import 'package:test_sa/extensions/context_extension.dart'; +// import 'package:test_sa/models/employee.dart'; +// import 'package:test_sa/models/lookup.dart'; +// import 'package:test_sa/models/service_request/search_work_order.dart'; +// import 'package:test_sa/views/pages/sub_workorder/workorder_list.dart'; +// import 'package:test_sa/views/widgets/app_text_form_field.dart'; +// import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +// import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field_new.dart'; +// +// import '../../../controllers/api_routes/http_status_manger.dart'; +// import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart'; +// import '../../../models/new_models/assigned_employee.dart'; +// import '../../widgets/buttons/app_back_button.dart'; +// import '../../widgets/buttons/app_button.dart'; +// import '../../widgets/status/report/service_report_all_users.dart'; +// import '../../widgets/status/report/service_report_maintenance_situation.dart'; +// import '../../widgets/status/report/service_report_visit_date_operator.dart'; +// import '../../widgets/titles/app_sub_title.dart'; +// todo remove this class after work +// class SearchSubWorkOrderPage extends StatefulWidget { +// static String id = "/SubWorkOrderPage"; +// +// const SearchSubWorkOrderPage({Key key}) : super(key: key); +// +// @override +// State createState() => _SearchSubWorkOrderPageState(); +// } +// +// class _SearchSubWorkOrderPageState extends State { +// final GlobalKey _formKey = GlobalKey(); +// final SearchWorkOrder _searchWorkOrders = SearchWorkOrder(); +// +// bool _isLoading = false; +// String _callerId = "", _site = ""; +// Lookup _dateOperator; +// +// @override +// void initState() { +// super.initState(); +// if (context.mounted) { +// Provider.of(context, listen: false).reset(); +// } +// } +// +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// body: SafeArea( +// child: SingleChildScrollView( +// child: Column( +// children: [ +// Container( +// // color: AColors.primaryColor, +// padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), +// child: Column( +// children: [ +// Row( +// children: [ +// const ABackButton(), +// Expanded( +// child: Center( +// child: Text( +// "Search Work Order", +// // style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), +// ), +// ), +// ), +// const SizedBox( +// width: 48, +// ) +// ], +// ), +// ], +// ), +// ), +// const SizedBox(height: 8), +// Form( +// key: _formKey, +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// ATextFormField( +// labelText: "Call ID", +// onSaved: (value) { +// _callerId = value; +// }, +// ), +// const SizedBox(height: 16), +// ATextFormField( +// labelText: "Asset S.N.", +// textInputType: TextInputType.number, +// onSaved: (value) { +// if (value != null) { +// _searchWorkOrders.assetType = Lookup(name: value); +// } +// }, +// ), +// const SizedBox(height: 16), +// ATextFormField( +// labelText: "Work Order No.", +// onSaved: (value) { +// _searchWorkOrders.workOrderNo = value; +// }, +// ), +// const SizedBox(height: 16), +// ASubTitle(context.translation.assignedEmployee), +// const SizedBox(height: 4), +// ServiceReportAllUsers( +// initialValue: _searchWorkOrders.assignedEmployee == null ? null : Employee(id: _searchWorkOrders.assignedEmployee.id, name: _searchWorkOrders.assignedEmployee.name), +// onSelect: (engineer) { +// _searchWorkOrders.assignedEmployee = AssignedEmployee(id: engineer.id, name: engineer.name); +// }, +// ), +// const SizedBox(height: 16), +// const ASubTitle("Maintenance Situation"), +// const SizedBox(height: 4), +// ServiceReportMaintenanceSituation( +// initialValue: _searchWorkOrders.calllastSituation, +// onSelect: (status) { +// if (status?.value == 12 || _searchWorkOrders.calllastSituation?.value == 12) { +// _searchWorkOrders.calllastSituation = status; +// setState(() {}); +// } else { +// _searchWorkOrders.calllastSituation = status; +// } +// }, +// woId: _searchWorkOrders.id?.toString(), +// ), +// const SizedBox(height: 16), +// HospitalAutoCompleteField( +// initialValue: _site, +// onSearch: (value) { +// _site = value.name; +// setState(() {}); +// }, +// ), +// const SizedBox(height: 16), +// ASubTitle(context.translation.visitDate), +// const SizedBox(height: 4), +// ServiceReportVisitDateOperator( +// initialValue: _dateOperator, +// onSelect: (status) { +// _dateOperator = status; +// }, +// ), +// Row( +// children: [ +// Expanded( +// child: ADatePicker( +// date: DateTime.tryParse(_searchWorkOrders.visitDate ?? ""), +// from: DateTime(1950), +// onDatePicker: (date) { +// _searchWorkOrders.visitDate = date?.toIso8601String(); +// setState(() {}); +// }, +// ), +// ), +// ], +// ), +// ], +// ), +// ), +// ), +// const SizedBox(height: 100), +// ], +// ), +// ), +// ), +// floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, +// floatingActionButton: _isLoading +// ? const CircularProgressIndicator() +// : Padding( +// padding: const EdgeInsets.symmetric(horizontal: 16), +// child: AButton( +// text: context.translation.search, +// onPressed: () async { +// _isLoading = true; +// setState(() {}); +// if (_formKey.currentState?.validate() ?? false) {} +// _formKey.currentState?.save(); +// final serviceRequestsProvider = Provider.of(context, listen: false); +// serviceRequestsProvider.reset(); +// final List woList = await serviceRequestsProvider.searchForWorkOrders( +// _searchWorkOrders, +// _callerId, +// _dateOperator, +// _site, +// ); +// _isLoading = false; +// setState(() {}); +// if (serviceRequestsProvider.stateCode >= 200 && serviceRequestsProvider.stateCode < 300) { +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (context) => WorkOrderList( +// items: woList, +// onLazyLoading: () async { +// return await serviceRequestsProvider.searchForWorkOrders( +// _searchWorkOrders, +// _callerId, +// _dateOperator, +// _site, +// ); +// }, +// ), +// ), +// ); +// } else { +// String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: context.translation); +// ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); +// } +// }, +// ), +// ), +// ); +// } +// } diff --git a/lib/views/pages/sub_workorder/workorder_list.dart b/lib/views/pages/sub_workorder/workorder_list.dart index 6759d800..9fa36397 100644 --- a/lib/views/pages/sub_workorder/workorder_list.dart +++ b/lib/views/pages/sub_workorder/workorder_list.dart @@ -1,98 +1,98 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/views/pages/sub_workorder/workorder_item.dart'; - -import '../../../controllers/providers/api/service_requests_provider.dart'; -import '../../../models/service_request/search_work_order.dart'; -import '../../widgets/buttons/app_back_button.dart'; -import '../../widgets/loaders/lazy_loading.dart'; -import '../../widgets/loaders/no_item_found.dart'; -import 'create_sub_workorder_page.dart'; - -class WorkOrderList extends StatefulWidget { - List items; - final Future> Function() onLazyLoading; - - WorkOrderList({Key key, this.items, this.onLazyLoading}) : super(key: key); - - @override - State createState() => _WorkOrderListState(); -} - -class _WorkOrderListState extends State { - List _items; - - @override - void initState() { - super.initState(); - _items = widget.items; - } - - @override - Widget build(BuildContext context) { - final serviceRequestsProvider = Provider.of(context, listen: false); - - return Scaffold( - body: SafeArea( - child: Column( - children: [ - Container( - // color: AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Column( - children: [ - Row( - children: [ - const ABackButton(), - Expanded( - child: Center( - child: Text( - "Work Order List", - // style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), - ), - ), - ), - const SizedBox(width: 48), - ], - ), - ], - ), - ), - Expanded( - child: _items?.isEmpty ?? [] - ? NoItemFound( - message: context.translation.noServiceRequestFound, - ) - : LazyLoading( - nextPage: serviceRequestsProvider.nextPage, - onLazyLoad: () async { - _items = await widget.onLazyLoading(); - setState(() {}); - }, - child: ListView.builder( - itemCount: _items.length, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - itemBuilder: (context, itemIndex) { - return WorkOrderItem( - index: itemIndex, - onPressed: (model) { - // Navigator.of(context).push(MaterialPageRoute( - // builder: (_) => WorkOrderUpdate(item: model,))); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder: model)), - ); - }, - item: _items[itemIndex], - ); - }, - ), - ), - ), - ], - ), - ), - ); - } -} +// import 'package:flutter/material.dart'; +// import 'package:provider/provider.dart'; +// import 'package:test_sa/extensions/context_extension.dart'; +// import 'package:test_sa/views/pages/sub_workorder/workorder_item.dart'; +// +// import '../../../controllers/providers/api/service_requests_provider.dart'; +// import '../../../models/service_request/search_work_order.dart'; +// import '../../widgets/buttons/app_back_button.dart'; +// import '../../widgets/loaders/lazy_loading.dart'; +// import '../../widgets/loaders/no_item_found.dart'; +// import 'create_sub_workorder_page.dart'; +//// todo remove this class after work +// class WorkOrderList extends StatefulWidget { +// List items; +// final Future> Function() onLazyLoading; +// +// WorkOrderList({Key key, this.items, this.onLazyLoading}) : super(key: key); +// +// @override +// State createState() => _WorkOrderListState(); +// } +// +// class _WorkOrderListState extends State { +// List _items; +// +// @override +// void initState() { +// super.initState(); +// _items = widget.items; +// } +// +// @override +// Widget build(BuildContext context) { +// final serviceRequestsProvider = Provider.of(context, listen: false); +// +// return Scaffold( +// body: SafeArea( +// child: Column( +// children: [ +// Container( +// // color: AColors.primaryColor, +// padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), +// child: Column( +// children: [ +// Row( +// children: [ +// const ABackButton(), +// Expanded( +// child: Center( +// child: Text( +// "Work Order List", +// // style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), +// ), +// ), +// ), +// const SizedBox(width: 48), +// ], +// ), +// ], +// ), +// ), +// Expanded( +// child: _items?.isEmpty ?? [] +// ? NoItemFound( +// message: context.translation.noServiceRequestFound, +// ) +// : LazyLoading( +// nextPage: serviceRequestsProvider.nextPage, +// onLazyLoad: () async { +// _items = await widget.onLazyLoading(); +// setState(() {}); +// }, +// child: ListView.builder( +// itemCount: _items.length, +// padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), +// itemBuilder: (context, itemIndex) { +// return WorkOrderItem( +// index: itemIndex, +// onPressed: (model) { +// // Navigator.of(context).push(MaterialPageRoute( +// // builder: (_) => WorkOrderUpdate(item: model,))); +// Navigator.push( +// context, +// MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder: model)), +// ); +// }, +// item: _items[itemIndex], +// ); +// }, +// ), +// ), +// ), +// ], +// ), +// ), +// ); +// } +// } diff --git a/lib/views/pages/user/requests/first_action_bottom_sheet.dart b/lib/views/pages/user/requests/first_action_bottom_sheet.dart index 3dbe4e95..30d322f8 100644 --- a/lib/views/pages/user/requests/first_action_bottom_sheet.dart +++ b/lib/views/pages/user/requests/first_action_bottom_sheet.dart @@ -129,16 +129,16 @@ class _FirstActionBottomSheetState extends State { // }); // }, // ), - if (_serviceRequest?.loanAvailability?.value == 1) 8.height, - if (_serviceRequest?.loanAvailability?.value == 1) - PickAsset( - device: asset ?? _serviceRequest.device, - onPickAsset: (asset) { - setState(() { - this.asset = asset; - }); - }, - ), + // if (_serviceRequest?.loanAvailability?.value == 1) 8.height, + // if (_serviceRequest?.loanAvailability?.value == 1) + // PickAsset( + // device: asset ?? _serviceRequest.device, + // onPickAsset: (asset) { + // setState(() { + // this.asset = asset; + // }); + // }, + // ), 8.height, AppTextFormField( labelText: context.translation.comments, diff --git a/lib/views/pages/user/requests/work_order/create_service_report.dart b/lib/views/pages/user/requests/work_order/create_service_report.dart index 999388ed..d21e034e 100644 --- a/lib/views/pages/user/requests/work_order/create_service_report.dart +++ b/lib/views/pages/user/requests/work_order/create_service_report.dart @@ -101,6 +101,7 @@ class _CreateServiceReportState extends State with TickerPr _serviceReport.callRequest = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id); await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); _serviceReport.assignedEmployee = _serviceReport.callRequest?.assignedEmployee; + _serviceReport.equipmentStatus = _serviceReport.callRequest?.defectType; _spareParts = await _partsProvider.getPartsList(assetId: widget.request.deviceId); _isLoading = false; setState(() {}); @@ -185,6 +186,15 @@ class _CreateServiceReportState extends State with TickerPr enabled: _serviceReport.endofWorkTime == null, onChange: (timer) async { _serviceReport.timer = timer; + if (timer?.startAt != null && timer?.endAt != null) { + if (timer?.durationInSecond != 0) { + _serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"); + } else { + timer.durationInSecond = (timer.endAt.difference(timer.startAt))?.inSeconds; + String workingHours = (((timer.durationInSecond ?? 0) / 60) / 60).toStringAsFixed(2); + _serviceReport.workingHours = num.tryParse(workingHours ?? "0"); + } + } return true; }, ), @@ -215,7 +225,9 @@ class _CreateServiceReportState extends State with TickerPr title: context.translation.equipmentStatus, initialValue: _serviceReport.equipmentStatus, onSelect: (value) { - _serviceReport.equipmentStatus = value; + if (value != null) { + _serviceReport.equipmentStatus = value; + } }, ), 8.height,