Merge pull request 'zaid_development_new' (#1) from zaid_development_new into main_latest_merged
Reviewed-on: http://34.17.52.79/Haroon6138/cloudsolutions-atoms/pulls/1main_latest_merged
commit
45a1707352
@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="50.481" height="50.488" viewBox="0 0 50.481 50.488">
|
||||
<g id="research_1_" data-name="research (1)" transform="translate(-2 -2)">
|
||||
<path id="Path_4616" data-name="Path 4616" d="M9.2,15H3.8A1.8,1.8,0,0,0,2,16.8V31.226a1.8,1.8,0,0,0,1.8,1.8H18.226a1.8,1.8,0,0,0,1.8-1.8v-.937a16.379,16.379,0,0,1-6.094-3.858A16.215,16.215,0,0,1,9.2,15Z" transform="translate(0 10.437)" fill="#5bb0d9"/>
|
||||
<path id="Path_4617" data-name="Path 4617" d="M3.8,20.028h6.292a15.865,15.865,0,0,1,3.84-6.094,16.379,16.379,0,0,1,6.094-3.856V3.8a1.8,1.8,0,0,0-1.8-1.8H3.8A1.8,1.8,0,0,0,2,3.8V18.226a1.8,1.8,0,0,0,1.8,1.8ZM7.03,9.41a1.785,1.785,0,0,1,2.56,0l.739.739,2.109-2.091A1.8,1.8,0,0,1,15,10.6l-3.389,3.371a1.763,1.763,0,0,1-2.542,0L7.03,11.952a1.8,1.8,0,0,1,0-2.54Z" fill="#5bb0d9"/>
|
||||
<path id="Path_4618" data-name="Path 4618" d="M46.922,39.274a1.945,1.945,0,0,0-.22-.193L37.78,32.706a1.8,1.8,0,0,0-2.322.193L32.82,30.262a14.452,14.452,0,1,0-2.558,2.558L32.9,35.458a1.8,1.8,0,0,0-.193,2.322L39.081,46.7a1.785,1.785,0,0,0,.193.227,5.408,5.408,0,1,0,7.648-7.648Zm-33.145-10.2a10.817,10.817,0,1,1,7.648,3.168,10.817,10.817,0,0,1-7.648-3.168Z" transform="translate(3.975 3.975)" fill="#5bb0d9"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
@ -0,0 +1,76 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:test_sa/controllers/api_routes/api_manager.dart';
|
||||
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||
import 'package:test_sa/models/service_request/search_work_order.dart';
|
||||
|
||||
class ServiceReportAssistantsEmployeeProvider extends ChangeNotifier {
|
||||
//reset provider data
|
||||
void reset() {
|
||||
_assistantEmployees = null;
|
||||
_loading = null;
|
||||
_stateCode = null;
|
||||
}
|
||||
|
||||
// state code of current request to defied error message
|
||||
// like 400 customer request failed
|
||||
// 500 service not available
|
||||
int _stateCode;
|
||||
int get stateCode => _stateCode;
|
||||
|
||||
// contain user data
|
||||
// when user not login or register _user = null
|
||||
List<AssistantEmployees> _assistantEmployees;
|
||||
List<AssistantEmployees> get assistantEmployees => _assistantEmployees;
|
||||
|
||||
// when categories in-process _loading = true
|
||||
// done _loading = true
|
||||
// failed _loading = false
|
||||
bool _loading;
|
||||
bool get isLoading => _loading;
|
||||
set isLoading(bool isLoading) {
|
||||
_loading = isLoading;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// return -2 if request in progress
|
||||
/// return -1 if error happen when sending request
|
||||
/// return state code if request complete may be 200, 404 or 403
|
||||
/// for more details check http state manager
|
||||
/// lib\controllers\http_status_manger\http_status_manger.dart
|
||||
Future<int> getAssistantEmployees() async {
|
||||
if (_loading == true) return -2;
|
||||
_loading = true;
|
||||
notifyListeners();
|
||||
Response response;
|
||||
try {
|
||||
response = await ApiManager.instance.get(
|
||||
"${URLs.getEngineers}",
|
||||
);
|
||||
// response = await get(
|
||||
// Uri.parse(
|
||||
// URLs.getServiceReportLastCalls
|
||||
// +(serviceStatus == null ? "" : "?service_status=$serviceStatus")
|
||||
// ),
|
||||
// );
|
||||
_stateCode = response.statusCode;
|
||||
if (response.statusCode >= 200 && response.statusCode < 300) {
|
||||
// client's request was successfully received
|
||||
List usersListJson = json.decode(response.body);
|
||||
_assistantEmployees = [];
|
||||
_assistantEmployees = usersListJson.map((type) => AssistantEmployees.fromJson(type ?? {})).toList();
|
||||
}
|
||||
_loading = false;
|
||||
notifyListeners();
|
||||
return response.statusCode;
|
||||
} catch (error) {
|
||||
_loading = false;
|
||||
_stateCode = -1;
|
||||
notifyListeners();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:test_sa/controllers/api_routes/api_manager.dart';
|
||||
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
|
||||
class ServiceReportMaintenanceSituationProvider extends ChangeNotifier {
|
||||
//reset provider data
|
||||
void reset() {
|
||||
_calls = null;
|
||||
_loading = null;
|
||||
_stateCode = null;
|
||||
}
|
||||
|
||||
// state code of current request to defied error message
|
||||
// like 400 customer request failed
|
||||
// 500 service not available
|
||||
int _stateCode;
|
||||
int get stateCode => _stateCode;
|
||||
|
||||
// contain user data
|
||||
// when user not login or register _user = null
|
||||
List<Lookup> _calls;
|
||||
List<Lookup> get operators => _calls;
|
||||
|
||||
// when categories in-process _loading = true
|
||||
// done _loading = true
|
||||
// failed _loading = false
|
||||
bool _loading;
|
||||
bool get isLoading => _loading;
|
||||
set isLoading(bool isLoading) {
|
||||
_loading = isLoading;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// return -2 if request in progress
|
||||
/// return -1 if error happen when sending request
|
||||
/// return state code if request complete may be 200, 404 or 403
|
||||
/// for more details check http state manager
|
||||
/// lib\controllers\http_status_manger\http_status_manger.dart
|
||||
Future<int> getOperators(String woId) async {
|
||||
if (_loading == true) return -2;
|
||||
_loading = true;
|
||||
notifyListeners();
|
||||
Response response;
|
||||
try {
|
||||
response = await ApiManager.instance.get(
|
||||
woId == null ? "${URLs.getMaintenanceSituation}" : "${URLs.getServiceReportLastCalls}?parentWOId=$woId&isAdd=true&id=${0}&typeTransaction='Nothing'",
|
||||
);
|
||||
// response = await get(
|
||||
// Uri.parse(
|
||||
// URLs.getServiceReportLastCalls
|
||||
// +(serviceStatus == null ? "" : "?service_status=$serviceStatus")
|
||||
// ),
|
||||
// );
|
||||
_stateCode = response.statusCode;
|
||||
if (response.statusCode >= 200 && response.statusCode < 300) {
|
||||
// client's request was successfully received
|
||||
List categoriesListJson = json.decode(response.body)["data"];
|
||||
_calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
|
||||
}
|
||||
_loading = false;
|
||||
notifyListeners();
|
||||
return response.statusCode;
|
||||
} catch (error) {
|
||||
_loading = false;
|
||||
_stateCode = -1;
|
||||
notifyListeners();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:test_sa/controllers/api_routes/api_manager.dart';
|
||||
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||
import 'package:test_sa/models/engineer.dart';
|
||||
|
||||
class ServiceReportUsersProvider extends ChangeNotifier {
|
||||
//reset provider data
|
||||
void reset() {
|
||||
_engineers = null;
|
||||
_loading = null;
|
||||
_stateCode = null;
|
||||
}
|
||||
|
||||
// state code of current request to defied error message
|
||||
// like 400 customer request failed
|
||||
// 500 service not available
|
||||
int _stateCode;
|
||||
int get stateCode => _stateCode;
|
||||
|
||||
// contain user data
|
||||
// when user not login or register _user = null
|
||||
List<Engineer> _engineers;
|
||||
List<Engineer> get engineers => _engineers;
|
||||
|
||||
// when categories in-process _loading = true
|
||||
// done _loading = true
|
||||
// failed _loading = false
|
||||
bool _loading;
|
||||
bool get isLoading => _loading;
|
||||
set isLoading(bool isLoading) {
|
||||
_loading = isLoading;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// return -2 if request in progress
|
||||
/// return -1 if error happen when sending request
|
||||
/// return state code if request complete may be 200, 404 or 403
|
||||
/// for more details check http state manager
|
||||
/// lib\controllers\http_status_manger\http_status_manger.dart
|
||||
Future<int> getAllUsers() async {
|
||||
if (_loading == true) return -2;
|
||||
_loading = true;
|
||||
notifyListeners();
|
||||
Response response;
|
||||
try {
|
||||
response = await ApiManager.instance.get(
|
||||
"${URLs.getAllUsers}",
|
||||
);
|
||||
// response = await get(
|
||||
// Uri.parse(
|
||||
// URLs.getServiceReportLastCalls
|
||||
// +(serviceStatus == null ? "" : "?service_status=$serviceStatus")
|
||||
// ),
|
||||
// );
|
||||
_stateCode = response.statusCode;
|
||||
if (response.statusCode >= 200 && response.statusCode < 300) {
|
||||
// client's request was successfully received
|
||||
List usersListJson = json.decode(response.body);
|
||||
_engineers = usersListJson.map((type) => Engineer.fromJson(type)).toList();
|
||||
}
|
||||
_loading = false;
|
||||
notifyListeners();
|
||||
return response.statusCode;
|
||||
} catch (error) {
|
||||
_loading = false;
|
||||
_stateCode = -1;
|
||||
notifyListeners();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:http/http.dart';
|
||||
import 'package:test_sa/controllers/api_routes/api_manager.dart';
|
||||
import 'package:test_sa/controllers/api_routes/urls.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
|
||||
class ServiceReportVisitOperatorProvider extends ChangeNotifier {
|
||||
//reset provider data
|
||||
void reset() {
|
||||
_calls = null;
|
||||
_loading = null;
|
||||
_stateCode = null;
|
||||
}
|
||||
|
||||
// state code of current request to defied error message
|
||||
// like 400 customer request failed
|
||||
// 500 service not available
|
||||
int _stateCode;
|
||||
int get stateCode => _stateCode;
|
||||
|
||||
// contain user data
|
||||
// when user not login or register _user = null
|
||||
List<Lookup> _calls;
|
||||
List<Lookup> get operators => _calls;
|
||||
|
||||
// when categories in-process _loading = true
|
||||
// done _loading = true
|
||||
// failed _loading = false
|
||||
bool _loading;
|
||||
bool get isLoading => _loading;
|
||||
set isLoading(bool isLoading) {
|
||||
_loading = isLoading;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// return -2 if request in progress
|
||||
/// return -1 if error happen when sending request
|
||||
/// return state code if request complete may be 200, 404 or 403
|
||||
/// for more details check http state manager
|
||||
/// lib\controllers\http_status_manger\http_status_manger.dart
|
||||
Future<int> getOperators() async {
|
||||
if (_loading == true) return -2;
|
||||
_loading = true;
|
||||
notifyListeners();
|
||||
Response response;
|
||||
try {
|
||||
response = await ApiManager.instance.get(
|
||||
"${URLs.getDateOperators}",
|
||||
);
|
||||
// response = await get(
|
||||
// Uri.parse(
|
||||
// URLs.getServiceReportLastCalls
|
||||
// +(serviceStatus == null ? "" : "?service_status=$serviceStatus")
|
||||
// ),
|
||||
// );
|
||||
_stateCode = response.statusCode;
|
||||
if (response.statusCode >= 200 && response.statusCode < 300) {
|
||||
// client's request was successfully received
|
||||
List categoriesListJson = json.decode(response.body)["data"];
|
||||
_calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
|
||||
}
|
||||
_loading = false;
|
||||
notifyListeners();
|
||||
return response.statusCode;
|
||||
} catch (error) {
|
||||
_loading = false;
|
||||
_stateCode = -1;
|
||||
notifyListeners();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,363 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
|
||||
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart';
|
||||
import 'package:test_sa/extensions/widget_extensions.dart';
|
||||
import 'package:test_sa/models/call_request_for_work_order_model.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
import 'package:test_sa/models/service_report.dart';
|
||||
import 'package:test_sa/models/service_request/search_work_order.dart';
|
||||
import 'package:test_sa/views/app_style/colors.dart';
|
||||
import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart';
|
||||
import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart';
|
||||
import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
|
||||
import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.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';
|
||||
import '../../widgets/buttons/app_button.dart';
|
||||
import '../../widgets/date_and_time/date_picker.dart';
|
||||
import '../../widgets/images/mini_one_image_picker.dart';
|
||||
import '../../widgets/status/report/service_report_fault_description.dart';
|
||||
import '../../widgets/status/report/service_report_reasons.dart';
|
||||
import '../../widgets/titles/app_sub_title.dart';
|
||||
|
||||
class CreateSubWorkOrderPage extends StatefulWidget {
|
||||
static const id = "/CreateSubWorkOrder";
|
||||
final SearchWorkOrder workOrder;
|
||||
|
||||
const CreateSubWorkOrderPage({this.workOrder, Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<CreateSubWorkOrderPage> createState() => _CreateSubWorkOrderPageState();
|
||||
}
|
||||
|
||||
class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
SearchWorkOrder _subWorkOrders;
|
||||
Lookup _serviceReportReason = const Lookup();
|
||||
ServiceReport _serviceReport;
|
||||
File _image;
|
||||
bool _isLoading = false;
|
||||
bool _validate = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_subWorkOrders = SearchWorkOrder(
|
||||
assignedEmployee: widget?.workOrder?.callRequest?.assignedEmployee,
|
||||
callRequest: CallRequest(id: widget?.workOrder?.callRequest?.id),
|
||||
currentSituation: null,
|
||||
supplier: null,
|
||||
);
|
||||
_serviceReport = ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus);
|
||||
_isLoading = true;
|
||||
super.initState();
|
||||
}
|
||||
|
||||
var assetTypesProvider;
|
||||
CallRequestForWorkOrder _callRequestForWorkOrder;
|
||||
|
||||
Future getAssetType() async {
|
||||
//if (assetTypesProvider == null) {
|
||||
Provider.of<ServiceRequestFaultDescriptionProvider>(context, listen: false).reset();
|
||||
assetTypesProvider = Provider.of<ServiceStatusProvider>(context, listen: false);
|
||||
_callRequestForWorkOrder = await Provider.of<ServiceRequestsProvider>(context).getCallRequestForWorkOrder(callId: widget.workOrder.callRequest.id.toString());
|
||||
await assetTypesProvider.getTypes();
|
||||
_subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere(
|
||||
(element) => element.value == _callRequestForWorkOrder?.assetType,
|
||||
orElse: () => null,
|
||||
);
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
//}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_callRequestForWorkOrder == null) {
|
||||
getAssetType();
|
||||
}
|
||||
final Subtitle subtitle = AppLocalization.of(context).subtitle;
|
||||
|
||||
return Scaffold(
|
||||
body: SafeArea(
|
||||
child: _isLoading
|
||||
? const ALoading()
|
||||
: Column(
|
||||
children: [
|
||||
SingleChildScrollView(
|
||||
child: Form(
|
||||
key: _formKey,
|
||||
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(
|
||||
"New Work Order",
|
||||
style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 48,
|
||||
)
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
|
||||
child: Column(
|
||||
children: [
|
||||
WorkOrderDetails(item: widget.workOrder, assetType: _subWorkOrders?.assetType),
|
||||
const SizedBox(height: 8),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const ASubTitle("Equipment status"),
|
||||
if (_validate && _subWorkOrders?.equipmentStatus == null)
|
||||
ASubTitle(
|
||||
subtitle.requiredWord,
|
||||
color: Colors.red,
|
||||
),
|
||||
const SizedBox(
|
||||
height: 4,
|
||||
),
|
||||
ServiceRequestDefectTypesMenu(
|
||||
initialValue: _serviceReport.equipmentStatus,
|
||||
onSelect: (status) {
|
||||
_subWorkOrders.equipmentStatus = status;
|
||||
_serviceReport.equipmentStatus = status;
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const ASubTitle("Return to Service"),
|
||||
if (_validate && _subWorkOrders.visitDate == null)
|
||||
ASubTitle(
|
||||
subtitle.requiredWord,
|
||||
color: Colors.red,
|
||||
),
|
||||
const SizedBox(
|
||||
height: 4,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: ADatePicker(
|
||||
date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""),
|
||||
from: DateTime(1950),
|
||||
onDatePicker: (date) {
|
||||
_subWorkOrders.visitDate = date?.toIso8601String();
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
ASubTitle("Failure ${subtitle.reasons}"),
|
||||
if (_validate && _subWorkOrders.reason == null)
|
||||
ASubTitle(
|
||||
subtitle.requiredWord,
|
||||
color: Colors.red,
|
||||
),
|
||||
const SizedBox(
|
||||
height: 4,
|
||||
),
|
||||
ServiceReportReasonsMenu(
|
||||
initialValue: _serviceReportReason,
|
||||
onSelect: (status) {
|
||||
_serviceReportReason = status;
|
||||
_subWorkOrders.reason = status;
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
ASubTitle(subtitle.faultDescription),
|
||||
if (_validate && _subWorkOrders.faultDescription == null)
|
||||
ASubTitle(
|
||||
subtitle.requiredWord,
|
||||
color: Colors.red,
|
||||
),
|
||||
const SizedBox(
|
||||
height: 4,
|
||||
),
|
||||
ServiceReportFaultDescription(
|
||||
requestId: widget.workOrder?.callRequest?.id?.toString(),
|
||||
initialValue: _subWorkOrders?.faultDescription,
|
||||
onSelect: (status) {
|
||||
_subWorkOrders.faultDescription = status;
|
||||
if (mounted) setState(() {});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const ASubTitle("Solution"),
|
||||
const SizedBox(height: 4),
|
||||
ATextFormField(labelText: _subWorkOrders?.faultDescription?.workPerformed ?? "", textInputType: TextInputType.multiline, enable: false),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
await showModalBottomSheet(
|
||||
context: context,
|
||||
useSafeArea: true,
|
||||
isScrollControlled: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
builder: (context) => WorkOrderDetailsBottomSheet(subWorkOrder: _subWorkOrders),
|
||||
);
|
||||
log(_subWorkOrders?.toJson()?.toString());
|
||||
},
|
||||
child: Card(
|
||||
child: ListTile(
|
||||
title: Row(
|
||||
children: [
|
||||
Text(
|
||||
"WO Details",
|
||||
style: Theme.of(context).textTheme.bodyMedium,
|
||||
),
|
||||
const Text("*", style: TextStyle(color: Colors.red)),
|
||||
],
|
||||
),
|
||||
trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
await showModalBottomSheet(
|
||||
context: context,
|
||||
useSafeArea: true,
|
||||
isScrollControlled: true,
|
||||
backgroundColor: Colors.transparent,
|
||||
builder: (context) => SparePartsBottomSheet(subWorkOrder: _subWorkOrders),
|
||||
);
|
||||
log(_subWorkOrders?.toJson()?.toString());
|
||||
},
|
||||
child: Card(
|
||||
child: ListTile(
|
||||
title: Row(
|
||||
children: [
|
||||
Text(
|
||||
"Spare Parts",
|
||||
style: Theme.of(context).textTheme.bodyMedium,
|
||||
),
|
||||
const Text("*", style: TextStyle(color: Colors.red)),
|
||||
],
|
||||
),
|
||||
trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
AMiniOneImagePicker(
|
||||
image: _image,
|
||||
onPick: (image) {
|
||||
_image = image;
|
||||
_subWorkOrders.attachmentsWorkOrder ??= [];
|
||||
_subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"));
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 50),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
).expanded,
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: AButton(
|
||||
text: subtitle.create,
|
||||
onPressed: () async {
|
||||
_subWorkOrders.parentWOId = widget.workOrder.id;
|
||||
_validate = true;
|
||||
setState(() {});
|
||||
if (validate()) {
|
||||
if (_subWorkOrders.timer?.startAt == null || _subWorkOrders.timer?.endAt == null) {
|
||||
Fluttertoast.showToast(msg: "Working hours required");
|
||||
return;
|
||||
} else if (_subWorkOrders.calllastSituation == null) {
|
||||
Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required");
|
||||
return;
|
||||
}
|
||||
_validate = false;
|
||||
_isLoading = true;
|
||||
setState(() {});
|
||||
if (_formKey.currentState?.validate() ?? false) {}
|
||||
_formKey.currentState?.save();
|
||||
final serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
|
||||
final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders);
|
||||
_isLoading = false;
|
||||
setState(() {});
|
||||
if (status >= 200 && status < 300) {
|
||||
Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully);
|
||||
Navigator.of(context).pop();
|
||||
Navigator.of(context).pop();
|
||||
} else {
|
||||
String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: subtitle);
|
||||
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
|
||||
content: Text(errorMessage),
|
||||
));
|
||||
}
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
bool validate() {
|
||||
if (_subWorkOrders.faultDescription == null || _subWorkOrders.reason == null || _subWorkOrders.equipmentStatus == null || _subWorkOrders.visitDate == null) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,226 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
|
||||
import 'package:test_sa/models/engineer.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
import 'package:test_sa/models/service_request/search_work_order.dart';
|
||||
import 'package:test_sa/models/subtitle.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/localization/localization.dart';
|
||||
import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart';
|
||||
import '../../app_style/colors.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<SearchSubWorkOrderPage> createState() => _SearchSubWorkOrderPageState();
|
||||
}
|
||||
|
||||
class _SearchSubWorkOrderPageState extends State<SearchSubWorkOrderPage> {
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
final SearchWorkOrder _searchWorkOrders = SearchWorkOrder();
|
||||
Subtitle _subtitle;
|
||||
bool _isLoading = false;
|
||||
String _callerId = "", _site = "";
|
||||
Lookup _dateOperator;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
if (context.mounted) {
|
||||
Provider.of<ServiceReportMaintenanceSituationProvider>(context, listen: false).reset();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_subtitle = AppLocalization.of(context).subtitle;
|
||||
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: "Caller 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(_subtitle.assignedEmployee),
|
||||
const SizedBox(height: 4),
|
||||
ServiceReportAllUsers(
|
||||
initialValue: _searchWorkOrders.assignedEmployee == null ? null : Engineer(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(_subtitle.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: _subtitle.search,
|
||||
onPressed: () async {
|
||||
_isLoading = true;
|
||||
setState(() {});
|
||||
if (_formKey.currentState?.validate() ?? false) {}
|
||||
_formKey.currentState?.save();
|
||||
final serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
|
||||
serviceRequestsProvider.reset();
|
||||
final List<SearchWorkOrder> 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: _subtitle);
|
||||
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage)));
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,173 @@
|
||||
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 '../../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 {
|
||||
final SearchWorkOrder subWorkOrder;
|
||||
const SparePartsBottomSheet({this.subWorkOrder, Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<SparePartsBottomSheet> createState() => _SparePartsBottomSheetState();
|
||||
}
|
||||
|
||||
class _SparePartsBottomSheetState extends State<SparePartsBottomSheet> {
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
final SearchWorkOrder _workOrder = SearchWorkOrder();
|
||||
bool _validate = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_workOrder.copyFrom(widget.subWorkOrder);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_workOrder.sparePartsWorkOrders = widget.subWorkOrder.sparePartsWorkOrders;
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final size = MediaQuery.of(context).size;
|
||||
final Subtitle subtitle = AppLocalization.of(context).subtitle;
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
|
||||
child: ClipRRect(
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(15),
|
||||
topRight: Radius.circular(15),
|
||||
),
|
||||
clipBehavior: Clip.antiAliasWithSaveLayer,
|
||||
child: Container(
|
||||
color: Colors.white,
|
||||
height: size.height * 0.9,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20),
|
||||
child: Form(
|
||||
key: _formKey,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const ASubTitle("Spare Parts"),
|
||||
const SizedBox(height: 8),
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: SingleChildScrollView(
|
||||
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.reportPartID,
|
||||
qty: part.quantity,
|
||||
sparePart: SparePart(id: part.id, partName: part.name, partNo: part.code),
|
||||
));
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: 8 * AppStyle.getScaleFactor(context),
|
||||
),
|
||||
if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false)
|
||||
Row(
|
||||
children: [
|
||||
Expanded(flex: 3, child: Text(subtitle.number)),
|
||||
Expanded(flex: 1, child: Text(subtitle.quantity)),
|
||||
],
|
||||
),
|
||||
if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false)
|
||||
Column(
|
||||
children: List.generate(
|
||||
_workOrder.sparePartsWorkOrders?.length,
|
||||
(index) {
|
||||
final spare = _workOrder.sparePartsWorkOrders[index];
|
||||
Part part = Part(
|
||||
id: spare.sparePart?.id,
|
||||
reportPartID: spare.id,
|
||||
code: spare.sparePart?.partNo,
|
||||
name: spare.sparePart?.partName,
|
||||
quantity: spare.qty,
|
||||
);
|
||||
return PartItem(
|
||||
part: part,
|
||||
onEdit: (qty) {
|
||||
spare.qty = qty;
|
||||
},
|
||||
onDelete: (part) {
|
||||
_workOrder.sparePartsWorkOrders.remove(spare);
|
||||
setState(() {});
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
AButton(
|
||||
text: subtitle.submit,
|
||||
onPressed: () async {
|
||||
_formKey.currentState.save();
|
||||
widget.subWorkOrder.copyFrom(_workOrder);
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,176 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fluttertoast/fluttertoast.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/models/service_request/search_work_order.dart';
|
||||
import 'package:test_sa/models/subtitle.dart';
|
||||
import 'package:test_sa/views/widgets/app_text_form_field.dart';
|
||||
import 'package:test_sa/views/widgets/buttons/app_button.dart';
|
||||
import 'package:test_sa/views/widgets/status/report/service_report_assistant_employee_menu.dart';
|
||||
import 'package:test_sa/views/widgets/status/report/service_report_maintenance_situation.dart';
|
||||
import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart';
|
||||
|
||||
import '../../../controllers/localization/localization.dart';
|
||||
import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart';
|
||||
import '../../widgets/timer/app_timer.dart';
|
||||
import '../../widgets/titles/app_sub_title.dart';
|
||||
|
||||
class WorkOrderDetailsBottomSheet extends StatefulWidget {
|
||||
final SearchWorkOrder subWorkOrder;
|
||||
const WorkOrderDetailsBottomSheet({this.subWorkOrder, Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<WorkOrderDetailsBottomSheet> createState() => _WorkOrderDetailsBottomSheetState();
|
||||
}
|
||||
|
||||
class _WorkOrderDetailsBottomSheetState extends State<WorkOrderDetailsBottomSheet> {
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
final SearchWorkOrder _workOrder = SearchWorkOrder();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
_workOrder.copyFrom(widget.subWorkOrder);
|
||||
if (context.mounted) {
|
||||
Provider.of<ServiceReportMaintenanceSituationProvider>(context, listen: false).reset();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final size = MediaQuery.of(context).size;
|
||||
final Subtitle subtitle = AppLocalization.of(context).subtitle;
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
|
||||
child: ClipRRect(
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(15),
|
||||
topRight: Radius.circular(15),
|
||||
),
|
||||
clipBehavior: Clip.antiAliasWithSaveLayer,
|
||||
child: Container(
|
||||
color: Colors.white,
|
||||
height: size.height * 0.9,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20),
|
||||
child: Form(
|
||||
key: _formKey,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const ASubTitle("WO Details"),
|
||||
const SizedBox(height: 8),
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
const SizedBox(height: 8),
|
||||
ATextFormField(enable: false, hintText: "Assigned Employee: ${_workOrder.assignedEmployee?.name}"),
|
||||
const SizedBox(height: 8),
|
||||
const ASubTitle("Assistant Employee"),
|
||||
const SizedBox(height: 4),
|
||||
ServiceReportAssistantEmployeeMenu(
|
||||
initialValue: (_workOrder.assistantEmployees?.isNotEmpty ?? false) ? _workOrder.assistantEmployees?.first : null,
|
||||
onSelect: (assistantsEmployee) {
|
||||
_workOrder.assistantEmployees = [assistantsEmployee];
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
ASubTitle(subtitle.workingHours),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: AppTimer(
|
||||
timer: _workOrder.timer,
|
||||
onChange: (timer) async {
|
||||
_workOrder.timer = timer;
|
||||
_workOrder.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0");
|
||||
return true;
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
ATextFormField(
|
||||
labelText: "Travel Hours",
|
||||
initialValue: _workOrder.travelingHours?.toString(),
|
||||
textInputType: TextInputType.number,
|
||||
onSaved: (value) {
|
||||
_workOrder.travelingHours = num.tryParse(value);
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
ATextFormField(
|
||||
labelText: "Travel Expense",
|
||||
initialValue: _workOrder.travelingExpenses?.toString(),
|
||||
textInputType: TextInputType.number,
|
||||
onSaved: (value) {
|
||||
_workOrder.travelingExpenses = num.tryParse(value);
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
ASubTitle(subtitle.callLastSituation),
|
||||
const SizedBox(height: 4),
|
||||
ServiceReportMaintenanceSituation(
|
||||
initialValue: _workOrder.calllastSituation,
|
||||
onSelect: (status) {
|
||||
if (status?.value == 12 || _workOrder.calllastSituation?.value == 12) {
|
||||
_workOrder.calllastSituation = status;
|
||||
setState(() {});
|
||||
} else {
|
||||
_workOrder.calllastSituation = status;
|
||||
}
|
||||
},
|
||||
woId: widget.subWorkOrder?.callRequest?.id?.toString(),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
const ASubTitle("Repair Location"),
|
||||
const SizedBox(height: 4),
|
||||
ServiceReportRepairLocation(
|
||||
initialValue: _workOrder.repairLocation,
|
||||
onSelect: (status) {
|
||||
_workOrder.repairLocation = status;
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
ATextFormField(
|
||||
labelText: "Technical Comments",
|
||||
initialValue: _workOrder.comment,
|
||||
textInputType: TextInputType.multiline,
|
||||
onSaved: (value) {
|
||||
_workOrder.comment = value;
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
AButton(
|
||||
text: subtitle.submit,
|
||||
onPressed: () async {
|
||||
if (_workOrder?.workingHours == null) {
|
||||
await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started");
|
||||
return;
|
||||
} else if ((_workOrder?.timer?.stopped ?? false) == false) {
|
||||
await Fluttertoast.showToast(msg: "Stop The Timer");
|
||||
return;
|
||||
}
|
||||
_formKey.currentState.save();
|
||||
widget.subWorkOrder.copyFrom(_workOrder);
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
|
||||
import '../../../controllers/localization/localization.dart';
|
||||
import '../../../models/service_request/search_work_order.dart';
|
||||
import '../../../models/subtitle.dart';
|
||||
import '../../app_style/colors.dart';
|
||||
import '../../app_style/sizing.dart';
|
||||
|
||||
class WorkOrderDetails extends StatelessWidget {
|
||||
final SearchWorkOrder item;
|
||||
Lookup assetType;
|
||||
|
||||
WorkOrderDetails({@required this.item, this.assetType, Key key}) : super(key: key);
|
||||
Subtitle _subtitle;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_subtitle = AppLocalization.of(context).subtitle;
|
||||
return Column(
|
||||
children: [
|
||||
Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
decoration: BoxDecoration(
|
||||
color: AColors.inputFieldBackgroundColor,
|
||||
border: Border.all(
|
||||
color: Color(0xffefefef),
|
||||
),
|
||||
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
|
||||
// boxShadow: const [
|
||||
// AppStyle.boxShadow
|
||||
// ]
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
_buildRow(_subtitle.callId, item.callRequest?.id?.toString() ?? "", context),
|
||||
_buildRow(_subtitle.assetNumber, item.callRequest?.asset?.assetNumber ?? "", context),
|
||||
_buildRow("WO No", item.workOrderNo, context),
|
||||
_buildRow(_subtitle.assetName, item.callRequest?.asset?.assetNumber ?? '', context),
|
||||
_buildRow(_subtitle.department, item.callRequest?.asset?.department ?? '', context),
|
||||
_buildRow(_subtitle.assetSN, item.callRequest?.asset?.assetSerialNo ?? '', context),
|
||||
_buildRow(_subtitle.model, item.callRequest?.asset?.modelDefinition?.modelName ?? "", context),
|
||||
_buildRow("Manufacturer", item.callRequest?.asset?.modelDefinition?.manufacturerName ?? "", context),
|
||||
_buildRow(_subtitle.site, item.callRequest?.asset?.site?.custName ?? "", context),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
height: 55,
|
||||
decoration: BoxDecoration(
|
||||
color: AColors.inputFieldBackgroundColor,
|
||||
border: Border.all(
|
||||
color: Color(0xffefefef),
|
||||
),
|
||||
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
|
||||
),
|
||||
child: _buildRow("Asset Type", assetType?.name ?? (item.assetType?.name ?? ""), context),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildRow(String title, String value, BuildContext context) {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
title + " : ",
|
||||
style: Theme.of(context).textTheme.subtitle2.copyWith(fontWeight: FontWeight.bold),
|
||||
),
|
||||
//if (item.clientName != null)
|
||||
Text(
|
||||
value,
|
||||
style: Theme.of(context).textTheme.subtitle2.copyWith(),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,105 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:test_sa/controllers/localization/localization.dart';
|
||||
import 'package:test_sa/models/subtitle.dart';
|
||||
import 'package:test_sa/views/app_style/colors.dart';
|
||||
import 'package:test_sa/views/app_style/sizing.dart';
|
||||
import 'package:test_sa/views/widgets/requests/request_status.dart';
|
||||
|
||||
import '../../../models/service_request/search_work_order.dart';
|
||||
|
||||
class WorkOrderItem extends StatelessWidget {
|
||||
final int index;
|
||||
final SearchWorkOrder item;
|
||||
final Function(SearchWorkOrder) onPressed;
|
||||
const WorkOrderItem({Key key, this.item, this.onPressed, this.index}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Subtitle _subtitle = AppLocalization.of(context).subtitle;
|
||||
Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
|
||||
Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary;
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 4),
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8),
|
||||
backgroundColor: itemColor,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)),
|
||||
),
|
||||
),
|
||||
onPressed: () {
|
||||
onPressed(item);
|
||||
},
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
item.callRequest.callNo ?? "-----",
|
||||
style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold),
|
||||
),
|
||||
Text(
|
||||
item.callRequest.asset.id.toString(),
|
||||
style: Theme.of(context).textTheme.subtitle2.copyWith(
|
||||
color: onItemColor,
|
||||
),
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
_subtitle.assetName,
|
||||
style: Theme.of(context).textTheme.subtitle2.copyWith(
|
||||
color: onItemColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
//if (item.clientName != null)
|
||||
Text(
|
||||
item.callRequest.asset.assetNumber,
|
||||
style: Theme.of(context).textTheme.subtitle2.copyWith(
|
||||
color: onItemColor,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Text(
|
||||
item.calllastSituation.name,
|
||||
style: Theme.of(context).textTheme.subtitle2.copyWith(
|
||||
color: onItemColor,
|
||||
),
|
||||
),
|
||||
Divider(
|
||||
color: onItemColor,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
_subtitle.status,
|
||||
style: Theme.of(context).textTheme.subtitle2.copyWith(
|
||||
color: onItemColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
if (item.callRequest.status?.id != null) StatusLabel(label: item.callRequest.status.name, color: AColors.getGasStatusColor(item.callRequest.status.id)),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,101 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/views/pages/sub_workorder/workorder_item.dart';
|
||||
|
||||
import '../../../controllers/localization/localization.dart';
|
||||
import '../../../controllers/providers/api/service_requests_provider.dart';
|
||||
import '../../../models/service_request/search_work_order.dart';
|
||||
import '../../../models/subtitle.dart';
|
||||
import '../../app_style/colors.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<SearchWorkOrder> items;
|
||||
final Future<List<SearchWorkOrder>> Function() onLazyLoading;
|
||||
WorkOrderList({Key key, this.items, this.onLazyLoading}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<WorkOrderList> createState() => _WorkOrderListState();
|
||||
}
|
||||
|
||||
class _WorkOrderListState extends State<WorkOrderList> {
|
||||
List<SearchWorkOrder> _items;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_items = widget.items;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final serviceRequestsProvider = Provider.of<ServiceRequestsProvider>(context, listen: false);
|
||||
Subtitle subtitle = AppLocalization.of(context).subtitle;
|
||||
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: subtitle.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,)));
|
||||
log(model?.toJson()?.toString());
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder: model)),
|
||||
);
|
||||
},
|
||||
item: _items[itemIndex],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart';
|
||||
|
||||
import '../../../controllers/localization/localization.dart';
|
||||
import '../../../models/service_request/search_work_order.dart';
|
||||
import '../../../models/subtitle.dart';
|
||||
import '../../app_style/colors.dart';
|
||||
import '../../widgets/buttons/app_back_button.dart';
|
||||
import '../../widgets/loaders/loading_manager.dart';
|
||||
|
||||
class WorkOrderUpdate extends StatefulWidget {
|
||||
final SearchWorkOrder item;
|
||||
|
||||
const WorkOrderUpdate({@required this.item, Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<WorkOrderUpdate> createState() => _WorkOrderUpdateState();
|
||||
}
|
||||
|
||||
class _WorkOrderUpdateState extends State<WorkOrderUpdate> {
|
||||
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||
Subtitle _subtitle;
|
||||
bool _isLoading = false;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_subtitle = AppLocalization.of(context).subtitle;
|
||||
|
||||
return Scaffold(
|
||||
body: SafeArea(
|
||||
child: Form(
|
||||
key: _formKey,
|
||||
child: LoadingManager(
|
||||
isLoading: _isLoading,
|
||||
isFailedLoading: false,
|
||||
stateCode: 200,
|
||||
onRefresh: () async {},
|
||||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4),
|
||||
child: Row(
|
||||
children: [
|
||||
const ABackButton(),
|
||||
Expanded(
|
||||
child: Center(
|
||||
child: Text(
|
||||
"Work Order",
|
||||
style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 58),
|
||||
],
|
||||
),
|
||||
),
|
||||
WorkOrderDetails(item: widget.item,)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,38 +1,92 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:test_sa/models/gas_refill/gas_refill_details.dart';
|
||||
import 'package:test_sa/views/app_style/colors.dart';
|
||||
import 'package:test_sa/views/widgets/app_text_form_field.dart';
|
||||
|
||||
class GasRefillCreateDetailsItem extends StatelessWidget {
|
||||
import '../../../controllers/localization/localization.dart';
|
||||
import '../buttons/app_button.dart';
|
||||
import '../titles/app_sub_title.dart';
|
||||
|
||||
class GasRefillCreateDetailsItem extends StatefulWidget {
|
||||
final GasRefillDetails model;
|
||||
final VoidCallback onDelete;
|
||||
final VoidCallback onPressed;
|
||||
final bool isUpdate;
|
||||
|
||||
const GasRefillCreateDetailsItem({Key key, this.isUpdate, this.model, this.onPressed}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<GasRefillCreateDetailsItem> createState() => _GasRefillCreateDetailsItemState();
|
||||
}
|
||||
|
||||
const GasRefillCreateDetailsItem({Key key, this.model, this.onDelete}) : super(key: key);
|
||||
class _GasRefillCreateDetailsItemState extends State<GasRefillCreateDetailsItem> {
|
||||
GlobalKey<FormState> _formKey;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_formKey = GlobalKey<FormState>();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [Expanded(child: Text(model.type.name)), IconButton(onPressed: onDelete, color: AColors.red, icon: const Icon(Icons.delete))],
|
||||
),
|
||||
Wrap(
|
||||
spacing: 10,
|
||||
children: [
|
||||
Text("Quantity: ${model.requestedQuantity.toStringAsFixed(0)}"),
|
||||
Text("Cylinder Size: ${model.cylinderSize.name}"),
|
||||
Text("Cylinder Type: ${model.cylinderType.name}"),
|
||||
],
|
||||
),
|
||||
if (model.deliveredQuantity != null)
|
||||
final subtitle = AppLocalization.of(context).subtitle;
|
||||
final startEditing = widget.isUpdate && (widget.model.selectedForEditing ?? false);
|
||||
return Form(
|
||||
key: _formKey,
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
const Text("Delivered Quantity"),
|
||||
Text(model.deliveredQuantity.toStringAsFixed(0)),
|
||||
Expanded(child: Text(widget.model.type.name)),
|
||||
IconButton(onPressed: widget.onPressed, color: widget.isUpdate ? AColors.cyan : AColors.red, icon: Icon(widget.isUpdate ? Icons.edit : Icons.delete))
|
||||
],
|
||||
),
|
||||
Wrap(
|
||||
spacing: 10,
|
||||
children: [
|
||||
Text("Quantity: ${widget.model.requestedQuantity.toStringAsFixed(0)}"),
|
||||
Text("Cylinder Size: ${widget.model.cylinderSize.name}"),
|
||||
Text("Cylinder Type: ${widget.model.cylinderType.name}"),
|
||||
],
|
||||
),
|
||||
const Divider(),
|
||||
],
|
||||
if (widget.model.deliveredQuantity != null)
|
||||
Row(
|
||||
children: [
|
||||
const Text("Delivered Quantity: "),
|
||||
Text(widget.model.deliveredQuantity.toStringAsFixed(0)),
|
||||
],
|
||||
),
|
||||
if (startEditing) const SizedBox(height: 16),
|
||||
if (startEditing) ASubTitle(subtitle.deliveredQuantity),
|
||||
if (startEditing) const SizedBox(height: 4),
|
||||
if (startEditing)
|
||||
ATextFormField(
|
||||
initialValue: widget.model.deliveredQuantity?.toString() ?? "0",
|
||||
textAlign: TextAlign.center,
|
||||
style: Theme.of(context).textTheme.titleMedium,
|
||||
// validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only",
|
||||
textInputType: TextInputType.number,
|
||||
onSaved: (value) {
|
||||
if (value.isNotEmpty) {
|
||||
widget.model.deliveredQuantity = double.tryParse(value);
|
||||
} else {
|
||||
widget.model.deliveredQuantity = 0;
|
||||
}
|
||||
},
|
||||
),
|
||||
if (startEditing) const SizedBox(height: 8),
|
||||
if (startEditing)
|
||||
AButton(
|
||||
text: subtitle.edit,
|
||||
onPressed: () {
|
||||
_formKey.currentState?.save();
|
||||
widget.onPressed();
|
||||
},
|
||||
),
|
||||
const Divider(),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,109 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:test_sa/views/app_style/colors.dart';
|
||||
import 'package:test_sa/views/app_style/sizing.dart';
|
||||
|
||||
import '../../../models/service_request/search_work_order.dart';
|
||||
|
||||
class AssistantEmployeeMenu extends StatefulWidget {
|
||||
final List<AssistantEmployees> statuses;
|
||||
final AssistantEmployees initialStatus;
|
||||
final Function(AssistantEmployees) onSelect;
|
||||
|
||||
const AssistantEmployeeMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key);
|
||||
|
||||
@override
|
||||
_SingleAssistantEmployeeMenuState createState() => _SingleAssistantEmployeeMenuState();
|
||||
}
|
||||
|
||||
class _SingleAssistantEmployeeMenuState extends State<AssistantEmployeeMenu> {
|
||||
AssistantEmployees _selectedStatus;
|
||||
|
||||
@override
|
||||
void setState(VoidCallback fn) {
|
||||
if (mounted) super.setState(fn);
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(covariant AssistantEmployeeMenu oldWidget) {
|
||||
if (widget.initialStatus != null) {
|
||||
final result = widget.statuses?.where((element) {
|
||||
return element?.user?.id == widget.initialStatus?.user?.id;
|
||||
});
|
||||
if (result.isNotEmpty) {
|
||||
_selectedStatus = result.first;
|
||||
} else {
|
||||
_selectedStatus = null;
|
||||
}
|
||||
if ((widget.initialStatus?.user?.id ?? "") != (_selectedStatus?.user?.id ?? "")) {
|
||||
widget.onSelect(_selectedStatus);
|
||||
}
|
||||
} else {
|
||||
_selectedStatus = null;
|
||||
}
|
||||
super.didUpdateWidget(oldWidget);
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
if (widget.initialStatus != null) {
|
||||
final result = widget.statuses?.where((element) {
|
||||
return element?.user?.id == widget.initialStatus?.user?.id;
|
||||
});
|
||||
if (result.isNotEmpty) _selectedStatus = result.first;
|
||||
if (widget.initialStatus?.user?.id != _selectedStatus?.user?.id) {
|
||||
widget.onSelect(_selectedStatus);
|
||||
}
|
||||
}
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
decoration: BoxDecoration(
|
||||
color: AColors.inputFieldBackgroundColor,
|
||||
border: Border.all(
|
||||
color: Color(0xffefefef),
|
||||
),
|
||||
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
|
||||
// boxShadow: const [
|
||||
// AppStyle.boxShadow
|
||||
// ]
|
||||
),
|
||||
child: DropdownButton<AssistantEmployees>(
|
||||
value: _selectedStatus,
|
||||
iconSize: 24,
|
||||
icon: const Icon(Icons.keyboard_arrow_down_rounded),
|
||||
elevation: 0,
|
||||
isExpanded: true,
|
||||
hint: Text(
|
||||
"Select",
|
||||
style: Theme.of(context).textTheme.subtitle1,
|
||||
),
|
||||
style: TextStyle(color: Theme.of(context).primaryColor),
|
||||
underline: const SizedBox.shrink(),
|
||||
onChanged: (AssistantEmployees newValue) {
|
||||
setState(() {
|
||||
_selectedStatus = newValue;
|
||||
});
|
||||
widget.onSelect(newValue);
|
||||
},
|
||||
items: widget.statuses.map<DropdownMenuItem<AssistantEmployees>>((AssistantEmployees value) {
|
||||
return DropdownMenuItem<AssistantEmployees>(
|
||||
value: value,
|
||||
child: Text(
|
||||
value.user?.name ?? "NULL",
|
||||
style: Theme.of(context).textTheme.titleMedium.copyWith(
|
||||
color: Theme.of(context).primaryColor,
|
||||
fontSize: 11,
|
||||
//fontWeight: FontWeight.bold
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart';
|
||||
import 'package:test_sa/models/engineer.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
|
||||
import 'package:test_sa/views/widgets/status/users_menu.dart';
|
||||
|
||||
class ServiceReportAllUsers extends StatelessWidget {
|
||||
final Function(Engineer) onSelect;
|
||||
final Engineer initialValue;
|
||||
const ServiceReportAllUsers({Key key, @required this.onSelect, this.initialValue}) : super(key: key);
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
ServiceReportUsersProvider menuProvider = Provider.of<ServiceReportUsersProvider>(context);
|
||||
return LoadingManager(
|
||||
isLoading: menuProvider.isLoading,
|
||||
isFailedLoading: menuProvider.engineers == null,
|
||||
stateCode: menuProvider.stateCode,
|
||||
onRefresh: () async {
|
||||
menuProvider.getAllUsers();
|
||||
},
|
||||
child: UsersMenu(
|
||||
initialStatus: initialValue,
|
||||
statuses: menuProvider.engineers,
|
||||
onSelect: onSelect,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/models/service_request/search_work_order.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
|
||||
import 'package:test_sa/views/widgets/status/assistant_employee_menu.dart';
|
||||
|
||||
import '../../../../controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart';
|
||||
|
||||
class ServiceReportAssistantEmployeeMenu extends StatelessWidget {
|
||||
final Function(AssistantEmployees) onSelect;
|
||||
final AssistantEmployees initialValue;
|
||||
const ServiceReportAssistantEmployeeMenu({Key key, @required this.onSelect, this.initialValue}) : super(key: key);
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
ServiceReportAssistantsEmployeeProvider menuProvider = Provider.of<ServiceReportAssistantsEmployeeProvider>(context);
|
||||
return LoadingManager(
|
||||
isLoading: menuProvider.isLoading,
|
||||
isFailedLoading: menuProvider.assistantEmployees == null,
|
||||
stateCode: menuProvider.stateCode,
|
||||
onRefresh: () async {
|
||||
await menuProvider.getAssistantEmployees();
|
||||
},
|
||||
child: AssistantEmployeeMenu(
|
||||
initialStatus: initialValue,
|
||||
statuses: menuProvider.assistantEmployees,
|
||||
onSelect: onSelect,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
|
||||
import 'package:test_sa/views/widgets/status/single_status_menu.dart';
|
||||
|
||||
class ServiceReportMaintenanceSituation extends StatelessWidget {
|
||||
final Function(Lookup) onSelect;
|
||||
final Lookup initialValue;
|
||||
final String woId;
|
||||
|
||||
const ServiceReportMaintenanceSituation({
|
||||
Key key,
|
||||
@required this.onSelect,
|
||||
@required this.initialValue,
|
||||
@required this.woId,
|
||||
}) : super(key: key);
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
ServiceReportMaintenanceSituationProvider menuProvider = Provider.of<ServiceReportMaintenanceSituationProvider>(context);
|
||||
return LoadingManager(
|
||||
isLoading: menuProvider.isLoading,
|
||||
isFailedLoading: menuProvider.operators == null,
|
||||
stateCode: menuProvider.stateCode,
|
||||
onRefresh: () async {
|
||||
menuProvider.getOperators(woId);
|
||||
},
|
||||
child: SingleStatusMenu(
|
||||
initialStatus: initialValue,
|
||||
statuses: menuProvider.operators,
|
||||
onSelect: onSelect,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_visit_date_operator_provider.dart';
|
||||
import 'package:test_sa/models/lookup.dart';
|
||||
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
|
||||
import 'package:test_sa/views/widgets/status/single_status_menu.dart';
|
||||
|
||||
class ServiceReportVisitDateOperator extends StatelessWidget {
|
||||
final Function(Lookup) onSelect;
|
||||
final Lookup initialValue;
|
||||
|
||||
const ServiceReportVisitDateOperator({Key key, @required this.onSelect, @required this.initialValue}) : super(key: key);
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
ServiceReportVisitOperatorProvider menuProvider = Provider.of<ServiceReportVisitOperatorProvider>(context);
|
||||
return LoadingManager(
|
||||
isLoading: menuProvider.isLoading,
|
||||
isFailedLoading: menuProvider.operators == null,
|
||||
stateCode: menuProvider.stateCode,
|
||||
onRefresh: () async {
|
||||
menuProvider.getOperators();
|
||||
},
|
||||
child: SingleStatusMenu(
|
||||
initialStatus: initialValue,
|
||||
statuses: menuProvider.operators,
|
||||
onSelect: onSelect,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,109 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:test_sa/views/app_style/colors.dart';
|
||||
import 'package:test_sa/views/app_style/sizing.dart';
|
||||
|
||||
import '../../../models/engineer.dart';
|
||||
|
||||
class UsersMenu extends StatefulWidget {
|
||||
final List<Engineer> statuses;
|
||||
final Engineer initialStatus;
|
||||
final Function(Engineer) onSelect;
|
||||
|
||||
const UsersMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key);
|
||||
|
||||
@override
|
||||
_SingleUsersMenuState createState() => _SingleUsersMenuState();
|
||||
}
|
||||
|
||||
class _SingleUsersMenuState extends State<UsersMenu> {
|
||||
Engineer _selectedStatus;
|
||||
|
||||
@override
|
||||
void setState(VoidCallback fn) {
|
||||
if (mounted) super.setState(fn);
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(covariant UsersMenu oldWidget) {
|
||||
if (widget.initialStatus != null) {
|
||||
final result = widget.statuses?.where((element) {
|
||||
return element == widget.initialStatus;
|
||||
});
|
||||
if (result.isNotEmpty) {
|
||||
_selectedStatus = result.first;
|
||||
} else {
|
||||
_selectedStatus = null;
|
||||
}
|
||||
if ((widget.initialStatus?.id ?? "") != (_selectedStatus?.id ?? "")) {
|
||||
widget.onSelect(_selectedStatus);
|
||||
}
|
||||
} else {
|
||||
_selectedStatus = null;
|
||||
}
|
||||
super.didUpdateWidget(oldWidget);
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
if (widget.initialStatus != null) {
|
||||
final result = widget.statuses?.where((element) {
|
||||
return element == widget.initialStatus;
|
||||
});
|
||||
if (result.isNotEmpty) _selectedStatus = result.first;
|
||||
if (widget.initialStatus.id != _selectedStatus?.id) {
|
||||
widget.onSelect(_selectedStatus);
|
||||
}
|
||||
}
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
decoration: BoxDecoration(
|
||||
color: AColors.inputFieldBackgroundColor,
|
||||
border: Border.all(
|
||||
color: Color(0xffefefef),
|
||||
),
|
||||
borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)),
|
||||
// boxShadow: const [
|
||||
// AppStyle.boxShadow
|
||||
// ]
|
||||
),
|
||||
child: DropdownButton<Engineer>(
|
||||
value: _selectedStatus,
|
||||
iconSize: 24,
|
||||
icon: const Icon(Icons.keyboard_arrow_down_rounded),
|
||||
elevation: 0,
|
||||
isExpanded: true,
|
||||
hint: Text(
|
||||
"Select",
|
||||
style: Theme.of(context).textTheme.subtitle1,
|
||||
),
|
||||
style: TextStyle(color: Theme.of(context).primaryColor),
|
||||
underline: SizedBox.shrink(),
|
||||
onChanged: (Engineer newValue) {
|
||||
setState(() {
|
||||
_selectedStatus = newValue;
|
||||
});
|
||||
widget.onSelect(newValue);
|
||||
},
|
||||
items: widget.statuses.map<DropdownMenuItem<Engineer>>((Engineer value) {
|
||||
return DropdownMenuItem<Engineer>(
|
||||
value: value,
|
||||
child: Text(
|
||||
value.name,
|
||||
style: Theme.of(context).textTheme.subtitle1.copyWith(
|
||||
color: Theme.of(context).primaryColor,
|
||||
fontSize: 11,
|
||||
//fontWeight: FontWeight.bold
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue