diff --git a/lib/main.dart b/lib/main.dart index ada9fea0..49caab45 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -31,6 +31,8 @@ import 'package:test_sa/modules/asset_inventory_module/provider/asset_inventory_ 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_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'; @@ -317,6 +319,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => LoanProvider()), ChangeNotifierProvider(create: (_) => LoanPeriodProvider()), ChangeNotifierProvider(create: (_) => MedicalDepartmentProvider()), + ChangeNotifierProvider(create: (_) => DemoProvider()), ], child: GestureDetector( onTap: () { @@ -388,6 +391,7 @@ class MyApp extends StatelessWidget { // SwipeHistoryView.routeName: (_) => const SwipeHistoryView(), CreateMedicalGasRequestPage.id: (_) => CreateMedicalGasRequestPage(), + CreateDemoRequestPage.id: (_) => CreateDemoRequestPage(), }, ), ), diff --git a/lib/modules/demo_module/create_demo_request_page.dart b/lib/modules/demo_module/create_demo_request_page.dart index 88dca696..72898cee 100644 --- a/lib/modules/demo_module/create_demo_request_page.dart +++ b/lib/modules/demo_module/create_demo_request_page.dart @@ -38,9 +38,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 'demo_detail_view_page.dart'; class CreateDemoRequestPage extends StatefulWidget { - static const String id = "/create-medical-gas"; + static const String id = "/create-demo-request"; CreateDemoRequestPage({Key? key}) : super(key: key); @@ -73,7 +74,7 @@ class _CreateDemoRequestPageState extends State with Tick Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, - appBar: DefaultAppBar(title: 'Medical Gas Inspection'.addTranslation), + appBar: DefaultAppBar(title: 'Demo Request'.addTranslation), body: Form( key: _formKey, child: Column( @@ -84,92 +85,11 @@ class _CreateDemoRequestPageState extends State with Tick crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - SingleItemDropDownMenu( - context: context, - title: "Order Type", - validator: (value) { - if (value == null) return "Mandatory"; - return null; - }, - enabled: false, - staticData: [], - initialValue: null, - showShadow: false, - backgroundColor: AppColor.fieldBgColor(context), - showAsBottomSheet: true, - onSelect: (value) {}, - ), - 8.height, - SingleItemDropDownMenu( - context: context, - title: "Item Type", - validator: (value) { - if (value == null) return "Mandatory"; - return null; - }, - enabled: false, - staticData: [], - initialValue: null, - showShadow: false, - backgroundColor: AppColor.fieldBgColor(context), - showAsBottomSheet: true, - onSelect: (value) {}, - ), - 8.height, - SingleItemDropDownMenu( - context: context, - title: context.translation.site, - initialValue: _loanFormModel.site, - showShadow: false, - validator: (value) { - if (value == null) return "Please select a site"; - return null; - }, - backgroundColor: AppColor.fieldBgColor(context), - showAsBottomSheet: true, - onSelect: (value) { - _loanFormModel.site = value; - setState(() {}); - }, - ), - 8.height, - SingleItemDropDownMenu( - context: context, - title: context.translation.department, - showShadow: false, - validator: (value) { - if (value == null) return "Please select a department"; - return null; - }, - showAsBottomSheet: true, - initialValue: _loanFormModel.department, - requestById: context.userProvider.user?.clientId, - backgroundColor: AppColor.fieldBgColor(context), - onSelect: (value) { - _loanFormModel.department = value; - setState(() {}); - }, - ), - 8.height, - SingleItemDropDownMenu( - context: context, - title: context.translation.supplier, - backgroundColor: AppColor.fieldBgColor(context), - initialValue: supplier, - showAsBottomSheet: true, - showShadow: false, - showCancel: true, - onSelect: (_supplier) { - supplier = _supplier; - setState(() {}); - }, - ), - 8.height, - if (supplier != null) ...[ - 'Name: ${supplier?.name ?? "-"}'.addTranslation.bodyText(context).custom(color: AppColor.black10), - 'Email: ${supplier?.email ?? "-"}'.addTranslation.bodyText(context).custom(color: AppColor.black10), - 'Contact: ${supplier?.contact ?? "-"}'.addTranslation.bodyText(context).custom(color: AppColor.black10), - ], + ...siteSection(), + 16.height, + ...doctorInfoSection(), + 16.height, + ...vendorDetailsSection(), 16.height, AttachmentPicker( label: context.translation.attachments, @@ -201,8 +121,289 @@ class _CreateDemoRequestPageState extends State with Tick ); } + List siteSection() { + return [ + 'Site Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.site, + initialValue: _loanFormModel.site, + showShadow: false, + validator: (value) { + if (value == null) return "Please select a site"; + return null; + }, + backgroundColor: AppColor.fieldBgColor(context), + showAsBottomSheet: true, + onSelect: (value) { + _loanFormModel.site = value; + setState(() {}); + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.department, + showShadow: false, + validator: (value) { + if (value == null) return "Please select a department"; + return null; + }, + showAsBottomSheet: true, + initialValue: _loanFormModel.department, + requestById: context.userProvider.user?.clientId, + backgroundColor: AppColor.fieldBgColor(context), + onSelect: (value) { + _loanFormModel.department = value; + setState(() {}); + }, + ), + ]; + } + + List doctorInfoSection() { + return [ + "Doctor Details".bodyText(context).custom(color: AppColor.black10), + 8.height, + AppTextFormField( + initialValue: "", + 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) { + _loanFormModel.docName = value; + }, + ), + 8.height, + AppTextFormField( + initialValue: "", + 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) { + _loanFormModel.docNumber = value; + }, + ), + 8.height, + AppTextFormField( + initialValue: "", + 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) { + _loanFormModel.docEmail = value; + }, + ), + 8.height, + AppTextFormField( + 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) { + _loanFormModel.itemDescription = value; + }, + ), + 8.height, + AppTextFormField( + 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) { + _loanFormModel.requestDescription = value; + }, + ), + ]; + } + + List assetSection() { + return [ + 'Asset Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), + 8.height, + AppTextFormField( + labelText: "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) { + _loanFormModel.model = value; + }, + ), + 8.height, + AppTextFormField( + labelText: "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) { + _loanFormModel.manufacturer = value; + }, + ), + 8.height, + SingleItemDropDownMenu( + 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(() {}); + } + }, + ), + 8.height, + ]; + } + + List vendorDetailsSection() { + return [ + 'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), + 8.height, + AppTextFormField( + initialValue: "", + 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.name, + textInputAction: TextInputAction.next, + onChange: (value) { + _loanFormModel.vendorName = value; + }, + ), + 8.height, + AppTextFormField( + initialValue: "", + labelText: "Representative 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.name, + textInputAction: TextInputAction.next, + onChange: (value) { + _loanFormModel.vendorRepresentativeName = value; + }, + ), + 8.height, + AppTextFormField( + initialValue: "", + 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, + textInputAction: TextInputAction.next, + onChange: (value) { + _loanFormModel.vendorNumber = value; + }, + ), + 8.height, + AppTextFormField( + initialValue: "", + 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, + textInputAction: TextInputAction.next, + onChange: (value) { + _loanFormModel.vendorEmail = value; + }, + ), + ]; + } + Future _submit() async { - // Navigator.of(context).push(MaterialPageRoute(builder: (_) => MedicalGasInspectionDetailPage(inspectionId: 0))); + Navigator.of(context).push(MaterialPageRoute(builder: (_) => DemoDetailViewPage(demoId: 0))); return; FocusScope.of(context).unfocus(); if (_formKey.currentState!.validate()) { diff --git a/lib/modules/demo_module/demo_activities_page.dart b/lib/modules/demo_module/demo_activities_page.dart new file mode 100644 index 00000000..5b422148 --- /dev/null +++ b/lib/modules/demo_module/demo_activities_page.dart @@ -0,0 +1,107 @@ +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/widget_extensions.dart'; +import 'package:test_sa/views/widgets/images/files_list.dart'; + +import '../../controllers/api_routes/urls.dart'; +import '../../extensions/text_extensions.dart'; +import '../../new_views/app_style/app_color.dart'; +import '../../new_views/common_widgets/app_filled_button.dart'; +import '../../new_views/common_widgets/default_app_bar.dart'; +import '../cm_module/views/components/action_button/footer_action_button.dart'; +import 'demo_extension_bottom_sheet.dart'; + +class DemoActivitiesPage extends StatelessWidget { + DemoActivitiesPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: const DefaultAppBar(title: "Activities"), + body: FutureBuilder( + future: Future.delayed(Duration(seconds: 1)), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) return const CircularProgressIndicator(color: AppColor.primary10).center; + List allAttachments = []; + return Column( + children: [ + SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Installation Date', + style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), + ), + Text( + '03 Mar, 2025', + style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral50), + ), + 12.height, + Text( + "End-user signature", + style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), + ), + 12.height, + if (allAttachments.isNotEmpty) ...[ + const Divider().defaultStyle(context), + Text( + "Attachments".addTranslation, + style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e ?? '') ?? '').toList() ?? []), + ], + ], + ).toShadowContainer(context, borderRadius: 14, backgroundColor: Color(0xffF4F8FC), showShadow: false), + 16.height, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Estimation Delivery Date', + style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral120), + ), + Text( + '03 Mar, 2025', + style: AppTextStyles.bodyText2.copyWith(color: AppColor.neutral50), + ), + ], + ).toShadowContainer(context, borderRadius: 14, backgroundColor: Color(0xffF4F8FC), showShadow: false), + ], + ).toShadowContainer( + context, + borderRadius: 20, + showShadow: false, + )).expanded, + FooterActionButton.footerContainer( + context: context, + child: AppFilledButton( + buttonColor: AppColor.primary10, + label: "Extension Request", + onPressed: () => _extensionRequest(context), + ), + ), + ], + ); + }, + )); + } + + void _extensionRequest(context) { + showModalBottomSheet( + context: context, + useSafeArea: true, + backgroundColor: Colors.transparent, + builder: (context) => const DemoExtensionBottomSheet(), + ); + } +} diff --git a/lib/modules/demo_module/demo_detail_view_page.dart b/lib/modules/demo_module/demo_detail_view_page.dart new file mode 100644 index 00000000..a4b46c44 --- /dev/null +++ b/lib/modules/demo_module/demo_detail_view_page.dart @@ -0,0 +1,188 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.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/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 '../../controllers/api_routes/urls.dart'; +import '../../extensions/text_extensions.dart'; +import '../../new_views/common_widgets/default_app_bar.dart'; +import '../../views/widgets/images/files_list.dart'; +import '../../views/widgets/requests/request_status.dart'; +import '../loan_module/models/loan_request_model.dart'; +import 'demo_activities_page.dart'; + +class DemoDetailViewPage extends StatefulWidget { + static const String id = "/demo-detail-page"; + final int demoId; + + DemoDetailViewPage({Key? key, required this.demoId}) : super(key: key); + + @override + _DemoDetailViewPageState createState() { + return _DemoDetailViewPageState(); + } +} + +class _DemoDetailViewPageState extends State { + @override + void initState() { + super.initState(); + } + + List allAttachments = []; + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: const DefaultAppBar(title: "Request Details"), + body: Column( + children: [ + // FutureBuilder( + // future: Provider.of(context, listen: false).getLoanById(widget.demoId), + // builder: (BuildContext context, AsyncSnapshot snapshot) { + // if (snapshot.connectionState == ConnectionState.waiting) return const CircularProgressIndicator(color: AppColor.primary10).center; + // if (snapshot.data == null) return const NoDataFound().center; + // + // List 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, + ), + ), + ], + )); + } + + List requestDetails(BuildContext context, LoanRequestModel loanData) { + 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), + ]; + } + + List vendorDetails(BuildContext context, LoanRequestModel loanData) { + 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), + ]; + } + + List assetDetails(BuildContext context, LoanRequestModel loanData) { + 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), + ]; + } + + List doctorDetails(BuildContext context, LoanRequestModel loanData) { + 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), + ]; + } + + List requesterDetails(BuildContext context, LoanRequestModel loanData) { + 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), + // 'Extension: ${loanData.requesterExtensionNo ?? "-"}'.bodyText(context), + ]; + } + + void _update() {} +} diff --git a/lib/modules/demo_module/demo_extension_bottom_sheet.dart b/lib/modules/demo_module/demo_extension_bottom_sheet.dart new file mode 100644 index 00000000..29c2eabf --- /dev/null +++ b/lib/modules/demo_module/demo_extension_bottom_sheet.dart @@ -0,0 +1,143 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/helper/utils.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/site_contact_info_model.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'; + +import '../../new_views/app_style/app_color.dart'; +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); + + @override + Widget build(BuildContext context) { + return Container( + clipBehavior: Clip.antiAlias, + // height: MediaQuery.sizeOf(context).height * .5, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topRight: Radius.circular(30), + topLeft: Radius.circular(30), + ), + ), + 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), + ), + ), + 16.height, + SingleItemDropDownMenu( + 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); + } +} diff --git a/lib/modules/demo_module/demo_provider.dart b/lib/modules/demo_module/demo_provider.dart new file mode 100644 index 00000000..18e64600 --- /dev/null +++ b/lib/modules/demo_module/demo_provider.dart @@ -0,0 +1,38 @@ +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 addLoanRequest(Map 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 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; + } +} diff --git a/lib/new_views/pages/land_page/create_request_type_bottom_sheet.dart b/lib/new_views/pages/land_page/create_request_type_bottom_sheet.dart index 1508985c..063df7dd 100644 --- a/lib/new_views/pages/land_page/create_request_type_bottom_sheet.dart +++ b/lib/new_views/pages/land_page/create_request_type_bottom_sheet.dart @@ -10,6 +10,7 @@ import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/modules/cm_module/create_cm_request.dart'; +import 'package:test_sa/modules/demo_module/create_demo_request_page.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/loan_module/pages/create_loan_request_page.dart'; @@ -133,6 +134,7 @@ class CreateRequestModel { list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id)); list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id)); list.add(CreateRequestModel('Loan Equipment Request'.addTranslation, "add_icon", CreateLoanRequestPage.id)); + list.add(CreateRequestModel('Demo Request'.addTranslation, "add_icon", CreateDemoRequestPage.id)); } return list; }