update form changed

design_3.0_demo_module
WaseemAbbasi22 1 week ago
parent 63efb3fae0
commit 1e158e8bd4

@ -4,8 +4,8 @@ class URLs {
static const String appReleaseBuildNumber = "32";
// static const host1 = "https://atomsm.hmg.com"; // production url
static const host1 = "https://atomsmdev.hmg.com"; // local DEV url
// static const host1 = "https://atomsmuat.hmg.com"; // local UAT url
// static const host1 = "https://atomsmdev.hmg.com"; // local DEV url
static const host1 = "https://atomsmuat.hmg.com"; // local UAT url
// static final String _baseUrl = "$_host/mobile"; // host local UAT
// static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis

@ -135,7 +135,7 @@ class AllRequestsProvider extends ChangeNotifier {
List<int> list = [1, 2, 3, 4];
if (context.userProvider.isAssessor) {
list = [9];
list = [9,15];
return list;
}
if (context.userProvider.isQualityUser) {

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
@ -6,6 +8,7 @@ import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_item_
import 'package:test_sa/modules/asset_inventory_module/pages/inventory_session_item_view.dart';
import 'package:test_sa/modules/demo_module/demo_request_item_view.dart';
import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_item_view.dart';
import 'package:test_sa/modules/medical_gas_inspection/medical_gas_inspection_item_view.dart';
import 'package:test_sa/modules/tm_module/tasks/task_request_item_view.dart';
import 'package:test_sa/modules/traf_module/traf_request_item_view.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
@ -40,6 +43,7 @@ class RequestCategoryList extends StatelessWidget {
}
Widget _buildRequestItem(Data request) {
log('here with no ${request.transactionNo}');
switch (request.transactionNo) {
case 1:
return ServiceRequestItemView(requestData: request);
@ -59,14 +63,14 @@ class RequestCategoryList extends StatelessWidget {
return InventorySessionItemView(requestData: request);
case 9:
return TrafRequestItemView(requestData: request);
//TODO need to verify this ...
case 10:
return EquipmentInternalAuditItemView(requestData: request);
case 11:
return EquipmentInternalAuditItemView(requestData: request);
case 13:
return AssetDeliveryItemView(requestData: request);
//Todo need to verify this...
case 14:
return MedicalGasInspectionItemView(requestData: request);
case 15:
return DemoRequestItemView(requestData: request);
default:

@ -100,18 +100,38 @@ extension IntExtensionsDemoRequest on int {
DemoRequestStepEnum toDemoRequestStepEnum() {
//Todo need to check exact stages
switch (this) {
case 4:
return DemoRequestStepEnum.extendDemoPeriod;
case 2:
// { "id": 7690, "name": "Pending Assessor Acceptance", "value": 5 },
//
// update request details
//
//
// { "id": 7692, "name": "Assessor Audit Doc Pending", "value": 7 },
//
// Update request details
//
//
// { "id": 7766, "name": "Demo Period Expired", "value": 15 }
//
// request for extention
//
//
// { "id": 7769, "name": "Awaiting MD Evaluation", "value": 18 },
//
// evaluation
case 5:
return DemoRequestStepEnum.qAuditorRejectAccept;
case 3:
case 7:
return DemoRequestStepEnum.updateRequest;
case 5:
return DemoRequestStepEnum.updateRequest;
return DemoRequestStepEnum.viewOnly;
case 6:
case 15:
return DemoRequestStepEnum.extendDemoPeriod;
default:
return DemoRequestStepEnum.viewOnly;
// return DemoRequestStepEnum.viewOnly;
return DemoRequestStepEnum.updateRequest;
}
}
}

@ -110,6 +110,7 @@ class RequestsDetails {
String? nameOfType;
String? priority;
String? status;
int? statusValue;
String? assetName;
String? assetNo;
String? assetSN;
@ -139,6 +140,7 @@ class RequestsDetails {
this.nameOfType,
this.priority,
this.status,
this.statusValue,
this.assetName,
this.assetNo,
this.assetSN,
@ -168,6 +170,7 @@ class RequestsDetails {
nameOfType = json['nameOfType'];
priority = json['priority'];
status = json['status'];
statusValue = json['statusValue'];
assetName = json['assetName'];
assetNo = json['assetNo'];
assetSN = json['assetSN'];
@ -199,6 +202,7 @@ class RequestsDetails {
data['nameOfType'] = nameOfType;
data['priority'] = priority;
data['status'] = status;
data['statusValue'] = statusValue;
data['assetName'] = assetName;
data['assetNo'] = assetNo;
data['assetSN'] = assetSN;

@ -1,6 +1,7 @@
enum DemoRequestStepEnum {
qAuditorRejectAccept, // quality auditor accept reject
updateRequest, // quality auditor edit reject, // 5
extendDemoPeriod, // extent
qAuditorRejectAccept, // 5 quality auditor accept reject
updateRequest, //7
extendDemoPeriod, //15 extent
viewOnly, // need to check when show view only
submitEvaluation, //18
}

@ -47,6 +47,7 @@ class Data {
String? typeTransaction;
String? transactionDate;
String? statusName;
int? statusValue;
String? priorityName;
bool? isHighPriority;
String? assetName;
@ -69,6 +70,7 @@ class Data {
this.nameOfType,
this.transactionDate,
this.statusName,
this.statusValue,
this.numberOfAssets,
this.numberOfSites,
this.sessionType,
@ -88,6 +90,7 @@ class Data {
typeTransaction = json['typeTransaction'];
transactionDate = json['transactionDate'];
statusName = json['statusName'];
statusValue = json['statusValue'];
priorityName = json['priorityName'];
isHighPriority = json['isHighPriority'];
assetName = json['assetName'];
@ -111,6 +114,7 @@ class Data {
data['typeTransaction'] = typeTransaction;
data['transactionDate'] = transactionDate;
data['statusName'] = statusName;
data['statusValue'] = statusValue;
data['priorityName'] = priorityName;
data['isHighPriority'] = isHighPriority;
data['assetName'] = assetName;

@ -23,7 +23,7 @@ import 'package:test_sa/modules/cm_module/views/forms/asset_retired/verify_asset
import 'package:test_sa/modules/demo_module/demo_extension_bottom_sheet.dart';
import 'package:test_sa/modules/demo_module/models/demo_request_model.dart';
import 'package:test_sa/modules/demo_module/provider/demo_provider.dart';
import 'package:test_sa/modules/demo_module/update_request_detail_view.dart';
import 'package:test_sa/modules/demo_module/update_demo-request_view.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
@ -376,8 +376,8 @@ class FooterActionButton {
}) {
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);
UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
//Todo use this only for quality auditor user...
if (userProvider.user?.type == UsersTypes.normal_user) {
if (userProvider.user?.type == UsersTypes.assessor) {
switch (demoRequestStage) {
case DemoRequestStepEnum.qAuditorRejectAccept:
return footerContainer(
@ -430,7 +430,27 @@ class FooterActionButton {
bool? isRefresh = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UpdateRequestView(
builder: (context) => UpdateDemoRequestView(
dataModel: dataModel,
)));
if (isRefresh == true) {
refreshData(true);
}
},
),
);
case DemoRequestStepEnum.submitEvaluation:
return footerContainer(
context: context,
child: AppFilledButton(
label: 'Submit Evaluation'.addTranslation,
// maxWidth: true,
buttonColor: AppColor.primary10,
onPressed: () async {
bool? isRefresh = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UpdateDemoRequestView(
dataModel: dataModel,
)));
if (isRefresh == true) {

@ -548,8 +548,8 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
_demoFormModel.demoAttachment = [];
for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
//Todo need to change from static attachmentTypeId...
_demoFormModel.demoAttachment?.add(DemoAttachments(id: 0, attachmentName: fileName, demoRequestId: 0,attachmentTypeId: 5));
//Todo need to change from static attachmentTypeId lookUp value from lookup 4104...
_demoFormModel.demoAttachment?.add(DemoAttachments(id: 0, attachmentName: fileName, demoRequestId: 0,documentTypeId: 7748));
}
Utils.showLoading(context);
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);

@ -4,6 +4,7 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/demo_request_step.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/demo_module/demo_extension_bottom_sheet.dart';
@ -58,8 +59,8 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
setState(() {
loading = true;
});
// dataModel = await demoProvider?.getDemoById(widget.demoId) ?? DemoRequestModel();
dataModel = await demoProvider?.getDemoById(11) ?? DemoRequestModel();
dataModel = await demoProvider?.getDemoById(widget.demoId) ?? DemoRequestModel();
// _attachments = dataModel.demoAttachments.toList() ?? [];
setState(() {
loading = false;
@ -118,6 +119,7 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
).expanded,
FooterActionButton.demoRequestDetailsFooterWidget(
demoRequestStage: dataModel!.status!.demoRequestStepEnum!,
// demoRequestStage: DemoRequestStepEnum.updateRequest,
dataModel: dataModel!,
status: dataModel!.status!,
context: context,

@ -25,12 +25,26 @@ class DemoRequestItemView extends StatelessWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
8.height,
// (requestData?.typeTransaction ?? 'Demo Request').heading5(context),
('Demo Request').heading5(context),
//TODO need to replace this with exact values need to show here..
infoWidget(label: 'PO Internal'.addTranslation, value: requestData?.poInternal ?? '-', context: context),
infoWidget(label: 'PO External'.addTranslation, value: requestData?.poExternal ?? '-', context: context),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StatusLabel(
label: requestData!.statusName!,
textColor: AppColor.demoRequestStatusTextColor(context, requestData?.statusValue ?? 0),
backgroundColor: AppColor.demoRequestStatus(context, requestData?.statusValue ?? 0),
),
1.width.expanded,
Text(
requestData!.transactionDate?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
),
],
),
// 8.height,
(requestData?.typeTransaction ?? 'Demo Request').heading5(context),
infoWidget(label: 'Request No'.addTranslation, value: requestData?.requestNo ?? '-', context: context),
infoWidget(label: context.translation.requestType, value: requestData?.requestTypeName, context: context),
// infoWidget(label: 'No of Sites'.addTranslation, value: requestData?.numberOfSites != null ? requestData?.numberOfSites.toString() : '-', context: context),
8.height,
Row(
@ -55,13 +69,27 @@ class DemoRequestItemView extends StatelessWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
8.height,
('Demo Request').heading5(context),
// (requestDetails?.nameOfType ?? 'Demo Request').heading5(context),
//TODO need to replace this with exact values need to show here..
infoWidget(label: 'PO Internal'.addTranslation, value: requestDetails?.poInternal ?? '-', context: context),
infoWidget(label: 'PO External'.addTranslation, value: requestDetails?.poExternal ?? '-', context: context),
8.height,
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StatusLabel(
label: requestDetails!.status!,
textColor: AppColor.demoRequestStatusTextColor(context, requestDetails?.statusValue ?? 0),
backgroundColor: AppColor.demoRequestStatus(context, requestDetails?.statusValue ?? 0),
),
1.width.expanded,
Text(
requestDetails!.date?.toServiceRequestCardFormat ?? "",
textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
),
],
),
// 8.height,
(requestDetails?.nameOfType ?? 'Demo Request').heading5(context),
// infoWidget(label: context.translation.requestType, value: requestDetails!.requestType, context: context),
infoWidget(label: context.translation.requestNo, value: requestDetails!.requestNo, context: context),
infoWidget(label: context.translation.site, value: requestDetails!.site, context: context),
Row(
mainAxisSize: MainAxisSize.min,
children: [

@ -1,15 +1,15 @@
class DemoAttachments {
int? id;
num? demoRequestId;
num? attachmentTypeId;
num? documentTypeId;
String? attachmentName;
String? originalName;
DemoAttachments({this.id, this.attachmentTypeId, this.attachmentName, this.demoRequestId, this.originalName});
DemoAttachments({this.id, this.documentTypeId, this.attachmentName, this.demoRequestId, this.originalName});
DemoAttachments.fromJson(dynamic json) {
id = json['id'];
attachmentTypeId = json['attachmentTypeId'];
documentTypeId = json['documentTypeId'];
demoRequestId = json['demoRequestId'];
attachmentName = json['attachmentName'];
originalName = json['originalName'];
@ -18,7 +18,7 @@ class DemoAttachments {
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['attachmentTypeId'] = attachmentTypeId;
map['documentTypeId'] = documentTypeId;
map['attachmentName'] = attachmentName;
map['demoRequestId'] = demoRequestId;
map['originalName'] = originalName;

@ -77,8 +77,8 @@ class DemoFormModel {
"vendorRepresentativeName": vendorRepresentativeName,
"manufacturer": manufacturer,
"demoPeriodId": demoPeriod?.id,
"supplierId": 0,
"suppPersonId": 0,
"supplierId": vendor?.id,
"suppPersonId": supEngineer?.id,
// "vendorEmail": vendorEmail,
"demoAttachments": demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [],
};

@ -20,6 +20,10 @@ class DemoRequestModel {
String? doctorContactEmail;
String? itemDescription;
String? requestDescription;
String? vendorName;
String? vendorRepresentativeName;
String? vendorContactNumber;
String? vendorEmail;
Lookup? demoPeriod;
SupplierDetails? supplier;
SuppEngineerWorkOrders? suppPerson;
@ -45,6 +49,10 @@ class DemoRequestModel {
this.doctorContactEmail,
this.itemDescription,
this.requestDescription,
this.vendorName,
this.vendorRepresentativeName,
this.vendorEmail,
this.vendorContactNumber,
this.demoPeriod,
this.supplier,
this.suppPerson,
@ -71,6 +79,10 @@ class DemoRequestModel {
doctorContactEmail = json['doctorContactEmail'];
itemDescription = json['itemDescription'];
requestDescription = json['requestDescription'];
vendorName = json['vendorName'];
vendorRepresentativeName = json['vendorRepresentativeName'];
vendorContactNumber = json['vendorContactNumber'];
vendorEmail = json['vendorEmail'];
demoPeriod = json['demoPeriod'] != null ? (Lookup.fromJson(json['demoPeriod'])) : null;
supplier = json['supplier'] != null ? (SupplierDetails.fromJson(json['supplier'])) : null;
suppPerson = json['suppPerson'] != null ? (SuppEngineerWorkOrders.fromJson(json['suppPerson'])) : null;

@ -1,19 +1,27 @@
import 'dart:developer';
import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.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/new_models/building.dart';
import 'package:test_sa/models/new_models/floor.dart';
import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/modules/demo_module/models/demo_form_model.dart';
import 'package:test_sa/modules/demo_module/models/demo_request_model.dart';
import 'package:test_sa/modules/loan_module/models/loan_request_model.dart';
import 'dart:convert';
import '../../../models/new_models/department.dart';
class DemoProvider extends ChangeNotifier {
Future<bool> addDemoRequest(Map<String, dynamic> body) async {
try {
Response response = await ApiManager.instance.post(URLs.addDemoRequest, body: body, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
// String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? "");
String message = (jsonDecode(response.body)["message"] ?? "");
String message = (jsonDecode(response.body)["message"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true;
}
@ -24,6 +32,7 @@ class DemoProvider extends ChangeNotifier {
}
bool isLoading = false;
bool isSiteLoading = false;
Future<DemoRequestModel?> getDemoById(int id) async {
DemoRequestModel? demoRequestModel;
@ -39,12 +48,8 @@ class DemoProvider extends ChangeNotifier {
}
Future<bool> acceptRejectRequest({required int requestId, required bool status}) async {
try {
Map<String,dynamic> payload = {
"demoRequestId": requestId,
"isApproved": status
};
Map<String, dynamic> payload = {"demoRequestId": requestId, "isApproved": status};
Response response = await ApiManager.instance.post(URLs.updateDemoRequestByAssessor, body: payload, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? "");
@ -56,6 +61,7 @@ class DemoProvider extends ChangeNotifier {
return false;
}
}
Future<bool> updateDemoRequest(Map<String, dynamic> body) async {
try {
Response response = await ApiManager.instance.post(URLs.updateDemoRequest, body: body, showToast: false);
@ -69,13 +75,10 @@ class DemoProvider extends ChangeNotifier {
return false;
}
}
Future<bool> updateDemoPeriod({required int demoPeriodId, required int requestId,required bool isUpdateRequired}) async {
Future<bool> updateDemoPeriod({required int demoPeriodId, required int requestId, required bool isUpdateRequired}) async {
try {
Map<String,dynamic> payload ={
"demoRequestId": requestId,
"demoPeriodId": demoPeriodId,
"isDemoPeriodExtentionRequired": isUpdateRequired
};
Map<String, dynamic> payload = {"demoRequestId": requestId, "demoPeriodId": demoPeriodId, "isDemoPeriodExtentionRequired": isUpdateRequired};
Response response = await ApiManager.instance.post(URLs.updateDemoPeriodByRequester, body: payload, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? "");
@ -87,4 +90,73 @@ class DemoProvider extends ChangeNotifier {
return false;
}
}
Future<Site> getSiteData({required num? siteId}) async {
Site siteObj = Site();
isSiteLoading = true;
notifyListeners();
try {
final response = await ApiManager.instance.get(
"${URLs.getSiteAutoCompleteWithoutConditionSites}?id=$siteId",
);
if (response.statusCode >= 200 && response.statusCode < 300) {
final List? siteData = json.decode(response.body)["data"];
if (siteData != null && siteData.isNotEmpty) {
siteObj = Site.fromJson(siteData.first);
}
}
} catch (_) {}
isSiteLoading = false;
notifyListeners();
return siteObj;
}
// Future<DemoFormModel> getSiteData({
// required num? siteId,
// }) async {
// isSiteLoading = true;
// DemoFormModel model=DemoFormModel();
// notifyListeners();
//
// try {
// final response = await ApiManager.instance.get(
// "${URLs.getSiteAutoCompleteWithoutConditionSites}?id=$siteId",
// );
//
// if (response.statusCode >= 200 && response.statusCode < 300) {
// final List? siteData = json.decode(response.body)["data"];
//
// if (siteData != null && siteData.isNotEmpty) {
// model.site = Site.fromJson(siteData.first);
// }
//
// model.building = model.site?.buildings?.firstWhere(
// (e) => e.value == model.building?.value,
// orElse: () => Building(),
// );
//
// model.floor = model.building?.floors?.firstWhere(
// (e) => e.value == model.floor?.value,
// orElse: () => Floor(),
// );
//
// model.department = model.floor?.departments?.firstWhere(
// (e) => e.departmentName == model.department?.departmentName,
// orElse: () => Department(),
// );
//
// }
//
// isSiteLoading = false;
// notifyListeners();
// return model;
// } catch (e) {
// isSiteLoading = false;
// notifyListeners();
// return model;
// }
// }
}

@ -0,0 +1,597 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart';
import 'package:test_sa/models/new_models/floor.dart';
import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_details.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/demo_module/models/demo_attachment_model.dart';
import 'package:test_sa/modules/demo_module/models/demo_request_model.dart';
import 'package:test_sa/modules/demo_module/provider/demo_period_lookup_provider.dart';
import 'package:test_sa/modules/demo_module/provider/demo_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/providers/work_order/vendor_provider.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart';
import '../../models/new_models/department.dart';
import 'models/demo_form_model.dart';
class UpdateDemoRequestView extends StatefulWidget {
static const String id = "/update-demo-request";
DemoRequestModel dataModel;
UpdateDemoRequestView({Key? key, required this.dataModel}) : super(key: key);
@override
_UpdateDemoRequestViewState createState() => _UpdateDemoRequestViewState();
}
class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with TickerProviderStateMixin {
final List<GenericAttachmentModel> attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
DemoFormModel _demoFormModel = DemoFormModel();
late TextEditingController doctorName;
late TextEditingController doctorPhone;
late TextEditingController doctorEmail;
late TextEditingController assetName;
late TextEditingController model;
late TextEditingController manufacturer;
late TextEditingController itemDesc;
late TextEditingController requestDesc;
late TextEditingController vendorPhone;
late TextEditingController vendorEmail;
late SiteProvider siteProvider;
late DemoProvider demoProvider;
bool isLoading = true;
@override
void initState() {
super.initState();
doctorName = TextEditingController();
doctorPhone = TextEditingController();
doctorEmail = TextEditingController();
assetName = TextEditingController();
model = TextEditingController();
manufacturer = TextEditingController();
itemDesc = TextEditingController();
requestDesc = TextEditingController();
vendorPhone = TextEditingController();
vendorEmail = TextEditingController();
siteProvider = Provider.of<SiteProvider>(context, listen: false);
demoProvider = Provider.of<DemoProvider>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((_) {
fillData();
});
}
void fillData() async {
final vendorProvider = Provider.of<VendorProvider>(context, listen: false);
if (vendorProvider.items.isEmpty) {
if (mounted) {
await vendorProvider.getData();
}
}
final d = widget.dataModel;
if (d.site?.id != null) {
_demoFormModel.site = await demoProvider.getSiteData(
siteId: d.site?.id,
);
_demoFormModel.building = _demoFormModel.site?.buildings?.firstWhere(
(e) => e.id == d.building?.id,
orElse: () => Building(),
);
_demoFormModel.floor = _demoFormModel.building?.floors?.firstWhere(
(e) => e.id == d.floor?.id,
orElse: () => Floor(),
);
_demoFormModel.department = _demoFormModel.floor?.departments?.firstWhere(
(e) => e.id == d.department?.id,
orElse: () => Department(),
);
}
doctorName.text = d.doctorName ?? '';
doctorPhone.text = d.doctorContactNumber ?? '';
doctorEmail.text = d.doctorContactEmail ?? '';
assetName.text = d.assetName ?? '';
model.text = d.model ?? '';
manufacturer.text = d.manufacturer ?? '';
itemDesc.text = d.itemDescription ?? '';
requestDesc.text = d.requestDescription ?? '';
vendorPhone.text = d.supplier?.contact ?? d.vendorContactNumber ?? '';
vendorEmail.text = d.supplier?.email ?? d.vendorEmail ?? '';
_demoFormModel
..docName = d.doctorName
..docNumber = d.doctorContactNumber
..docEmail = d.doctorContactEmail
..assetName = d.assetName
..model = d.model
..manufacturer = d.manufacturer
..itemDescription = d.itemDescription
..requestDescription = d.requestDescription
..vendor = d.supplier
..vendorName = d.vendorName
..vendorRepresentativeName = d.vendorRepresentativeName
..vendorEmail = d.vendorEmail
..vendorContactNumber = d.vendorContactNumber;
_demoFormModel.id = widget.dataModel.id;
_demoFormModel.demoPeriod = widget.dataModel.demoPeriod;
if (d.supplier != null) {
final supplier = d.supplier;
_demoFormModel.vendor = supplier;
final selectedVendor = vendorProvider.items.firstWhere(
(element) => element.id == supplier?.id,
orElse: () => SupplierDetails(),
);
_demoFormModel.vendor?.suppPersons = selectedVendor.suppPersons;
_demoFormModel.supEngineer = widget.dataModel.suppPerson;
_demoFormModel.vendorEmail = supplier?.email;
_demoFormModel.vendorContactNumber = supplier?.contact;
vendorPhone.text = supplier?.email ?? '';
vendorEmail.text = supplier?.contact ?? '';
}
attachments.clear();
if (widget.dataModel.demoAttachments?.isNotEmpty ?? false) {
for (final item in widget.dataModel.demoAttachments!) {
if ((item.attachmentName ?? '').isNotEmpty) {
attachments.add(
GenericAttachmentModel(name: item.attachmentName, id: item.id ?? 0, originalName: item.originalName),
);
}
}
}
setState(() {
isLoading = false;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: DefaultAppBar(title: 'Update Request'.addTranslation),
body: isLoading
? const CircularProgressIndicator(color: AppColor.primary10).center
: Form(
key: _formKey,
child: Column(
children: [
SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
...siteSection(),
16.height,
...doctorInfoSection(),
16.height,
...assetSection(),
16.height,
...vendorDetailsSection(),
16.height,
AttachmentPicker(
label: context.translation.attachments,
attachment: attachments,
buttonColor: AppColor.black10,
onlyImages: false,
showAsListView: true,
buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120),
),
],
).toShadowContainer(context, borderRadius: 20),
).expanded,
FooterActionButton.footerContainer(
context: context,
child: AppFilledButton(
buttonColor: AppColor.primary10,
label: context.translation.update,
onPressed: _update,
// buttonColor: AppColor.primary10,
),
),
],
),
),
);
}
List<Widget> siteSection() {
return [
'Site Details'.addTranslation.bodyText(context).custom(color: AppColor.black10),
8.height,
SingleItemDropDownMenu<Site, SiteProvider>(
context: context,
title: context.translation.site,
initialValue: _demoFormModel.site,
showShadow: false,
validator: (value) {
if (value == null) return "Please select a site";
return null;
},
backgroundColor: AppColor.fieldBgColor(context),
showAsBottomSheet: true,
onSelect: (value) {
_demoFormModel.site = value;
setState(() {});
},
),
8.height,
SingleItemDropDownMenu<Building, NullableLoadingProvider>(
context: context,
title: context.translation.building,
initialValue: _demoFormModel.building,
showShadow: false,
showAsBottomSheet: true,
validator: (value) {
if (value == null) return "Please select a building";
return null;
},
backgroundColor: AppColor.fieldBgColor(context),
enabled: _demoFormModel.site?.buildings?.isNotEmpty ?? false,
staticData: _demoFormModel.site?.buildings ?? [],
onSelect: (value) {
_demoFormModel.building = value;
_demoFormModel.floor = null;
_demoFormModel.department = null;
setState(() {});
},
),
8.height,
SingleItemDropDownMenu<Floor, NullableLoadingProvider>(
context: context,
title: context.translation.floor,
showShadow: false,
showAsBottomSheet: true,
initialValue: _demoFormModel.floor,
backgroundColor: AppColor.fieldBgColor(context),
enabled: _demoFormModel.building?.floors?.isNotEmpty ?? false,
staticData: _demoFormModel.building?.floors ?? [],
validator: (value) {
if (value == null) return "Please select a floor";
return null;
},
onSelect: (value) {
_demoFormModel.floor = value;
_demoFormModel.department = null;
setState(() {});
},
),
8.height,
SingleItemDropDownMenu<Department, NullableLoadingProvider>(
context: context,
title: context.translation.department,
showShadow: false,
showAsBottomSheet: true,
initialValue: _demoFormModel.department,
backgroundColor: AppColor.fieldBgColor(context),
enabled: _demoFormModel.floor?.departments?.isNotEmpty ?? false,
validator: (value) {
if (value == null) return "Please select a department";
return null;
},
staticData: _demoFormModel.floor?.departments ?? [],
onSelect: (value) {
_demoFormModel.department = value;
_demoFormModel.room = null;
setState(() {});
},
),
];
}
List<Widget> doctorInfoSection() {
return [
"Doctor Details".bodyText(context).custom(color: AppColor.black10),
8.height,
AppTextFormField(
controller: doctorName,
labelText: "Name",
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.text,
onChange: (value) {
_demoFormModel.docName = value;
},
),
8.height,
AppTextFormField(
controller: doctorPhone,
labelText: "Contact Number",
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.phone,
onChange: (value) {
_demoFormModel.docNumber = value;
},
),
8.height,
AppTextFormField(
controller: doctorEmail,
labelText: "Email",
validator: (value) {
if ((value ?? "").isEmpty) {
return "Mandatory";
} else {
return Validator.isEmail(value!) ? null : context.translation.emailValidateMessage;
}
},
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.emailAddress,
onChange: (value) {
_demoFormModel.docEmail = value;
},
),
8.height,
AppTextFormField(
controller: itemDesc,
labelText: "Item Description",
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.text,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.itemDescription = value;
},
),
8.height,
AppTextFormField(
controller: requestDesc,
labelText: "Request Description",
// validator: (value) {
// if ((value ?? "").isEmpty) return "Mandatory";
// return null;
// },
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.text,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.requestDescription = value;
},
),
];
}
List<Widget> assetSection() {
return [
'Asset Details'.addTranslation.bodyText(context).custom(color: AppColor.black10),
8.height,
AppTextFormField(
labelText: "Asset Name",
controller: assetName,
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.text,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.assetName = value;
},
),
8.height,
AppTextFormField(
labelText: "Model",
controller: model,
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.text,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.model = value;
},
),
8.height,
AppTextFormField(
labelText: "Manufacturer",
controller: manufacturer,
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.text,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.manufacturer = value;
},
),
8.height,
SingleItemDropDownMenu<Lookup, DemoPeriodLookupProvider>(
context: context,
height: 56.toScreenHeight,
title: "Demo Period",
initialValue: _demoFormModel.demoPeriod,
showShadow: false,
validator: (value) {
if (value == null) return "Mandatory";
return null;
},
backgroundColor: AppColor.fieldBgColor(context),
showAsBottomSheet: true,
onSelect: (value) {
_demoFormModel.demoPeriod = value;
setState(() {});
},
),
];
}
List<Widget> vendorDetailsSection() {
return [
'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10),
//TODO show this only if supplier id and suppler person id is null..
if (_demoFormModel.vendor == null) ...[
8.height,
Text(
'${'Vendor Name'.addTranslation}: ${_demoFormModel.vendorName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
8.height,
Text(
'${'Representative Name'.addTranslation}: ${_demoFormModel.vendorRepresentativeName?.cleanupWhitespace.capitalizeFirstOfEach}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
),
],
8.height,
SingleItemDropDownMenu<SupplierDetails, VendorProvider>(
context: context,
title: 'Vendor Name'.addTranslation,
backgroundColor: AppColor.fieldBgColor(context),
initialValue: _demoFormModel.vendor,
showAsBottomSheet: true,
showShadow: false,
showCancel: true,
onSelect: (person) {
_demoFormModel.vendor = person;
_demoFormModel.supEngineer = null;
vendorPhone.text = person?.contact ?? '';
vendorEmail.text = person?.email ?? '';
setState(() {});
},
),
8.height,
SingleItemDropDownMenu<SuppPersons, NullableLoadingProvider>(
context: context,
backgroundColor: _demoFormModel.vendor?.suppliername == null
? context.isDark
? AppColor.neutral20
: AppColor.neutral40
: AppColor.fieldBgColor(context),
title: "Representative Name".addTranslation,
showShadow: false,
enabled: _demoFormModel.vendor?.suppPersons?.isNotEmpty ?? false,
staticData: _demoFormModel.vendor?.suppPersons,
showAsBottomSheet: true,
initialValue: _demoFormModel.supEngineer == null ? null : SuppPersons.fromJson(_demoFormModel.supEngineer?.toJson()),
onSelect: (suppPerson) {
if (suppPerson != null) {
_demoFormModel.supEngineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson());
setState(() {});
}
},
),
8.height,
AppTextFormField(
controller: vendorPhone,
enable: false,
labelText: "Contact Number",
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.phone,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.vendorContactNumber = value;
},
),
8.height,
AppTextFormField(
labelText: "Email",
controller: vendorEmail,
enable: false,
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.vendorEmail = value;
},
),
];
}
Future<void> _update() async {
FocusScope.of(context).unfocus();
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
_demoFormModel.demoAttachment = [];
for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
//Todo need to pass attachmentType id as well.
_demoFormModel.demoAttachment?.add(DemoAttachments(id: item.id, demoRequestId: _demoFormModel.id ?? 0, attachmentName: fileName));
}
Utils.showLoading(context);
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);
bool isSuccess = await demoProvider.updateDemoRequest(_demoFormModel.toJson());
Utils.hideLoading(context);
if (isSuccess) {
Navigator.pop(context, true);
}
}
}
}

@ -1,257 +0,0 @@
import 'dart:convert';
import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/dashboard_latest/dashboard_provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/models/new_models/task_request/task_type_model.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart';
import 'package:test_sa/models/service_request/supplier_details.dart';
import 'package:test_sa/modules/cm_module/cm_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/demo_module/models/demo_attachment_model.dart';
import 'package:test_sa/modules/demo_module/models/demo_request_model.dart';
import 'package:test_sa/modules/demo_module/provider/demo_period_lookup_provider.dart';
import 'package:test_sa/modules/demo_module/provider/demo_provider.dart';
import 'package:test_sa/modules/loan_module/models/loan_form_model.dart';
import 'package:test_sa/modules/loan_module/models/medical_department_model.dart';
import 'package:test_sa/modules/loan_module/provider/loan_period_provider.dart';
import 'package:test_sa/modules/loan_module/provider/loan_provider.dart';
import 'package:test_sa/modules/loan_module/provider/loan_provider.dart';
import 'package:test_sa/modules/loan_module/provider/medical_department_provider.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/department_provider.dart';
import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/providers/work_order/vendor_provider.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
import '../../../../../../new_views/common_widgets/default_app_bar.dart';
import 'demo_detail_view_page.dart';
import 'models/demo_form_model.dart';
class UpdateRequestView extends StatefulWidget {
static const String id = "/update-demo-request";
DemoRequestModel dataModel;
UpdateRequestView({Key? key, required this.dataModel}) : super(key: key);
@override
_UpdateRequestViewState createState() => _UpdateRequestViewState();
}
class _UpdateRequestViewState extends State<UpdateRequestView> with TickerProviderStateMixin {
final List<GenericAttachmentModel> attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final DemoFormModel _demoFormModel = DemoFormModel();
TextEditingController vendorEmailController = TextEditingController();
TextEditingController vendorPhoneController = TextEditingController();
@override
void dispose() {
vendorEmailController.dispose();
vendorPhoneController.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
fillData();
}
void fillData() async {
final vendorProvider = Provider.of<VendorProvider>(context, listen: false);
if (vendorProvider.items.isEmpty) {
if (mounted) {
await vendorProvider.getData();
}
}
final supplier = widget.dataModel.supplier;
_demoFormModel.vendor = supplier;
final selectedVendor = vendorProvider.items.firstWhere(
(element) => element.id == supplier?.id,
orElse: () => SupplierDetails(),
);
_demoFormModel.id = widget.dataModel.id;
_demoFormModel.vendor?.suppPersons = selectedVendor.suppPersons;
_demoFormModel.supEngineer = widget.dataModel.suppPerson;
_demoFormModel.vendorEmail = supplier?.email;
_demoFormModel.vendorContactNumber = supplier?.contact;
vendorEmailController.text = supplier?.email ?? '';
vendorPhoneController.text = supplier?.contact ?? '';
// PREFILL ATTACHMENTS
attachments.clear();
if (widget.dataModel.demoAttachments?.isNotEmpty ?? false) {
for (final item in widget.dataModel.demoAttachments!) {
if ((item.attachmentName ?? '').isNotEmpty) {
attachments.add(
GenericAttachmentModel(name: item.attachmentName, id: item.id ?? 0, originalName: item.originalName),
);
}
}
}
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: DefaultAppBar(title: 'Update Request'.addTranslation),
body: Form(
key: _formKey,
child: Column(
children: [
SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
...vendorDetailsSection(),
16.height,
AttachmentPicker(
label: context.translation.attachments,
attachment: attachments,
buttonColor: AppColor.black10,
onlyImages: false,
showAsListView: true,
buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120),
),
],
).toShadowContainer(context, borderRadius: 20),
).expanded,
FooterActionButton.footerContainer(
context: context,
child: AppFilledButton(
buttonColor: AppColor.primary10,
label: context.translation.update,
onPressed: _update,
// buttonColor: AppColor.primary10,
),
),
],
),
),
);
}
List<Widget> vendorDetailsSection() {
return [
'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10),
8.height,
SingleItemDropDownMenu<SupplierDetails, VendorProvider>(
key: ValueKey(_demoFormModel.vendor?.id),
context: context,
title: 'Vendor Name'.addTranslation,
backgroundColor: AppColor.fieldBgColor(context),
initialValue: _demoFormModel.vendor,
showAsBottomSheet: true,
showShadow: false,
showCancel: true,
onSelect: (person) {
_demoFormModel.vendor = person;
_demoFormModel.supEngineer = null;
vendorPhoneController.text = person?.contact ?? '';
vendorEmailController.text = person?.email ?? '';
setState(() {});
},
),
8.height,
SingleItemDropDownMenu<SuppPersons, NullableLoadingProvider>(
key: ValueKey(_demoFormModel.supEngineer?.id),
context: context,
backgroundColor: _demoFormModel.vendor?.suppliername == null
? context.isDark
? AppColor.neutral20
: AppColor.neutral40
: AppColor.fieldBgColor(context),
title: "Representative Name".addTranslation,
showShadow: false,
enabled: _demoFormModel.vendor?.suppPersons?.isNotEmpty ?? false,
staticData: _demoFormModel.vendor?.suppPersons,
showAsBottomSheet: true,
initialValue: _demoFormModel.supEngineer == null ? null : SuppPersons.fromJson(_demoFormModel.supEngineer?.toJson()),
onSelect: (suppPerson) {
if (suppPerson != null) {
_demoFormModel.supEngineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson());
setState(() {});
}
},
),
8.height,
AppTextFormField(
controller: vendorPhoneController,
enable: false,
labelText: "Contact Number",
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.phone,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.vendorContactNumber = value;
},
),
8.height,
AppTextFormField(
labelText: "Email",
controller: vendorEmailController,
enable: false,
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.vendorEmail = value;
},
),
];
}
Future<void> _update() async {
FocusScope.of(context).unfocus();
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
_demoFormModel.demoAttachment = [];
for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_demoFormModel.demoAttachment?.add(DemoAttachments(id: 0, attachmentName: fileName, demoRequestId: 0));
_demoFormModel.demoAttachment?.add(DemoAttachments(id: item.id, demoRequestId: _demoFormModel.id ?? 0, attachmentName: fileName));
}
Utils.showLoading(context);
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);
bool isSuccess = await demoProvider.updateDemoRequest(_demoFormModel.toUpdateJson());
Utils.hideLoading(context);
if (isSuccess) {
Navigator.pop(context, true);
}
}
}
}

@ -205,7 +205,7 @@ class AppColor {
return orange30;
case "reviewed":
return orange30;
case "returned for correction":
case "returned for correction":
return orange30;
default:
return Colors.white;
@ -259,7 +259,8 @@ class AppColor {
return blueStatus(context);
}
}
static Color demoRequestStatus(BuildContext context, int id) {
static Color demoRequestStatus(BuildContext context, int id) {
switch (id) {
case 1:
return blueStatus(context);
@ -270,7 +271,7 @@ class AppColor {
case 4:
return yellowStatus(context);
default:
return blueStatus(context);
return yellowStatus(context);
}
}
@ -286,16 +287,17 @@ class AppColor {
return Colors.white;
}
}
static Color demoRequestStatusTextColor(BuildContext context, int id) {
switch (id) {
case 2:
return orange60;
case 4:
return Colors.white;
return orange60;
case 9:
return orange60;
default:
return Colors.white;
return orange60;
}
}

@ -79,9 +79,9 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
if (isEngineer) {
types[context.translation.recurrentWo] = 5;
if (context.settingProvider.isUserFlowMedical) types["Equipment Internal Audit".addTranslation] = 10;
if (context.settingProvider.isUserFlowMedical) types["System Internal Audit".addTranslation] = 11;
if (context.settingProvider.isUserFlowMedical) types["Medical Gas Inspection".addTranslation] = 11;
if (context.settingProvider.isUserFlowMedical) types["Equipment Internal Audit".addTranslation] = 10;
if (context.settingProvider.isUserFlowMedical) types["System Internal Audit".addTranslation] = 11;
if (context.settingProvider.isUserFlowMedical) types["Medical Gas Inspection".addTranslation] = 11;
}
if (context.settingProvider.isUserFlowMedical && isEngineer) {
@ -104,8 +104,8 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
// }
if (context.userProvider.isQualityUser) {
if (context.settingProvider.isUserFlowMedical) types = {'Recall and Alert': 7};
if (context.settingProvider.isUserFlowMedical) types['Equipment Internal Audit'] = 10;
if (context.settingProvider.isUserFlowMedical) types['System Internal Audit'] = 11;
if (context.settingProvider.isUserFlowMedical) types['Equipment Internal Audit'] = 10;
if (context.settingProvider.isUserFlowMedical) types['System Internal Audit'] = 11;
}
if (context.userProvider.isCommissioningEngineer) {
///TODO need to check what other requests type needed here.
@ -113,7 +113,13 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
'Asset Delivery': 13,
};
}
///TODO need add accessor filter as well.
if (context.userProvider.isAssessor) {
types = {
'Demo Request': 15,
};
}
final statuses = {
"All WO": 0,

@ -75,8 +75,6 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
}
requestsList.add(Request(12, "Loan Equipment"));
//Todo need to remove this only for accessor
requestsList.add(Request(15, "Demo Request"));
if (context.userProvider.isAssessor) {
requestsList = [
Request(null, context.translation.allWorkOrder),

@ -82,7 +82,6 @@ class RequestPaginatedListview extends StatelessWidget {
return AssetDeliveryItemView(requestData: request);
case 14:
return MedicalGasInspectionItemView(requestData: request);
//TODO need to change number
case 15:
return DemoRequestItemView(requestData: request);
default:

@ -38,14 +38,14 @@ class RequestItemViewList extends StatelessWidget {
shrinkWrap: true,
itemBuilder: (cxt, index) {
if (isLoading) return const SizedBox().toRequestShimmer(cxt, isLoading);
// if (list[index].transactionType == null) {
// return EquipmentInternalAuditItemView(requestDetails: list[index]);
// // return Container(
// // height: 100,
// // width: double.infinity,
// // color: AppColor.neutral40,
// // );
// }
if (list[index].transactionType == 12) {
return DemoRequestItemView(requestDetails: list[index]);;
// return Container(
// height: 100,
// width: double.infinity,
// color: AppColor.neutral40,
// );
}
switch (list[index].transactionType) {
case 1:
return ServiceRequestItemView(requestDetails: list[index]);
@ -72,17 +72,14 @@ class RequestItemViewList extends StatelessWidget {
return EquipmentInternalAuditItemView(requestDetails: list[index]);
case 11:
return SystemInternalAuditItemView(requestDetails: list[index]);
//TODO need to correct this after testing...
case 12:
return DemoRequestItemView(requestDetails: list[index]);
case 12:
return LoanEquipmentItemView(requestDetails: list[index]);
case 13:
return AssetDeliveryItemView(requestDetails: list[index]);
case 14:
return MedicalGasInspectionItemView(requestDetails: list[index]);
case 15:
return DemoRequestItemView(requestDetails: list[index]);
default:
Container(
height: 100,

Loading…
Cancel
Save