import 'dart:convert'; import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:employee_selfservice_mobile/Screens/Menu/SuratTugas/RequestHttp/pengajuanST_post.dart'; import 'package:intl/intl.dart'; import 'package:progress_dialog_null_safe/progress_dialog_null_safe.dart'; import 'dart:developer' as logDev; import '../SlipGaji/background.dart'; List fileAttach = [""]; TextEditingController keperluanTeksController = TextEditingController(); TextEditingController tujuanTeksController = TextEditingController(); TextEditingController uangMukaTeksController = TextEditingController(); TextEditingController ticketFromTeksController = TextEditingController(); TextEditingController ticketToTeksController = TextEditingController(); TextEditingController ticketPriceTeksController = TextEditingController(); class PengajuanExtendTanggalKembali_Screen extends StatefulWidget { const PengajuanExtendTanggalKembali_Screen({Key? key}) : super(key: key); @override State createState() => _PengajuanExtendTanggalKembali_Screen(); } class _PengajuanExtendTanggalKembali_Screen extends State { String _fileText = ""; String _totalFile= ""; bool visibleDateST = false; bool visibleDateDeparture = false; bool visibleDateReturn = false; bool visibleDateTicket = false; DateTime dateFrom = DateTime.now(); late String formattedDateST = ""; late String formattedDateDeparture = ""; late String formattedDateReturn = ""; late String formattedDateTicket = ""; late String kendaraan; var selectedTicketType; initState(){ keperluanTeksController.clear(); tujuanTeksController.clear(); uangMukaTeksController.clear(); ticketFromTeksController.clear(); ticketToTeksController.clear(); ticketPriceTeksController.clear(); //loadingPage(); /*WidgetsBinding.instance.addPostFrameCallback((_) { cutiType = getJenisCuti(); });*/ super.initState(); } @override Widget build(BuildContext context) { return Scaffold( body: SingleChildScrollView( child: Column( children: [ Stack( children: [ WavyHeader(), Container( margin: EdgeInsets.only(top: MediaQuery.of(context).size.height/6 - 20), padding: EdgeInsets.fromLTRB(20, 5, 25, 5), child: Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( 'Submission\t\t', maxLines: 2, style: GoogleFonts.luckiestGuy( fontSize: 28, color: Color(0xFF4858A7), fontStyle: FontStyle.italic, ), ), Image.asset('assets/images/submit_st.png', width: 40, height: 40, ), ], )), SafeArea( child: Container( width: MediaQuery.of(context).size.width, margin: EdgeInsets.only( top: MediaQuery.of(context).size.height / 5, left: 10, right: 10, bottom: 10 ), child: Column( children: [ Container( child: Card( elevation: 10, child: Container( decoration: BoxDecoration( color: Color(0XFFFAF7EE), borderRadius: BorderRadius.circular(10)), child: Column( children: [ Container( margin: EdgeInsets.only( left: 10, right: 10, top: 15, bottom: 15), child: Text('Assignment Letter Submission', style: GoogleFonts.josefinSans(fontSize: 18, fontWeight: FontWeight.bold, decoration: TextDecoration.underline, decorationStyle: TextDecorationStyle.dashed),), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Column( children: [ Row( children: [ Expanded( flex: 3, child: Text( 'Assigment Letter Date', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Column( children: [ ElevatedButton( onPressed: () async { DateTime? newDate = await showDatePicker( context: context, initialDate: dateFrom, firstDate: DateTime(1900), lastDate: DateTime(2100)); final DateFormat formatter = DateFormat('yyyy-MM-dd'); if (newDate == null) { return; } else { setState(() { if (visibleDateST == false){ visibleDateST = !visibleDateST; } formattedDateST = formatter.format(newDate); //dateFrom = formattedFrom as DateTime; }); } }, /*style: ElevatedButton.styleFrom( backgroundColor: CupertinoColors .systemGrey2),*/ child: Container( width: double.infinity, child: Text( "Choose Date", style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w400), ), ), ), ], ), ), ], ),Row( children: [ Expanded( flex: 3, child: Text( '', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Column( children: [ Visibility( visible: visibleDateST, child: Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only( left: 15, right: 15, bottom: 5), child: Text(formattedDateST, overflow: TextOverflow.ellipsis, maxLines: 1, style: TextStyle( color: Colors.black54), ), ), ) ], ), ), ], ), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Row( children: [ Expanded( flex: 3, child: Text( 'Description\nof Needs', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5)), child: Padding( padding: EdgeInsets.only( left: 10, right: 10, top: 5, bottom: 5), child: TextFormField( keyboardType: TextInputType.multiline, maxLines: 1, textInputAction: TextInputAction.next, controller: keperluanTeksController, decoration: InputDecoration( border: InputBorder.none, hintText: "description")), ))), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Column( children: [ Row( children: [ Expanded( flex: 3, child: Text( 'Departure\nDate', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Column( children: [ ElevatedButton( onPressed: () async { DateTime? newDate = await showDatePicker( context: context, initialDate: dateFrom, firstDate: DateTime(1900), lastDate: DateTime(2100)); final DateFormat formatter = DateFormat('yyyy-MM-dd'); if (newDate == null) { return; } else { setState(() { if (visibleDateDeparture == false){ visibleDateDeparture = !visibleDateDeparture; } formattedDateDeparture = formatter.format(newDate); //dateFrom = formattedFrom as DateTime; }); } }, /*style: ElevatedButton.styleFrom( backgroundColor: CupertinoColors .systemGrey2),*/ child: Container( width: double.infinity, child: Text( "Choose Date", style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w400), ), ), ), ], ), ), ], ),Row( children: [ Expanded( flex: 3, child: Text( '', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Column( children: [ Visibility( visible: visibleDateDeparture, child: Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only( left: 15, right: 15, bottom: 5), child: Text(formattedDateDeparture, overflow: TextOverflow.ellipsis, maxLines: 1, style: TextStyle( color: Colors.black54), ), ), ) ], ), ), ], ), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Column( children: [ Row( children: [ Expanded( flex: 3, child: Text( 'Return Date', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Column( children: [ ElevatedButton( onPressed: () async { DateTime? newDate = await showDatePicker( context: context, initialDate: dateFrom, firstDate: DateTime(1900), lastDate: DateTime(2100)); final DateFormat formatter = DateFormat('yyyy-MM-dd'); if (newDate == null) { return; } else { setState(() { if (visibleDateReturn == false){ visibleDateReturn = !visibleDateReturn; } formattedDateReturn = formatter.format(newDate); //dateFrom = formattedFrom as DateTime; }); } }, /*style: ElevatedButton.styleFrom( backgroundColor: CupertinoColors .systemGrey2),*/ child: Container( width: double.infinity, child: Text( "Choose Date", style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w400), ), ), ), ], ), ), ], ),Row( children: [ Expanded( flex: 3, child: Text( '', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Column( children: [ Visibility( visible: visibleDateReturn, child: Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only( left: 15, right: 15, bottom: 5), child: Text(formattedDateReturn, overflow: TextOverflow.ellipsis, maxLines: 1, style: TextStyle( color: Colors.black54), ), ), ) ], ), ), ], ), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Row( children: [ Expanded( flex: 3, child: Text( 'Destination', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5)), child: Padding( padding: EdgeInsets.only( left: 10, right: 10, top: 5, bottom: 5), child: TextFormField( keyboardType: TextInputType.multiline, maxLines: null, textInputAction: TextInputAction.next, controller: tujuanTeksController, decoration: InputDecoration( border: InputBorder.none, hintText: "ex. Bali")), ))), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Row( children: [ Expanded( flex: 3, child: Text( 'Down Payment', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5)), child: Padding( padding: EdgeInsets.only( left: 10, right: 10, top: 5, bottom: 5), child: TextFormField( keyboardType: TextInputType.number, maxLines: null, textInputAction: TextInputAction.next, controller: uangMukaTeksController, decoration: InputDecoration( border: InputBorder.none, hintText: "ex. 1500500")), ))), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Row( children: [ Expanded( flex: 3, child: Text( 'Ticket Type', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Container( decoration: BoxDecoration( color: CupertinoColors.systemGrey2, borderRadius: BorderRadius.circular(5)), child: DropdownButton( value: this.selectedTicketType, isExpanded: true, underline: SizedBox(), hint: Text( '\t\tChoose Ticket Type', style: TextStyle( color: Colors.black54), ), onChanged: (value) { print(value); setState(() { selectedTicketType = value!; if (selectedTicketType == "airplane"){ kendaraan = "pesawat"; } else if (selectedTicketType == "train"){ kendaraan = "kereta"; } }); }, items: ticketType .map( (e) => DropdownMenuItem( value: e, child: Text("\t\t\t" + e)), ) .toList(), ), )), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Row( children: [ Expanded( flex: 3, child: Text( 'Ticket From', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5)), child: Padding( padding: EdgeInsets.only( left: 10, right: 10, top: 5, bottom: 5), child: TextFormField( keyboardType: TextInputType.multiline, maxLines: null, textInputAction: TextInputAction.next, controller: ticketFromTeksController, decoration: InputDecoration( border: InputBorder.none, hintText: "ex. Jakarta")), ))), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Row( children: [ Expanded( flex: 3, child: Text( 'Ticket To', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5)), child: Padding( padding: EdgeInsets.only( left: 10, right: 10, top: 5, bottom: 5), child: TextFormField( keyboardType: TextInputType.multiline, maxLines: null, textInputAction: TextInputAction.next, controller: ticketToTeksController, decoration: InputDecoration( border: InputBorder.none, hintText: "ex. Bali")), ))), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Column( children: [ Row( children: [ Expanded( flex: 3, child: Text( 'Ticket Date', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Column( children: [ ElevatedButton( onPressed: () async { DateTime? newDate = await showDatePicker( context: context, initialDate: dateFrom, firstDate: DateTime(1900), lastDate: DateTime(2100)); final DateFormat formatter = DateFormat('yyyy-MM-dd'); if (newDate == null) { return; } else { setState(() { if (visibleDateTicket == false){ visibleDateTicket = !visibleDateTicket; } formattedDateTicket = formatter.format(newDate); //dateFrom = formattedFrom as DateTime; }); } }, /*style: ElevatedButton.styleFrom( backgroundColor: CupertinoColors .systemGrey2),*/ child: Container( width: double.infinity, child: Text( "Choose Date", style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w400), ), ), ), ], ), ), ], ),Row( children: [ Expanded( flex: 3, child: Text( '', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Column( children: [ Visibility( visible: visibleDateTicket, child: Container( alignment: Alignment.centerLeft, margin: EdgeInsets.only( left: 15, right: 15, bottom: 5), child: Text(formattedDateTicket, overflow: TextOverflow.ellipsis, maxLines: 1, style: TextStyle( color: Colors.black54), ), ), ) ], ), ), ], ), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Row( children: [ Expanded( flex: 3, child: Text( 'Ticket Price', style: GoogleFonts.inconsolata( fontSize: 17), )), Expanded( flex: 7, child: Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(5)), child: Padding( padding: EdgeInsets.only( left: 10, right: 10, top: 5, bottom: 5), child: TextFormField( keyboardType: TextInputType.number, maxLines: null, textInputAction: TextInputAction.done, controller: ticketPriceTeksController, decoration: InputDecoration( border: InputBorder.none, hintText: "ex. 1550000")), ))), ], ), ), Container( margin: EdgeInsets.only( left: 10, right: 10, top: 10, bottom: 10), child: Column( children: [ InkWell( child: Container( padding: EdgeInsets.fromLTRB( 10, 10, 10, 10), width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(5), gradient: LinearGradient(colors: [ Color(0xFFFF9945), Color(0xFFFc6076) ])), child: Text('Submit', textAlign: TextAlign.center, style: TextStyle( color: Colors.white, fontSize: 17, fontWeight: FontWeight.w500)), ), onTap: () async { ProgressDialog loading = ProgressDialog(context); loading = ProgressDialog(context, type: ProgressDialogType.normal, isDismissible: false, showLogs: true); loading.style( message: 'Please Wait .....', borderRadius: 3, backgroundColor: Colors.white, progressWidget: CircularProgressIndicator(), elevation: 10.0, padding: EdgeInsets.all(10), insetAnimCurve: Curves.easeInOut, progress: 0.0, maxProgress: 100.0, progressTextStyle: TextStyle( color: Colors.black, fontSize: 10.0, fontWeight: FontWeight.w400), messageTextStyle: TextStyle( color: Colors.black, fontSize: 15.0, fontWeight: FontWeight.w600)); if (!validateFormPengajuanST(context)){ return; } else if (validateFormPengajuanST(context)){ await loading.show(); PengajuanST_Post.connectToAPI( formattedDateST, uangMukaTeksController.text.toString(), keperluanTeksController.text.toString(), formattedDateDeparture, formattedDateReturn, tujuanTeksController.text.toString(), kendaraan, ticketFromTeksController.text.toString(), ticketToTeksController.text.toString(), formattedDateTicket, ticketPriceTeksController.text.toString()).then((valueResult) async { logDev.log(kendaraan, name: "TICKET TYPE - Kendaraan"); Map object = json.decode(valueResult); if (object.containsKey("result").toString() == "true") { String result = object['result'].toString(); if (result.contains("failed")){ await loading.hide(); Widget okButton = TextButton( child: Text("OK"), onPressed: () { Navigator.of(context, rootNavigator: true).pop(); }, ); // set up the AlertDialog AlertDialog alert = AlertDialog( title: Text("Employee Self Service"), content: Text("Error Submit, Please Try Again Later!"), actions: [ okButton, ], ); // show the dialog showDialog( context: context, builder: (BuildContext context) { return alert; }, ); } else { await loading.hide(); /*formattedDateFrom = ""; visibleDateFrom = false; visibleDateFrom = false; deskripsiTeksController.clear();*/ Widget okButton = TextButton( child: Text("OK"), onPressed: () { Navigator.of(context, rootNavigator: true).pop(); Navigator.pushReplacement(context, MaterialPageRoute( builder: (context) => PengajuanExtendTanggalKembali_Screen())); }, ); // set up the AlertDialog AlertDialog alert = AlertDialog( title: Text("Employee Self Service"), content: Text("Success Submit Assignment Letter"), actions: [ okButton, ], ); // show the dialog showDialog( context: context, builder: (BuildContext context) { return alert; }, ); } } else { await loading.hide(); alertDialogFailedResponse(context); } } ); } }, ) ], ), ), ], ), ), ), ), ], ), ), ), ], ), ], )), ); } bool validateFormPengajuanST (BuildContext context) { bool result = true; if (formattedDateST == "") { Fluttertoast.showToast( msg: "Assignment Letter Date\nNot Selected", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; } else if (keperluanTeksController.text.toString().isEmpty) { Fluttertoast.showToast( msg: "Description of Needs Required!", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; } else if (formattedDateDeparture == "") { Fluttertoast.showToast( msg: "Departure Date Not Selected", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; } else if (formattedDateReturn == "") { Fluttertoast.showToast( msg: "Return Date Not Selected", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; } else if (tujuanTeksController.text.toString().isEmpty) { Fluttertoast.showToast( msg: "Destination Required!", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; } else if (uangMukaTeksController.text.toString().isEmpty) { Fluttertoast.showToast( msg: "Down Payment Required!", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; } /*else if (selectedTicketType == null) { Fluttertoast.showToast( msg: "Ticket Type Not Selected", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; } else if (ticketFromTeksController.text.toString().isEmpty){ Fluttertoast.showToast( msg: "Ticket From Required!", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; } else if (ticketToTeksController.text.toString().isEmpty){ Fluttertoast.showToast( msg: "Ticket To Required!", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; } else if (formattedDateTicket == "") { Fluttertoast.showToast( msg: "Ticket Date Not Selected", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; } else if (ticketPriceTeksController.text.toString().isEmpty){ Fluttertoast.showToast( msg: "Ticket Price Required!", toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER, timeInSecForIosWeb: 1, textColor: Colors.white, fontSize: 16.0); result = false; }*/ return result; } } alertDialogFailedRetrievedData(BuildContext context){ Widget okButton = TextButton( child: Text("Refresh"), onPressed: () { /*Navigator.of(context, rootNavigator: true).pop(); Navigator.pushReplacement(context, MaterialPageRoute( builder: (context) => AjukanCutiScreen()));*/ }, ); Widget noButton = TextButton( child: Text("Back"), onPressed: () { Navigator.of(context, rootNavigator: true).pop(); Navigator.pop(context); }, ); // set up the AlertDialog AlertDialog alert = AlertDialog( title: Text("Employee Self Service"), content: Text("Failed to Retrieve Data"), actions: [ noButton, okButton, ], ); // show the dialog showDialog( context: context, builder: (BuildContext context) { return alert; }, ); } alertDialogFailedResponse(BuildContext context){ Widget okButton = TextButton( child: Text("Refresh"), onPressed: () { /* Navigator.of(context, rootNavigator: true).pop(); Navigator.pushReplacement(context, MaterialPageRoute( builder: (context) => AjukanCutiScreen()));*/ }, ); Widget noButton = TextButton( child: Text("Back"), onPressed: () { Navigator.of(context, rootNavigator: true).pop(); Navigator.pop(context); }, ); // set up the AlertDialog AlertDialog alert = AlertDialog( title: Text("Employee Self Service"), content: Text("Server Response Error"), actions: [ noButton, okButton, ], ); // show the dialog showDialog( context: context, builder: (BuildContext context) { return alert; }, ); } List ticketType = [ "airplane", "train" ];