Advertisement
Vassa007

Untitled

Sep 4th, 2023
1,275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 15.46 KB | None | 0 0
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_bloc/flutter_bloc.dart';
  3. import 'package:font_awesome_flutter/font_awesome_flutter.dart';
  4. import 'package:lottie/lottie.dart';
  5. import 'package:sisca/presentation/peserta/bloc/jenis_bloc.dart';
  6. import 'package:sisca/presentation/peserta/data/model/argument_jenis.dart';
  7. import 'package:sisca/presentation/peserta/ui/widget/button_submit.dart';
  8. import 'package:sisca/presentation/peserta/ui/widget/card_peserta.dart';
  9. import 'package:sisca/presentation/peserta/ui/widget/textfield_search.dart';
  10.  
  11. import '../../../config/theme/light_colors.dart';
  12. import '../../error/error_screen.dart';
  13. import '../../scan/ui/widget/button_scan.dart';
  14. import '../bloc/peserta_bloc.dart';
  15. import '../data/model/peserta_model.dart';
  16.  
  17. class PesertaPage extends StatefulWidget {
  18.   final String id, jenis, status;
  19.   const PesertaPage(
  20.       {Key? key, required this.jenis, required this.status, required this.id})
  21.       : super(key: key);
  22.  
  23.   @override
  24.   State<PesertaPage> createState() => _PesertaPageState();
  25. }
  26.  
  27. class _PesertaPageState extends State<PesertaPage> {
  28.   late List<DaftarPeserta> _pesertaList = [];
  29.   late List<DDLJenis> _jenisList = [];
  30.   late List<DDLStatus> _ststusList = [];
  31.   late List<DaftarPeserta> _searchResult = [];
  32.   late TextEditingController textController = TextEditingController();
  33.   int selectedIdjenis = 0;
  34.   int selectedIdStatus = 0;
  35.   String selectedJenis = "";
  36.   String selectedStatus = "";
  37.   String _title = "";
  38.   String _tempat = "";
  39.   int _jumlahHadir = 0;
  40.   int _pesertaHadir = 0;
  41.   int _pesertaKonsumsi = 0;
  42.  
  43.   @override
  44.   void initState() {
  45.     BlocProvider.of<JenisBloc>(context).add(JenisSendData(widget.id));
  46.     BlocProvider.of<PesertaBloc>(context)
  47.         .add(PesertaSendData(widget.jenis, '', widget.id));
  48.     super.initState();
  49.   }
  50.  
  51.   String combineChoices() {
  52.     return "$selectedJenis $selectedStatus";
  53.   }
  54.  
  55.   @override
  56.   Widget build(BuildContext context) {
  57.     final Size size = MediaQuery.of(context).size;
  58.     return Scaffold(
  59.       appBar: AppBar(
  60.         title: const Text(
  61.           "Daftar Undangan",
  62.           style: TextStyle(color: Colors.redAccent),
  63.         ),
  64.         elevation: 0.0,
  65.         backgroundColor: Colors.white,
  66.         leading: IconButton(
  67.           icon: const Icon(Icons.arrow_back, color: Colors.red),
  68.           onPressed: () => Navigator.of(context).pop(),
  69.         ),
  70.       ),
  71.       body: SafeArea(
  72.           child: BlocConsumer<PesertaBloc, PesertaState>(
  73.         builder: (context, state) {
  74.           if (state is PesertaLoad) {
  75.             if (state.data.isNotEmpty) {
  76.               for (var i = 0; i < state.data.length; i++) {
  77.                 _pesertaList = state.data[i].daftarPeserta!;
  78.                 _jenisList = state.data[i].ddlJenis!;
  79.                 _ststusList = state.data[i].ddlStatus!;
  80.                 _title = state.data[i].event!.title!;
  81.                 _tempat = state.data[i].event!.tempat!;
  82.                 _jumlahHadir = state.data[i].event!.jumlah_preserta!.peserta!;
  83.                 _pesertaHadir =
  84.                     state.data[i].event!.jumlah_preserta!.peserta_hadir!;
  85.                 _pesertaKonsumsi =
  86.                     state.data[i].event!.jumlah_preserta!.peserta_konsumsi!;
  87.               }
  88.             } else {
  89.               return Center(
  90.                 child: Container(
  91.                   margin: const EdgeInsets.symmetric(vertical: 50),
  92.                   child: const Text(
  93.                     "Peserta kosong",
  94.                     style: TextStyle(
  95.                       color: Colors.black45,
  96.                       fontWeight: FontWeight.w400,
  97.                     ),
  98.                   ),
  99.                 ),
  100.               );
  101.             }
  102.           } else if (state is PesertaLoading) {
  103.             return Center(
  104.                 child: Container(
  105.               margin: const EdgeInsets.symmetric(vertical: 50),
  106.               child: Container(
  107.                 width: 175,
  108.                 height: 175,
  109.                 child: Lottie.asset('assets/lottie/animated_loading.json'),
  110.               ),
  111.             ));
  112.           } else if (state is ErrorPeserta) {
  113.             return ErrorScreenBuilder(errorMessage: state.errorMessage);
  114.           }
  115.  
  116.           return buildInitialLayout(size);
  117.         },
  118.         listener: (context, state) {},
  119.       )),
  120.     );
  121.   }
  122.  
  123.   Widget buildInitialLayout(Size size) => Column(
  124.         children: [
  125.           Expanded(
  126.             child: ListView(children: [
  127.               /// filed pencarian
  128.               Row(
  129.                 children: [
  130.                   TextFieldSearch(
  131.                     size: size,
  132.                     textController: textController,
  133.                     hintText: 'Cari nama undangan',
  134.                     icoton: textController.text.isEmpty
  135.                         ? IconButton(
  136.                             onPressed: () {},
  137.                             icon: const Icon(
  138.                               FontAwesomeIcons.search,
  139.                               color: Colors.black54,
  140.                             ))
  141.                         : IconButton(
  142.                             onPressed: () {
  143.                               textController.clear();
  144.                               setState(() {
  145.                                 _searchResult = _pesertaList;
  146.                               });
  147.                             },
  148.                             icon: const Icon(
  149.                               FontAwesomeIcons.close,
  150.                               color: Colors.black54,
  151.                             )),
  152.                     onChangedText: onSearchTextChanged,
  153.                   ),
  154.                 ],
  155.               ),
  156.  
  157.               /// Filter kehadiran
  158.               SingleChildScrollView(
  159.                 scrollDirection: Axis.horizontal,
  160.                 child: Row(
  161.                   crossAxisAlignment: CrossAxisAlignment.start,
  162.                   mainAxisAlignment: MainAxisAlignment.start,
  163.                   children: [
  164.                     _chipJenis(),
  165.                     _chipStatus(),
  166.                   ],
  167.                 ),
  168.               ),
  169.  
  170.               Text("data ${combineChoices()}"),
  171.  
  172.               /// Daftar Peserta
  173.               _pesertaListView()
  174.             ]),
  175.           ),
  176.           Container(
  177.             width: double.infinity,
  178.             decoration: const BoxDecoration(
  179.               color: Color(0xFF00FFFFFF),
  180.             ),
  181.             child: Padding(
  182.               padding: EdgeInsets.all(8.0),
  183.               child: Row(
  184.                 crossAxisAlignment: CrossAxisAlignment.center,
  185.                 mainAxisAlignment: MainAxisAlignment.center,
  186.                 children: [
  187.                   Container(
  188.                     width: size.width * 0.4,
  189.                     decoration: const BoxDecoration(
  190.                       borderRadius: BorderRadius.all(Radius.circular(12)),
  191.                       color: LightColors.kGreenY,
  192.                     ),
  193.                     child: Padding(
  194.                       padding: EdgeInsets.all(10),
  195.                       child: InkWell(
  196.                         child: Text(
  197.                           "$_pesertaHadir Peserta",
  198.                           textAlign: TextAlign.center,
  199.                           style: const TextStyle(
  200.                             fontSize: 14.0,
  201.                             color: LightColors.kGreen,
  202.                             fontWeight: FontWeight.w500,
  203.                           ),
  204.                         ),
  205.                         onTap: () {
  206.                           _showModalBottom(size);
  207.                         },
  208.                       ),
  209.                     ),
  210.                   ),
  211.                   ButtonScan(
  212.                     size: size,
  213.                     press: () {
  214.                       Navigator.pushNamed(context, '/scan',
  215.                           arguments: JenisArgument(_jenisList[0].idJenis));
  216.                     },
  217.                   )
  218.                 ],
  219.               ),
  220.             ),
  221.           )
  222.         ],
  223.       );
  224.  
  225.   /// Daftar Peserta
  226.   Widget _pesertaListView() {
  227.     return _searchResult.isNotEmpty
  228.         ? ListView.builder(
  229.             shrinkWrap: true,
  230.             physics: const NeverScrollableScrollPhysics(),
  231.             itemCount: _searchResult.length,
  232.             itemBuilder: (context, index) {
  233.               return _pesertaListItems(_searchResult[index]);
  234.             },
  235.           )
  236.         : ListView.builder(
  237.             shrinkWrap: true,
  238.             physics: const NeverScrollableScrollPhysics(),
  239.             itemCount: _pesertaList.length,
  240.             itemBuilder: (context, index) {
  241.               return _pesertaListItems(_pesertaList[index]);
  242.             },
  243.           );
  244.   }
  245.  
  246.   Widget _pesertaListItems(DaftarPeserta pesertaList) {
  247.     return Container(
  248.       padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5),
  249.       child: CardPeserta(
  250.         nama: pesertaList.nama!,
  251.         no_identitas: pesertaList.no_identitas!,
  252.         unit_kerja: pesertaList.unit_kerja!,
  253.         sub_unit_kerja: pesertaList.sub_unit_kerja!,
  254.         data_presensi: pesertaList.data_presensi!.hadir!,
  255.       ),
  256.     );
  257.   }
  258.  
  259.   /// Show Modal Bottomsheet
  260.   _showModalBottom(Size size) {
  261.     showModalBottomSheet(
  262.       context: context,
  263.       builder: (BuildContext context) {
  264.         return Column(
  265.           mainAxisSize: MainAxisSize.min,
  266.           crossAxisAlignment: CrossAxisAlignment.start,
  267.           mainAxisAlignment: MainAxisAlignment.start,
  268.           children: [
  269.             Container(
  270.               margin: const EdgeInsets.fromLTRB(10, 20, 10, 10),
  271.               child: Text(
  272.                 _title,
  273.                 textAlign: TextAlign.justify,
  274.                 style:
  275.                     const TextStyle(fontSize: 15, fontWeight: FontWeight.w600),
  276.               ),
  277.             ),
  278.             Container(
  279.               margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
  280.               child: Text(
  281.                 _tempat,
  282.                 maxLines: 2,
  283.                 overflow: TextOverflow.ellipsis,
  284.                 style:
  285.                     const TextStyle(fontSize: 14, fontWeight: FontWeight.w400),
  286.               ),
  287.             ),
  288.             Container(
  289.               margin: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
  290.               width: size.width * 0.4,
  291.               decoration: const BoxDecoration(
  292.                 borderRadius: BorderRadius.all(Radius.circular(12)),
  293.                 color: LightColors.kLightYellow,
  294.               ),
  295.               child: Padding(
  296.                 padding: EdgeInsets.all(10),
  297.                 child: Text(
  298.                   "$_jumlahHadir Peserta",
  299.                   textAlign: TextAlign.center,
  300.                   style: const TextStyle(
  301.                     fontSize: 15.0,
  302.                     color: LightColors.kDarkYellow,
  303.                     fontWeight: FontWeight.w500,
  304.                   ),
  305.                 ),
  306.               ),
  307.             ),
  308.             Container(
  309.               margin: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
  310.               width: size.width * 0.4,
  311.               decoration: const BoxDecoration(
  312.                 borderRadius: BorderRadius.all(Radius.circular(12)),
  313.                 color: LightColors.kGreenY,
  314.               ),
  315.               child: Padding(
  316.                 padding: EdgeInsets.all(10),
  317.                 child: Text(
  318.                   "$_pesertaHadir Peserta",
  319.                   textAlign: TextAlign.center,
  320.                   style: const TextStyle(
  321.                     fontSize: 15.0,
  322.                     color: LightColors.kGreen,
  323.                     fontWeight: FontWeight.w500,
  324.                   ),
  325.                 ),
  326.               ),
  327.             ),
  328.             Container(
  329.               margin: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
  330.               width: size.width * 0.4,
  331.               decoration: const BoxDecoration(
  332.                 borderRadius: BorderRadius.all(Radius.circular(12)),
  333.                 color: LightColors.kBlue,
  334.               ),
  335.               child: Padding(
  336.                 padding: EdgeInsets.all(10),
  337.                 child: Text(
  338.                   "$_pesertaKonsumsi Peserta",
  339.                   textAlign: TextAlign.center,
  340.                   style: const TextStyle(
  341.                     fontSize: 15.0,
  342.                     color: LightColors.kDarkBlue,
  343.                     fontWeight: FontWeight.w500,
  344.                   ),
  345.                 ),
  346.               ),
  347.             ),
  348.             Center(
  349.               child: ButtonSubmit(
  350.                 size: size,
  351.                 nameButton: 'Tutup',
  352.                 press: () {
  353.                   Navigator.of(context).pop();
  354.                 },
  355.               ),
  356.             ),
  357.           ],
  358.         );
  359.       },
  360.     );
  361.   }
  362.  
  363.   /// onChanged Text
  364.   onSearchTextChanged(String text) {
  365.     List<DaftarPeserta> _results = <DaftarPeserta>[];
  366.     if (text.isEmpty) {
  367.       _results = _pesertaList;
  368.     } else {
  369.       _results = _pesertaList
  370.           .where((peserta) =>
  371.               peserta.nama!.toLowerCase().contains(text.toLowerCase()))
  372.           .toList();
  373.     }
  374.  
  375.     setState(() {
  376.       _searchResult = _results;
  377.     });
  378.     return;
  379.   }
  380.  
  381.   ///ddl jenis
  382.   Widget _chipJenis() {
  383.     return Container(
  384.       margin: EdgeInsets.fromLTRB(10, 10, 0, 10),
  385.       child: Column(
  386.         mainAxisAlignment: MainAxisAlignment.start,
  387.         crossAxisAlignment: CrossAxisAlignment.start,
  388.         children: [
  389.           Wrap(
  390.             spacing: 8.0,
  391.             children: _jenisList.asMap().entries.map((e) {
  392.               final index = e.key;
  393.               final option = e.value;
  394.               return ChoiceChip(
  395.                 label: Text(option.jenis_qrcode!),
  396.                 selected: selectedIdjenis == index,
  397.                 selectedColor: Colors.redAccent,
  398.                 onSelected: (isSelected) {
  399.                   setState(() {
  400.                     if (isSelected) {
  401.                       selectedIdjenis = index;
  402.                       selectedJenis = option.jenis_qrcode!;
  403.                     }
  404.                   });
  405.                 },
  406.                 labelStyle: TextStyle(
  407.                     color:
  408.                         selectedIdjenis == index ? Colors.white : Colors.black),
  409.               );
  410.             }).toList(),
  411.           )
  412.         ],
  413.       ),
  414.     );
  415.   }
  416.  
  417.   ///ddl status
  418.   Widget _chipStatus() {
  419.     return Container(
  420.       margin: EdgeInsets.fromLTRB(10, 10, 10, 10),
  421.       child: Column(
  422.         mainAxisAlignment: MainAxisAlignment.start,
  423.         crossAxisAlignment: CrossAxisAlignment.start,
  424.         children: [
  425.           Wrap(
  426.             spacing: 8.0,
  427.             children: _ststusList.asMap().entries.map((e) {
  428.               final index = e.key;
  429.               final option = e.value;
  430.               return ChoiceChip(
  431.                 label: Text(option.status!),
  432.                 selected: selectedIdStatus == index,
  433.                 selectedColor: Colors.redAccent,
  434.                 onSelected: (isSelected) {
  435.                   setState(() {
  436.                     if (isSelected) {
  437.                       selectedIdStatus = index;
  438.                       selectedStatus = option.status!;
  439.                     }
  440.                   });
  441.                 },
  442.                 labelStyle: TextStyle(
  443.                     color: selectedIdStatus == index
  444.                         ? Colors.white
  445.                         : Colors.black),
  446.               );
  447.             }).toList(),
  448.           ),
  449.         ],
  450.       ),
  451.     );
  452.   }
  453. }
  454.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement