GSI - Employe Self Service Mobile
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

382 lines
15 KiB

2 months ago
  1. import 'dart:convert';
  2. import 'dart:ui';
  3. import 'package:flutter/material.dart';
  4. import 'package:fluttertoast/fluttertoast.dart';
  5. import 'package:google_fonts/google_fonts.dart';
  6. import 'package:employee_selfservice_mobile/Screens/Menu/SuratTugas/RequestHttp/detailST_post.dart';
  7. import 'package:employee_selfservice_mobile/Screens/Menu/SuratTugas/RequestHttp/historyST_post.dart';
  8. import 'package:progress_dialog_null_safe/progress_dialog_null_safe.dart';
  9. import 'dart:developer' as logDev;
  10. import '../AjukanCuti/backgroundHistory.dart';
  11. class HistoryST extends StatefulWidget {
  12. const HistoryST({Key? key}) : super(key: key);
  13. @override
  14. State<HistoryST> createState() => _HistoryST();
  15. }
  16. class _HistoryST extends State<HistoryST> {
  17. late List <String> id_List;
  18. late List <String> number_List;
  19. late List <String> keperluan_List;
  20. late List <String> tglDibuat_List;
  21. late List <String> status_List;
  22. late List <String> tglST_List;
  23. late List <String> uMuka_List;
  24. late List <String> tglBerangkat_List;
  25. late List <String> tglKembali_List;
  26. late List <String> tujuan_List;
  27. late List <String> ticketType_List;
  28. late List <String> ticketFrom_List;
  29. late List <String> ticketTo_List;
  30. late List <String> ticketDate_List;
  31. late List <String> ticketPrice_List;
  32. late List <Color> statusColor;
  33. late List <bool> visible;
  34. int HistoryLength = 0;
  35. @override
  36. initState() {
  37. id_List = [""];
  38. number_List = [""];
  39. keperluan_List = [""];
  40. tglDibuat_List = [""];
  41. status_List = [""];
  42. tglST_List = [""];
  43. uMuka_List = [""];
  44. tglBerangkat_List = [""];
  45. tglKembali_List = [""];
  46. tujuan_List = [""];
  47. ticketType_List = [""];
  48. ticketFrom_List = [""];
  49. ticketTo_List = [""];
  50. ticketDate_List = [""];
  51. ticketPrice_List = [""];
  52. statusColor = [Colors.black54];
  53. visible = [false];
  54. WidgetsBinding.instance.addPostFrameCallback((_) async {
  55. getHistoryData();
  56. });
  57. }
  58. getHistoryData() async {
  59. ProgressDialog loading = ProgressDialog(context);
  60. loading = ProgressDialog(context,
  61. type: ProgressDialogType.normal, isDismissible: false, showLogs: true);
  62. loading.style(
  63. message: 'Please Wait .....',
  64. borderRadius: 3,
  65. backgroundColor: Colors.white,
  66. progressWidget: CircularProgressIndicator(),
  67. elevation: 10.0,
  68. padding: EdgeInsets.all(10),
  69. insetAnimCurve: Curves.easeInOut,
  70. progress: 0.0,
  71. maxProgress: 100.0,
  72. progressTextStyle: TextStyle(
  73. color: Colors.black, fontSize: 10.0, fontWeight: FontWeight.w400),
  74. messageTextStyle: TextStyle(
  75. color: Colors.black, fontSize: 15.0, fontWeight: FontWeight.w600));
  76. await loading.show();
  77. HistoryST_Post.connectToAPI().then((valueResult) async {
  78. Map<String, dynamic> object = jsonDecode(valueResult);
  79. if (object.containsKey("result").toString() == "true") {
  80. String result = object['result'].toString();
  81. if (result.contains("failed")) {
  82. await loading.hide();
  83. alertDialogFailedRetrievedData(context);
  84. } else {
  85. List <dynamic> historyST = object['result'];
  86. setState(() async {
  87. for (int i = 0; i < historyST.length; i++){
  88. String id = historyST[i]['id'].toString();
  89. String number = historyST[i]['number'].toString();
  90. String keperluan = historyST[i]['keperluan'].toString();
  91. String tglDibuat = historyST[i]['tgl_dibuat'].toString();
  92. String status = historyST[i]['status'].toString();
  93. id_List.add(id);
  94. number_List.add(number);
  95. keperluan_List.add(keperluan);
  96. tglDibuat_List.add(tglDibuat);
  97. status_List.add(status);
  98. visible.add(false);
  99. var statColor;
  100. if (status == "draft"){
  101. statColor = Colors.red;
  102. } else if (status == "approved"){
  103. statColor = Colors.green;
  104. } else if (status == "advacanced"){
  105. statColor = Colors.orangeAccent;
  106. } else if (status == "done"){
  107. statColor = Colors.blueAccent;
  108. } else if (status == "close"){
  109. statColor = Colors.deepPurple;
  110. }
  111. statusColor.add(statColor);
  112. }
  113. id_List.removeAt(0);
  114. number_List.removeAt(0);
  115. keperluan_List.removeAt(0);
  116. tglDibuat_List.removeAt(0);
  117. status_List.removeAt(0);
  118. statusColor.removeAt(0);
  119. visible.removeAt(0);
  120. HistoryLength = historyST.length;
  121. logDev.log(HistoryLength.toString(), name: "HISTORY LENGTH");
  122. for (int i = 0; i < HistoryLength;i++){
  123. DetailST_Post.connectToAPI(id_List[i]).then((valueResult) async {
  124. Map<String, dynamic> object = jsonDecode(valueResult);
  125. if (object.containsKey("result").toString() == "true") {
  126. String result = object['result'].toString();
  127. if (result.contains("failed")) {
  128. await loading.hide();
  129. alertDialogFailedRetrievedData(context);
  130. } else {
  131. List <dynamic> detailST = object['result'];
  132. await loading.hide();
  133. setState(() {
  134. for (int j = 0; j < HistoryLength; j++){
  135. String tglST = detailST[j]['tgl_st'].toString();
  136. String uMuka = detailST[j]['umuka'].toString();
  137. String tglBerangkat = detailST[j]['tgl_berangkat'].toString();
  138. String tglKembali = detailST[j]['tgl_kembali'].toString();
  139. String tujuan = detailST[j]['tujuan'].toString();
  140. List<dynamic> ticketID = object['result']['ticket_ids'];
  141. String ticketType = ticketID[j]['type'].toString();
  142. String ticketFrom = ticketID[j]['from'].toString();
  143. String ticketTo = ticketID[j]['to'].toString();
  144. String ticketDate = ticketID[j]['tgl'].toString();
  145. String ticketPrice = ticketID[j]['harga'].toString();
  146. tglST_List.add(tglST);
  147. uMuka_List.add(uMuka);
  148. tglBerangkat_List.add(tglBerangkat);
  149. tglKembali_List.add(tglKembali);
  150. tujuan_List.add(tujuan);
  151. ticketType_List.add(ticketType);
  152. ticketFrom_List.add(ticketFrom);
  153. ticketTo_List.add(ticketTo);
  154. ticketDate_List.add(ticketDate);
  155. ticketPrice_List.add(ticketPrice);
  156. logDev.log(tglST_List.toString(), name:"semua list");
  157. }
  158. });
  159. }
  160. } else {
  161. Fluttertoast.showToast(
  162. msg: "Server Response Error",
  163. toastLength: Toast.LENGTH_SHORT,
  164. gravity: ToastGravity.CENTER,
  165. timeInSecForIosWeb: 1,
  166. textColor: Colors.white,
  167. fontSize: 16.0);
  168. }
  169. });
  170. }
  171. tglST_List.removeAt(0);
  172. uMuka_List.removeAt(0);
  173. tglBerangkat_List.removeAt(0);
  174. tglKembali_List.removeAt(0);
  175. tujuan_List.removeAt(0);
  176. ticketType_List.removeAt(0);
  177. ticketFrom_List.removeAt(0);
  178. ticketTo_List.removeAt(0);
  179. ticketDate_List.removeAt(0);
  180. ticketPrice_List.removeAt(0);
  181. await loading.hide();
  182. });
  183. }
  184. } else {
  185. Fluttertoast.showToast(
  186. msg: "Server Response Error",
  187. toastLength: Toast.LENGTH_SHORT,
  188. gravity: ToastGravity.CENTER,
  189. timeInSecForIosWeb: 1,
  190. textColor: Colors.white,
  191. fontSize: 16.0);
  192. }
  193. await loading.hide();
  194. });
  195. }
  196. @override
  197. Widget build(BuildContext context) {
  198. var size = MediaQuery.of(context).size;
  199. return Scaffold(
  200. body: Stack(
  201. children: [
  202. Column(
  203. children: <Widget>[
  204. Stack(
  205. children: [
  206. WavyHeader(),
  207. Container(
  208. margin: EdgeInsets.only(
  209. top: (size.height / 6) - 20),
  210. padding: EdgeInsets.fromLTRB(0, 5, 25, 5),
  211. child: Row(
  212. mainAxisAlignment: MainAxisAlignment.end,
  213. crossAxisAlignment: CrossAxisAlignment.end,
  214. children: [
  215. Text(
  216. 'History\t\t',
  217. maxLines: 1,
  218. style: GoogleFonts.luckiestGuy(
  219. fontSize: 28,
  220. color: Color(0xFF4858A7),
  221. fontStyle: FontStyle.italic,
  222. ),
  223. ),
  224. Image.asset(
  225. 'assets/images/ic_history.png',
  226. width: 40,
  227. height: 40,
  228. ),
  229. ],
  230. )
  231. ),
  232. ],
  233. ),
  234. ],
  235. ),
  236. Container(
  237. margin: EdgeInsets.only(top: (MediaQuery.of(context).size.height / 6) + 40, left: 5, right: 5, bottom: 10),
  238. child: ListView.builder(
  239. scrollDirection: Axis.vertical,
  240. shrinkWrap: true,
  241. itemCount: HistoryLength,
  242. itemBuilder: (context, int i) {
  243. return Container(
  244. child: InkWell(
  245. child: Card(
  246. elevation: 10,
  247. child: Column(
  248. children: [
  249. Row(
  250. children: [
  251. Expanded(
  252. flex: 8,
  253. child: Padding(
  254. padding: EdgeInsets.fromLTRB(10, 5, 5, 5),
  255. child: Column(
  256. mainAxisAlignment: MainAxisAlignment.center,
  257. crossAxisAlignment: CrossAxisAlignment.start,
  258. children: [
  259. Text(number_List[i], style: GoogleFonts.rubikBubbles(fontSize: 16)),
  260. Text(keperluan_List[i], style: GoogleFonts.nunito(fontSize: 15)),
  261. Text("\nCreated : " + tglDibuat_List[i], style: GoogleFonts.nunito(fontSize: 15)),
  262. ],
  263. ),
  264. )
  265. ),
  266. Expanded(
  267. flex: 2,
  268. child: Padding(
  269. padding: EdgeInsets.fromLTRB(5, 5, 5, 5),
  270. child: Text(status_List[i], textAlign: TextAlign.center, style: GoogleFonts.lilitaOne(color: statusColor[i], fontSize: 17),
  271. ),
  272. )
  273. ),
  274. ],
  275. ),
  276. /*Align(
  277. alignment: Alignment.centerLeft,
  278. child: Visibility(
  279. visible: visible[i],
  280. child: Padding(
  281. padding: EdgeInsets.fromLTRB(10, 5, 5, 5),
  282. child: Column(
  283. mainAxisAlignment: MainAxisAlignment.start,
  284. crossAxisAlignment: CrossAxisAlignment.start,
  285. children: [
  286. *//*Text("\nAssignment Letter Date\t : " + tglST_List[i], style: GoogleFonts.josefinSans(fontSize: 15, fontWeight: FontWeight.bold)),*//*
  287. Text("Down Payment\t\t : " + uMuka_List[i], style: GoogleFonts.nunito(fontSize: 15)),
  288. Text("Departure Date\t\t : " + tglBerangkat_List[i], style: GoogleFonts.yeonSung(fontSize: 14, fontStyle: FontStyle.italic)),
  289. Text("Return Date\t\t : " + tglKembali_List[i], style: GoogleFonts.yeonSung(fontSize: 14, fontStyle: FontStyle.italic)),
  290. Text("Destination\t\t : " + tujuan_List[i], style: GoogleFonts.yeonSung(fontSize: 14, fontStyle: FontStyle.italic)),
  291. *//*Text("Ticket Type\t\t : " + ticketType_List[i], style: GoogleFonts.yeonSung(fontSize: 14, fontStyle: FontStyle.italic)),
  292. Text("From\t\t\t : " + ticketFrom_List[i], style: GoogleFonts.yeonSung(fontSize: 14, fontStyle: FontStyle.italic)),
  293. Text("To\t\t : " + ticketTo_List[i], style: GoogleFonts.yeonSung(fontSize: 14, fontStyle: FontStyle.italic)),
  294. Text("Ticket Date\t\t : " + ticketDate_List[i], style: GoogleFonts.yeonSung(fontSize: 14, fontStyle: FontStyle.italic)),
  295. Text("Ticket Price\t\t\t : " + ticketPrice_List[i], style: GoogleFonts.yeonSung(fontSize: 14, fontStyle: FontStyle.italic)),*//*
  296. ],
  297. ),
  298. )
  299. ),
  300. )*/
  301. ],
  302. ),
  303. ),
  304. onTap: (){
  305. setState(() {
  306. visible[i] = !visible[i];
  307. });
  308. },
  309. ),
  310. );
  311. },
  312. ),
  313. )
  314. ]),
  315. );
  316. }
  317. }
  318. alertDialogFailedRetrievedData(BuildContext context) {
  319. Widget okButton = TextButton(
  320. child: Text("Refresh"),
  321. onPressed: () {
  322. Navigator.of(context, rootNavigator: true).pop();
  323. Navigator.pushReplacement(
  324. context, MaterialPageRoute(builder: (context) => HistoryST()));
  325. },
  326. );
  327. Widget noButton = TextButton(
  328. child: Text("Back"),
  329. onPressed: () {
  330. Navigator.of(context, rootNavigator: true).pop();
  331. Navigator.pop(context);
  332. },
  333. );
  334. // set up the AlertDialog
  335. AlertDialog alert = AlertDialog(
  336. title: Text("Employee Self Service"),
  337. content: Text("Failed to Retrieve Data"),
  338. actions: [
  339. noButton,
  340. okButton,
  341. ],
  342. );
  343. // show the dialog
  344. showDialog(
  345. context: context,
  346. builder: (BuildContext context) {
  347. return alert;
  348. },
  349. );
  350. }