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/controllers/validator/validator.dart'; import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/generic_attachment_model.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/site.dart'; import 'package:test_sa/models/new_models/task_request/task_type_model.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/service_request/supplier_details.dart'; import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/demo_module/demo_period_lookup_provider.dart'; import 'package:test_sa/modules/loan_module/models/loan_form_model.dart'; import 'package:test_sa/modules/loan_module/models/medical_department_model.dart'; import 'package:test_sa/modules/loan_module/provider/loan_period_provider.dart'; import 'package:test_sa/modules/loan_module/provider/loan_provider.dart'; import 'package:test_sa/modules/loan_module/provider/loan_provider.dart'; import 'package:test_sa/modules/loan_module/provider/medical_department_provider.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; import 'package:test_sa/providers/department_provider.dart'; import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; import 'package:test_sa/providers/work_order/vendor_provider.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import '../../../../../../new_views/common_widgets/default_app_bar.dart'; import 'demo_detail_view_page.dart'; import 'demo_form_model.dart'; class CreateDemoRequestPage extends StatefulWidget { static const String id = "/create-demo-request"; CreateDemoRequestPage({Key? key}) : super(key: key); @override _CreateDemoRequestPageState createState() => _CreateDemoRequestPageState(); } class _CreateDemoRequestPageState extends State with TickerProviderStateMixin { final List attachments = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); TaskType? selectedType; final DemoFormModel _demoFormModel = DemoFormModel(); TextEditingController commentController = TextEditingController(); SupplierDetails? supplier; Lookup? demoPeriodLookup; // List loanTypes = []; @override void initState() { super.initState(); // Provider.of(context, listen: false).reset(); // Provider.of(context, listen: false).reset(); // loanTypes = [Lookup(id: 0, name: "Standard", value: 1), Lookup(id: 1, name: "Backup", value: 2)]; } @override Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, appBar: DefaultAppBar(title: 'Demo Request'.addTranslation), body: Form( key: _formKey, child: Column( children: [ SingleChildScrollView( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ // SingleItemDropDownMenu( // context: context, // title: "Demo Period", // initialValue: demoPeriodLookup, // showShadow: false, // validator: (value) { // if (value == null) return "Mandatory"; // return null; // }, // backgroundColor: AppColor.fieldBgColor(context), // showAsBottomSheet: true, // onSelect: (value) { // demoPeriodLookup = value; // setState(() {}); // }, // ), // 16.height, ...siteSection(), 16.height, ...doctorInfoSection(), 16.height, ...assetSection(), 16.height, ...vendorDetailsSection(), 16.height, AttachmentPicker( label: context.translation.attachments, attachment: attachments, buttonColor: AppColor.black10, onlyImages: false, showAsListView: true, buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120), onChange: (attachments) { attachments = attachments; setState(() {}); }, ), ], ).toShadowContainer(context, borderRadius: 20), ).expanded, FooterActionButton.footerContainer( context: context, child: AppFilledButton( buttonColor: AppColor.primary10, label: context.translation.submitRequest, onPressed: _submit, // buttonColor: AppColor.primary10, ), ), ], ), ), ); } List siteSection() { return [ 'Site Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), 8.height, SingleItemDropDownMenu( context: context, title: context.translation.site, initialValue: _demoFormModel.site, showShadow: false, validator: (value) { if (value == null) return "Please select a site"; return null; }, backgroundColor: AppColor.fieldBgColor(context), showAsBottomSheet: true, onSelect: (value) { _demoFormModel.site = value; setState(() {}); }, ), 8.height, SingleItemDropDownMenu( context: context, title: context.translation.department, showShadow: false, validator: (value) { if (value == null) return "Please select a department"; return null; }, showAsBottomSheet: true, initialValue: _demoFormModel.department, requestById: context.userProvider.user?.clientId, backgroundColor: AppColor.fieldBgColor(context), onSelect: (value) { _demoFormModel.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) { _demoFormModel.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) { _demoFormModel.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) { _demoFormModel.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) { _demoFormModel.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) { _demoFormModel.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) { _demoFormModel.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) { _demoFormModel.manufacturer = value; }, ), 8.height, SingleItemDropDownMenu( context: context, height: 56.toScreenHeight, title: "Demo Period", initialValue: demoPeriodLookup, showShadow: false, validator: (value) { if (value == null) return "Mandatory"; return null; }, backgroundColor: AppColor.fieldBgColor(context), showAsBottomSheet: true, onSelect: (value) { demoPeriodLookup = value; setState(() {}); }, ), ]; } 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) { _demoFormModel.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) { _demoFormModel.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) { _demoFormModel.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) { _demoFormModel.vendorEmail = value; }, ), ]; } Future _submit() async { FocusScope.of(context).unfocus(); if (_formKey.currentState!.validate()) { _formKey.currentState!.save(); _demoFormModel.demoAttachment = []; for (var item in attachments) { String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; _demoFormModel.demoAttachment?.add(DemoAttachments(id: 0, attachmentName: fileName, demoRequestId: 0)); } Utils.showLoading(context); LoanProvider loanProvider = Provider.of(context, listen: false); Map body = _demoFormModel.toJson(); body["id"] = 0; // body["LoanTypeId"] = 0; // body["requestorUserID"] = context.userProvider.user!.userID; bool isSuccess = await loanProvider.addLoanRequest(body); Utils.hideLoading(context); if (isSuccess) { Navigator.pop(context); } } } }