improvements

design_3.0_demo_module
Sikander Saleem 2 weeks ago
parent 42677a72b3
commit 1a2845337b

@ -8,10 +8,10 @@ class URLs {
static const host1 = "https://atomsmuat.hmg.com"; // local UAT 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/mobile"; // host local UAT
// static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
// static final String _baseUrl = "$_host/mobile"; // host local UAT and for internal audit dev // static final String _baseUrl = "$_host/mobile"; // host local UAT and for internal audit dev
// static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM // static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM
static final String _baseUrl = "$_host/v4/mobile"; // v4 for Demo module // static final String _baseUrl = "$_host/v4/mobile"; // v4 for Demo module
// static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation // static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation
static const String chatHubUrl = "https://apiderichat.hmg.com/chathub"; static const String chatHubUrl = "https://apiderichat.hmg.com/chathub";
@ -492,11 +492,14 @@ class URLs {
//Demo Request... //Demo Request...
static get addDemoRequest => "$_baseUrl/DemoRequest/AddDemoRequest"; static get addDemoRequest => "$_baseUrl/DemoRequest/AddDemoRequest";
static get updateDemoRequest => "$_baseUrl/DemoRequest/UpdateDemoRequest"; static get updateDemoRequest => "$_baseUrl/DemoRequest/UpdateDemoRequest";
static get getDemoRequestById => "$_baseUrl/DemoRequest"; static get getDemoRequestById => "$_baseUrl/DemoRequest";
static get updateDemoRequestByAssessor => "$_baseUrl/DemoRequest/UpdateDemoRequestByAssessor"; static get updateDemoRequestByAssessor => "$_baseUrl/DemoRequest/UpdateDemoRequestByAssessor";
static get updateDemoPeriodByRequester => "$_baseUrl/DemoRequest/UpdateDemoPeriodByRequester";
//4104 attachment type lookup static get updateDemoPeriodByRequester => "$_baseUrl/DemoRequest/UpdateDemoPeriodByRequester";
//4104 attachment type lookup
} }

@ -8,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/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/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/equipment_internal_audit/equipment_internal_audit_item_view.dart';
import 'package:test_sa/modules/loan_module/pages/loan_equipment_item_view.dart';
import 'package:test_sa/modules/medical_gas_inspection/medical_gas_inspection_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/tm_module/tasks/task_request_item_view.dart';
import 'package:test_sa/modules/traf_module/traf_request_item_view.dart'; import 'package:test_sa/modules/traf_module/traf_request_item_view.dart';
@ -43,7 +44,7 @@ class RequestCategoryList extends StatelessWidget {
} }
Widget _buildRequestItem(Data request) { Widget _buildRequestItem(Data request) {
log('here with no ${request.transactionNo}'); // log('here with no ${request.transactionNo}');
switch (request.transactionNo) { switch (request.transactionNo) {
case 1: case 1:
return ServiceRequestItemView(requestData: request); return ServiceRequestItemView(requestData: request);
@ -63,15 +64,17 @@ class RequestCategoryList extends StatelessWidget {
return InventorySessionItemView(requestData: request); return InventorySessionItemView(requestData: request);
case 9: case 9:
return TrafRequestItemView(requestData: request); return TrafRequestItemView(requestData: request);
case 10: case 10:
return EquipmentInternalAuditItemView(requestData: request); return EquipmentInternalAuditItemView(requestData: request);
case 11: case 11:
return EquipmentInternalAuditItemView(requestData: request); return EquipmentInternalAuditItemView(requestData: request);
case 13: case 12:
return LoanEquipmentItemView(requestData: request);
case 13:
return AssetDeliveryItemView(requestData: request); return AssetDeliveryItemView(requestData: request);
case 14: case 14:
return MedicalGasInspectionItemView(requestData: request); return MedicalGasInspectionItemView(requestData: request);
case 15: case 15:
return DemoRequestItemView(requestData: request); return DemoRequestItemView(requestData: request);
default: default:
return Container( return Container(

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

@ -372,7 +372,7 @@ class FooterActionButton {
Lookup? status, Lookup? status,
required DemoRequestModel dataModel, required DemoRequestModel dataModel,
required DemoRequestStepEnum demoRequestStage, required DemoRequestStepEnum demoRequestStage,
required Function(bool status) refreshData, required VoidCallback refreshData,
}) { }) {
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false); DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);
UserProvider userProvider = Provider.of<UserProvider>(context, listen: false); UserProvider userProvider = Provider.of<UserProvider>(context, listen: false);
@ -401,9 +401,7 @@ class FooterActionButton {
} }
}, },
).expanded, ).expanded,
const SizedBox( const SizedBox(width: 16),
width: 20,
),
AppFilledButton( AppFilledButton(
label: context.translation.accept, label: context.translation.accept,
maxWidth: true, maxWidth: true,
@ -413,7 +411,7 @@ class FooterActionButton {
bool responseStatus = await demoProvider.acceptRejectRequest(requestId: dataModel.id!, status: true); bool responseStatus = await demoProvider.acceptRejectRequest(requestId: dataModel.id!, status: true);
Utils.hideLoading(context); Utils.hideLoading(context);
if (responseStatus) { if (responseStatus) {
refreshData(true); refreshData();
} }
}, },
).expanded, ).expanded,
@ -434,7 +432,7 @@ class FooterActionButton {
dataModel: dataModel, dataModel: dataModel,
))); )));
if (isRefresh == true) { if (isRefresh == true) {
refreshData(true); refreshData();
} }
}, },
), ),
@ -454,7 +452,7 @@ class FooterActionButton {
dataModel: dataModel, dataModel: dataModel,
))); )));
if (isRefresh == true) { if (isRefresh == true) {
refreshData(true); refreshData();
} }
}, },
), ),
@ -478,7 +476,7 @@ class FooterActionButton {
), ),
); );
if (isRefresh == true) { if (isRefresh == true) {
refreshData(true); refreshData();
} }
}, },
), ),

@ -59,10 +59,10 @@ class CreateDemoRequestPage extends StatefulWidget {
} }
class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with TickerProviderStateMixin { class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with TickerProviderStateMixin {
final List<GenericAttachmentModel> attachments = []; List<GenericAttachmentModel> _attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final DemoFormModel _demoFormModel = DemoFormModel(); final DemoFormModel _demoFormModel = DemoFormModel(id: 0);
TextEditingController vendorEmailController = TextEditingController(); TextEditingController vendorEmailController = TextEditingController();
TextEditingController vendorPhoneController = TextEditingController(); TextEditingController vendorPhoneController = TextEditingController();
@ -72,13 +72,12 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
vendorPhoneController.dispose(); vendorPhoneController.dispose();
super.dispose(); super.dispose();
} }
Lookup? demoDocumentLookup; Lookup? demoDocumentLookup;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
// Provider.of<MedicalDepartmentProvider>(context, listen: false).reset();
// Provider.of<LoanPeriodProvider>(context, listen: false).reset();
// loanTypes = [Lookup(id: 0, name: "Standard", value: 1), Lookup(id: 1, name: "Backup", value: 2)];
} }
@override @override
@ -143,7 +142,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
16.height, 16.height,
AttachmentPicker( AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
attachment: attachments, attachment: _attachments,
buttonColor: AppColor.black10.withOpacity(demoDocumentLookup != null ? 1 : .4), buttonColor: AppColor.black10.withOpacity(demoDocumentLookup != null ? 1 : .4),
onlyImages: false, onlyImages: false,
enabled: demoDocumentLookup != null, enabled: demoDocumentLookup != null,
@ -151,7 +150,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
showAsListView: true, showAsListView: true,
buttonIcon: 'image-plus'.toSvgAsset(color: (context.isDark ? AppColor.primary10 : AppColor.neutral120).withOpacity(demoDocumentLookup != null ? 1 : .4)), buttonIcon: 'image-plus'.toSvgAsset(color: (context.isDark ? AppColor.primary10 : AppColor.neutral120).withOpacity(demoDocumentLookup != null ? 1 : .4)),
onChange: (attachments) { onChange: (attachments) {
attachments = attachments; _attachments = attachments;
setState(() {}); setState(() {});
}, },
), ),
@ -436,7 +435,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), 'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10),
8.height, 8.height,
AppTextFormField( AppTextFormField(
labelText:'Vendor Name'.addTranslation, labelText: 'Vendor Name'.addTranslation,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
@ -449,7 +448,7 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
), ),
8.height, 8.height,
AppTextFormField( AppTextFormField(
labelText:'Representative Name'.addTranslation, labelText: 'Representative Name'.addTranslation,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleMedium,
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
@ -495,10 +494,11 @@ class _CreateDemoRequestPageState extends State<CreateDemoRequestPage> with Tick
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
if (_formKey.currentState!.validate()) { if (_formKey.currentState!.validate()) {
_formKey.currentState!.save(); _formKey.currentState!.save();
_demoFormModel.id = 0;
_demoFormModel.demoAttachment = []; _demoFormModel.demoAttachment = [];
for (var item in attachments) { for (var item in _attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; 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,documentTypeId: 7748)); _demoFormModel.demoAttachment?.add(DemoAttachments(id: 0, attachmentName: fileName, demoRequestId: 0, documentTypeId: item.documentTypeId!.id!));
} }
Utils.showLoading(context); Utils.showLoading(context);
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false); DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);

@ -22,6 +22,7 @@ import '../../views/widgets/images/files_list.dart';
import '../../views/widgets/requests/request_status.dart'; import '../../views/widgets/requests/request_status.dart';
import '../loan_module/models/loan_request_model.dart'; import '../loan_module/models/loan_request_model.dart';
import 'demo_activities_page.dart'; import 'demo_activities_page.dart';
import 'models/demo_attachment_model.dart';
class DemoDetailViewPage extends StatefulWidget { class DemoDetailViewPage extends StatefulWidget {
static const String id = "/demo-detail-page"; static const String id = "/demo-detail-page";
@ -36,36 +37,37 @@ class DemoDetailViewPage extends StatefulWidget {
} }
class _DemoDetailViewPageState extends State<DemoDetailViewPage> { class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
bool isLoading = false; // bool isLoading = false;
DemoRequestModel? dataModel; // DemoRequestModel? dataModel;
DemoProvider? demoProvider; DemoProvider? demoProvider;
List<WorkOrderAttachments> allAttachments = [];
// List<DemoAttachments> allAttachments = [];
//Todo need to check about attachments. //Todo need to check about attachments.
bool loading = false; // bool loading = false;
@override @override
void initState() { void initState() {
demoProvider = Provider.of<DemoProvider>(context, listen: false); demoProvider = Provider.of<DemoProvider>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((_) { // WidgetsBinding.instance.addPostFrameCallback((_) {
getDetailsById(); // getDetailsById();
}); // });
super.initState(); super.initState();
} }
Future<void> getDetailsById() async { // Future<void> getDetailsById() async {
setState(() { // setState(() {
loading = true; // loading = true;
}); // });
dataModel = await demoProvider?.getDemoById(widget.demoId) ?? DemoRequestModel(); // dataModel = await demoProvider?.getDemoById(widget.demoId);// ?? DemoRequestModel();
//
// _attachments = dataModel.demoAttachments.toList() ?? []; // allAttachments = dataModel?.demoAttachments ?? [];
setState(() { // setState(() {
loading = false; // loading = false;
}); // });
} // }
@override @override
void dispose() { void dispose() {
@ -76,69 +78,78 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: const DefaultAppBar(title: "Request Details"), appBar: const DefaultAppBar(title: "Request Details"),
body: loading body: FutureBuilder<DemoRequestModel?>(
? const CircularProgressIndicator(color: AppColor.primary10).center future: Provider.of<DemoProvider>(context, listen: false).getDemoById(widget.demoId),
: dataModel == null builder: (BuildContext context, AsyncSnapshot<DemoRequestModel?> snapshot) {
? const NoDataFound().center if (snapshot.connectionState == ConnectionState.waiting) return const CircularProgressIndicator(color: AppColor.primary10).center;
: Column( if (snapshot.data == null) return const NoDataFound().center;
children: [
SingleChildScrollView( List<DemoAttachments> allAttachments = snapshot.data!.demoAttachments! ?? [];
padding: const EdgeInsets.all(16),
child: Column( DemoRequestModel demoData = snapshot.data!;
crossAxisAlignment: CrossAxisAlignment.start,
children: [ return Column(
if (dataModel?.status != null) ...[ children: [
StatusLabel( SingleChildScrollView(
label: dataModel?.status?.name, padding: const EdgeInsets.all(16),
id: dataModel?.status?.value, child: Column(
radius: 4, crossAxisAlignment: CrossAxisAlignment.start,
textColor: AppColor.demoRequestStatusTextColor(context, dataModel!.status!.value!), children: [
backgroundColor: AppColor.demoRequestStatus(context, dataModel!.status!.value!), if (demoData.status != null) ...[
), StatusLabel(
8.height, label: demoData.status?.name,
], id: demoData.status?.value,
...requesterDetails(context, dataModel), radius: 4,
12.height, textColor: AppColor.demoRequestStatusTextColor(context, demoData.status!.value!),
...requestDetails(context, dataModel), backgroundColor: AppColor.demoRequestStatus(context, demoData.status!.value!),
12.height, ),
...doctorDetails(context, dataModel), 8.height,
12.height, ],
...assetDetails(context, dataModel), 12.height,
12.height, ...requesterDetails(context, demoData),
...vendorDetails(context, dataModel), const Divider().defaultStyle(context),
if (allAttachments.isNotEmpty) ...[ ...requestDetails(context, demoData),
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
Text( ...doctorDetails(context, demoData),
"Attachments".addTranslation, const Divider().defaultStyle(context),
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ...assetDetails(context, demoData),
), const Divider().defaultStyle(context),
FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []), ...vendorDetails(context, demoData),
], if (allAttachments.isNotEmpty) ...[
], const Divider().defaultStyle(context),
).toShadowContainer(context, padding: 12), Text(
).expanded, "Attachments".addTranslation,
FooterActionButton.demoRequestDetailsFooterWidget( style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
demoRequestStage: dataModel!.status!.demoRequestStepEnum!, ),
// demoRequestStage: DemoRequestStepEnum.updateRequest, FilesList(
dataModel: dataModel!, showAsListView: true,
status: dataModel!.status!, images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList(),
context: context, types: allAttachments.map((e) => e.documentType?.name ?? '').toList()),
refreshData: (status) { ],
if (status) { ],
getDetailsById(); ).toShadowContainer(context, padding: 12),
} ).expanded,
}).toShadowContainer(context, padding: 0, showShadow: false, borderRadius: 0), FooterActionButton.demoRequestDetailsFooterWidget(
], demoRequestStage: demoData.status!.demoRequestStepEnum!,
)); // demoRequestStage: DemoRequestStepEnum.updateRequest,
dataModel: demoData,
status: demoData.status!,
context: context,
refreshData: () => setState(() {})).toShadowContainer(context, padding: 0, showShadow: false, borderRadius: 0),
],
);
}));
} }
List<Widget> requestDetails(BuildContext context, DemoRequestModel? model) { List<Widget> requestDetails(BuildContext context, DemoRequestModel? model) {
return [ return [
Text("Request Details", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Request Details", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
// 'Demo No: ${model. ?? "-"}'.bodyText(context), // 'Demo No: ${model. ?? "-"}'.bodyText(context),
'Demo Period: ${model?.demoPeriod?.name ?? "-"}'.bodyText(context), 'Demo Period: ${model?.demoPeriod?.name ?? "-"}'.bodyText(context),
'${context.translation.site}: ${model?.site?.custName ?? "-"}'.bodyText(context), '${context.translation.site}: ${model?.site?.custName ?? "-"}'.bodyText(context),
'${context.translation.department}: ${model?.department?.name ?? "-"}'.bodyText(context), '${context.translation.building}: ${model?.building?.name ?? "-"}'.bodyText(context),
'${context.translation.floor}: ${model?.floor?.name ?? "-"}'.bodyText(context),
'${context.translation.department}: ${model?.department?.departmentName ?? "-"}'.bodyText(context),
'Item Description: ${model?.itemDescription ?? "-"}'.bodyText(context), 'Item Description: ${model?.itemDescription ?? "-"}'.bodyText(context),
'Request Description: ${model?.requestDescription ?? "-"}'.bodyText(context), 'Request Description: ${model?.requestDescription ?? "-"}'.bodyText(context),
]; ];
@ -146,17 +157,17 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
List<Widget> vendorDetails(BuildContext context, DemoRequestModel? model) { List<Widget> vendorDetails(BuildContext context, DemoRequestModel? model) {
return [ return [
Text("Vendor Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Vendor Information", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Name: ${model?.supplier?.name ?? "-"}'.bodyText(context), 'Name: ${model?.supplier?.name ?? model?.vendorName ?? "-"}'.bodyText(context),
'Representative Name: ${model?.suppPerson?.name ?? "-"}'.bodyText(context), 'Representative Name: ${model?.suppPerson?.name ?? model?.vendorRepresentativeName ?? "-"}'.bodyText(context),
'Contact: ${model?.supplier?.contact ?? "-"}'.bodyText(context), 'Contact: ${model?.supplier?.contact ?? model?.vendorContactNumber ?? "-"}'.bodyText(context),
'Email: ${model?.supplier?.email ?? "-"}'.bodyText(context), 'Email: ${model?.supplier?.email ?? model?.vendorEmail ?? "-"}'.bodyText(context),
]; ];
} }
List<Widget> assetDetails(BuildContext context, DemoRequestModel? model) { List<Widget> assetDetails(BuildContext context, DemoRequestModel? model) {
return [ return [
Text("Asset Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Asset Information", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'${context.translation.assetName}: ${model?.assetName ?? "-"}'.bodyText(context), '${context.translation.assetName}: ${model?.assetName ?? "-"}'.bodyText(context),
'${context.translation.manufacture}: ${model?.manufacturer ?? "-"}'.bodyText(context), '${context.translation.manufacture}: ${model?.manufacturer ?? "-"}'.bodyText(context),
'${context.translation.model}: ${model?.model ?? "-"}'.bodyText(context), '${context.translation.model}: ${model?.model ?? "-"}'.bodyText(context),
@ -165,7 +176,7 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
List<Widget> doctorDetails(BuildContext context, DemoRequestModel? model) { List<Widget> doctorDetails(BuildContext context, DemoRequestModel? model) {
return [ return [
Text("Doctor Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Doctor Information", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Name: ${model?.doctorName ?? "-"}'.bodyText(context), 'Name: ${model?.doctorName ?? "-"}'.bodyText(context),
'Contact: ${model?.doctorContactNumber ?? "-"}'.bodyText(context), 'Contact: ${model?.doctorContactNumber ?? "-"}'.bodyText(context),
'Email: ${model?.doctorContactEmail ?? "-"}'.bodyText(context), 'Email: ${model?.doctorContactEmail ?? "-"}'.bodyText(context),
@ -174,7 +185,7 @@ class _DemoDetailViewPageState extends State<DemoDetailViewPage> {
List<Widget> requesterDetails(BuildContext context, DemoRequestModel? model) { List<Widget> requesterDetails(BuildContext context, DemoRequestModel? model) {
return [ return [
Text("Requester Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Requester Information", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Name: ${model?.requesterUser?.requesterName ?? "-"}'.bodyText(context), 'Name: ${model?.requesterUser?.requesterName ?? "-"}'.bodyText(context),
'Email: ${model?.requesterUser?.requesterEmail ?? "-"}'.bodyText(context), 'Email: ${model?.requesterUser?.requesterEmail ?? "-"}'.bodyText(context),
'Contact: ${model?.requesterUser?.requesterMobile ?? "-"}'.bodyText(context), 'Contact: ${model?.requesterUser?.requesterMobile ?? "-"}'.bodyText(context),

@ -60,10 +60,7 @@ class DemoRequestItemView extends StatelessWidget {
), ),
], ],
).toShadowContainer(context, withShadow: showShadow).onPress(() async { ).toShadowContainer(context, withShadow: showShadow).onPress(() async {
Navigator.of(context).push(MaterialPageRoute( Navigator.of(context).push(MaterialPageRoute(builder: (_) => DemoDetailViewPage(demoId: requestData!.id!)));
builder: (_) => DemoDetailViewPage(
demoId: requestData!.id!,
)));
}); });
} }
return Column( return Column(
@ -103,10 +100,7 @@ class DemoRequestItemView extends StatelessWidget {
), ),
], ],
).toShadowContainer(context, withShadow: showShadow).onPress(() async { ).toShadowContainer(context, withShadow: showShadow).onPress(() async {
Navigator.of(context).push(MaterialPageRoute( Navigator.of(context).push(MaterialPageRoute(builder: (_) => DemoDetailViewPage(demoId: requestDetails!.id!)));
builder: (_) => DemoDetailViewPage(
demoId: requestDetails!.id!,
)));
}); });
} }

@ -1,15 +1,19 @@
import 'package:test_sa/models/lookup.dart';
class DemoAttachments { class DemoAttachments {
int? id; int? id;
num? demoRequestId; num? demoRequestId;
num? documentTypeId; num? documentTypeId;
Lookup? documentType;
String? attachmentName; String? attachmentName;
String? originalName; String? originalName;
DemoAttachments({this.id, this.documentTypeId, this.attachmentName, this.demoRequestId, this.originalName}); DemoAttachments({this.id, this.documentTypeId, this.documentType, this.attachmentName, this.demoRequestId, this.originalName});
DemoAttachments.fromJson(dynamic json) { DemoAttachments.fromJson(dynamic json) {
id = json['id']; id = json['id'];
documentTypeId = json['documentTypeId']; documentTypeId = json['documentTypeId'];
documentType = json['documentType'] != null ? Lookup.fromJson(json['documentType']) : null;
demoRequestId = json['demoRequestId']; demoRequestId = json['demoRequestId'];
attachmentName = json['attachmentName']; attachmentName = json['attachmentName'];
originalName = json['originalName']; originalName = json['originalName'];

@ -58,7 +58,7 @@ class DemoFormModel {
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
return { return {
"id": 0, "id": id ?? 0,
'siteId': site?.id, 'siteId': site?.id,
'departmentId': department?.id, 'departmentId': department?.id,
"buildingId": building?.id, "buildingId": building?.id,
@ -80,7 +80,35 @@ class DemoFormModel {
"supplierId": vendor?.id, "supplierId": vendor?.id,
"suppPersonId": supEngineer?.id, "suppPersonId": supEngineer?.id,
// "vendorEmail": vendorEmail, // "vendorEmail": vendorEmail,
"demoAttachments": demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [], "demoAttachments":
// [
// {
// "id": 3,
// // "documentType": {
// // "id": 7748,
// // "name": "February",
// // "value": 2
// // },
// "documentTypeId": 7748,
// "attachmentName": "6c9f50b0-1c92-4ae9-ae64-7c284c61ea72.jpg",
// "originalName": "scaled_d245df97-1289-4d0c-92a0-569abedfb0db8154518103327960943.jpg",
// "demoRequestId": 3
// },
// {
// "id": 4,
// // "documentType": {
// // "id": 7748,
// // "name": "February",
// // "value": 2
// // },
// "documentTypeId": 7748,
// "attachmentName": "346e04f6-0f9b-4004-ad85-4cdbf8318f7c.jpg",
// "originalName": "scaled_85790b6c-7b16-46e6-891c-11c316d5897a2973693360957767376.jpg",
// "demoRequestId": 3
// }
// ]
demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [],
}; };
} }

@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
@ -106,6 +105,7 @@ class DemoProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
return siteObj; return siteObj;
} }
Future<bool> addDemoTrialOutcome(Map<String, dynamic> body) async { Future<bool> addDemoTrialOutcome(Map<String, dynamic> body) async {
try { try {
Response response = await ApiManager.instance.post(URLs.addDemoTrialOutcome, body: body, showToast: false); Response response = await ApiManager.instance.post(URLs.addDemoTrialOutcome, body: body, showToast: false);

@ -47,7 +47,7 @@ class UpdateDemoRequestView extends StatefulWidget {
} }
class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with TickerProviderStateMixin { class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with TickerProviderStateMixin {
final List<GenericAttachmentModel> attachments = []; final List<DemoAttachments> attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
DemoFormModel _demoFormModel = DemoFormModel(); DemoFormModel _demoFormModel = DemoFormModel();
@ -161,7 +161,7 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
for (final item in widget.dataModel.demoAttachments!) { for (final item in widget.dataModel.demoAttachments!) {
if ((item.attachmentName ?? '').isNotEmpty) { if ((item.attachmentName ?? '').isNotEmpty) {
attachments.add( attachments.add(
GenericAttachmentModel(name: item.attachmentName, id: item.id ?? 0, originalName: item.originalName), DemoAttachments(attachmentName: item.attachmentName, id: item.id ?? 0, originalName: item.originalName),
); );
} }
} }
@ -197,14 +197,14 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
16.height, 16.height,
...vendorDetailsSection(), ...vendorDetailsSection(),
16.height, 16.height,
AttachmentPicker( // AttachmentPicker(
label: context.translation.attachments, // label: context.translation.attachments,
attachment: attachments, // attachment: attachments,
buttonColor: AppColor.black10, // buttonColor: AppColor.black10,
onlyImages: false, // onlyImages: false,
showAsListView: true, // showAsListView: true,
buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120), // buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120),
), // ),
], ],
).toShadowContainer(context, borderRadius: 20), ).toShadowContainer(context, borderRadius: 20),
).expanded, ).expanded,
@ -580,10 +580,11 @@ class _UpdateDemoRequestViewState extends State<UpdateDemoRequestView> with Tick
if (_formKey.currentState!.validate()) { if (_formKey.currentState!.validate()) {
_formKey.currentState!.save(); _formKey.currentState!.save();
_demoFormModel.demoAttachment = []; _demoFormModel.demoAttachment = [];
// _demoFormModel.id = 3;
for (var item in attachments) { for (var item in attachments) {
String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; // 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. //Todo need to pass attachmentType id as well.
_demoFormModel.demoAttachment?.add(DemoAttachments(id: item.id, demoRequestId: _demoFormModel.id ?? 0, attachmentName: fileName)); // _demoFormModel.demoAttachment?.add(DemoAttachments(id: item.id, demoRequestId: _demoFormModel.id ?? 0, attachmentName: fileName));
} }
Utils.showLoading(context); Utils.showLoading(context);
DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false); DemoProvider demoProvider = Provider.of<DemoProvider>(context, listen: false);

@ -70,21 +70,21 @@ class LoanEquipmentDetailPage extends StatelessWidget {
), ),
12.height, 12.height,
...requesterDetails(context, snapshot.data!), ...requesterDetails(context, snapshot.data!),
12.height, const Divider().defaultStyle(context),
...requestDetails(context, snapshot.data!), ...requestDetails(context, snapshot.data!),
12.height, const Divider().defaultStyle(context),
...assetDetails(context, snapshot.data!), ...assetDetails(context, snapshot.data!),
12.height, const Divider().defaultStyle(context),
...installationDetails(context, snapshot.data!), ...installationDetails(context, snapshot.data!),
12.height, const Divider().defaultStyle(context),
...doctorDetails(context, snapshot.data!), ...doctorDetails(context, snapshot.data!),
12.height, const Divider().defaultStyle(context),
...vendorDetails(context, snapshot.data!), ...vendorDetails(context, snapshot.data!),
if (allAttachments.isNotEmpty) ...[ if (allAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
Text( Text(
"Attachments".addTranslation, "Attachments".addTranslation,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
), ),
FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []), FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []),
], ],
@ -98,7 +98,7 @@ class LoanEquipmentDetailPage extends StatelessWidget {
List<Widget> requestDetails(BuildContext context, LoanRequestModel loanData) { List<Widget> requestDetails(BuildContext context, LoanRequestModel loanData) {
return [ return [
Text("Request Details", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Request Details", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Loan Type: ${loanData.loanTypeName ?? "-"}'.bodyText(context), 'Loan Type: ${loanData.loanTypeName ?? "-"}'.bodyText(context),
'Loan No: ${loanData.reqCode ?? "-"}'.bodyText(context), 'Loan No: ${loanData.reqCode ?? "-"}'.bodyText(context),
'Loan Period: ${loanData.loanPeriodName ?? "-"}'.bodyText(context), 'Loan Period: ${loanData.loanPeriodName ?? "-"}'.bodyText(context),
@ -111,7 +111,7 @@ class LoanEquipmentDetailPage extends StatelessWidget {
List<Widget> vendorDetails(BuildContext context, LoanRequestModel loanData) { List<Widget> vendorDetails(BuildContext context, LoanRequestModel loanData) {
return [ return [
Text("Vendor Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Vendor Information", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Name: ${loanData.vendorName ?? "-"}'.bodyText(context), 'Name: ${loanData.vendorName ?? "-"}'.bodyText(context),
'Representative Name: ${loanData.vendorRepName ?? "-"}'.bodyText(context), 'Representative Name: ${loanData.vendorRepName ?? "-"}'.bodyText(context),
'Contact: ${loanData.vendorContact ?? "-"}'.bodyText(context), 'Contact: ${loanData.vendorContact ?? "-"}'.bodyText(context),
@ -121,7 +121,7 @@ class LoanEquipmentDetailPage extends StatelessWidget {
List<Widget> assetDetails(BuildContext context, LoanRequestModel loanData) { List<Widget> assetDetails(BuildContext context, LoanRequestModel loanData) {
return [ return [
Text("Asset Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Asset Information", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'${context.translation.assetName}: ${loanData.assetName ?? "-"}'.bodyText(context), '${context.translation.assetName}: ${loanData.assetName ?? "-"}'.bodyText(context),
'${context.translation.assetNo}: ${loanData.assetNumber ?? "-"}'.bodyText(context), '${context.translation.assetNo}: ${loanData.assetNumber ?? "-"}'.bodyText(context),
'${context.translation.serialNumber}: ${loanData.assetSerialNumber ?? "-"}'.bodyText(context), '${context.translation.serialNumber}: ${loanData.assetSerialNumber ?? "-"}'.bodyText(context),
@ -132,7 +132,7 @@ class LoanEquipmentDetailPage extends StatelessWidget {
List<Widget> installationDetails(BuildContext context, LoanRequestModel loanData) { List<Widget> installationDetails(BuildContext context, LoanRequestModel loanData) {
return [ return [
Text("Installation & Pullout Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Installation & Pullout Information", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Installation EDD: ${loanData.installationEDD?.toServiceRequestDetailsFormat ?? "-"}'.bodyText(context), 'Installation EDD: ${loanData.installationEDD?.toServiceRequestDetailsFormat ?? "-"}'.bodyText(context),
'Installation Date: ${loanData.installationEDD?.toAssetDetailsFormat ?? "-"}'.bodyText(context), 'Installation Date: ${loanData.installationEDD?.toAssetDetailsFormat ?? "-"}'.bodyText(context),
'Pullout EDD: ${loanData.pulloutEDD?.toServiceRequestDetailsFormat ?? "-"}'.bodyText(context), 'Pullout EDD: ${loanData.pulloutEDD?.toServiceRequestDetailsFormat ?? "-"}'.bodyText(context),
@ -142,7 +142,7 @@ class LoanEquipmentDetailPage extends StatelessWidget {
List<Widget> doctorDetails(BuildContext context, LoanRequestModel loanData) { List<Widget> doctorDetails(BuildContext context, LoanRequestModel loanData) {
return [ return [
Text("Doctor Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Doctor Information", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Name: ${loanData.doctorName ?? "-"}'.bodyText(context), 'Name: ${loanData.doctorName ?? "-"}'.bodyText(context),
'Contact: ${loanData.doctorContact ?? "-"}'.bodyText(context), 'Contact: ${loanData.doctorContact ?? "-"}'.bodyText(context),
'Email: ${loanData.doctorEmail ?? "-"}'.bodyText(context), 'Email: ${loanData.doctorEmail ?? "-"}'.bodyText(context),
@ -151,7 +151,7 @@ class LoanEquipmentDetailPage extends StatelessWidget {
List<Widget> requesterDetails(BuildContext context, LoanRequestModel loanData) { List<Widget> requesterDetails(BuildContext context, LoanRequestModel loanData) {
return [ return [
Text("Requester Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), Text("Requester Information", style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)),
'Name: ${loanData.requestorUserIdForDisplay ?? "-"}'.bodyText(context), 'Name: ${loanData.requestorUserIdForDisplay ?? "-"}'.bodyText(context),
'Email: ${loanData.requestorUserEmail ?? "-"}'.bodyText(context), 'Email: ${loanData.requestorUserEmail ?? "-"}'.bodyText(context),
'Contact: ${loanData.requestorUserMobileNumber ?? "-"}'.bodyText(context), 'Contact: ${loanData.requestorUserMobileNumber ?? "-"}'.bodyText(context),

@ -75,6 +75,7 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
context.translation.preventiveMaintenance: 4, context.translation.preventiveMaintenance: 4,
context.translation.task: 6, context.translation.task: 6,
"Loan Equipment": 12, "Loan Equipment": 12,
"Demo": 15,
}; };
if (isEngineer) { if (isEngineer) {

@ -75,6 +75,7 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
} }
requestsList.add(Request(12, "Loan Equipment")); requestsList.add(Request(12, "Loan Equipment"));
requestsList.add(Request(15, "Demo"));
if (context.userProvider.isAssessor) { if (context.userProvider.isAssessor) {
requestsList = [ requestsList = [

@ -38,14 +38,7 @@ class RequestItemViewList extends StatelessWidget {
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (cxt, index) { itemBuilder: (cxt, index) {
if (isLoading) return const SizedBox().toRequestShimmer(cxt, isLoading); if (isLoading) return const SizedBox().toRequestShimmer(cxt, isLoading);
if (list[index].transactionType == 12) {
return DemoRequestItemView(requestDetails: list[index]);;
// return Container(
// height: 100,
// width: double.infinity,
// color: AppColor.neutral40,
// );
}
switch (list[index].transactionType) { switch (list[index].transactionType) {
case 1: case 1:
return ServiceRequestItemView(requestDetails: list[index]); return ServiceRequestItemView(requestDetails: list[index]);

@ -15,6 +15,7 @@ import 'package:test_sa/controllers/notification/firebase_notification_manger.da
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import 'package:test_sa/new_views/pages/land_page/land_page.dart'; import 'package:test_sa/new_views/pages/land_page/land_page.dart';
import 'package:test_sa/new_views/pages/login_page.dart'; import 'package:test_sa/new_views/pages/login_page.dart';
@ -193,10 +194,7 @@ class _SplashPageState extends State<SplashPage> {
child: SizedBox( child: SizedBox(
width: 36, width: 36,
height: 36, height: 36,
child: CircularProgressIndicator( child: CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3),
color: Color(0xff4A8DB7),
strokeWidth: 3,
),
)), )),
SizedBox( SizedBox(
width: MediaQuery.of(context).size.width / 1.1, width: MediaQuery.of(context).size.width / 1.1,

@ -16,10 +16,11 @@ import 'package:url_launcher/url_launcher.dart';
class FilesList extends StatelessWidget { class FilesList extends StatelessWidget {
final List<String> images; final List<String> images;
final List<String> types;
final EdgeInsets? padding; final EdgeInsets? padding;
final bool showAsListView; final bool showAsListView;
const FilesList({Key? key, this.images = const <String>[], this.padding, this.showAsListView = false}) : super(key: key); const FilesList({Key? key, this.images = const <String>[], this.types = const <String>[], this.padding, this.showAsListView = false}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -75,7 +76,7 @@ class FilesList extends StatelessWidget {
4.height, 4.height,
RichText( RichText(
text: TextSpan( text: TextSpan(
text: 'Asset Guide | ', text: '${types.isEmpty ? "Asset Guide" : types[itemIndex]} | ',
style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral120), style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral120),
children: <TextSpan>[ children: <TextSpan>[
TextSpan( TextSpan(

Loading…
Cancel
Save