import 'dart:convert'; import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_department_sections.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_project_departments.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_projects.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/mowadhafhi_attachement_request.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/simple_button.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; class MowadhafhiHRRequest extends StatefulWidget { const MowadhafhiHRRequest({Key? key}) : super(key: key); @override _MowadhafhiHRRequestState createState() => _MowadhafhiHRRequestState(); } class _MowadhafhiHRRequestState extends State { List getTicketTypesList = []; List getMowadhafhiProjectsList = []; List getProjectDepartmentsList = []; List getDepartmentSectionsList = []; List getSectionTopicsList = []; GetProjectDepartments? selectedDepartment; GetDepartmentSections? selectedSection; GetSectionTopics? selectedTopic; List attachmentFiles = []; String selectedServiceType = ""; String description = ""; int? projectID; @override void initState() { getTicketTypes(); super.initState(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: AppBarWidget( context, title: LocaleKeys.mowadhafhiRequest.tr(), ), body: SingleChildScrollView( child: getTicketTypesList.isNotEmpty ? Container( width: double.infinity, padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10), boxShadow: [ BoxShadow( color: const Color(0xff000000).withOpacity(.05), blurRadius: 26, offset: const Offset(0, -3), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.serviceType.tr().toText16(), 12.height, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ SizedBox( height: 40, child: ListView.separated( itemBuilder: (context, index) { return Container( padding: const EdgeInsets.only(right: 6, top: 8, bottom: 8), child: ShowRadio( title: getTicketTypesList[index].typeName!, value: getTicketTypesList[index].ticketTypeId!.toString(), groupValue: selectedServiceType, selectedColor: MyColors.gradiantStartColor), ).onPress(() { selectedServiceType = getTicketTypesList[index].ticketTypeId!.toString(); setState(() {}); }); }, separatorBuilder: (context, index) => 1.width, shrinkWrap: true, itemCount: getTicketTypesList.length ?? 0, scrollDirection: Axis.horizontal, ), ), ], ), 12.height, LocaleKeys.departmentName.tr().toText16(), 12.height, PopupMenuButton( child: DynamicTextFieldWidget( LocaleKeys.selectDepartment.tr(), selectedDepartment?.departmentName ?? "", isEnable: false, isPopup: true, isInputTypeNum: true, isReadOnly: false, ).paddingOnly(bottom: 12), itemBuilder: (_) => >[ for (int i = 0; i < getProjectDepartmentsList!.length; i++) PopupMenuItem(child: Text(getProjectDepartmentsList![i].departmentName!), value: i), ], onSelected: (int popupIndex) { selectedDepartment = getProjectDepartmentsList![popupIndex]; getDepartmentSections(selectedDepartment?.projectDepartmentId); setState(() {}); }), 12.height, LocaleKeys.relatedSection.tr().toText16(), 12.height, PopupMenuButton( child: DynamicTextFieldWidget( LocaleKeys.selectSection.tr(), selectedSection?.sectionName ?? "", isEnable: false, isPopup: true, isInputTypeNum: true, isReadOnly: false, ).paddingOnly(bottom: 12), itemBuilder: (_) => >[ for (int i = 0; i < getDepartmentSectionsList!.length; i++) PopupMenuItem(child: Text(getDepartmentSectionsList![i].sectionName!), value: i), ], onSelected: (int popupIndex) { selectedSection = getDepartmentSectionsList![popupIndex]; getSectionTopics(selectedSection?.departmentSectionId); setState(() {}); }), 12.height, LocaleKeys.relatedTopic.tr().toText16(), 12.height, PopupMenuButton( child: DynamicTextFieldWidget( LocaleKeys.selectTopic.tr(), selectedTopic?.topicName ?? "", isEnable: false, isPopup: true, isInputTypeNum: true, isReadOnly: false, ).paddingOnly(bottom: 12), itemBuilder: (_) => >[ for (int i = 0; i < getSectionTopicsList!.length; i++) PopupMenuItem(child: Text(getSectionTopicsList![i].topicName!), value: i), ], onSelected: (int popupIndex) { selectedTopic = getSectionTopicsList![popupIndex]; // getDepartmentSections(selectedSection?.departmentSectionId); setState(() {}); }), 12.height, LocaleKeys.supportingDocument.tr().toText16(), 12.height, attachmentView("Attachments"), 12.height, LocaleKeys.description.tr().toText16(), 12.height, DynamicTextFieldWidget( "", "", isEnable: true, isPopup: false, lines: 4, isInputTypeNum: false, isReadOnly: false, onChange: (String value) { debugPrint(value); description = value; }, ), 50.height ], ), ) : Container(), ), bottomSheet: Container( padding: const EdgeInsets.only(top: 8.0, bottom: 8.0), decoration: const BoxDecoration( color: MyColors.white, ), child: Row( children: [ 12.width, Expanded( child: DefaultButton( LocaleKeys.submit.tr(), !checkValidation() ? null : () { submitHRRequest(); }, color: const Color(0xFFD02127), ), ), 12.width, ], ), ), ); } bool checkValidation() { if (selectedServiceType == "" || selectedDepartment == null || selectedSection == null || selectedTopic == null) { return false; } else { return true; } } Widget attachmentView(String title) { return Container( padding: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(15), boxShadow: [ BoxShadow( color: const Color(0xff000000).withOpacity(.05), blurRadius: 26, offset: const Offset(0, -3), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ Row( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: [ title.toText16().expanded, 6.width, SimpleButton("Add", () async { FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true); if (result != null) { attachmentFiles = attachmentFiles + result.paths.map((path) => File(path!)).toList(); attachmentFiles = attachmentFiles.toSet().toList(); setState(() {}); } }, fontSize: 14), ], ), if (attachmentFiles.isNotEmpty) 12.height, if (attachmentFiles.isNotEmpty) ListView.separated( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemBuilder: (cxt, index) { String fileName = attachmentFiles[index].path.split('/').last; return Row( children: [ fileName.toText13().expanded, 6.width, IconButton( padding: EdgeInsets.zero, iconSize: 20, icon: const Icon(Icons.cancel_rounded), color: MyColors.redColor, constraints: const BoxConstraints(), onPressed: () async { attachmentFiles.removeAt(index); setState(() {}); }, ) ], ); }, separatorBuilder: (cxt, index) => 6.height, itemCount: attachmentFiles.length), ], ), ); } void getTicketTypes() async { try { Utils.showLoading(context); getTicketTypesList = await MowadhafhiApiClient().getTicketTypes(); Utils.hideLoading(context); getMowadhafhiProjects(); // setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } } void getMowadhafhiProjects() async { try { Utils.showLoading(context); getMowadhafhiProjectsList = await MowadhafhiApiClient().getProjects(); Utils.hideLoading(context); getProjectDepartments(getMowadhafhiProjectsList[0].projectId!); projectID = getMowadhafhiProjectsList[0].projectId; } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } } void getProjectDepartments(int projectID) async { try { Utils.showLoading(context); getProjectDepartmentsList = await MowadhafhiApiClient().getProjectDepartments(projectID); Utils.hideLoading(context); setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } } void getDepartmentSections(int? projectDepartmentID) async { try { Utils.showLoading(context); getDepartmentSectionsList = await MowadhafhiApiClient().getDepartmentSections(projectDepartmentID); Utils.hideLoading(context); setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } } void getSectionTopics(int? departmentSectionID) async { try { Utils.showLoading(context); getSectionTopicsList = await MowadhafhiApiClient().getSectionTopics(departmentSectionID); Utils.hideLoading(context); setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } } void submitHRRequest() async { try { Utils.showLoading(context); List> list = []; if (attachmentFiles.isNotEmpty) { for (int i = 0; i < attachmentFiles.length; i++) { String type = attachmentFiles[i].path.split('.').last; String name = attachmentFiles[i].path.split('/').last; List fileContent = await attachmentFiles[i].readAsBytes(); String encodedFile = base64Encode(fileContent); list.add(MowadhafhiRequestAttachment( contentType: "image/" + type, fileName: name, base64Data: encodedFile, ).toJson()); } } int? messageStatus = await MowadhafhiApiClient().submitRequest(selectedDepartment?.projectDepartmentId, description, projectID, selectedSection?.departmentSectionId.toString(), selectedTopic?.sectionTopicId.toString(), int.parse(selectedServiceType), list); Utils.showToast("Request created successfully"); Utils.hideLoading(context); Navigator.pop(context); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } } }