From 255691f47a9ad80af68846dc45838fa2e52137c4 Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 Date: Wed, 19 Nov 2025 09:40:06 +0300 Subject: [PATCH] loan design in progress --- lib/main.dart | 7 +- .../loan_module/models/loan_form_model.dart | 95 ++++++ .../pages/create_loan_request_view.dart | 301 ++++++++++++++++++ .../loan_module/provider/loan_provider.dart | 8 + .../create_request-type_bottomsheet.dart | 4 + 5 files changed, 414 insertions(+), 1 deletion(-) create mode 100644 lib/modules/loan_module/models/loan_form_model.dart create mode 100644 lib/modules/loan_module/pages/create_loan_request_view.dart create mode 100644 lib/modules/loan_module/provider/loan_provider.dart diff --git a/lib/main.dart b/lib/main.dart index d9fabe55..e9b69c18 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -28,6 +28,8 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/servic import 'package:test_sa/modules/asset_inventory_module/provider/asset_inventory_provider.dart'; import 'package:test_sa/modules/cm_module/service_request_detail_provider.dart'; import 'package:test_sa/modules/cm_module/views/nurse/create_new_request_view.dart'; +import 'package:test_sa/modules/loan_module/pages/create_loan_request_view.dart'; +import 'package:test_sa/modules/loan_module/provider/loan_provider.dart'; import 'package:test_sa/modules/tm_module/tasks_wo/create_task_view.dart'; import 'package:test_sa/new_views/app_style/app_themes.dart'; import 'package:test_sa/new_views/pages/help_center_page.dart'; @@ -122,7 +124,8 @@ void main() async { } else { await Firebase.initializeApp(); } - SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(statusBarColor: Colors.transparent, + SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( + statusBarColor: Colors.transparent, systemNavigationBarColor: Colors.white, systemNavigationBarIconBrightness: Brightness.dark, )); @@ -282,6 +285,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => VendorProvider()), ChangeNotifierProvider(create: (_) => PpmChecklistStatusProvider()), ChangeNotifierProvider(create: (_) => AssetInventoryProvider()), + ChangeNotifierProvider(create: (_) => LoanProvider()), ], child: GestureDetector( onTap: () { @@ -343,6 +347,7 @@ class MyApp extends StatelessWidget { ProfilePage.id: (_) => const ProfilePage(), ReportBugPage.id: (_) => const ReportBugPage(), HelpCenterPage.id: (_) => const HelpCenterPage(), + CreateLoanRequestView.id: (_) => const CreateLoanRequestView(), // SwipeSuccessView.routeName: (_) => const SwipeSuccessView(), // SwipeHistoryView.routeName: (_) => const SwipeHistoryView(), }, diff --git a/lib/modules/loan_module/models/loan_form_model.dart b/lib/modules/loan_module/models/loan_form_model.dart new file mode 100644 index 00000000..13122cc5 --- /dev/null +++ b/lib/modules/loan_module/models/loan_form_model.dart @@ -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/site.dart'; + +class LoanFormModel { + 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; + Building? building; + List? loanAttachment; + + LoanFormModel({ + 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.loanAttachment, + this.site, + this.building, + }); + + Map toJson() { + return { + "docName": docName, + "docNumber": docNumber, + "docEmail": docEmail, + "itemDescription": itemDescription, + "requestDescription": requestDescription, + "model": model, + "manufacturer": manufacturer, + "loanProvided": loanProvided?.toJson(), + "vendorName": vendorName, + "vendorRepresentativeName": vendorRepresentativeName, + "vendorNumber": vendorNumber, + "vendorEmail": vendorEmail, + 'site' : site?.toJson(), + 'building' : building?.toJson(), + "loanAttachment": loanAttachment != null ? loanAttachment!.map((v) => v.toJson()).toList() : [], + }; + } +} +class LoanAttachments { + LoanAttachments({ + this.id, + this.name, + this.originalName, + }); + + LoanAttachments.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + originalName = json['originalName']; + } + + num? id; + String? name; + String? originalName; + + LoanAttachments copyWith({ + num? id, // Parameter is now nullable + String? name, // Parameter is now nullable + String? originalName, // Parameter is now nullable + }) => + LoanAttachments( + id: id ?? this.id, + name: name ?? this.name, + originalName: originalName ?? this.originalName, + ); + + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['originalName'] = originalName; + return map; + } +} diff --git a/lib/modules/loan_module/pages/create_loan_request_view.dart b/lib/modules/loan_module/pages/create_loan_request_view.dart new file mode 100644 index 00000000..830c4d64 --- /dev/null +++ b/lib/modules/loan_module/pages/create_loan_request_view.dart @@ -0,0 +1,301 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; +import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/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/mapped_sites.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/new_models/task_request/task_request_model.dart'; +import 'package:test_sa/models/new_models/task_request/task_type_model.dart'; +import 'package:test_sa/models/service_request/pending_service_request_model.dart'; +import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart'; +import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; +import 'package:test_sa/modules/loan_module/models/loan_form_model.dart'; +import 'package:test_sa/modules/loan_module/provider/loan_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/task_request_provider/task_job_provider.dart'; +import 'package:test_sa/providers/task_request_provider/task_request_provider.dart'; +import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/equipment/asset_picker.dart'; +import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; + +import '../../../../../../new_views/common_widgets/default_app_bar.dart'; + +class CreateLoanRequestView extends StatefulWidget { + static const String id = "/create-loan"; + + const CreateLoanRequestView({Key? key}) : super(key: key); + + @override + _CreateLoanRequestViewState createState() => _CreateLoanRequestViewState(); +} + +class _CreateLoanRequestViewState extends State with TickerProviderStateMixin { + final List attachments = []; + final GlobalKey _formKey = GlobalKey(); + final GlobalKey _scaffoldKey = GlobalKey(); + Asset? device; + TaskType? selectedType; + final LoanFormModel _loanFormModel = LoanFormModel(); + TextEditingController commentController = TextEditingController(); + + @override + void initState() { + // TODO: implement initState + super.initState(); + Provider.of(context, listen: false).reset(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + key: _scaffoldKey, + appBar: DefaultAppBar(title: 'Loan Request'.addTranslation), + body: Form( + key: _formKey, + child: Column( + children: [ + SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + contactInfoSection(), + 16.height, + itemDetailsSection(), + 16.height, + vendorDetailsSection(), + 23.height, + AttachmentPicker( + label: context.translation.attachments, + attachment: attachments, + buttonColor: AppColor.black10, + onlyImages: false, + buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120), + //verify this if not required delete this .. + onChange: (attachments) { + attachments = attachments; + setState(() {}); + }, + ), + ], + ).toShadowContainer(context).paddingAll(16), + ).expanded, + FooterActionButton.footerContainer( + context: context, + child: AppFilledButton( + buttonColor: AppColor.primary10, + label: context.translation.submitRequest, + onPressed: _submit, + // buttonColor: AppColor.primary10, + ), + ), + ], + ), + ), + ); + } + + Widget contactInfoSection() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + context.translation.contactInfo.heading6(context).custom(color: AppColor.black10), + 8.height, + AppTextFormField( + labelText: "Name", + backgroundColor: AppColor.fieldBgColor(context), + textAlign: TextAlign.center, + hintText: "Doc Name", + labelStyle: AppTextStyles.textFieldLabelStyle, + hintStyle: AppTextStyles.textFieldLabelStyle, + textInputType: TextInputType.text, + showShadow: false, + onSaved: (value) { + _loanFormModel.docName = value; + }, + style: Theme.of(context).textTheme.titleMedium, + ), + 8.height, + AppTextFormField( + labelText: "Number", + backgroundColor: AppColor.fieldBgColor(context), + textAlign: TextAlign.center, + hintText: "Doc Number", + labelStyle: AppTextStyles.textFieldLabelStyle, + hintStyle: AppTextStyles.textFieldLabelStyle, + textInputType: TextInputType.phone, + showShadow: false, + onSaved: (value) { + _loanFormModel.docNumber = value; + }, + style: Theme.of(context).textTheme.titleMedium, + ), + 8.height, + AppTextFormField( + labelText: "Email", + backgroundColor: AppColor.fieldBgColor(context), + textAlign: TextAlign.center, + hintText: "Doc Email", + labelStyle: AppTextStyles.textFieldLabelStyle, + hintStyle: AppTextStyles.textFieldLabelStyle, + textInputType: TextInputType.emailAddress, + showShadow: false, + onSaved: (value) { + _loanFormModel.docEmail = value; + }, + style: Theme.of(context).textTheme.titleMedium, + ), + ], + ); + } + + Widget itemDetailsSection() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 'Item Details'.addTranslation.heading6(context).custom(color: AppColor.black10), + 8.height, + AppTextFormField( + labelText: "Name", + backgroundColor: AppColor.fieldBgColor(context), + textAlign: TextAlign.center, + hintText: "Doc Name", + labelStyle: AppTextStyles.textFieldLabelStyle, + hintStyle: AppTextStyles.textFieldLabelStyle, + textInputType: TextInputType.text, + showShadow: false, + onSaved: (value) { + _loanFormModel.docName = value; + }, + style: Theme.of(context).textTheme.titleMedium, + ), + 8.height, + AppTextFormField( + labelText: "Number", + backgroundColor: AppColor.fieldBgColor(context), + textAlign: TextAlign.center, + hintText: "Doc Number", + labelStyle: AppTextStyles.textFieldLabelStyle, + hintStyle: AppTextStyles.textFieldLabelStyle, + textInputType: TextInputType.phone, + showShadow: false, + onSaved: (value) { + _loanFormModel.docNumber = value; + }, + style: Theme.of(context).textTheme.titleMedium, + ), + 8.height, + AppTextFormField( + labelText: "Email", + backgroundColor: AppColor.fieldBgColor(context), + textAlign: TextAlign.center, + hintText: "Doc Email", + labelStyle: AppTextStyles.textFieldLabelStyle, + hintStyle: AppTextStyles.textFieldLabelStyle, + textInputType: TextInputType.emailAddress, + showShadow: false, + onSaved: (value) { + _loanFormModel.docEmail = value; + }, + style: Theme.of(context).textTheme.titleMedium, + ), + ], + ); + } + Widget vendorDetailsSection() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 'Vendor Details'.addTranslation.heading6(context).custom(color: AppColor.black10), + 8.height, + AppTextFormField( + labelText: "Name", + backgroundColor: AppColor.fieldBgColor(context), + textAlign: TextAlign.center, + hintText: "Doc Name", + labelStyle: AppTextStyles.textFieldLabelStyle, + hintStyle: AppTextStyles.textFieldLabelStyle, + textInputType: TextInputType.text, + showShadow: false, + onSaved: (value) { + _loanFormModel.docName = value; + }, + style: Theme.of(context).textTheme.titleMedium, + ), + 8.height, + AppTextFormField( + labelText: "Number", + backgroundColor: AppColor.fieldBgColor(context), + textAlign: TextAlign.center, + hintText: "Doc Number", + labelStyle: AppTextStyles.textFieldLabelStyle, + hintStyle: AppTextStyles.textFieldLabelStyle, + textInputType: TextInputType.phone, + showShadow: false, + onSaved: (value) { + _loanFormModel.docNumber = value; + }, + style: Theme.of(context).textTheme.titleMedium, + ), + 8.height, + AppTextFormField( + labelText: "Email", + backgroundColor: AppColor.fieldBgColor(context), + textAlign: TextAlign.center, + hintText: "Doc Email", + labelStyle: AppTextStyles.textFieldLabelStyle, + hintStyle: AppTextStyles.textFieldLabelStyle, + textInputType: TextInputType.emailAddress, + showShadow: false, + onSaved: (value) { + _loanFormModel.docEmail = value; + }, + style: Theme.of(context).textTheme.titleMedium, + ), + ], + ); + } + + Widget scanAssetButton() { + return AssetPicker( + device: device, + showLoading: false, + borderColor: AppColor.black20, + onPick: (asset) async { + device = asset; + setState(() {}); + }, + ); + } + + Future _submit() async { + if (_formKey.currentState!.validate()) { + _formKey.currentState!.save(); + + _loanFormModel?.loanAttachment = []; + for (var item in attachments) { + String fileName = ServiceRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; + _loanFormModel?.loanAttachment?.add(LoanAttachments(id: item.id, name: fileName)); + } + LoanProvider loanProvider = Provider.of(context, listen: false); + // await loanProvider.addLoanRequest(context: context, task: _loanFormModel!); + } + } +} diff --git a/lib/modules/loan_module/provider/loan_provider.dart b/lib/modules/loan_module/provider/loan_provider.dart new file mode 100644 index 00000000..5397aa3b --- /dev/null +++ b/lib/modules/loan_module/provider/loan_provider.dart @@ -0,0 +1,8 @@ +import 'package:flutter/cupertino.dart'; + +class LoanProvider extends ChangeNotifier { + + + + +} \ No newline at end of file diff --git a/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart b/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart index 20478b13..11a49ad6 100644 --- a/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart +++ b/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart @@ -1,10 +1,13 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_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/modules/cm_module/views/nurse/create_new_request_view.dart'; +import 'package:test_sa/modules/loan_module/pages/create_loan_request_view.dart'; import 'package:test_sa/modules/tm_module/tasks_wo/create_task_view.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/pages/gas_refill_request_form.dart'; @@ -101,6 +104,7 @@ class CreateRequestModel { list.add(CreateRequestModel(context.translation.transferAsset, "add_icon", CreateDeviceTransferRequest.id)); //TODO uncommit this to enable task. list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id)); + list.add(CreateRequestModel('Loan Equipment Request'.addTranslation, "add_icon", CreateLoanRequestView.id)); } return list; }