Compare commits

...

9 Commits

@ -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
@ -488,4 +488,15 @@ class URLs {
static get getMedicalGasById => "$_baseUrl/MedicalGas/GetMedicalGasRequestByIdAsync";
static get updateDeliveryNote => "$_baseUrl/MedicalGas/MedicalGasRequestDeliveryNotesAsync";
//Demo Request...
static get addDemoRequest => "$_baseUrl/DemoRequest/AddDemoRequest";
static get updateDemoRequest => "$_baseUrl/DemoRequest/UpdateDemoRequest";
static get getDemoRequestById => "$_baseUrl/DemoRequest";
static get updateDemoRequestByAssessor => "$_baseUrl/DemoRequest/UpdateDemoRequestByAssessor";
static get updateDemoPeriodByRequester => "$_baseUrl/DemoRequest/UpdateDemoPeriodByRequester";
//4104 attachment type lookup
}

@ -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,10 +1,14 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_item_view.dart';
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';
@ -39,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);
@ -58,13 +63,16 @@ 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);
case 14:
return MedicalGasInspectionItemView(requestData: request);
case 15:
return DemoRequestItemView(requestData: request);
default:
return Container(
height: 100,

@ -1,4 +1,5 @@
import 'package:test_sa/app_strings/app_asset.dart';
import 'package:test_sa/models/enums/demo_request_step.dart';
import 'package:test_sa/models/enums/recurrent_task_inspection_data_type.dart';
import 'package:test_sa/models/enums/swipe_type.dart';
import 'package:test_sa/models/enums/work_order_next_step.dart';
@ -68,9 +69,9 @@ extension IntExtensionsWorkOrder on int {
return WorkOrderNextStepEnum.assetRetirementManagementApproval;
case 31:
return WorkOrderNextStepEnum.waitingForRequesterToConfirm;
case 35:
case 35:
return WorkOrderNextStepEnum.eFixRemotely;
case 36:
case 36:
return WorkOrderNextStepEnum.eNeedVisit;
default:
return WorkOrderNextStepEnum.assignToMe;
@ -95,9 +96,47 @@ extension IntExtensionsWorkOrder on int {
}
}
extension IntExtensionsDemoRequest on int {
DemoRequestStepEnum toDemoRequestStepEnum() {
//Todo need to check exact stages
switch (this) {
// { "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 7:
return DemoRequestStepEnum.updateRequest;
case 5:
return DemoRequestStepEnum.updateRequest;
return DemoRequestStepEnum.viewOnly;
case 15:
return DemoRequestStepEnum.extendDemoPeriod;
default:
// return DemoRequestStepEnum.viewOnly;
return DemoRequestStepEnum.updateRequest;
}
}
}
extension EnumExtensionsSwipeType on SwipeTypeEnum {
extension EnumExtensionsSwipeType on SwipeTypeEnum {
int getIntFromSwipeTypeEnum() {
switch (this) {
case SwipeTypeEnum.NFC:
@ -109,7 +148,8 @@ extension EnumExtensionsSwipeType on SwipeTypeEnum {
}
}
}
extension StringExtensionsRecurrentTaskInpesctionDataType on String {
extension StringExtensionsRecurrentTaskInpesctionDataType on String {
RecurrentTaskInspectionDataTypeEnum toRecurrentTaskInspectionDataTypeEnum() {
switch (this) {
case 'bool':
@ -122,7 +162,6 @@ extension StringExtensionsRecurrentTaskInpesctionDataType on String {
}
}
extension IntExtensionsAssetDeliveryStage on int {
AssetDeliveryStageEnum toAssetDeliveryStageEnum() {
switch (this) {
@ -138,17 +177,16 @@ extension IntExtensionsAssetDeliveryStage on int {
}
}
enum DropDownMatchType {
identifier,
name,
}
enum CostCenterType {
costCenter,
serialNumber,
}
enum AssetDeliveryStageEnum {
deliveryInspection,
technicalInspection,

@ -38,8 +38,8 @@ import 'package:test_sa/modules/cm_module/cm_detail_provider.dart';
import 'package:test_sa/modules/cm_module/create_cm_request.dart';
import 'package:test_sa/modules/cx_module/chat/chat_provider.dart';
import 'package:test_sa/modules/demo_module/create_demo_request_page.dart';
import 'package:test_sa/modules/demo_module/demo_period_lookup_provider.dart';
import 'package:test_sa/modules/demo_module/demo_provider.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/internal_audit_module/pages/equipment_internal_audit/create_equipment_internal_audit_form.dart';
import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/create_system_internal_audit_form.dart';
import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/update_system_internal_audit_page.dart';

@ -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;

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

@ -1,16 +1,21 @@
import 'dart:developer';
import 'package:test_sa/extensions/enum_extensions.dart';
import 'package:test_sa/models/enums/demo_request_step.dart';
import 'package:test_sa/models/enums/work_order_next_step.dart';
import 'base.dart';
//Need to change this to accept generic enum model..
class Lookup extends Base {
int? id; // Now nullable
int? value; // Now nullable
WorkOrderNextStepEnum? workOrderNextStepEnum; // Now nullable
AssetDeliveryStageEnum? assetDeliveryStageEnum; // Now nullable
DemoRequestStepEnum? demoRequestStepEnum; // Now nullable
String? name; // Now nullable
Lookup({this.id, this.value, this.name, this.workOrderNextStepEnum, this.assetDeliveryStageEnum}) : super(identifier: id?.toString(), name: name);
Lookup({this.id, this.value, this.name, this.workOrderNextStepEnum, this.assetDeliveryStageEnum, this.demoRequestStepEnum}) : super(identifier: id?.toString(), name: name);
@override
bool operator ==(Object other) => identical(this, other) || other is Lookup && ((value != null && value == other.value) || (id != null && id == other.id));
@ -44,6 +49,7 @@ class Lookup extends Base {
name: parsedJson["name"],
workOrderNextStepEnum: parsedJson["value"] == null ? null : (parsedJson["value"] as int).toWorkOrderNextStepEnum(),
assetDeliveryStageEnum: parsedJson["value"] == null ? null : (parsedJson["value"] as int).toAssetDeliveryStageEnum(),
demoRequestStepEnum: parsedJson["value"] == null ? null : (parsedJson["value"] as int).toDemoRequestStepEnum(),
id: parsedJson["id"],
value: parsedJson["value"],
);

@ -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;

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -6,6 +8,8 @@ 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/enums/demo_request_step.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/enums/work_order_next_step.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
@ -16,6 +20,10 @@ import 'package:test_sa/modules/cm_module/views/components/activities_list_view.
import 'package:test_sa/modules/cm_module/views/components/bottom_sheets/service_request_bottomsheet.dart';
import 'package:test_sa/modules/cm_module/views/components/verify_arrival_view.dart';
import 'package:test_sa/modules/cm_module/views/forms/asset_retired/verify_asset_detail.dart';
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_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';
@ -358,4 +366,129 @@ class FooterActionButton {
}
return const SizedBox();
}
static Widget demoRequestDetailsFooterWidget({
required BuildContext context,
Lookup? status,
required DemoRequestModel dataModel,
required DemoRequestStepEnum demoRequestStage,
required Function(bool status) refreshData,
}) {
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);
UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
if (userProvider.user?.type == UsersTypes.assessor) {
switch (demoRequestStage) {
case DemoRequestStepEnum.qAuditorRejectAccept:
return footerContainer(
context: context,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min,
children: [
AppFilledButton(
label: context.translation.reject,
maxWidth: true,
buttonColor: AppColor.background(context),
textColor: AppColor.red30,
showBorder: true,
onPressed: () async {
Utils.showLoading(context);
bool responseStatus = await demoProvider.acceptRejectRequest(requestId: dataModel.id!, status: false);
Utils.hideLoading(context);
if (responseStatus) {
Navigator.pop(context);
}
},
).expanded,
const SizedBox(
width: 20,
),
AppFilledButton(
label: context.translation.accept,
maxWidth: true,
buttonColor: AppColor.green70,
onPressed: () async {
Utils.showLoading(context);
bool responseStatus = await demoProvider.acceptRejectRequest(requestId: dataModel.id!, status: true);
Utils.hideLoading(context);
if (responseStatus) {
refreshData(true);
}
},
).expanded,
],
));
case DemoRequestStepEnum.updateRequest:
return footerContainer(
context: context,
child: AppFilledButton(
label: context.translation.updateRequest,
// maxWidth: true,
buttonColor: AppColor.primary10,
onPressed: () async {
bool? isRefresh = await Navigator.push(
context,
MaterialPageRoute(
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) {
refreshData(true);
}
},
),
);
case DemoRequestStepEnum.viewOnly:
return const SizedBox();
case DemoRequestStepEnum.extendDemoPeriod:
return footerContainer(
context: context,
child: AppFilledButton(
buttonColor: AppColor.primary10,
label: "Extension Request",
onPressed: () async {
final bool? isRefresh = await showModalBottomSheet<bool>(
context: context,
useSafeArea: true,
backgroundColor: Colors.transparent,
isScrollControlled: true,
builder: (_) => DemoExtensionBottomSheet(
requestId: dataModel.id!,
),
);
if (isRefresh == true) {
refreshData(true);
}
},
),
);
}
} else {
if (demoRequestStage == DemoRequestStepEnum.viewOnly) {
return const SizedBox();
}
}
return const SizedBox();
}
}

@ -16,13 +16,18 @@ 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/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/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/demo_period_lookup_provider.dart';
import 'package:test_sa/modules/demo_module/models/demo_attachment_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';
@ -39,9 +44,10 @@ 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 'demo_detail_view_page.dart';
import 'demo_document_lookup_provider.dart';
import 'demo_form_model.dart';
import 'models/demo_form_model.dart';
class CreateDemoRequestPage extends StatefulWidget {
static const String id = "/create-demo-request";
@ -56,18 +62,17 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
final List<GenericAttachmentModel> attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TaskType? selectedType;
final DemoFormModel _demoFormModel = DemoFormModel();
TextEditingController vendorEmailController = TextEditingController();
TextEditingController vendorPhoneController = TextEditingController();
TextEditingController commentController = TextEditingController();
SupplierDetails? supplier;
Lookup? demoPeriodLookup;
@override
void dispose() {
vendorEmailController.dispose();
vendorPhoneController.dispose();
super.dispose();
}
Lookup? demoDocumentLookup;
// List<Lookup> loanTypes = [];
@override
void initState() {
super.initState();
@ -189,20 +194,63 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
},
),
8.height,
SingleItemDropDownMenu<MedicalDepartmentModel, MedicalDepartmentProvider>(
SingleItemDropDownMenu<Building, NullableLoadingProvider>(
context: context,
title: context.translation.department,
title: context.translation.building,
initialValue: _demoFormModel.building,
showShadow: false,
showAsBottomSheet: true,
validator: (value) {
if (value == null) return "Please select a department";
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,
requestById: context.userProvider.user?.clientId,
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(() {});
},
),
@ -309,6 +357,24 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
return [
'Asset Details'.addTranslation.bodyText(context).custom(color: AppColor.black10),
8.height,
AppTextFormField(
labelText: "Asset 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)),
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",
validator: (value) {
@ -349,7 +415,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
context: context,
height: 56.toScreenHeight,
title: "Demo Period",
initialValue: demoPeriodLookup,
initialValue: _demoFormModel.demoPeriod,
showShadow: false,
validator: (value) {
if (value == null) return "Mandatory";
@ -358,7 +424,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
backgroundColor: AppColor.fieldBgColor(context),
showAsBottomSheet: true,
onSelect: (value) {
demoPeriodLookup = value;
_demoFormModel.demoPeriod = value;
setState(() {});
},
),
@ -370,17 +436,12 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10),
8.height,
AppTextFormField(
initialValue: "",
labelText: "Name",
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
labelText:'Vendor Name'.addTranslation,
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.name,
textInputType: TextInputType.text,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.vendorName = value;
@ -388,17 +449,12 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
),
8.height,
AppTextFormField(
initialValue: "",
labelText: "Representative Name",
validator: (value) {
if ((value ?? "").isEmpty) return "Mandatory";
return null;
},
labelText:'Representative Name'.addTranslation,
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
showShadow: false,
textInputType: TextInputType.name,
textInputType: TextInputType.text,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.vendorRepresentativeName = value;
@ -406,12 +462,8 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
),
8.height,
AppTextFormField(
initialValue: "",
// controller: vendorPhoneController,
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)),
@ -419,20 +471,13 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
textInputType: TextInputType.phone,
textInputAction: TextInputAction.next,
onChange: (value) {
_demoFormModel.vendorNumber = value;
_demoFormModel.vendorContactNumber = value;
},
),
8.height,
AppTextFormField(
initialValue: "",
labelText: "Email",
validator: (value) {
if ((value ?? "").isEmpty) {
return "Mandatory";
} else {
return Validator.isEmail(value!) ? null : context.translation.emailValidateMessage;
}
},
// controller: vendorEmailController,
style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
@ -450,20 +495,14 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
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: 0, attachmentName: fileName, demoRequestId: 0,documentTypeId: 7748));
}
Utils.showLoading(context);
LoanProvider loanProvider = Provider.of<LoanProvider>(context, listen: false);
Map<String, dynamic> body = _demoFormModel.toJson();
body["id"] = 0;
// body["LoanTypeId"] = 0;
// body["requestorUserID"] = context.userProvider.user!.userID;
bool isSuccess = await loanProvider.addLoanRequest(body);
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);
bool isSuccess = await demoProvider.addDemoRequest(_demoFormModel.toJson());
Utils.hideLoading(context);
if (isSuccess) {
Navigator.pop(context);

@ -87,7 +87,10 @@ class DemoActivitiesPage extends StatelessWidget {
child: AppFilledButton(
buttonColor: AppColor.primary10,
label: "Extension Request",
onPressed: () => _extensionRequest(context),
// onPressed: () => _extensionRequest(context),
onPressed: () {
},
),
),
],
@ -96,12 +99,12 @@ class DemoActivitiesPage extends StatelessWidget {
));
}
void _extensionRequest(context) {
showModalBottomSheet(
context: context,
useSafeArea: true,
backgroundColor: Colors.transparent,
builder: (context) => const DemoExtensionBottomSheet(),
);
}
// void _extensionRequest(context) {
// showModalBottomSheet(
// context: context,
// useSafeArea: true,
// backgroundColor: Colors.transparent,
// builder: (context) => DemoExtensionBottomSheet(),
// );
// }
}

@ -4,12 +4,16 @@ 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';
import 'package:test_sa/modules/demo_module/demo_provider.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/loan_module/models/loan_attachment_model.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/views/widgets/loaders/no_data_found.dart';
import '../../controllers/api_routes/urls.dart';
import '../../extensions/text_extensions.dart';
@ -32,12 +36,36 @@ class DemoDetailViewPage extends StatefulWidget {
}
class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
bool isLoading = false;
DemoRequestModel? dataModel;
DemoProvider? demoProvider;
List<WorkOrderAttachments> allAttachments = [];
//Todo need to check about attachments.
bool loading = false;
@override
void initState() {
demoProvider = Provider.of<DemoProvider>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((_) {
getDetailsById();
});
super.initState();
}
List<LoanAttachmentModel> allAttachments = [];
Future<void> getDetailsById() async {
setState(() {
loading = true;
});
dataModel = await demoProvider?.getDemoById(widget.demoId) ?? DemoRequestModel();
// _attachments = dataModel.demoAttachments.toList() ?? [];
setState(() {
loading = false;
});
}
@override
void dispose() {
@ -48,138 +76,108 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
Widget build(BuildContext context) {
return Scaffold(
appBar: const DefaultAppBar(title: "Request Details"),
body: Column(
children: [
// FutureBuilder<LoanRequestModel?>(
// future: Provider.of<DemoProvider>(context, listen: false).getLoanById(widget.demoId),
// builder: (BuildContext context, AsyncSnapshot<LoanRequestModel?> snapshot) {
// if (snapshot.connectionState == ConnectionState.waiting) return const CircularProgressIndicator(color: AppColor.primary10).center;
// if (snapshot.data == null) return const NoDataFound().center;
//
// List<LoanAttachmentModel> allAttachments = snapshot.data!.loanAttachments!;
//
// return
SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// StatusLabel(
// label: snapshot.data!.loanStatusName!,
// textColor: AppColor.getRequestStatusTextColorByName(context, snapshot.data!.loanStatusName!),
// backgroundColor: AppColor.getRequestStatusColorByName(context, snapshot.data!.loanStatusName!),
// ),
// 1.width.expanded,
// Text(
// snapshot.data!.createdDate?.toServiceRequestCardFormat ?? "-",
// textAlign: TextAlign.end,
// style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50),
// ),
// ],
// ),
// 12.height,
...requesterDetails(context, LoanRequestModel()),
12.height,
...requestDetails(context, LoanRequestModel()),
12.height,
...doctorDetails(context, LoanRequestModel()),
12.height,
...assetDetails(context, LoanRequestModel()),
12.height,
...vendorDetails(context, LoanRequestModel()),
if (allAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context),
Text(
"Attachments".addTranslation,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []),
],
],
).toShadowContainer(context, padding: 12),
)
// ;
// }
//
// )
.expanded,
FooterActionButton.footerContainer(
context: context,
child: AppFilledButton(
buttonColor: AppColor.primary10,
label: "Activities",
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => DemoActivitiesPage()));
},
),
),
FooterActionButton.footerContainer(
context: context,
child: AppFilledButton(
buttonColor: AppColor.primary10,
label: context.translation.update,
onPressed: _update,
),
),
],
));
body: loading
? const CircularProgressIndicator(color: AppColor.primary10).center
: dataModel == null
? const NoDataFound().center
: Column(
children: [
SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (dataModel?.status != null) ...[
StatusLabel(
label: dataModel?.status?.name,
id: dataModel?.status?.value,
radius: 4,
textColor: AppColor.demoRequestStatusTextColor(context, dataModel!.status!.value!),
backgroundColor: AppColor.demoRequestStatus(context, dataModel!.status!.value!),
),
8.height,
],
...requesterDetails(context, dataModel),
12.height,
...requestDetails(context, dataModel),
12.height,
...doctorDetails(context, dataModel),
12.height,
...assetDetails(context, dataModel),
12.height,
...vendorDetails(context, dataModel),
if (allAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context),
Text(
"Attachments".addTranslation,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []),
],
],
).toShadowContainer(context, padding: 12),
).expanded,
FooterActionButton.demoRequestDetailsFooterWidget(
demoRequestStage: dataModel!.status!.demoRequestStepEnum!,
// demoRequestStage: DemoRequestStepEnum.updateRequest,
dataModel: dataModel!,
status: dataModel!.status!,
context: context,
refreshData: (status) {
if (status) {
getDetailsById();
}
}).toShadowContainer(context, padding: 0, showShadow: false, borderRadius: 0),
],
));
}
List<Widget> requestDetails(BuildContext context, LoanRequestModel loanData) {
List<Widget> requestDetails(BuildContext context, DemoRequestModel? model) {
return [
Text("Request Details", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
// 'Loan Type: ${loanData.loanTypeName ?? "-"}'.bodyText(context),
'Demo No: ${loanData.reqCode ?? "-"}'.bodyText(context),
'Demo Period: ${loanData.loanPeriodName ?? "-"}'.bodyText(context),
'${context.translation.site}: ${loanData.siteName ?? "-"}'.bodyText(context),
'${context.translation.department}: ${loanData.departmentName ?? "-"}'.bodyText(context),
'Item Description: ${loanData.itemDescription ?? "-"}'.bodyText(context),
'Request Description: ${loanData.requestDescription ?? "-"}'.bodyText(context),
// 'Demo No: ${model. ?? "-"}'.bodyText(context),
'Demo Period: ${model?.demoPeriod?.name ?? "-"}'.bodyText(context),
'${context.translation.site}: ${model?.site?.custName ?? "-"}'.bodyText(context),
'${context.translation.department}: ${model?.department?.name ?? "-"}'.bodyText(context),
'Item Description: ${model?.itemDescription ?? "-"}'.bodyText(context),
'Request Description: ${model?.requestDescription ?? "-"}'.bodyText(context),
];
}
List<Widget> vendorDetails(BuildContext context, LoanRequestModel loanData) {
List<Widget> vendorDetails(BuildContext context, DemoRequestModel? model) {
return [
Text("Vendor Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Name: ${loanData.vendorName ?? "-"}'.bodyText(context),
'Representative Name: ${loanData.vendorRepName ?? "-"}'.bodyText(context),
'Contact: ${loanData.vendorContact ?? "-"}'.bodyText(context),
'Email: ${loanData.vendorEmail ?? "-"}'.bodyText(context),
'Name: ${model?.supplier?.name ?? "-"}'.bodyText(context),
'Representative Name: ${model?.suppPerson?.name ?? "-"}'.bodyText(context),
'Contact: ${model?.supplier?.contact ?? "-"}'.bodyText(context),
'Email: ${model?.supplier?.email ?? "-"}'.bodyText(context),
];
}
List<Widget> assetDetails(BuildContext context, LoanRequestModel loanData) {
List<Widget> assetDetails(BuildContext context, DemoRequestModel? model) {
return [
Text("Asset Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
// '${context.translation.assetName}: ${loanData.assetName ?? "-"}'.bodyText(context),
// '${context.translation.assetNo}: ${loanData.assetNumber ?? "-"}'.bodyText(context),
// '${context.translation.serialNumber}: ${loanData.assetSerialNumber ?? "-"}'.bodyText(context),
'${context.translation.manufacture}: ${loanData.manufacturer ?? "-"}'.bodyText(context),
'${context.translation.model}: ${loanData.model ?? "-"}'.bodyText(context),
'Estimated Delivery Date: 29 October, 2025'.bodyText(context),
'${context.translation.assetName}: ${model?.assetName ?? "-"}'.bodyText(context),
'${context.translation.manufacture}: ${model?.manufacturer ?? "-"}'.bodyText(context),
'${context.translation.model}: ${model?.model ?? "-"}'.bodyText(context),
];
}
List<Widget> doctorDetails(BuildContext context, LoanRequestModel loanData) {
List<Widget> doctorDetails(BuildContext context, DemoRequestModel? model) {
return [
Text("Doctor Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Name: ${loanData.doctorName ?? "-"}'.bodyText(context),
'Contact: ${loanData.doctorContact ?? "-"}'.bodyText(context),
'Email: ${loanData.doctorEmail ?? "-"}'.bodyText(context),
'Name: ${model?.doctorName ?? "-"}'.bodyText(context),
'Contact: ${model?.doctorContactNumber ?? "-"}'.bodyText(context),
'Email: ${model?.doctorContactEmail ?? "-"}'.bodyText(context),
];
}
List<Widget> requesterDetails(BuildContext context, LoanRequestModel loanData) {
List<Widget> requesterDetails(BuildContext context, DemoRequestModel? model) {
return [
Text("Requester Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Name: ${loanData.requestorUserIdForDisplay ?? "-"}'.bodyText(context),
'Email: ${loanData.requestorUserEmail ?? "-"}'.bodyText(context),
'Contact: ${loanData.requestorUserMobileNumber ?? "-"}'.bodyText(context),
'Name: ${model?.requesterUser?.requesterName ?? "-"}'.bodyText(context),
'Email: ${model?.requesterUser?.requesterEmail ?? "-"}'.bodyText(context),
'Contact: ${model?.requesterUser?.requesterMobile ?? "-"}'.bodyText(context),
// 'Extension: ${loanData.requesterExtensionNo ?? "-"}'.bodyText(context),
];
}

@ -10,6 +10,8 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/site_contact_info_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/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
import 'package:url_launcher/url_launcher_string.dart';
@ -19,8 +21,18 @@ import '../../new_views/common_widgets/app_filled_button.dart';
import '../cm_module/views/components/action_button/footer_action_button.dart';
import '../loan_module/provider/loan_period_provider.dart';
class DemoExtensionBottomSheet extends StatelessWidget {
const DemoExtensionBottomSheet({Key? key}) : super(key: key);
class DemoExtensionBottomSheet extends StatefulWidget {
int requestId;
DemoExtensionBottomSheet({Key? key, required this.requestId}) : super(key: key);
@override
State<DemoExtensionBottomSheet> createState() => _DemoExtensionBottomSheetState();
}
class _DemoExtensionBottomSheetState extends State<DemoExtensionBottomSheet> {
Lookup? demoPeriod;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
@ -36,108 +48,76 @@ class DemoExtensionBottomSheet extends StatelessWidget {
),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight),
child: SafeArea(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
width: 40.toScreenWidth,
height: 5.toScreenHeight,
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
),
16.height,
Align(
alignment: AlignmentDirectional.centerStart,
child: Text(
"Select Demo Period",
style: AppTextStyles.heading3.copyWith(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
child: Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
width: 40.toScreenWidth,
height: 5.toScreenHeight,
decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)),
),
16.height,
Align(
alignment: AlignmentDirectional.centerStart,
child: Text(
"Select Demo Period",
style: AppTextStyles.heading5.copyWith(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
),
16.height,
SingleItemDropDownMenu<Lookup, DemoPeriodLookupProvider>(
context: context,
height: 56.toScreenHeight,
title: "Demo Period",
initialValue: demoPeriod,
showShadow: false,
validator: (value) {
if (value == null) return "Mandatory";
return null;
},
backgroundColor: AppColor.fieldBgColor(context),
showAsBottomSheet: true,
onSelect: (value) {
demoPeriod = value;
setState(() {});
},
),
36.height,
Row(
children: [
AppFilledButton(
label: context.translation.cancel,
buttonColor: AppColor.white60,
textColor: AppColor.black10,
loading: false,
onPressed: () async {
Navigator.pop(context,false);
},
).expanded,
16.width,
AppFilledButton(
buttonColor: AppColor.primary10,
label: context.translation.submit,
onPressed: () async {
if (_formKey.currentState!.validate()) {
Utils.showLoading(context);
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);
bool isSuccess = await demoProvider.updateDemoPeriod(requestId: widget.requestId, demoPeriodId: demoPeriod!.id!, isUpdateRequired: true);
Utils.hideLoading(context);
if (isSuccess) {
Navigator.pop(context, true);
}
}
},
).expanded,
],
),
),
16.height,
SingleItemDropDownMenu<Lookup, LoanPeriodProvider>(
context: context,
height: 56.toScreenHeight,
title: 'Demo Period'.addTranslation,
showShadow: false,
validator: (value) {
if (value == null) return "Please select loan period";
return null;
},
backgroundColor: AppColor.fieldBgColor(context),
showAsBottomSheet: true,
// initialValue: _loanFormModel.loanProvided,
onSelect: (status) {
// if (status != null) {
// _loanFormModel.loanProvided = status;
// setState(() {});
// }
},
),
36.height,
Row(
children: [
AppFilledButton(
label: context.translation.cancel,
buttonColor: AppColor.white60,
textColor: AppColor.black10,
loading: false,
onPressed: () async {
Navigator.pop(context);
},
).expanded,
16.width,
AppFilledButton(
buttonColor: AppColor.primary10,
label: context.translation.submit,
onPressed: () {
Utils.showLoading(context);
Future.delayed(Duration(milliseconds: 500), () {
// api call to submits
Utils.hideLoading(context);
Navigator.pop(context);
// api call to get fresh data
});
},
).expanded,
],
),
],
],
),
),
),
);
}
void _launchWhatsapp(String number) async {
var whatsappUrl = "https://wa.me/$number/?text=${Uri.parse("Hi, I need some help")}";
try {
if (await canLaunchUrlString(whatsappUrl)) {
await launchUrlString(whatsappUrl);
} else {
throw 'Could not launch $whatsappUrl';
}
} catch (e) {
print('Error launching WhatsApp: $e');
}
}
Widget contactItem(BuildContext context, bool isDark, String iconName, String title, String subtitle) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SvgPicture.asset(
"assets/images/$iconName.svg",
width: 32.toScreenWidth,
color: isDark ? AppColor.primary40 : AppColor.primary70,
),
30.height,
Text(
title,
style: AppTextStyles.heading6.copyWith(color: isDark ? AppColor.neutral30 : AppColor.neutral50),
),
Text(
subtitle,
style: AppTextStyles.bodyText.copyWith(color: isDark ? AppColor.neutral10 : AppColor.neutral20),
),
],
).toShadowContainer(context);
}
}

@ -1,157 +0,0 @@
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart';
import 'package:test_sa/models/new_models/department.dart';
import 'package:test_sa/models/new_models/floor.dart';
import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/modules/loan_module/models/medical_department_model.dart';
class DemoFormModel {
String? docName;
String? docNumber;
String? docEmail;
String? itemDescription;
String? requestDescription;
String? model;
String? manufacturer;
Lookup? loanProvided;
String? vendorName;
String? vendorRepresentativeName;
String? vendorNumber;
String? vendorEmail;
Site? site;
MedicalDepartmentModel? department;
List<DemoAttachments>? demoAttachment;
DemoFormModel({
this.docName,
this.docNumber,
this.docEmail,
this.itemDescription,
this.requestDescription,
this.model,
this.manufacturer,
this.loanProvided,
this.vendorName,
this.vendorRepresentativeName,
this.vendorNumber,
this.vendorEmail,
this.demoAttachment,
this.site,
this.department,
});
//{
// "id": 0,
// "employeeId": "fa29a9de-1337-4729-b823-68c6ecffdd33",
// "requestorUserID": "fa29a9de-1337-4729-b823-68c6ecffdd33",
// "employeeName": "engineer-dev",
// "employeeEmail": "Engineer_Dev@yahoo.com",
// "positionName": "High",
// "requesterExtensionNumber": "7726",
// "requesterContactNumber": "72132197",
// "siteId": 1,
// "departmentId": 5,
// "loanTypeId": 6448,
// "doctorName": "Doctor A",
// "doctorContact": "0561432451",
// "doctorEmail": "doctor@test.com",
// "itemDescription": "Test item",
// "requestDescription": "Test request",
// "loanPeriodId": 6453,
// "assetId": null,
// "assetNumber": "",
// "assetName": "",
// "assetSerialNumber": "",
// "model": "Model A",
// "manufacturer": "Siemens",
// "vendorName": "Vendor A",
// "vendorRepName": "Vendor Rep A",
// "vendorContact": "0561432455",
// "vendorEmail": "vendor@test.com",
// "loanStatusId": 1,
// "loanAttachments": [],
// "submittedAt": "2025-11-13T12:11:12.673Z",
// "updatedAt": null,
// "cMWOItemId": null
// }
Map<String, dynamic> toJson() {
var abc = {
"id": 0,
"siteId": 0,
"buildingId": 0,
"floorId": 0,
"departmentId": 0,
"assetName": "string",
"model": "string",
"manufacturer": "string",
"doctorName": "string",
"doctorContactNumber": "string",
"doctorContactEmail": "string",
"itemDescription": "string",
"requestDescription": "string",
"demoPeriodId": 0,
"supplierId": 0,
"suppPersonId": 0,
"isSubmit": true,
"demoAttachments": [
{
"id": 0,
"attachmentName": "string",
"originalName": "string",
"demoRequestId": 0,
"attachmentTypeId": 0
}
]
};
return {
"doctorName": docName,
"doctorContact": docNumber,
"doctorEmail": docEmail,
"itemDescription": itemDescription,
"requestDescription": requestDescription,
"model": model,
"manufacturer": manufacturer,
"demoPeriodId": loanProvided?.id,
"vendorName": vendorName,
"vendorRepresentativeName": vendorRepresentativeName,
"vendorRepName": vendorRepresentativeName,
"vendorNumber": vendorNumber,
"vendorContact": vendorNumber,
"vendorEmail": vendorEmail,
'siteId': site?.id,
'departmentId': department?.id,
"demoAttachments": demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [],
};
}
}
class DemoAttachments {
num? id;
num? demoRequestId;
num? attachmentTypeId;
String? attachmentName;
String? originalName;
DemoAttachments({this.id, this.attachmentTypeId, this.attachmentName, this.demoRequestId, this.originalName});
DemoAttachments.fromJson(dynamic json) {
id = json['id'];
attachmentTypeId = json['attachmentTypeId'];
demoRequestId = json['demoRequestId'];
attachmentName = json['attachmentName'];
originalName = json['originalName'];
}
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['attachmentTypeId'] = attachmentTypeId;
map['attachmentName'] = attachmentName;
map['demoRequestId'] = demoRequestId;
map['originalName'] = originalName;
return map;
}
}

@ -1,52 +0,0 @@
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/modules/loan_module/models/loan_request_model.dart';
import 'dart:convert';
class DemoProvider extends ChangeNotifier {
Future<bool> addLoanRequest(Map<String, dynamic> body) async {
try {
Response response = await ApiManager.instance.post(URLs.addLoan, body: body, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true;
}
return false;
} catch (error) {
return false;
}
}
bool isLoading = false;
Future<LoanRequestModel?> getLoanById(int id) async {
LoanRequestModel? loanData;
try {
Response response = await ApiManager.instance.get(URLs.getLoanById + "?loanId=$id");
if (response.statusCode >= 200 && response.statusCode < 300) {
loanData = LoanRequestModel.fromJson(json.decode(response.body)["data"]);
}
} catch (error) {
print(error);
}
return loanData;
}
Future<bool> addDemoTrialOutcome(Map<String, dynamic> body) async {
try {
Response response = await ApiManager.instance.post(URLs.addDemoTrialOutcome, body: body, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true;
}
return false;
} catch (error) {
return false;
}
}
}

@ -0,0 +1,119 @@
import 'package:flutter/material.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/models/all_requests_and_count_model.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_page.dart';
import 'package:test_sa/modules/asset_inventory_module/pages/asset_inventory_page.dart';
import 'package:test_sa/modules/demo_module/demo_detail_view_page.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart';
class DemoRequestItemView extends StatelessWidget {
final Data? requestData;
final RequestsDetails? requestDetails;
final bool showShadow;
const DemoRequestItemView({Key? key, this.requestData, this.requestDetails, this.showShadow = true}) : super(key: key);
@override
Widget build(BuildContext context) {
if (requestData != null) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
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(
mainAxisSize: MainAxisSize.min,
children: [
Text(
context.translation.viewDetails,
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)),
),
4.width,
Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14)
],
),
],
).toShadowContainer(context, withShadow: showShadow).onPress(() async {
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => DemoDetailViewPage(
demoId: requestData!.id!,
)));
});
}
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
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: [
Text(
context.translation.viewDetails,
style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)),
),
4.width,
Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14)
],
),
],
).toShadowContainer(context, withShadow: showShadow).onPress(() async {
Navigator.of(context).push(MaterialPageRoute(
builder: (_) => DemoDetailViewPage(
demoId: requestDetails!.id!,
)));
});
}
Widget infoWidget({required String label, String? value, required BuildContext context}) {
if (value != null && value.isNotEmpty) {
return '$label: $value'.bodyText(context);
}
return const SizedBox();
}
}

@ -8,8 +8,7 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/modules/demo_module/demo_provider.dart';
import 'package:test_sa/modules/loan_module/provider/loan_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';

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

@ -0,0 +1,95 @@
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/room_model.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/demo_module/models/demo_attachment_model.dart';
import 'package:test_sa/modules/loan_module/models/medical_department_model.dart';
import '../../../models/new_models/department.dart';
class DemoFormModel {
String? docName;
int? id;
String? docNumber;
String? docEmail;
String? itemDescription;
String? requestDescription;
String? model;
String? assetName;
String? manufacturer;
Lookup? demoPeriod;
String? vendorRepresentativeName;
String? vendorName;
String? vendorContactNumber;
String? vendorEmail;
Site? site;
Building? building; // Now nullable
Floor? floor; // Now nullable
Department? department; // Now nullable
Rooms? room;
SuppEngineerWorkOrders? supEngineer;
SupplierDetails? vendor;
List<DemoAttachments>? demoAttachment;
DemoFormModel({
this.id,
this.docName,
this.docNumber,
this.docEmail,
this.itemDescription,
this.requestDescription,
this.model,
this.assetName,
this.manufacturer,
this.demoPeriod,
this.vendorRepresentativeName,
this.vendorName,
this.vendorContactNumber,
this.vendorEmail,
this.demoAttachment,
this.site,
this.vendor,
this.supEngineer,
this.department,
});
Map<String, dynamic> toJson() {
return {
"id": 0,
'siteId': site?.id,
'departmentId': department?.id,
"buildingId": building?.id,
"floorId": floor?.id,
"assetName": assetName,
"isSubmit": true,
"doctorName": docName,
"doctorContactNumber": docNumber,
"doctorContactEmail": docEmail,
"itemDescription": itemDescription,
"requestDescription": requestDescription,
"model": model,
"vendorName": vendorName,
"vendorContactNumber": vendorContactNumber,
"vendorEmail": vendorEmail,
"vendorRepresentativeName": vendorRepresentativeName,
"manufacturer": manufacturer,
"demoPeriodId": demoPeriod?.id,
"supplierId": vendor?.id,
"suppPersonId": supEngineer?.id,
// "vendorEmail": vendorEmail,
"demoAttachments": demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [],
};
}
Map<String, dynamic> toUpdateJson() {
return {
"id": id,
"supplierId": vendor?.id,
"suppPersonId": supEngineer?.id,
"demoAttachments": demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [],
};
}
}

@ -0,0 +1,139 @@
import 'package:test_sa/models/device/asset_by_id_model.dart';
import 'package:test_sa/models/lookup.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/demo_module/models/demo_attachment_model.dart';
import 'package:test_sa/modules/loan_module/models/medical_department_model.dart';
class DemoRequestModel {
int? id;
RequesterUserModel? requesterUser;
Site? site;
Lookup? building;
Lookup? floor;
MedicalDepartmentModel? department;
String? assetName;
String? model;
String? manufacturer;
String? doctorName;
String? doctorContactNumber;
String? doctorContactEmail;
String? itemDescription;
String? requestDescription;
String? vendorName;
String? vendorRepresentativeName;
String? vendorContactNumber;
String? vendorEmail;
Lookup? demoPeriod;
SupplierDetails? supplier;
SuppEngineerWorkOrders? suppPerson;
Lookup? status;
List<DemoAttachments>? demoAttachments;
dynamic demoAsset;
dynamic demoInstallationTaskJob;
dynamic demoPullOutTaskJob;
bool? isDemoPeriodExpired;
DemoRequestModel({
this.id,
this.requesterUser,
this.site,
this.building,
this.floor,
this.department,
this.assetName,
this.model,
this.manufacturer,
this.doctorName,
this.doctorContactNumber,
this.doctorContactEmail,
this.itemDescription,
this.requestDescription,
this.vendorName,
this.vendorRepresentativeName,
this.vendorEmail,
this.vendorContactNumber,
this.demoPeriod,
this.supplier,
this.suppPerson,
this.status,
this.demoAttachments,
this.demoAsset,
this.demoInstallationTaskJob,
this.demoPullOutTaskJob,
this.isDemoPeriodExpired,
});
DemoRequestModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
requesterUser = json['requesterUser'] != null ? (RequesterUserModel()..fromJson(json['requesterUser'])) : null;
site = json['site'] != null ? (Site.fromJson(json['site'])) : null;
building = json['building'] != null ? (Lookup.fromJson(json['building'])) : null;
floor = json['floor'] != null ? (Lookup.fromJson(json['floor'])) : null;
department = json['department'] != null ? (MedicalDepartmentModel.fromJson(json['department'])) : null;
assetName = json['assetName'];
model = json['model'];
manufacturer = json['manufacturer'];
doctorName = json['doctorName'];
doctorContactNumber = json['doctorContactNumber'];
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;
status = json['status'] != null ? (Lookup.fromJson(json['status'])) : null;
demoAttachments = json['demoAttachments'] != null ? (json['demoAttachments'] as List).map((e) => DemoAttachments.fromJson(e)).toList() : null;
demoAsset = json['demoAsset'];
demoInstallationTaskJob = json['demoInstallationTaskJob'];
demoPullOutTaskJob = json['demoPullOutTaskJob'];
isDemoPeriodExpired = json['isDemoPeriodExpired'];
}
Map<String, dynamic> toJson() {
return {
"id": 0,
'siteId': site?.id,
'departmentId': department?.id,
"buildingId": 0,
"floorId": 0,
"assetName": assetName,
"isSubmit": true,
"itemDescription": itemDescription,
"requestDescription": requestDescription,
"model": model,
"manufacturer": manufacturer,
"demoPeriodId": demoPeriod?.id,
"supplierId": supplier?.id,
"suppPersonId": suppPerson?.id,
"demoAttachments": demoAttachments != null ? demoAttachments!.map((v) => v.toJson()).toList() : [],
};
}
}
class RequesterUserModel {
String? requesterUserId;
String? requesterName;
String? requesterEmail;
String? requesterMobile;
RequesterUserModel();
void fromJson(Map<String, dynamic> json) {
requesterUserId = json['requesterUserId'];
requesterName = json['requesterName'];
requesterEmail = json['requesterEmail'];
requesterMobile = json['requesterMobile'];
}
Map<String, dynamic> toJson() => {
'requesterUserId': requesterUserId,
'requesterName': requesterName,
'requesterEmail': requesterEmail,
'requesterMobile': requesterMobile,
};
}

@ -3,9 +3,9 @@ import 'dart:convert';
import 'package:http/http.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import '../../controllers/api_routes/api_manager.dart';
import '../../controllers/api_routes/urls.dart';
import '../../models/lookup.dart';
import '../../../controllers/api_routes/api_manager.dart';
import '../../../controllers/api_routes/urls.dart';
import '../../../models/lookup.dart';
class DemoPeriodLookupProvider extends LoadingListNotifier<Lookup> {
@override

@ -0,0 +1,168 @@
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/site.dart';
import 'package:test_sa/modules/demo_module/models/demo_request_model.dart';
import 'dart:convert';
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"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true;
}
return false;
} catch (error) {
return false;
}
}
bool isLoading = false;
bool isSiteLoading = false;
Future<DemoRequestModel?> getDemoById(int id) async {
DemoRequestModel? demoRequestModel;
try {
Response response = await ApiManager.instance.get(URLs.getDemoRequestById + "/$id");
if (response.statusCode >= 200 && response.statusCode < 300) {
demoRequestModel = DemoRequestModel.fromJson(json.decode(response.body)["data"]);
}
} catch (error) {
print(error);
}
return demoRequestModel;
}
Future<bool> acceptRejectRequest({required int requestId, required bool status}) async {
try {
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"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true;
}
return false;
} catch (error) {
return false;
}
}
Future<bool> updateDemoRequest(Map<String, dynamic> body) async {
try {
Response response = await ApiManager.instance.post(URLs.updateDemoRequest, body: body, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true;
}
return false;
} catch (error) {
return false;
}
}
Future<bool> updateDemoPeriod({required int demoPeriodId, required int requestId, required bool isUpdateRequired}) async {
try {
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"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true;
}
return false;
} catch (error) {
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<bool> addDemoTrialOutcome(Map<String, dynamic> body) async {
try {
Response response = await ApiManager.instance.post(URLs.addDemoTrialOutcome, body: body, showToast: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? "");
Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG);
return true;
}
return false;
} catch (error) {
return false;
}
}
// 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);
}
}
}
}

@ -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;
@ -260,6 +260,21 @@ class AppColor {
}
}
static Color demoRequestStatus(BuildContext context, int id) {
switch (id) {
case 1:
return blueStatus(context);
case 2:
return yellowStatus(context);
case 3:
return greenStatus(context);
case 4:
return yellowStatus(context);
default:
return yellowStatus(context);
}
}
static Color getRequestStatusTextColor(BuildContext context, int id) {
switch (id) {
case 2:
@ -273,6 +288,19 @@ class AppColor {
}
}
static Color demoRequestStatusTextColor(BuildContext context, int id) {
switch (id) {
case 2:
return orange60;
case 4:
return orange60;
case 9:
return orange60;
default:
return orange60;
}
}
static Color getPriorityStatusTextColor(BuildContext context, int id) {
switch (id) {
//low priority

@ -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.
@ -114,6 +114,13 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
};
}
///TODO need add accessor filter as well.
if (context.userProvider.isAssessor) {
types = {
'Demo Request': 15,
};
}
final statuses = {
"All WO": 0,
context.translation.open: 1,

@ -75,10 +75,12 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
}
requestsList.add(Request(12, "Loan Equipment"));
if (context.userProvider.isAssessor) {
requestsList = [
Request(null, context.translation.allWorkOrder),
Request(15, 'Demo Request'),
// Request(9, 'TRAF'),
];
}

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/new_models/dashboard_detail.dart';
import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_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/internal_audit_module/pages/system_internal_audit/system_internal_audit_item_view.dart';
import 'package:test_sa/modules/asset_inventory_module/pages/inventory_session_item_view.dart';
@ -77,10 +78,12 @@ class RequestPaginatedListview extends StatelessWidget {
return SystemInternalAuditItemView(requestData: request);
case 12:
return LoanEquipmentItemView(requestData: request);
case 13:
case 13:
return AssetDeliveryItemView(requestData: request);
case 14:
case 14:
return MedicalGasInspectionItemView(requestData: request);
case 15:
return DemoRequestItemView(requestData: request);
default:
return Container(
height: 100,

@ -7,6 +7,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_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/internal_audit_module/pages/system_internal_audit/system_internal_audit_item_view.dart';
import 'package:test_sa/modules/asset_inventory_module/pages/inventory_session_item_view.dart';
@ -37,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]);
@ -77,7 +78,8 @@ class RequestItemViewList extends StatelessWidget {
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