From daa21c4f8bb758670221586d778c0b10a527a82f Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 21 Dec 2023 21:15:38 +0700 Subject: [PATCH] perbaikan sistem peminjaman, scan qr code, dropdown peti, list peti, pembuatan create finish, pembaharuan tampilan peminjaman, search peminjaman, total peminjaman, perubahan tampilan dashboard home --- assets/item/empty.png | Bin 0 -> 159600 bytes lib/main.dart | 1 + lib/migrations/databasehelper.dart | 5 +- lib/models/asset_status_model.dart | 12 +- lib/models/m_asset_status_model.dart | 7 +- .../home/conn_home_page.dart/syncronize.dart | 8 +- lib/pages/home/home_page.dart | 484 +++-- lib/pages/home/main_page.dart | 8 +- lib/pages/home/setting_page.dart | 8 +- .../peminjaman_barang/conn/syncronize.dart | 6 +- .../controller/peminjaman_controller.dart | 4 +- .../peminjaman_barang/create-finish.dart | 873 ++++++++ lib/pages/peminjaman_barang/create.dart | 1813 ++++++++--------- .../peminjaman_stock_page.dart | 1175 ++++++----- lib/pages/peminjaman_barang/show.dart | 260 ++- lib/pages/pengembalian_barang/edit.dart | 227 ++- lib/pages/pengembalian_barang/index.dart | 130 +- lib/pages/pengembalian_barang/show.dart | 22 +- lib/pages/sign_in_page.dart | 9 +- lib/pages/transfer_peti/index.dart | 6 +- lib/widget/component_query.dart | 13 + lib/widget/loading_shimmer_show.dart | 299 +++ pubspec.lock | 8 + pubspec.yaml | 2 + 24 files changed, 3504 insertions(+), 1876 deletions(-) create mode 100644 assets/item/empty.png create mode 100644 lib/pages/peminjaman_barang/create-finish.dart create mode 100644 lib/widget/component_query.dart create mode 100644 lib/widget/loading_shimmer_show.dart diff --git a/assets/item/empty.png b/assets/item/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..993c0239b9d0650c20331929a126637e05bc2cd0 GIT binary patch literal 159600 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

9VH)zOC^&!>&&?(g`3WH^5lc_ZpK<`0IJXF{$z` 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 pGn$yu1cuF^U data = { "mobile_id": assetStatusesLocalList[i].mobile_id.toString(), "peti_id": assetStatusesLocalList[i].peti_id.toString(), + "warehouse_id": assetStatusesLocalList[i].warehouse_id.toString(), "exit_at": assetStatusesLocalList[i].exit_at.toString(), "est_pengembalian": assetStatusesLocalList[i].est_pengembalian.toString(), "exit_pic": assetStatusesLocalList[i].exit_pic.toString(), - "exit_warehouse": assetStatusesLocalList[i].exit_warehouse.toString(), + // "exit_warehouse": assetStatusesLocalList[i].exit_warehouse.toString(), // "status": assetStatusesLocalList[i].status.toString(), "created_by": assetStatusesLocalList[i].created_by.toString(), "created_at": formattedCreatedAt, @@ -216,12 +217,13 @@ class SyncronizationGlobalData { Map data = { "mobile_id": assetStatusesLocalList[i]['mobile_id'].toString(), "peti_id": assetStatusesLocalList[i]['peti_id'].toString(), + "warehouse_id": assetStatusesLocalList[i]['warehouse_id'].toString(), "exit_at": assetStatusesLocalList[i]['exit_at'].toString(), "est_pengembalian": assetStatusesLocalList[i]['est_pengembalian'].toString(), "exit_pic": assetStatusesLocalList[i]['exit_pic'].toString(), - "exit_warehouse": - assetStatusesLocalList[i]['exit_warehouse'].toString(), + // "exit_warehouse": + // assetStatusesLocalList[i]['exit_warehouse'].toString(), "status": assetStatusesLocalList[i]['status'].toString(), "created_by": assetStatusesLocalList[i]['created_by'].toString(), "created_at": formattedCreatedAt, diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index 0383451..9a5d4eb 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -28,6 +28,8 @@ import 'conn_home_page.dart/syncronize.dart'; import 'controller/home_controller.dart'; class HomePage extends StatefulWidget { + final ControllerHome controllerHome = ControllerHome(); // Declare here + @override State createState() => _HomePageState(); } @@ -55,13 +57,17 @@ class _HomePageState extends State { List? _warehouseData; Timer? _timer; + int _peminjamanCount = 0; + int _pengembalianCount = 0; + int _transferCount = 0; + bool _isLoading = true; @override void initState() { super.initState(); _getUserToken(); - + _initData(); // Menerapkan Future untuk menangani tugas asinkronus Future.wait([ warehouseListAPI(), @@ -75,15 +81,35 @@ class _HomePageState extends State { datatablesWarehouseList(), ]).then((_) { // Selesaikan loading setelah semua tugas selesai - setState(() { - _isLoading = false; - }); + if (mounted) { + setState(() { + _isLoading = false; + }); + } }); // Inisialisasi _data di sini jika diperlukan _data = []; } + @override + void setState(fn) { + if (mounted) { + super.setState(fn); + } + } + + Future _initData() async { + try { + _peminjamanCount = await widget.controllerHome.getPeminjamanCount(); + _pengembalianCount = await widget.controllerHome.getPengembalianCount(); + _transferCount = await widget.controllerHome.getTransferCount(); + } catch (error) { + print(error); + } + // ... tambahkan inisialisasi lainnya + } + void _getUserToken() async { SharedPreferences prefs = await SharedPreferences.getInstance(); if (mounted) { @@ -286,63 +312,73 @@ class _HomePageState extends State { // Datatables ------------------------------------------------------------------------ Future datatablesAssetStatusList() async { - await Controller().fetchAssetStatusLocalController().then((value) { - setState(() { - _data = (value as List) - .map((e) => AssetStatusModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await Controller().fetchAssetStatusLocalController().then((value) { + setState(() { + _data = (value as List) + .map((e) => AssetStatusModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesPetiList() async { - await Controller().fetchPetiData().then((value) { - setState(() { - _petiData = (value as List) - .map((e) => PetiAssetModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await Controller().fetchPetiData().then((value) { + setState(() { + _petiData = (value as List) + .map((e) => PetiAssetModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesTipePetiList() async { - await Controller().fetchTipePetiData().then((value) { - setState(() { - _tipePetiData = (value as List) - .map((e) => TypePetiModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await Controller().fetchTipePetiData().then((value) { + setState(() { + _tipePetiData = (value as List) + .map((e) => TypePetiModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesCustomerList() async { - await Controller().fetchCustomerData().then((value) { - setState(() { - _customerData = (value as List) - .map((e) => CustomerModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await Controller().fetchCustomerData().then((value) { + setState(() { + _customerData = (value as List) + .map((e) => CustomerModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesWarehouseList() async { - await Controller().fetchWarehouseData().then((value) { - setState(() { - _warehouseData = (value as List) - .map((e) => WarehouseModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await Controller().fetchWarehouseData().then((value) { + setState(() { + _warehouseData = (value as List) + .map((e) => WarehouseModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } @override void dispose() { - // Memastikan untuk membatalkan timer saat widget di-dispose + _timer?.cancel(); super.dispose(); } @@ -354,31 +390,31 @@ class _HomePageState extends State { Widget cardMenuPeminjaman() { return Container( - margin: EdgeInsets.all(10), + height: 125, child: Card( shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15.0), + borderRadius: BorderRadius.circular(10.0), ), - elevation: 5, + elevation: 3, child: InkWell( onTap: () { // Aksi ketika card diklik Navigator.pushNamed(context, '/peminjaman-barang'); }, child: Container( - padding: EdgeInsets.all(16.0), + // padding: EdgeInsets.only(top: 8.0, bottom: 8.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.vertical_align_top, - size: 50, + size: 30, color: Colors.greenAccent[700], ), - SizedBox(height: 10), + SizedBox(height: 5), Text( 'Peminjaman', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), ], ), @@ -390,31 +426,66 @@ class _HomePageState extends State { Widget cardMenuPengembalian() { return Container( - margin: EdgeInsets.all(10), + height: 125, child: Card( shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15.0), + borderRadius: BorderRadius.circular(10.0), ), - elevation: 5, + elevation: 3, child: InkWell( onTap: () { // Aksi ketika card diklik Navigator.pushNamed(context, '/pengembalian-barang'); }, child: Container( - padding: EdgeInsets.all(16.0), + // padding: EdgeInsets.all(8.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.vertical_align_bottom, - size: 50, + size: 30, color: Colors.blueAccent[700], ), - SizedBox(height: 10), + SizedBox(height: 5), Text( 'Pengembalian', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), + ), + ], + ), + ), + ), + ), + ); + } + + Widget cardMenuTransfer() { + return Container( + height: 125, + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), + ), + elevation: 3, + child: InkWell( + onTap: () { + // Aksi ketika card diklik + Navigator.pushNamed(context, '/transfer-peti'); + }, + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.input_outlined, + size: 30, + color: Colors.yellow[700], + ), + SizedBox(height: 5), + Text( + 'Transfer Peti', + style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), ), ], ), @@ -463,42 +534,6 @@ class _HomePageState extends State { ); } - Widget cardMenuTransfer() { - return Container( - margin: EdgeInsets.all(10), - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15.0), - ), - elevation: 5, - child: InkWell( - onTap: () { - // Aksi ketika card diklik - Navigator.pushNamed(context, '/transfer-peti'); - }, - child: Container( - padding: EdgeInsets.all(16.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.input_outlined, - size: 50, - color: Colors.yellow[700], - ), - SizedBox(height: 10), - Text( - 'Transfer Peti', - style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), - ), - ], - ), - ), - ), - ), - ); - } - Widget _buildCountTile(IconData icon, int count, Color color, String text) { return Column( children: [ @@ -622,34 +657,6 @@ class _HomePageState extends State { ), ), ), - - // Divider - // Divider( - // height: 1, - // thickness: 1, - // color: Colors.black, // Black divider - // ), - - // Upload Only Button - // Container( - // width: double.infinity, - // child: TextButton( - // onPressed: () { - // Navigator.pop(context); // Close dialog - // syncToGlobal('Peminjaman'); - // syncToGlobal('Pengembalian'); - // syncToGlobal('Transfer'); - // }, - // child: Text( - // "Upload Only", - // style: TextStyle( - // color: Colors.black, - // fontSize: 16.0, - // fontFamily: 'Poppins', - // ), - // ), - // ), - // ), ], ), ); @@ -657,30 +664,196 @@ class _HomePageState extends State { ); } + Widget cardMenuSync() { + return Card( + elevation: 3, + margin: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + color: Color.fromARGB(255, 50, 39, 122), + padding: EdgeInsets.all(16.0), + child: Text( + "Sync Data Global", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 20.0, + ), + ), + ), + SizedBox(height: 10), + // Display counts for each table + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _buildCountTile( + Icons.vertical_align_top, + _peminjamanCount, + Colors.green[700]!, + 'Peminjaman', + ), + _buildCountTile( + Icons.vertical_align_bottom, + _pengembalianCount, + Colors.blue[700]!, + 'Pengembalian', + ), + _buildCountTile( + Icons.input_outlined, + _transferCount, + Colors.yellow[700]!, + 'Transfer', + ), + ], + ), + SizedBox(height: 10), + + // Re-init Button + ElevatedButton( + onPressed: () { + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: + Colors.grey[100], // Set the background color + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + elevation: 0, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Dialog title with close button + Container( + width: double.infinity, + color: Colors.indigo[700], // Indigo background + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + "Konfirmasi Sync", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 16.0, + ), + ), + ), + IconButton( + icon: Icon( + Icons.close, + color: Colors.white, + ), + onPressed: () { + Navigator.pop(context); // Close dialog + }, + ), + ], + ), + ), + + // Divider + Divider( + height: 1, + thickness: 1, + color: Colors.black, // Black divider + ), + + // Description text + Container( + padding: EdgeInsets.all(16.0), + child: Text( + "Apakah Anda yakin ingin mengunggah dan mengunduh data?", + style: TextStyle( + fontSize: 16.0, + ), + ), + ), + + // Re-init Button with blue background + + ElevatedButton( + onPressed: () { + Navigator.pop(context); // Close dialog + fetchDataFromApiAndSync(); + }, + style: TextButton.styleFrom( + backgroundColor: Colors.blue[700], + ), + child: Text( + "Upload + Download", + style: TextStyle( + color: Colors.white, + fontSize: 16.0, + fontFamily: 'Poppins', + ), + ), + ), + ], + ), + ); + }, + ); + }, + style: ElevatedButton.styleFrom( + primary: Colors.blue[700], + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Upload + Download", + style: TextStyle( + color: Colors.white, + fontSize: 16.0, + fontFamily: 'Poppins', + ), + ), + Icon( + Icons.cloud_upload, + color: Colors.white, + ), + ], + ), + ), + ) + ], + ), + ); + } + return Scaffold( backgroundColor: Colors.grey[200], appBar: AppBar( elevation: 0, automaticallyImplyLeading: false, backgroundColor: Colors.indigo[700], - actions: [ - IconButton( - icon: Icon( - Icons.cloud_sync, - size: 30, - ), - onPressed: () async { - if (await SyncronizationGlobalData.isInternet()) { - // Display custom dialog when the IconButton is pressed - showSyncDialog(context); - } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text("No internet connection")), - ); - } - }, - ), - ], + // actions: [ + // IconButton( + // icon: Icon( + // Icons.cloud_sync, + // size: 30, + // ), + // onPressed: () async { + // if (await SyncronizationGlobalData.isInternet()) { + // // Display custom dialog when the IconButton is pressed + // showSyncDialog(context); + // } else { + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar(content: Text("No internet connection")), + // ); + // } + // }, + // ), + // ], + centerTitle: true, title: Row( children: [ SizedBox(width: 10), @@ -707,14 +880,39 @@ class _HomePageState extends State { ), body: ListView( children: [ - GridView.count( - crossAxisCount: 2, - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), + cardMenuSync(), + SizedBox(height: 10), + Container( + padding: EdgeInsets.all(10), + child: Text( + 'Menu Aplikasi', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - cardMenuPeminjaman(), - cardMenuPengembalian(), - cardMenuTransfer(), + Expanded( + child: cardMenuPeminjaman(), + ), + Expanded( + child: cardMenuPengembalian(), + ), + ], + ), + SizedBox(height: 10), // Add some space between rows + Row( + children: [ + Expanded( + child: cardMenuTransfer(), + ), + Expanded( + child: Container(), + // child: cardMenuPengembalian(), + ), ], ), ], diff --git a/lib/pages/home/main_page.dart b/lib/pages/home/main_page.dart index 9386ac7..1831fa1 100644 --- a/lib/pages/home/main_page.dart +++ b/lib/pages/home/main_page.dart @@ -28,9 +28,11 @@ class _MainPageState extends State { currentIndex: currentIndex, selectedItemColor: Colors.indigoAccent, // Warna saat dipilih onTap: (index) { - setState(() { - currentIndex = index; - }); + if (mounted) { + setState(() { + currentIndex = index; + }); + } }, items: [ BottomNavigationBarItem( diff --git a/lib/pages/home/setting_page.dart b/lib/pages/home/setting_page.dart index 045090e..52f3cf2 100644 --- a/lib/pages/home/setting_page.dart +++ b/lib/pages/home/setting_page.dart @@ -27,9 +27,11 @@ class SettingPageState extends State { void _getUserToken() async { try { SharedPreferences prefs = await SharedPreferences.getInstance(); - setState(() { - token = prefs.getString('token'); - }); + if (mounted) { + setState(() { + token = prefs.getString('token'); + }); + } } catch (e) { print("Error: $e"); } diff --git a/lib/pages/peminjaman_barang/conn/syncronize.dart b/lib/pages/peminjaman_barang/conn/syncronize.dart index 46f95b1..9318c66 100644 --- a/lib/pages/peminjaman_barang/conn/syncronize.dart +++ b/lib/pages/peminjaman_barang/conn/syncronize.dart @@ -173,7 +173,7 @@ class SyncronizationPeminjamanData { "exit_at": assetStatus.exit_at.toString(), "est_pengembalian": assetStatus.est_pengembalian.toString(), "exit_pic": assetStatus.exit_pic.toString(), - "exit_warehouse": assetStatus.exit_warehouse.toString(), + // "exit_warehouse": assetStatus.exit_warehouse.toString(), "created_by": assetStatus.created_by.toString(), "created_at": formattedCreatedAt, }; @@ -248,8 +248,8 @@ class SyncronizationPeminjamanData { "est_pengembalian": assetStatusesLocalList[i]['est_pengembalian'].toString(), "exit_pic": assetStatusesLocalList[i]['exit_pic'].toString(), - "exit_warehouse": - assetStatusesLocalList[i]['exit_warehouse'].toString(), + // "exit_warehouse": + // assetStatusesLocalList[i]['exit_warehouse'].toString(), "status": assetStatusesLocalList[i]['status'].toString(), "created_by": assetStatusesLocalList[i]['created_by'].toString(), "created_at": formattedCreatedAt, diff --git a/lib/pages/peminjaman_barang/controller/peminjaman_controller.dart b/lib/pages/peminjaman_barang/controller/peminjaman_controller.dart index 00a8d47..2d0ce2d 100644 --- a/lib/pages/peminjaman_barang/controller/peminjaman_controller.dart +++ b/lib/pages/peminjaman_barang/controller/peminjaman_controller.dart @@ -127,11 +127,11 @@ class Controller { await dbClient!.delete(SqfliteDatabaseHelper.peminjamanTable); } - Future addAllData(List contactList) async { + Future addAllData(List peminjamanList) async { var dbclient = await conn.db; Batch batch = dbclient!.batch(); - for (var contact in contactList) { + for (var contact in peminjamanList) { batch.insert( SqfliteDatabaseHelper.peminjamanTable, contact.toJson(), diff --git a/lib/pages/peminjaman_barang/create-finish.dart b/lib/pages/peminjaman_barang/create-finish.dart new file mode 100644 index 0000000..ab92fe8 --- /dev/null +++ b/lib/pages/peminjaman_barang/create-finish.dart @@ -0,0 +1,873 @@ +import 'dart:convert'; + +import 'package:dropdown_search/dropdown_search.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:intl/intl.dart'; +import 'package:loading_animation_widget/loading_animation_widget.dart'; +import 'package:provider/provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:intl/date_symbol_data_local.dart'; +import 'package:collection/collection.dart'; +import 'package:uuid/uuid.dart'; + +import '../../models/asset_status_model.dart'; +import '../../models/customer_model.dart'; +import '../../models/disposal_model.dart'; +import '../../models/m_asset_status_model.dart'; +import '../../models/type_peti_model.dart'; +import '../../models/user_model.dart'; +import '../../models/warehouse_mode.dart'; +import '../../providers/auth_provider.dart'; +import '../../services/controllerApi.dart'; +import 'conn/syncronize.dart'; +import 'controller/peminjaman_controller.dart'; + +class InformasiDataEntryPage extends StatefulWidget { + final List temporaryDataList; + + InformasiDataEntryPage({required this.temporaryDataList}); + + @override + _InformasiDataEntryPageState createState() => _InformasiDataEntryPageState(); +} + +class _InformasiDataEntryPageState extends State { + String? token; + // List? customerSqfliteApi; + PetiAssetModel? petiSqfliteApi; + WarehouseModel? warehouseSqfliteApi; + WarehouseModel? warehouseTujuanSqfliteApi; + DisposalPetiModel? disposalSqfliteApi; + CustomerModel? customerSqfliteApi; + List? _valpeti; // Change this line + List? _valwarehouse; + List? _valwarehouseTujuan; + List? _valcustomer; + List? _valdisposal; + List _allPetiList = []; + List _unrestrictedPetiList = []; + List _filteredPetiList = []; + bool isQRCodeScanned = false; + String searchText = ''; + PetiAssetModel? selectedPeti; + TextEditingController searchBoxController = TextEditingController(); + TextEditingController _exit_atController = TextEditingController(); + TextEditingController _est_pengembalianController = TextEditingController(); + TextEditingController _penanggungJawabController = TextEditingController(); + TextEditingController _warehouseController = TextEditingController(); + + List selectedPetiList = []; + List? _data; + List temporaryDataList = []; + + final _formKey = GlobalKey(); + bool loading = true; + late Future _dataFuture; + // bool _isLoading = false; + + @override + void initState() { + super.initState(); + // Set loading ke true pada awalnya + if (mounted) { + if (mounted) { + setState(() { + loading = false; + }); + } + } + + _dataFuture = fetchData(); + } + + Future fetchData() async { + await _getUserToken(); + await warehouseListAPI(); + await petiListAPI(); + await disposalListAPI(); + await customerListAPI(); + initializeDateFormatting('id_ID', null); + + // Tandai bahwa proses loading telah selesai + if (mounted) { + setState(() { + loading = false; + }); + } + } + + Future _getUserToken() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + if (mounted) { + setState(() { + token = prefs.getString('token'); + loading = false; + }); + } + } + + void addDataToDropdown(PetiAssetModel peti) { + if (mounted) { + setState(() { + selectedPetiList.add(peti); + }); + } + } + + Future disposalListAPI() async { + if (mounted) { + await ControllerApi().fetchDisposalDataAPI().then((value) { + setState(() { + _valdisposal = (value as List) + .map((item) => DisposalPetiModel.fromJson(item)) + .toList(); + loading = false; + }); + }); + } + } + + Future customerListAPI() async { + if (mounted) { + await ControllerApi().fetchCustomerDataAPI().then((value) { + setState(() { + _valcustomer = (value as List) + .map((item) => CustomerModel.fromJson(item)) + .toList(); + loading = false; + }); + }); + } + } + + Future warehouseListAPI() async { + if (mounted) { + await ControllerApi().fetchWarehouseDataAPI().then((value) { + setState(() { + _valwarehouse = (value as List) + .map((item) => WarehouseModel.fromJson(item)) + .toList(); + loading = false; + }); + }); + } + } + + Future petiListAPI() async { + if (mounted) { + await ControllerApi().fetchPetiDataAPI().then((value) { + setState(() { + _valpeti = (value as List) + .map((item) => PetiAssetModel.fromJson(item)) + .toList(); + loading = false; + }); + }); + } + } + + Future isInteret() async { + await SyncronizationPeminjamanData.isInternet().then((connection) { + if (connection) { + print("Internet connection available"); + } else { + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar(content: Text("No Internet"))); + } + }); + } + + @override + Widget build(BuildContext context) { + AuthProvider authProvider = + Provider.of(context, listen: false); + UserModel user = authProvider.user; + + // WarehouseModel? warehouseSqfliteApi = _valwarehouse?.firstWhereOrNull( + // (warehouse) => warehouse.id == _valwarehouse?.first.id, + // ); + + var uuid = Uuid(); + + DateTime? parseDateTime(String? dateTimeString) { + if (dateTimeString == null || dateTimeString.isEmpty) { + return null; + } + try { + return DateTime.parse(dateTimeString); + } catch (e) { + print('Error parsing DateTime: $e'); + return null; + } + } + + Future removePetiFromSharedPreferences( + PetiAssetModel removedPeti) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + + // Retrieve existing data from SharedPreferences + List? petiListJson = prefs.getStringList('selectedPetiList'); + + if (petiListJson != null) { + // Convert JSON strings to PetiAssetModel objects + List existingPetiList = petiListJson + .map((petiJson) => PetiAssetModel.fromJson(json.decode(petiJson))) + .toList(); + + // Remove the specified peti from the list + existingPetiList.removeWhere((peti) => peti.id == removedPeti.id); + + // Save the updated list back to SharedPreferences + List updatedPetiListJson = + existingPetiList.map((peti) => json.encode(peti.toJson())).toList(); + + prefs.setStringList('selectedPetiList', updatedPetiListJson); + } + } + + void removePeti(int index) async { + PetiAssetModel? selectedPeti = + selectedPetiList != null ? selectedPetiList[index] : null; + + print('Before Remove: ${selectedPeti?.fix_lot}'); + + if (index >= 0 && index < selectedPetiList.length) { + if (mounted) { + PetiAssetModel removedPeti = selectedPetiList[index]; + + // Remove the data with the specified peti_id from temporaryDataList + temporaryDataList + .removeWhere((data) => data.peti_id == removedPeti.id); + + selectedPetiList.removeAt(index); + + await removePetiFromSharedPreferences(removedPeti); + + print('After Remove: ${selectedPeti?.fix_lot}'); + } + } else { + print('Invalid index: $index. No removal performed.'); + } + } + + List selectedPetis = widget.temporaryDataList + .map((data) { + PetiAssetModel? peti = + _valpeti?.firstWhereOrNull((peti) => peti.id == data.peti_id); + print("Checking conditions for Peti ID: ${data.peti_id}"); + print("Exit_atController: ${_exit_atController.text.isNotEmpty}"); + print("petiSqfliteApi: ${peti != null}"); + print("warehouseSqfliteApi: ${warehouseSqfliteApi != null}"); + if (peti != null) { + return peti; + } else { + print("Peti not found for ID: ${data.peti_id}"); + return PetiAssetModel( + id: -1, + fix_lot: '', /* other default values */ + ); + } + }) + .where((peti) => peti != null && peti.id != -1) + .cast() + .toList(); + + Future saveAssetData(List selectedPetis) async { + DateTime now = DateTime.now().toLocal(); + String formattedDate = DateFormat('yyyy-MM-dd HH:mm:ss.SSS').format(now); + + List savedPetiIds = []; + + for (PetiAssetModel selectedPeti in selectedPetis) { + // print("Checking conditions for Peti ID: ${selectedPeti.id}"); + // print("Exit_atController: ${_exit_atController.text.isNotEmpty}"); + // print("petiSqfliteApi: ${petiSqfliteApi != null}"); + // print("warehouseSqfliteApi: ${warehouseSqfliteApi != null}"); + + if (selectedPeti == null) { + print("Selected Peti is null"); + continue; + } + + // Ensure that _valpeti is not null before trying to find the PetiAssetModel + if (_valpeti == null) { + print("_valpeti is null"); + continue; + } + + petiSqfliteApi = + _valpeti?.firstWhereOrNull((peti) => peti.id == selectedPeti.id); + + if (petiSqfliteApi == null) { + print("Peti not found for ID: ${selectedPeti.id}"); + continue; + } + + if (_exit_atController.text.isNotEmpty && + petiSqfliteApi != null && + warehouseSqfliteApi != null) { + print("All conditions met. Saving data..."); + + AssetStatusModel assetAddModel = AssetStatusModel( + id: null, + peti_id: selectedPeti.id, + customer_id: customerSqfliteApi?.id, + warehouse_id: warehouseSqfliteApi?.id, + exit_at: parseDateTime(_exit_atController.text), + exit_pic: _penanggungJawabController.text, + est_pengembalian: parseDateTime(_est_pengembalianController.text), + created_by: user.fullname, + created_at: parseDateTime(formattedDate), + mobile_id: uuid.v4(), + ); + + // Call addData function + int result = await Controller().addPeminjamanData(assetAddModel); + + if (result > 0) { + savedPetiIds.add(selectedPeti.id!); + if (mounted) { + setState(() { + _exit_atController.text = ''; + _penanggungJawabController.text = ''; + _est_pengembalianController.text = ''; + warehouseSqfliteApi?.id = null; + customerSqfliteApi?.id = null; + }); + } + print("Success Tambah data untuk Peti ID: ${selectedPeti.id}"); + EasyLoading.showSuccess("Data Berhasil Disimpan"); + // Reset controllers and make fields nullable + } else { + print("Failed untuk Peti ID: ${selectedPeti.id}"); + } + } else { + print("Conditions not met. Unable to save data."); + if (_exit_atController.text.isEmpty) { + print("Exit_atController is empty"); + } + if (petiSqfliteApi == null) { + print("petiSqfliteApi is null"); + } + if (warehouseSqfliteApi == null) { + print("warehouseSqfliteApi is null"); + } + } + } + + // Hapus peti-peti yang baru saja disimpan dari SharedPreferences + for (PetiAssetModel selectedPeti in selectedPetis) { + if (selectedPeti != null) { + await removePetiFromSharedPreferences(selectedPeti); + } + } + +// Jika Anda ingin pindah ke halaman setelah menyimpan data untuk semua peti + Navigator.pushNamed(context, '/peminjaman-barang'); + } + + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: true, + backgroundColor: Colors.indigo[700], + elevation: 0, + title: Text('Isikan Data Peminjaman Peti', + style: TextStyle( + fontSize: 16, + )), + ), + body: Form( + key: _formKey, + child: FutureBuilder( + future: _dataFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Center( + child: LoadingAnimationWidget.staggeredDotsWave( + color: Colors.indigo, + size: 40, + ), + ); + } else if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else { + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: 8), + Text( + 'List Peti:', + style: TextStyle( + fontSize: 14, fontWeight: FontWeight.bold), + ), + SizedBox(height: 8), + Container( + height: 250, + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.withOpacity(0.5), + width: 1, + ), + borderRadius: BorderRadius.circular(8), + color: Colors.grey[100], + ), + padding: EdgeInsets.all(8), + child: Expanded( + child: ListView.builder( + itemCount: widget.temporaryDataList.length, + itemBuilder: (context, index) { + int? petiId = + widget.temporaryDataList[index].peti_id; + PetiAssetModel? petiSqfliteApi = + _valpeti?.firstWhereOrNull( + (peti) => peti.id == petiId, + ); + + return ConstrainedBox( + constraints: BoxConstraints( + maxHeight: + 100, // Set your desired height here + ), + child: Card( + elevation: 1, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide( + color: Colors.grey.withOpacity(0.5), + width: 1, + ), + ), + margin: EdgeInsets.symmetric(vertical: 4), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: SingleChildScrollView( + child: Row( + children: [ + Text( + '${index + 1}.', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(width: 16), + Text( + ' ${petiSqfliteApi?.fix_lot ?? ''}', + style: TextStyle(fontSize: 13), + ), + // Tambahkan properti lainnya sesuai kebutuhan + ], + ), + ), + ), + ), + ); + }, + ), + ), + ), + SizedBox(height: 16), + Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Pilih Customer:', + style: TextStyle( + fontSize: 14, fontWeight: FontWeight.bold), + ), + SizedBox(height: 8), + DropdownSearch( + dropdownDecoratorProps: DropDownDecoratorProps( + dropdownSearchDecoration: InputDecoration( + hintText: 'Pilih Customer', + border: OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(5.0), + ), + ), + ), + ), + popupProps: PopupProps.bottomSheet( + showSearchBox: true, + itemBuilder: (context, CustomerModel? customer, + bool? isSelected) { + if (customer == null) { + return SizedBox.shrink(); + } + return Container( + child: Column( + children: [ + ListTile( + title: Text( + customer.name.toString(), + style: TextStyle( + fontSize: 16, + fontFamily: 'OpenSansCondensed', + ), + ), + leading: Icon( + Icons.person_pin, + size: 24, + color: customer.id == + customerSqfliteApi?.id + ? Colors.indigo[700] + : Colors.grey, + ), + ), + Divider( + height: 1, + color: Colors + .grey, // Warna pembatas (divider) + ), + ], + ), + color: customer.id == customerSqfliteApi?.id + ? Colors.grey.withOpacity(0.7) + : Colors.white, + ); + }, + fit: FlexFit.loose, + title: Padding( + padding: EdgeInsets.all(8.0), + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Pilih Customer', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold), + ), + IconButton( + icon: Icon( + Icons.close, + color: Colors.red, + ), + onPressed: () { + Navigator.pop(context); + }, + ), + ], + ), + Divider(), + ], + ), + ), + ), + items: (_valcustomer ?? []) + .where((customer) => + customer.deleted_at != true) + .where((customer) => customer.name! + .toLowerCase() + .contains(searchBoxController.text + .toLowerCase())) + .toList() ?? + [], + itemAsString: (CustomerModel customer) => + customer.name ?? + "", // Ganti dengan properti yang sesuai + selectedItem: customerSqfliteApi, + onChanged: (CustomerModel? value) { + setState(() { + customerSqfliteApi = value; + }); + }, + validator: (CustomerModel? value) { + if (value == null) { + return 'Harus diisi'; + } + return null; + }, + ), + ], + ), + ), + SizedBox(height: 16), + Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Tanggal Peminjaman:', + style: TextStyle( + fontSize: 14, fontWeight: FontWeight.bold), + ), + SizedBox(height: 8), + FormBuilderDateTimePicker( + validator: (value) { + if (_exit_atController.text.isEmpty) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: Colors.redAccent[700], + content: Row( + children: [ + Icon( + Icons.error_outline, + color: Colors.white, + ), + SizedBox(width: 5), + Text( + 'Tanggal Peminjaman harus diisi'), + ], + ), + duration: Duration(seconds: 2), + ), + ); + return null; // Return null jika ada kesalahan + } + return null; // Return null jika tidak ada kesalahan + }, + controller: _exit_atController, + name: 'tanggal_peminjaman', + inputType: InputType.date, + format: DateFormat('yyyy-MM-dd', 'id_ID'), + decoration: InputDecoration( + hintText: 'Tanggal Peminjaman', + border: OutlineInputBorder(), + suffixIcon: Icon(Icons.calendar_today), + ), + onChanged: (DateTime? selectedDate) { + if (selectedDate != null) { + // Mengisi tanggal estimasi 7 hari ke depan + DateTime estimasiPengembalian = + selectedDate.add(Duration(days: 7)); + _est_pengembalianController.text = + DateFormat('yyyy-MM-dd') + .format(estimasiPengembalian); + } + }, + ), + ], + ), + ), + SizedBox(height: 16), + Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Estimasi Pengembalian:', + style: TextStyle( + fontSize: 14, fontWeight: FontWeight.bold), + ), + SizedBox(height: 4), + Text( + '* Terisi otomatis 7 hari setelah tanggal peminjaman', + style: TextStyle( + fontSize: 12, + color: Colors.red, + fontStyle: FontStyle.italic), + ), + SizedBox(height: 8), + FormBuilderDateTimePicker( + validator: (value) { + if (_est_pengembalianController.text.isEmpty) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: Colors.redAccent[700], + content: Row( + children: [ + Icon( + Icons.error_outline, + color: Colors.white, + ), + SizedBox(width: 5), + Text('Tanggal Estimasi Pengembalian'), + ], + ), + duration: Duration(seconds: 2), + ), + ); + return null; // Return null jika ada kesalahan + } + return null; // Return null jika tidak ada kesalahan + }, + controller: _est_pengembalianController, + name: 'estimasi_pengembalian', + inputType: InputType.date, + format: DateFormat('yyyy-MM-dd', 'id_ID'), + decoration: InputDecoration( + hintText: 'Estimasi Tanggal Pengembalian', + border: OutlineInputBorder(), + suffixIcon: Icon(Icons.calendar_today), + ), + ), + ], + ), + ), + SizedBox(height: 16), + Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Penanggung Jawab:', + style: TextStyle( + fontSize: 14, fontWeight: FontWeight.bold), + ), + SizedBox(height: 8), + TextFormField( + controller: _penanggungJawabController = + TextEditingController(text: user.fullname), + decoration: InputDecoration( + border: OutlineInputBorder(), + hintText: 'Penanggung Jawab', + ), + validator: (value) { + if (value == null || value.isEmpty) { + return 'Harus diisi'; + } + return null; // Return null jika tidak ada kesalahan + }, + ), + ], + ), + ), + SizedBox(height: 16), + Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Gudang:', + style: TextStyle( + fontSize: 14, fontWeight: FontWeight.bold), + ), + SizedBox(height: 8), + DropdownButtonFormField( + validator: (value) { + if (value == null) { + return 'Harus diisi'; + } + return null; + }, + decoration: InputDecoration( + hintText: 'Gudang', + border: OutlineInputBorder(), + ), + hint: Text("Gudang"), + value: warehouseSqfliteApi, + items: (_valwarehouse ?? []) + .where((warehouse) => + warehouse.deleted_at != true) + .map((WarehouseModel warehouse) + // _valwarehouse?.map((WarehouseModel warehouse) + { + return DropdownMenuItem( + child: Row( + children: [ + Icon( + Icons.warehouse, + color: warehouseSqfliteApi?.id == + warehouse.id + ? Colors.indigo[700] + : Colors.grey, + ), + + SizedBox( + width: + 8), // Jarak antara ikon dan teks + Text( + '${warehouse.name}', + style: TextStyle( + fontSize: 16, + fontFamily: 'OpenSansCondensed', + fontWeight: + warehouseSqfliteApi?.id == + warehouse.id + ? FontWeight.bold + : FontWeight.normal, + ), + ), + ], + ), + value: warehouse, + ); + }).toList() ?? + [], + onChanged: (value) { + setState(() { + warehouseSqfliteApi = value; + }); + }, + ), + ], + ), + ), + ], + ), + ), + ); + } + }, + ), + ), + bottomNavigationBar: BottomAppBar( + height: MediaQuery.of(context).size.height / 10, + color: Color.fromARGB(255, 5, 28, 158), // Warna latar belakang + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: MediaQuery.of(context).size.width / 3, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + height: 50, // Lebar dan tinggi sesuai kebutuhan + width: 50, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.green, // Warna hijau untuk save + ), + child: IconButton( + onPressed: () async { + if (_formKey.currentState!.validate()) { + try { + if (_exit_atController.text.isNotEmpty && + warehouseSqfliteApi != null) { + await saveAssetData(selectedPetis); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: Colors.redAccent[700], + content: Row( + children: [ + Icon( + Icons.error_outline, + color: Colors.white, + ), + SizedBox(width: 5), + Text('Data belum lengkap'), + ], + ), + duration: Duration(seconds: 2), + ), + ); + } + } catch (e) { + print('Error storing data: $e'); + } + } + }, + icon: Icon(Icons.check, color: Colors.white), + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/peminjaman_barang/create.dart b/lib/pages/peminjaman_barang/create.dart index de56968..d5491fb 100644 --- a/lib/pages/peminjaman_barang/create.dart +++ b/lib/pages/peminjaman_barang/create.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:core'; import 'dart:math'; - import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:siopas/models/asset_status_model.dart'; @@ -20,19 +19,18 @@ import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:intl/date_symbol_data_local.dart'; // Import package intl import 'package:uuid/uuid.dart'; import 'package:dropdown_search/dropdown_search.dart'; - import '../../connection/connection.dart'; import 'package:http/http.dart' as http; - import '../../models/user_model.dart'; import '../../providers/auth_provider.dart'; import '../../services/syncronizeAPI.dart'; import 'controller/peminjaman_controller.dart'; import 'package:collection/collection.dart'; +import 'create-finish.dart'; + class CreatePeminjamanBarang extends StatefulWidget { const CreatePeminjamanBarang({Key? key}) : super(key: key); - @override State createState() => _CreatePeminjamanBarangState(); } @@ -43,49 +41,41 @@ class _CreatePeminjamanBarangState extends State { // List? customerSqfliteApi; PetiAssetModel? petiSqfliteApi; WarehouseModel? warehouseSqfliteApi; - WarehouseModel? warehouseTujuanSqfliteApi; - DisposalPetiModel? disposalSqfliteApi; - CustomerModel? customerSqfliteApi; - List? _valpeti; // Change this line List? _valwarehouse; - List? _valwarehouseTujuan; - List? _valcustomer; List? _valdisposal; - List _allPetiList = []; - List _unrestrictedPetiList = []; List _filteredPetiList = []; bool isQRCodeScanned = false; - String searchText = ''; PetiAssetModel? selectedPeti; - TextEditingController searchBoxController = TextEditingController(); - TextEditingController _exit_atController = TextEditingController(); - TextEditingController _est_pengembalianController = TextEditingController(); - TextEditingController _penanggungJawabController = TextEditingController(); - final _formKey = GlobalKey(); + List? selectedPetiList = []; + List scannedPetiList = []; + List temporaryDataList = []; + List? _data; + List localSelectedPetiList = []; + final _formKey = GlobalKey(); final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); Barcode? result; QRViewController? controller; - bool loading = true; @override void initState() { super.initState(); _getUserToken(); - warehouseListAPI(); petiListAPI(); - disposalListAPI(); - customerListAPI(); initializeDateFormatting('id_ID', null); - - setState(() { - loading = false; // Mengatur loading ke false setelah tugas selesai + assetStatusListSqflite(); + getSelectedPetiListFromSharedPreferences().then((retrievedPetiList) { + setState(() { + // Update the state with the retrieved list + selectedPetiList = retrievedPetiList; + loading = false; + }); }); } @@ -99,441 +89,487 @@ class _CreatePeminjamanBarangState extends State { } } - Future disposalListAPI() async { - if (mounted) { - await ControllerApi().fetchDisposalDataAPI().then((value) { - setState(() { - _valdisposal = (value as List) - .map((item) => DisposalPetiModel.fromJson(item)) - .toList(); - loading = false; - }); - }); - } + // Function to save selectedPetiList to SharedPreferences + void saveSelectedPetiListToSharedPreferences( + List selectedPetiList) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + List> petiListJson = + selectedPetiList.map((peti) => peti.toJson()).toList(); + prefs.setStringList('selectedPetiList', + petiListJson.map((petiJson) => json.encode(petiJson)).toList()); } - Future customerListAPI() async { - if (mounted) { - await ControllerApi().fetchCustomerDataAPI().then((value) { - setState(() { - _valcustomer = (value as List) - .map((item) => CustomerModel.fromJson(item)) - .toList(); - loading = false; - }); - }); + // Function to retrieve selectedPetiList from SharedPreferences + Future> + getSelectedPetiListFromSharedPreferences() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + List? petiListJson = prefs.getStringList('selectedPetiList'); + if (petiListJson != null) { + List selectedPetiList = petiListJson + .map((petiJson) => PetiAssetModel.fromJson(json.decode(petiJson))) + .toList(); + return selectedPetiList; + } else { + return []; } } - Future warehouseListAPI() async { - if (mounted) { - await ControllerApi().fetchWarehouseDataAPI().then((value) { + void _handlePetiScanResult(int petiId) { + bool isPetiInAssetStatusList = + _data?.any((assetStatus) => assetStatus.peti_id == petiId) ?? false; + + bool isPetiInSelectedPetiList = + selectedPetiList!.any((peti) => peti.id == petiId); + + PetiAssetModel? petiSqfliteApi = _valpeti?.firstWhereOrNull( + (peti) => peti.id == petiId, + ); + + String fixLot = petiSqfliteApi?.fix_lot ?? + ''; // Menyimpan nilai fix_lot jika petiSqfliteApi tidak null + + if (isPetiInAssetStatusList) { + showErrorMessage( + 'Peti dengan $fixLot sudah terdaftar dalam daftar menu peminjaman. Harap periksa kembali.', + Colors.yellow[700]!, + ); + } else if (!isPetiInSelectedPetiList) { + PetiAssetModel? allowedPeti = _valpeti?.firstWhereOrNull( + (peti) => + peti.id == petiId && + peti.deleted_at != true && + peti.status == 'AKTIF', + ); + + if (allowedPeti != null) { setState(() { - _valwarehouse = (value as List) - .map((item) => WarehouseModel.fromJson(item)) - .toList(); - loading = false; + isQRCodeScanned = true; + _filteredPetiList = [allowedPeti]; + petiSqfliteApi = allowedPeti; + selectedPetiList!.add(allowedPeti); + saveSelectedPetiListToSharedPreferences(selectedPetiList!); }); - }); - } - } - - Future petiListAPI() async { - if (mounted) { - await ControllerApi().fetchPetiDataAPI().then((value) { + } else { + showErrorMessage( + 'Data Peti tidak ditemukan atau tidak sesuai dengan hak akses.', + Colors.red[700]!, + ); setState(() { - _valpeti = (value as List) - .map((item) => PetiAssetModel.fromJson(item)) - .toList(); - loading = false; + isQRCodeScanned = false; + petiSqfliteApi = null; }); - }); + } + } else { + showErrorMessage( + 'Peti dengan $fixLot sudah ada dalam daftar pilihan List Peti. Harap periksa kembali.', + Colors.yellow[700]!, + ); } } - Future isInteret() async { - await SyncronizationPeminjamanData.isInternet().then((connection) { - if (connection) { - print("Internet connection available"); - } else { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar(content: Text("No Internet"))); - } - }); + void _onQRViewCreated(QRViewController controller) async { + this.controller = controller; + bool scanned = false; + + // Code to auto-focus the back camera + controller.flipCamera(); + await Future.delayed(const Duration(milliseconds: 400)); + controller.flipCamera(); + + controller.scannedDataStream.listen( + (scanData) async { + if (!scanned) { + try { + result = scanData; + List lines = result!.code!.split('\n'); + String idPeti = ''; + String idWarehouse = ''; + for (String line in lines) { + if (line.contains(';')) { + List values = line.split(';'); + if (values.length >= 3) { + idPeti = values[1]; + idWarehouse = values[2]; + break; + } + } + } + int? petiId = int.tryParse(idPeti); + + if (petiId != null) { + _handlePetiScanResult(petiId); + } else { + showErrorMessage( + 'Nilai QR Code tidak sesuai dengan yang diharapkan.', + Colors.yellow[700]!, + ); + setState(() { + isQRCodeScanned = false; + petiSqfliteApi = null; + }); + } + + scanned = true; + } catch (e) { + controller.stopCamera(); + setState(() { + petiSqfliteApi = null; + }); + print('Error scanning QR Code: $e'); + showErrorMessage(e.toString(), Colors.red[700]!); + } finally { + controller.stopCamera(); + await Future.delayed(Duration(milliseconds: 500)); + if (mounted) { + Navigator.of(context).pop(); + } + } + } + }, + ); } - // Future _onQRViewCreated(QRViewController controller) async { + void showErrorMessage(String message, Color backgroundColor) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + message, + style: TextStyle( + color: Colors.black, + fontSize: 12, + ), + ), + backgroundColor: backgroundColor, + ), + ); + } + + // void _onQRViewCreated(QRViewController controller) async { // this.controller = controller; // bool scanned = false; - // // code to auto focus kamera belakang + // // Code to auto-focus the back camera // controller.flipCamera(); // await Future.delayed(const Duration(milliseconds: 400)); // controller.flipCamera(); // controller.scannedDataStream.listen( - // (scanData) { + // (scanData) async { // if (!scanned) { // try { - // setState(() { - // result = scanData; - // List lines = result!.code!.split('\n'); - // String idPeti = ''; - // String idWarehouse = ''; - - // for (String line in lines) { - // if (line.contains(';')) { - // List values = line.split(';'); - // if (values.length >= 3) { - // idPeti = values[1]; - // idWarehouse = values[2]; - // break; - // } + // result = scanData; + // List lines = result!.code!.split('\n'); + // String idPeti = ''; + // String idWarehouse = ''; + // for (String line in lines) { + // if (line.contains(';')) { + // List values = line.split(';'); + // if (values.length >= 3) { + // idPeti = values[1]; + // idWarehouse = values[2]; + // break; // } // } - - // int? petiId = int.tryParse(idPeti); - // int? warehouseId = int.tryParse(idWarehouse); - // // AuthProvider authProvider = - // // Provider.of(context, listen: false); - // // UserModel user = authProvider.user; - - // if (petiId != null && warehouseId != null) { - // // Check apakah peti dengan warehouse_id yang sesuai ada dalam daftar yang diizinkan - // PetiAssetModel? allowedPeti = _valpeti?.firstWhereOrNull( - // (peti) => - // peti.id == petiId && - // peti.deleted_at != true && - // // peti.warehouse_id == user.warehouse_id && - // peti.status == 'AKTIF', - // ); - - // if (allowedPeti != null) { - // petiSqfliteApi = allowedPeti; - - // warehouseSqfliteApi = _valwarehouse?.firstWhereOrNull( - // // warehouseSqfliteApi = _valwarehouse?.firstWhere( - // (warehouse) => warehouse.id == allowedPeti.warehouse_id, - // ); + // } + // int? petiId = int.tryParse(idPeti); + + // if (petiId != null) { + // // Memeriksa apakah peti_id sudah ada dalam _data (assetStatusListSqflite()) + // bool isPetiInAssetStatusList = + // _data?.any((assetStatus) => assetStatus.peti_id == petiId) ?? + // false; + + // PetiAssetModel? allowedPeti = _valpeti?.firstWhereOrNull( + // (peti) => + // peti.id == petiId && + // peti.deleted_at != true && + // peti.status == 'AKTIF', + // ); + + // if (allowedPeti != null) { + // // Mengecek apakah peti sudah ada dalam daftar selectedPetiList + // bool isPetiInList = + // selectedPetiList.any((peti) => peti.id == allowedPeti!.id); + + // if (!isPetiInList) { + // // Peti belum ada dalam daftar, tambahkan + // setState(() { + // isQRCodeScanned = true; + // _filteredPetiList = [allowedPeti]; + // petiSqfliteApi = allowedPeti; + // selectedPetiList.add(allowedPeti); + // saveSelectedPetiListToSharedPreferences(selectedPetiList); + // }); // } else { - // // Tampilkan pesan error jika data tidak sesuai dengan hak akses - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar( - // content: Text( - // 'Data Peti tidak ditemukan atau tidak sesuai dengan hak akses.', - // style: TextStyle( - // color: Colors.white, - // fontSize: 12, - // ), - // ), - // backgroundColor: Colors.red[700], - // action: SnackBarAction( - // label: 'Tutup', - // onPressed: () { - // ScaffoldMessenger.of(context).hideCurrentSnackBar(); - // }, - // ), - // ), + // // Peti sudah ada dalam daftar, tampilkan pesan peringatan + // showErrorMessage( + // 'Peti ${allowedPeti.fix_lot} sudah ada dalam daftar.', + // Colors.yellow[700]!, // ); - // petiSqfliteApi = null; - // warehouseSqfliteApi = null; // } // } else { - // // Tampilkan pesan error jika nilai yang dipindai tidak sesuai - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar( - // content: Row( - // children: [ - // Icon( - // Icons.warning, - // color: Colors.black, - // ), - // SizedBox(width: 8), - // Text( - // 'Nilai QR Code tidak sesuai dengan yang diharapkan.', - // style: TextStyle( - // color: Colors.black, - // fontSize: 12, - // ), - // ), - // ], - // ), - // backgroundColor: Colors.yellow[700], - // ), + // // Peti tidak ditemukan atau tidak sesuai dengan hak akses + // showErrorMessage( + // 'Data Peti tidak ditemukan atau tidak sesuai dengan hak akses.', + // Colors.red[700]!, // ); - // petiSqfliteApi = null; - // warehouseSqfliteApi = null; + // setState(() { + // isQRCodeScanned = false; + // petiSqfliteApi = null; + // }); // } + // } else { + // // Nilai QR Code tidak sesuai dengan yang diharapkan + // showErrorMessage( + // 'Nilai QR Code tidak sesuai dengan yang diharapkan.', + // Colors.yellow[700]!, + // ); + // setState(() { + // isQRCodeScanned = false; + // petiSqfliteApi = null; + // }); + // } - // scanned = true; - // }); - - // controller.stopCamera(); - - // Future.delayed(Duration(milliseconds: 500), () { - // if (mounted) { - // Navigator.of(context).pop(); - // } - // }); + // scanned = true; // } catch (e) { // controller.stopCamera(); - - // // Reset nilai dropdown Peti dan Warehouse // setState(() { // petiSqfliteApi = null; - // warehouseSqfliteApi = null; // }); // print('Error scanning QR Code: $e'); - - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar( - // content: Row( - // children: [ - // Icon( - // Icons.error, - // color: Colors.red[400], - // ), - // SizedBox(width: 8), - // Flexible( - // child: Text( - // e.toString(), - // style: TextStyle( - // color: Colors.white, - // fontSize: 12, - // ), - // ), - // ), - // ], - // ), - // backgroundColor: Colors.red[700], - // ), - // ); + // showErrorMessage(e.toString(), Colors.red[700]!); + // } finally { + // controller.stopCamera(); + // await Future.delayed(Duration(milliseconds: 500)); + // if (mounted) { + // Navigator.of(context).pop(); + // } // } // } // }, // ); // } - Future _onQRViewCreated(QRViewController controller) async { - this.controller = controller; - bool scanned = false; - - // code to auto focus kamera belakang - controller.flipCamera(); - await Future.delayed(const Duration(milliseconds: 400)); - controller.flipCamera(); - - controller.scannedDataStream.listen( - (scanData) { - if (!scanned) { - try { - setState(() { - result = scanData; - List lines = result!.code!.split('\n'); - String idPeti = ''; - String idWarehouse = ''; - - for (String line in lines) { - if (line.contains(';')) { - List values = line.split(';'); - if (values.length >= 3) { - idPeti = values[1]; - idWarehouse = values[2]; - break; - } - } - } - - int? petiId = int.tryParse(idPeti); - int? warehouseId = int.tryParse(idWarehouse); - // AuthProvider authProvider = Provider.of(context, listen: false); - // UserModel user = authProvider.user; - - // Dalam fungsi yang menangani pemindaian QR code - // Dalam fungsi yang menangani pemindaian QR code - if (petiId != null && warehouseId != null) { - // Check apakah peti dengan warehouse_id yang sesuai ada dalam daftar yang diizinkan - PetiAssetModel? allowedPeti = _valpeti?.firstWhereOrNull( - (peti) => - peti.id == petiId && - peti.deleted_at != true && - peti.status == 'AKTIF', - ); - - if (allowedPeti != null) { - setState(() { - isQRCodeScanned = true; - // Mengisi _filteredPetiList untuk dropdown hasil QR Code - _filteredPetiList = [ - _valpeti!.firstWhere((peti) => peti.id == allowedPeti.id) - ]; - - petiSqfliteApi = allowedPeti; - - warehouseSqfliteApi = _valwarehouse?.firstWhereOrNull( - (warehouse) => warehouse.id == allowedPeti.warehouse_id, - ); - - customerSqfliteApi = _valcustomer?.firstWhereOrNull( - (customer) => customer.id == allowedPeti.customer_id, - ); - }); - } else { - // Tampilkan pesan error jika data tidak sesuai dengan hak akses - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - 'Data Peti tidak ditemukan atau tidak sesuai dengan hak akses.', - style: TextStyle( - color: Colors.white, - fontSize: 12, - ), - ), - backgroundColor: Colors.red[700], - action: SnackBarAction( - label: 'Tutup', - onPressed: () { - ScaffoldMessenger.of(context).hideCurrentSnackBar(); - }, - ), - ), - ); - setState(() { - isQRCodeScanned = false; - petiSqfliteApi = null; - warehouseSqfliteApi = null; - }); - } - } else { - // Tampilkan pesan error jika nilai yang dipindai tidak sesuai - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Row( - children: [ - Icon( - Icons.warning, - color: Colors.black, - ), - SizedBox(width: 8), - Text( - 'Nilai QR Code tidak sesuai dengan yang diharapkan.', - style: TextStyle( - color: Colors.black, - fontSize: 12, - ), - ), - ], - ), - backgroundColor: Colors.yellow[700], - ), - ); - setState(() { - isQRCodeScanned = false; - petiSqfliteApi = null; - warehouseSqfliteApi = null; - }); - } - - scanned = true; - }); - - controller.stopCamera(); - - Future.delayed(Duration(milliseconds: 500), () { - if (mounted) { - Navigator.of(context).pop(); - } - }); - } catch (e) { - controller.stopCamera(); + Future assetStatusListSqflite() async { + if (mounted) { + await Controller().fetchAssetStatusLocalController().then((value) { + setState(() { + _data = (value as List) + .map((e) => AssetStatusModel.fromJson(e)) + .toList(); + loading = false; + }); + }); + } + } - // Reset nilai dropdown Peti dan Warehouse - setState(() { - petiSqfliteApi = null; - warehouseSqfliteApi = null; - }); - print('Error scanning QR Code: $e'); + Future petiListAPI() async { + if (mounted) { + await ControllerApi().fetchPetiDataAPI().then((value) { + setState(() { + _valpeti = (value as List) + .map((item) => PetiAssetModel.fromJson(item)) + .toList(); + loading = false; + }); + }); + } + } - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Row( - children: [ - Icon( - Icons.error, - color: Colors.red[400], - ), - SizedBox(width: 8), - Flexible( - child: Text( - e.toString(), - style: TextStyle( - color: Colors.white, - fontSize: 12, - ), - ), - ), - ], - ), - backgroundColor: Colors.red[700], - ), - ); - } - } - }, - ); + Future> _petiListAPI() async { + List petiList = await ControllerApi().fetchPetiDataAPI(); + return petiList.map((item) => PetiAssetModel.fromJson(item)).toList(); } + // Future> _petiListAPI() async { + // // Fetch data from the API + // dynamic apiPetiList = await ControllerApi().fetchPetiDataAPI(); + + // // Ensure apiPetiList is of type List + // List petiList = []; + + // if (apiPetiList is List) { + // petiList = + // apiPetiList.map((item) => PetiAssetModel.fromJson(item)).toList(); + // } + + // // Fetch data from SharedPreferences + // List sharedPreferencesPetiList = + // await getSelectedPetiListFromSharedPreferences(); + + // // Merge the lists, ensuring no duplicates + // List mergedPetiList = []; + // Set petiIds = Set(); + + // for (PetiAssetModel peti in petiList) { + // if (!petiIds.contains(peti.id)) { + // mergedPetiList.add(peti); + // petiIds.add(int.parse(peti.id.toString())); + // } + // } + + // for (PetiAssetModel peti in sharedPreferencesPetiList) { + // if (!petiIds.contains(peti.id)) { + // mergedPetiList.add(peti); + // petiIds.add(int.parse(peti.id.toString())); + // } + // } + + // return mergedPetiList; + // } + @override Widget build(BuildContext context) { AuthProvider authProvider = Provider.of(context, listen: false); UserModel user = authProvider.user; - var uuid = Uuid(); - - DateTime? parseDateTime(String? dateTimeString) { - if (dateTimeString == null || dateTimeString.isEmpty) { - return null; - } - - try { - return DateTime.parse(dateTimeString); - } catch (e) { - print('Error parsing DateTime: $e'); - return null; - } - } - Future saveAssetData() async { + print('Entering saveAssetData'); DateTime now = DateTime.now().toLocal(); String formattedDate = DateFormat('yyyy-MM-dd HH:mm:ss.SSS').format(now); - if (_exit_atController.text.isNotEmpty) { + // Cek apakah ada item yang dipilih di dalam selectedPetiList + if (selectedPetiList!.any((peti) => peti == null)) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text("Pilih setidaknya satu peti"), + backgroundColor: Colors.red, + )); + print('Exiting saveAssetData - No peti selected'); + return; + } + + // Iterasi melalui selectedPetiList + for (var peti in selectedPetiList!) { + // Buat model baru AssetStatusModel assetAddModel = AssetStatusModel( id: null, - peti_id: petiSqfliteApi!.id, - customer_id: customerSqfliteApi!.id, - warehouse_id: warehouseSqfliteApi!.id, - exit_at: parseDateTime(_exit_atController.text), - exit_pic: _penanggungJawabController.text, - exit_warehouse: warehouseTujuanSqfliteApi!.id, - est_pengembalian: parseDateTime(_est_pengembalianController.text), - created_by: user.fullname, - created_at: parseDateTime(formattedDate), - mobile_id: uuid.v4(), + peti_id: peti!.id, + // Tambahkan properti lainnya sesuai kebutuhan ); - // Call addData function - int result = await Controller().addPeminjamanData(assetAddModel); - if (result > 0) { - print("Success Tambah data"); - // print(result); - Navigator.pushNamed(context, '/peminjaman-barang'); - EasyLoading.showSuccess("Data Berhasil Disimpan"); + int index = + temporaryDataList.indexWhere((data) => data.peti_id == peti.id); + + if (index != -1) { + // Jika peti_id sudah ada, ganti entri yang sudah ada + temporaryDataList[index] = assetAddModel; } else { - print("Failed"); + // Jika peti_id belum ada, tambahkan ke dalam list + temporaryDataList.add(assetAddModel); } } + + print('Temporary data added. Length: ${temporaryDataList.length}'); + // Navigasi ke halaman selanjutnya dengan membawa data temporaryDataList + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => InformasiDataEntryPage( + temporaryDataList: temporaryDataList, + ), + ), + ); + print('Exiting saveAssetData'); + } + + Future checkAndAddPeti(PetiAssetModel value) async { + // print('Checking and adding Peti: ${value.fix_lot}'); + List assetStatusList = + await Controller().fetchAssetStatusLocalController(); + + // Ensure assetStatusList is of type List + if (assetStatusList is List) { + // Convert JSON strings to AssetStatusModel objects + assetStatusList = assetStatusList + .map((item) => + AssetStatusModel.fromJson(item as Map)) + .toList(); + } + + bool isPetiInSqflite = + assetStatusList.any((assetStatus) => assetStatus.peti_id == value.id); + + bool isPetiInLocalList = localSelectedPetiList.contains(value); + + bool isPetiInSelectedPetiList = + selectedPetiList!.any((peti) => peti.id == value.id); + + if (isPetiInSqflite) { + // print('Peti is already in Sqflite.'); + showErrorMessage( + 'Peti dengan ${value.fix_lot} sudah ada dalam daftar menu peminjaman. Harap periksa kembali.', + Colors.yellow[700]!, + ); + } else if (isPetiInSelectedPetiList || isPetiInLocalList) { + // print('Peti is already in selectedPetiList.'); + showErrorMessage( + 'Peti dengan ${value.fix_lot} sudah ada dalam daftar pilihan List Peti. Harap periksa kembali.', + Colors.yellow[700]!, + ); + } else { + // If the item passes all conditions, add it to the list + print('Adding Peti to the list.'); + setState(() { + selectedPetiList!.add(value); + saveSelectedPetiListToSharedPreferences(selectedPetiList!); + }); + } + } + +// Function to remove peti data from SharedPreferences + Future removePetiFromSharedPreferences( + PetiAssetModel removedPeti) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + + // Retrieve existing data from SharedPreferences + List? petiListJson = prefs.getStringList('selectedPetiList'); + + if (petiListJson != null) { + // Convert JSON strings to PetiAssetModel objects + List existingPetiList = petiListJson + .map((petiJson) => PetiAssetModel.fromJson(json.decode(petiJson))) + .toList(); + + // Remove the specified peti from the list + existingPetiList.removeWhere((peti) => peti.id == removedPeti.id); + + // Save the updated list back to SharedPreferences + List updatedPetiListJson = + existingPetiList.map((peti) => json.encode(peti.toJson())).toList(); + + prefs.setStringList('selectedPetiList', updatedPetiListJson); + } + } + + void removePeti(int index) async { + PetiAssetModel? selectedPeti = + selectedPetiList != null ? selectedPetiList![index] : null; + + print( + 'Before Remove: ${selectedPeti?.fix_lot}'); // Cetak atribut tertentu sebelum penghapusan + + if (index >= 0 && index < selectedPetiList!.length) { + if (mounted) { + // Simpan peti yang akan dihapus + PetiAssetModel removedPeti = selectedPetiList![index]; + + // Hapus item dari selectedPetiList + selectedPetiList!.removeAt(index); + + // Hapus entri yang sesuai dari temporaryDataList berdasarkan peti_id + temporaryDataList + .removeWhere((data) => data.peti_id == removedPeti.id); + + // Hapus data dari SharedPreferences + await removePetiFromSharedPreferences(removedPeti); + + print( + 'After Remove: ${selectedPeti?.fix_lot}'); // Cetak daftar setelah penghapusan + } + } else { + print('Invalid index: $index. Tidak ada penghapusan yang dilakukan.'); + } } var scanArea = (MediaQuery.of(context).size.width < 400 || @@ -542,6 +578,7 @@ class _CreatePeminjamanBarangState extends State { : 300.0; return Scaffold( + backgroundColor: Colors.grey[100], appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: Colors.indigo[700], @@ -559,602 +596,448 @@ class _CreatePeminjamanBarangState extends State { child: Form( key: _formKey, child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Row( - children: [ - Expanded( - child: Card( - elevation: 2, - child: Container( - margin: EdgeInsets.all(8), - child: DropdownSearch( - popupProps: PopupProps.bottomSheet( - showSearchBox: true, - itemBuilder: (context, PetiAssetModel? peti, - bool? isSelected) { - if (peti == null) { - return SizedBox.shrink(); - } - // Tentukan warna dan ikon berdasarkan kondisi status - Color bulletColor = peti.status == 'AKTIF' - ? Colors.green - : Colors.red; - IconData bulletIcon = - peti.status == 'AKTIF' - ? Icons.circle - : Icons.circle; - - return Container( - child: Column( - children: [ - ListTile( - title: Text( - peti.fix_lot.toString(), - style: TextStyle( - fontSize: 16, - fontFamily: - 'OpenSansCondensed', + Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide( + color: Colors.grey.withOpacity(0.8), + width: + 1), // Tambahkan ini untuk menambahkan border + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: + EdgeInsets.only(left: 8, right: 8, top: 13), + child: Text( + 'Add List Peti / Scan Peti:', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + ), + Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.only(left: 8), + child: FutureBuilder>( + future: _petiListAPI(), + builder: (context, + AsyncSnapshot> + snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return Center( + child: CircularProgressIndicator(), + ); + } else if (snapshot.hasError) { + return Text( + 'Error: ${snapshot.error}'); + } else { + List filteredItems = + snapshot.data?.where((peti) { + // Replace the condition with your logic + return !localSelectedPetiList + .contains( + peti.id) && + !scannedPetiList + .contains(peti.id); + }).toList() ?? + []; + return DropdownSearch( + popupProps: PopupProps.bottomSheet( + showSearchBox: true, + itemBuilder: (context, + PetiAssetModel? peti, + bool? isSelected) { + if (peti == null) { + return SizedBox.shrink(); + } + String itemAsString( + PetiAssetModel item) { + return item.fix_lot ?? ''; + } + + // Convert the item to a string for comparison + String petiAsString = + itemAsString(peti); + + // Check if the selected item is already in the list obtained from SharedPreferences + bool isPetiInSharedPreferences = + localSelectedPetiList.any( + (selectedPeti) => + itemAsString( + selectedPeti) == + petiAsString); + + // Check if the selected item is already in the list of scanned peti IDs + bool isPetiInScannedList = + scannedPetiList.any( + (scannedPeti) => + itemAsString( + scannedPeti) == + petiAsString); + + // Include the item only if it's not in either list + if (!isPetiInSharedPreferences && + !isPetiInScannedList) { + // Tentukan warna dan ikon berdasarkan kondisi status + Color bulletColor = + peti.status == 'AKTIF' + ? Colors.green + : Colors.red; + IconData bulletIcon = + peti.status == 'AKTIF' + ? Icons.circle + : Icons.circle; + + return Container( + child: Column( + children: [ + ListTile( + title: Text( + peti.fix_lot + .toString(), + style: TextStyle( + fontSize: 16, + fontFamily: + 'OpenSansCondensed', + ), + ), + leading: Icon( + bulletIcon, + color: bulletColor, + size: 24, + ), + ), + Divider( + height: 1, + color: Colors + .grey, // Warna pembatas (divider) + ), + ], + ), + color: peti.id == + petiSqfliteApi?.id + ? Colors.grey + .withOpacity(0.7) + : Colors.white, + ); + } else { + // Return an empty container for items that should be hidden + return SizedBox.shrink(); + } + }, + fit: FlexFit.loose, + title: Padding( + padding: EdgeInsets.all(8.0), + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + 'Pilih Peti', + style: TextStyle( + fontSize: 18, + fontWeight: + FontWeight + .bold), + ), + IconButton( + icon: Icon( + Icons.close, + color: Colors.red, + ), + onPressed: () { + Future.delayed( + Duration.zero, + () { + Navigator.pop( + context); + }); + }, + ), + ], + ), + Divider(), + ], ), ), - leading: Icon( - bulletIcon, - color: bulletColor, - size: 24, - ), - ), - Divider( - height: 1, - color: Colors - .grey, // Warna pembatas (divider) ), - ], - ), - color: peti.id == petiSqfliteApi?.id - ? Colors.grey.withOpacity(0.7) - : Colors.white, - ); - }, - fit: FlexFit.loose, - title: Padding( - padding: EdgeInsets.all(8.0), - child: Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - 'Pilih Peti', - style: TextStyle( - fontSize: 18, - fontWeight: - FontWeight.bold), - ), - IconButton( - icon: Icon( - Icons.close, - color: Colors.red, + dropdownDecoratorProps: + DropDownDecoratorProps( + dropdownSearchDecoration: + InputDecoration( + hintText: 'Pilih Peti', + border: OutlineInputBorder( + borderRadius: + BorderRadius.all( + Radius.circular(5.0), + ), ), - onPressed: () { - Navigator.pop(context); - }, ), - ], - ), - Divider(), - ], - ), + ), + items: filteredItems, + itemAsString: + (PetiAssetModel item) => + item.fix_lot ?? '', + onBeforeChange: + (PetiAssetModel? from, + PetiAssetModel? to) async { + // The logic here should remain the same + bool isPetiInSharedPreferences = + localSelectedPetiList + .contains(to); + bool isPetiInScannedList = + scannedPetiList + .contains(to?.id); + + if (isPetiInSharedPreferences || + isPetiInScannedList) { + showErrorMessage( + 'Peti dengan ${to?.fix_lot} sudah ada dalam daftar pilihan List Peti. Harap periksa kembali.', + Colors.yellow[700]!, + ); + + // Wait for a short time to display the error message before returning false + await Future.delayed(Duration( + milliseconds: 500)); + return false; // Cancel the change + } + + return true; // Allow the change + }, + onChanged: + (PetiAssetModel? value) async { + if (value != null) { + bool isPetiInSharedPreferences = + localSelectedPetiList + .contains(value); + bool isPetiInScannedList = + scannedPetiList + .contains(value.id); + + if (isPetiInSharedPreferences || + isPetiInScannedList) { + print( + 'Peti is already in SharedPreferences or Scanned List.'); + showErrorMessage( + 'Peti dengan ${value.fix_lot} sudah ada dalam daftar pilihan List Peti. Harap periksa kembali.', + Colors.yellow[700]!, + ); + } else { + // Move the asynchronous work outside the setState + await checkAndAddPeti(value); + } + } + }, + ); + } + }, ), ), - - dropdownDecoratorProps: - DropDownDecoratorProps( - dropdownSearchDecoration: InputDecoration( - labelText: 'Pilih Peti', - border: OutlineInputBorder( - borderRadius: BorderRadius.all( - Radius.circular(5.0), - ), - ), + ), + SizedBox(width: 8), // Spacer antara dua card + Container( + margin: EdgeInsets.all(8), + height: + MediaQuery.of(context).size.height / 10, + decoration: BoxDecoration( + color: Colors.indigoAccent, + borderRadius: BorderRadius.circular(15), + border: Border.all( + color: Colors.white, + width: 3, ), ), - - items: (isQRCodeScanned - ? _filteredPetiList - : (_valpeti ?? []).where((peti) => - peti.deleted_at != true && - (peti.warehouse_id == - user.warehouse_id) && - (peti.status == 'AKTIF'))) - .where((peti) => peti.fix_lot! - .toLowerCase() - .contains(searchBoxController.text - .toLowerCase())) - .toList() ?? - [], - // searchBoxController: searchBoxController, - itemAsString: (PetiAssetModel item) => - item.fix_lot ?? - "", // Ganti dengan properti yang sesuai - - selectedItem: petiSqfliteApi, - - onChanged: (PetiAssetModel? value) { - setState(() { - petiSqfliteApi = value; - if (value != null) { - warehouseSqfliteApi = _valwarehouse - ?.firstWhere((warehouse) => - warehouse.id == - value.warehouse_id); - customerSqfliteApi = _valcustomer - ?.firstWhereOrNull((customer) => - customer.id == - value.customer_id); - - // Perbarui _unrestrictedPetiList sesuai pemilihan manual - _unrestrictedPetiList = [ - _valpeti!.firstWhere( - (peti) => peti.id == value.id) - ]; - } - }); - }, - validator: (PetiAssetModel? value) { - if (value == null) { - return 'Harus diisi'; - } - return null; - }, - ), - ), - ), - ), - SizedBox(width: 8), // Spacer antara dua card - Card( - elevation: 2, - child: Container( - margin: EdgeInsets.all(8), - height: MediaQuery.of(context).size.height / 10, - decoration: BoxDecoration( - color: Colors.indigoAccent, - borderRadius: BorderRadius.circular(5), - ), - child: IconButton( - onPressed: () { - showModalBottomSheet( - context: context, - isScrollControlled: - true, // Set modal menjadi fullscreen - builder: (BuildContext context) { - return Stack( - alignment: Alignment.center, - children: [ - Container( - height: double.infinity, - width: double.infinity, - child: QRView( - key: qrKey, - onQRViewCreated: _onQRViewCreated, - overlay: QrScannerOverlayShape( - borderColor: Colors.red, - borderRadius: 10, - borderLength: 30, - borderWidth: 10, - cutOutSize: scanArea, - ), - ), - ), - Positioned( - bottom: 30, - height: 60, - child: Container( - height: - 60, // Lebar dan tinggi sesuai kebutuhan - width: 60, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors - .red, // Warna merah untuk close + child: IconButton( + onPressed: () { + showModalBottomSheet( + context: context, + isScrollControlled: + true, // Set modal menjadi fullscreen + builder: (BuildContext context) { + return Stack( + alignment: Alignment.center, + children: [ + Container( + height: double.infinity, + width: double.infinity, + child: QRView( + key: qrKey, + onQRViewCreated: + _onQRViewCreated, + overlay: + QrScannerOverlayShape( + borderColor: Colors.red, + borderRadius: 10, + borderLength: 30, + borderWidth: 10, + cutOutSize: scanArea, + ), + ), ), - - child: IconButton( - onPressed: () { - Navigator.of(context).pop(); - }, - icon: Icon( - Icons.close, - size: 40, + Positioned( + bottom: 30, + height: 60, + child: Container( + height: + 60, // Lebar dan tinggi sesuai kebutuhan + width: 60, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors + .red, // Warna merah untuk close + ), + child: IconButton( + onPressed: () { + Navigator.of(context) + .pop(); + }, + icon: Icon( + Icons.close, + size: 40, + ), + color: Colors.white, + ), ), - color: Colors.white, ), - ), - ), - ], + ], + ); + }, ); }, - ); - }, - icon: Icon( - Icons.qr_code, - size: 30, - ), - color: Colors.white, // Warna ikon - ), - ), - ), - ], - ), - SizedBox(height: 16), - Card( - elevation: 2, - child: Padding( - padding: const EdgeInsets.all(8), - child: DropdownSearch( - dropdownDecoratorProps: DropDownDecoratorProps( - dropdownSearchDecoration: InputDecoration( - labelText: 'Pilih Customer', - border: OutlineInputBorder( - borderRadius: BorderRadius.all( - Radius.circular(5.0), - ), - ), - ), - ), - popupProps: PopupProps.bottomSheet( - showSearchBox: true, - itemBuilder: (context, CustomerModel? customer, - bool? isSelected) { - if (customer == null) { - return SizedBox.shrink(); - } - - return Container( - child: Column( - children: [ - ListTile( - title: Text( - customer.name.toString(), - style: TextStyle( - fontSize: 16, - fontFamily: 'OpenSansCondensed', - ), - ), - leading: Icon( - Icons.person_pin, - size: 24, - color: customer.id == - customerSqfliteApi?.id - ? Colors.indigo[700] - : Colors.grey, - ), - ), - Divider( - height: 1, - color: Colors - .grey, // Warna pembatas (divider) - ), - ], - ), - color: customer.id == customerSqfliteApi?.id - ? Colors.grey.withOpacity(0.7) - : Colors.white, - ); - }, - fit: FlexFit.loose, - title: Padding( - padding: EdgeInsets.all(8.0), - child: Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Text( - 'Pilih Customer', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.bold), - ), - IconButton( - icon: Icon( - Icons.close, - color: Colors.red, - ), - onPressed: () { - Navigator.pop(context); - }, - ), - ], + icon: Icon( + Icons.qr_code, + size: 30, ), - Divider(), - ], - ), - ), - ), - - items: (_valcustomer ?? []) - .where((customer) => - customer.deleted_at != true) - .where((customer) => customer.name! - .toLowerCase() - .contains(searchBoxController.text - .toLowerCase())) - .toList() ?? - [], - itemAsString: (CustomerModel customer) => - customer.name ?? - "", // Ganti dengan properti yang sesuai - selectedItem: customerSqfliteApi, - onChanged: (CustomerModel? value) { - setState(() { - customerSqfliteApi = value; - }); - }, - validator: (CustomerModel? value) { - if (value == null) { - return 'Harus diisi'; - } - return null; - }, - ), - ), - ), - SizedBox(height: 16), - Card( - elevation: 2, - child: Padding( - padding: const EdgeInsets.all(8), - child: FormBuilderDateTimePicker( - validator: (value) { - if (_exit_atController.text.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - backgroundColor: Colors.redAccent[700], - content: Row( - children: [ - Icon( - Icons.error_outline, - color: Colors.white, - ), - SizedBox(width: 5), - Text('Tanggal Peminjaman harus diisi'), - ], - ), - duration: Duration(seconds: 2), + color: Colors.white, // Warna ikon ), - ); - return null; // Return null jika ada kesalahan - } - return null; // Return null jika tidak ada kesalahan - }, - controller: _exit_atController, - name: 'tanggal_peminjaman', - inputType: InputType.date, - format: DateFormat('yyyy-MM-dd', 'id_ID'), - decoration: InputDecoration( - labelText: 'Tanggal Peminjaman', - border: OutlineInputBorder(), - suffixIcon: Icon(Icons.calendar_today), + ), + ], ), - onChanged: (DateTime? selectedDate) { - if (selectedDate != null) { - // Mengisi tanggal estimasi 7 hari ke depan - DateTime estimasiPengembalian = - selectedDate.add(Duration(days: 7)); - _est_pengembalianController.text = - DateFormat('yyyy-MM-dd') - .format(estimasiPengembalian); - } - }, - ), + ], ), ), - SizedBox(height: 16), - Card( - elevation: 2, + Divider(), + SizedBox(height: 8), + Visibility( + visible: selectedPetiList!.isEmpty == false, child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(height: 8), Container( - margin: EdgeInsets.only( - left: 8), // Atur nilai left sesuai kebutuhan - child: Align( - alignment: Alignment.centerLeft, - child: Text( - '* Terisi otomatis 7 hari setelah tanggal peminjaman', - style: TextStyle( - fontSize: 12, - color: Colors.red, - fontStyle: FontStyle.italic), + margin: EdgeInsets.only(left: 8, bottom: 8), + child: Text( + 'List Peti:', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, ), ), ), - SizedBox(height: 8), - Padding( - padding: const EdgeInsets.all(8), - child: FormBuilderDateTimePicker( - validator: (value) { - if (_est_pengembalianController - .text.isEmpty) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - backgroundColor: Colors.redAccent[700], - content: Row( - children: [ - Icon( - Icons.error_outline, - color: Colors.white, + Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide( + color: Colors.grey.withOpacity(0.8), + width: + 1), // Tambahkan ini untuk menambahkan border + ), + child: Container( + margin: EdgeInsets.all(8), + child: ListView.builder( + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: selectedPetiList!.length, + itemBuilder: (BuildContext context, int i) { + return Container( + margin: EdgeInsets.only(bottom: 8), + padding: EdgeInsets.all(8), + child: Row( + children: [ + Text( + '${i + 1}.', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(width: 8), + Expanded( + child: Container( + padding: EdgeInsets.all(8.0), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(5.0), + border: Border.all( + color: Colors.grey), + ), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + selectedPetiList![i] + ?.fix_lot ?? + 'Belum dipilih', + style: TextStyle( + fontSize: 16, + fontFamily: + 'OpenSansCondensed'), + ), + ], + ), + ), + ), + Container( + margin: EdgeInsets.only(left: 8), + width: 30, + height: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: InkWell( + onTap: () { + setState(() { + removePeti(i); + }); + }, + child: Center( + child: Icon( + Icons.delete, + color: Colors.white, + ), + ), ), - SizedBox(width: 5), - Text( - 'Tanggal Estimasi Pengembalian harus diisi'), - ], - ), - duration: Duration(seconds: 2), + ), + ], ), ); - return null; // Return null jika ada kesalahan - } - return null; // Return null jika tidak ada kesalahan - }, - controller: _est_pengembalianController, - name: 'estimasi_pengembalian', - inputType: InputType.date, - format: DateFormat('yyyy-MM-dd', 'id_ID'), - decoration: InputDecoration( - labelText: 'Estimasi Tanggal Pengembalian', - border: OutlineInputBorder(), - suffixIcon: Icon(Icons.calendar_today), + }, ), ), ), ], ), ), - SizedBox(height: 16), - Card( - elevation: 2, - child: Padding( - padding: const EdgeInsets.all(8), - child: TextFormField( - controller: _penanggungJawabController = - TextEditingController(text: user.fullname), - decoration: InputDecoration( - labelText: 'Penanggung Jawab', - border: OutlineInputBorder(), - ), - validator: (value) { - if (value == null || value.isEmpty) { - return 'Harus diisi'; - } - return null; // Return null jika tidak ada kesalahan - }, - ), - ), - ), - SizedBox(height: 13), - Card( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: DropdownButtonFormField( - validator: (value) { - if (value == null) { - return 'Harus diisi'; - } - return null; - }, - decoration: InputDecoration( - labelText: 'Asal Gudang', - border: OutlineInputBorder(), - ), - hint: Text("Asal Gudang"), - value: warehouseSqfliteApi, - items: (_valwarehouse ?? []) - .where((warehouse) => - warehouse.deleted_at != true) - .map((WarehouseModel warehouse) - // _valwarehouse?.map((WarehouseModel warehouse) - { - return DropdownMenuItem( - child: Row( - children: [ - Icon( - Icons.warehouse, - color: warehouse.id == - warehouseSqfliteApi?.id - ? Colors.indigo[700] - : Colors.grey, - ), - SizedBox( - width: - 8), // Jarak antara ikon dan teks - Text( - '${warehouse.name}', - style: TextStyle( - fontSize: 16, - fontFamily: 'OpenSansCondensed', - ), - ), - ], - ), - value: warehouse, - ); - }).toList() ?? - [], - onChanged: (WarehouseModel? value) { - setState(() { - warehouseSqfliteApi = value; - }); - }, - ), - ), - ), - SizedBox(height: 13), - Card( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: DropdownButtonFormField( - validator: (value) { - if (value == null) { - return 'Harus diisi'; - } - return null; - }, - decoration: InputDecoration( - labelText: 'Tujuan Gudang', - border: OutlineInputBorder(), - ), - hint: Text("Tujuan Gudang"), - value: warehouseTujuanSqfliteApi, - items: (_valwarehouse ?? []) - .where((warehouseTujuan) => - warehouseTujuan.deleted_at != true) - .map((WarehouseModel warehouseTujuan) - // _valwarehouse?.map((WarehouseModel warehouse) - { - return DropdownMenuItem( - child: Row( - children: [ - Icon( - Icons.local_shipping, - color: warehouseTujuan.id == - warehouseTujuanSqfliteApi?.id - ? Colors.green[700] - : Colors.grey, - ), - SizedBox( - width: - 8), // Jarak antara ikon dan teks - Text( - '${warehouseTujuan.name}', - style: TextStyle( - fontSize: 16, - fontFamily: 'OpenSansCondensed', - ), - ), - ], - ), - value: warehouseTujuan, - ); - }).toList() ?? - [], - onChanged: (WarehouseModel? value) { - setState(() { - warehouseTujuanSqfliteApi = value; - }); - }, - ), - ), - ), ], ), ), ), ), bottomNavigationBar: BottomAppBar( - height: MediaQuery.of(context).size.height / 8, - color: Color.fromARGB(255, 5, 28, 158), // Warna latar belakang + height: MediaQuery.of(context).size.height / 10, + color: Color.fromARGB(255, 5, 28, 158), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -1172,7 +1055,7 @@ class _CreatePeminjamanBarangState extends State { ), child: IconButton( onPressed: () { - Navigator.pushNamed(context, '/peminjaman-barang'); + Navigator.pop(context); }, icon: Icon(Icons.close, color: Colors.white), ), @@ -1186,25 +1069,31 @@ class _CreatePeminjamanBarangState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Container( - height: 50, // Lebar dan tinggi sesuai kebutuhan + height: 50, width: 50, decoration: BoxDecoration( shape: BoxShape.circle, - color: Colors.green, // Warna hijau untuk save + color: Colors.blue, ), child: IconButton( onPressed: () async { - if (_formKey.currentState!.validate()) { - try { - if (_exit_atController.text.isNotEmpty && - petiSqfliteApi != null && - warehouseSqfliteApi != null) { - await saveAssetData(); - } - } catch (e) { - print('Error storing data: $e'); - } + // Cek apakah ada setidaknya satu peti terpilih + if (selectedPetiList!.isEmpty || + selectedPetiList!.any((peti) => peti == null)) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text( + "Tidak ada peti yang dipilih", + style: TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + backgroundColor: Colors.yellow[700], + )); + return; } + + await saveAssetData(); }, icon: Icon(Icons.save, color: Colors.white), ), diff --git a/lib/pages/peminjaman_barang/peminjaman_stock_page.dart b/lib/pages/peminjaman_barang/peminjaman_stock_page.dart index 852a539..d582380 100644 --- a/lib/pages/peminjaman_barang/peminjaman_stock_page.dart +++ b/lib/pages/peminjaman_barang/peminjaman_stock_page.dart @@ -5,6 +5,8 @@ import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:data_table_2/data_table_2.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:intl/date_symbol_data_local.dart'; +import 'package:shimmer/shimmer.dart'; import 'package:siopas/models/customer_model.dart'; import 'package:siopas/models/disposal_model.dart'; import 'package:siopas/models/m_asset_status_model.dart'; @@ -20,12 +22,16 @@ import 'package:siopas/models/asset_status_model.dart'; import 'package:siopas/providers/asset_status_provider.dart'; import 'package:collection/collection.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; import '../../models/condition_peti_model.dart'; +import '../../widget/loading_shimmer_show.dart'; +import '../home/controller/home_controller.dart'; import 'show.dart'; class AssetStatusPage extends StatefulWidget { - const AssetStatusPage({super.key}); + AssetStatusPage({super.key}); + final ControllerHome controllerHome = ControllerHome(); // Declare here @override State createState() => AssetStatusPageState(); @@ -57,6 +63,8 @@ class AssetStatusPageState extends State { Timer? _timer; + String _searchQuery = ''; + int _peminjamanCount = 0; bool _isLoading = false; @override @@ -65,9 +73,11 @@ class AssetStatusPageState extends State { _getUserToken(); // Mengatur _isLoading ke true sebelum tugas dimulai - setState(() { - _isLoading = true; - }); + if (mounted) { + setState(() { + _isLoading = true; + }); + } Future.wait([ warehouseListAPI(), @@ -79,11 +89,15 @@ class AssetStatusPageState extends State { datatablesTipePetiList(), datatablesCustomerList(), datatablesWarehouseList(), + _initData(), + initializeDateFormatting('id_ID', null), ]).then((_) { // Mengatur _isLoading ke false setelah semua tugas selesai - setState(() { - _isLoading = false; - }); + if (mounted) { + setState(() { + _isLoading = false; + }); + } }); // Inisialisasi _data di sini jika diperlukan @@ -99,6 +113,15 @@ class AssetStatusPageState extends State { } } + Future _initData() async { + try { + _peminjamanCount = await widget.controllerHome.getPeminjamanCount(); + } catch (error) { + print('Error fetching peminjamanCount: $error'); + } + // ... tambahkan inisialisasi lainnya + } + // Reinit atau Upload Only ------------------------------------------------------------------------ Future warehouseListAPI() async { if (mounted) { @@ -113,19 +136,6 @@ class AssetStatusPageState extends State { } } - // Future disposalListAPI() async { - // if (mounted) { - // await ControllerApi().fetchDisposalDataAPI().then((value) { - // setState(() { - // _valdisposal = (value as List) - // .map((item) => DisposalPetiModel.fromJson(item)) - // .toList(); - // loading = false; - // }); - // }); - // } - // } - Future typePetiListAPI() async { if (mounted) { await ControllerApi().fetchTipePetiDataAPI().then((value) { @@ -165,17 +175,6 @@ class AssetStatusPageState extends State { } } - // Future reinitAssetStatusApi() async { - // EasyLoading.show(status: 'Mengambil data Asset Status...'); - // List assetStatusApiData = - // await SyncronizationDataAPI().fetchAssetStatusFromApi(); - // await ControllerApi() - // .deleteAllAssetStatusDataAPI(); // Clear existing data in SQLite - // await ControllerApi() - // .addAllAssetStatusDataAPI(assetStatusApiData); // Add new data to SQLite - // EasyLoading.dismiss(); - // } - Future reinitWarehouseApi() async { EasyLoading.show(status: 'Mengambil data Warehouse...'); List warehouseApiData = @@ -237,15 +236,6 @@ class AssetStatusPageState extends State { EasyLoading.dismiss(); } - // Future reinitDisposalApi() async { - // List disposalApiData = - // await SyncronizationDataAPI().fetchDisposalFromApi(); - // await ControllerApi() - // .deleteAllDisposalDataAPI(); // Clear existing data in SQLite - // await ControllerApi() - // .addAllDisposalDataAPI(disposalApiData); // Add new data to SQLite - // } - Future fetchDataFromApiAndSync() async { EasyLoading.show(status: 'Mengambil data dari Server...'); await Future.delayed(Duration(seconds: 3)); @@ -253,13 +243,10 @@ class AssetStatusPageState extends State { try { await syncToMysql(); - // await reinitAssetStatusApi(); await reinitWarehouseApi(); await reinitPetiApi(); await reinitCustomerApi(); - // await reinitTypePetiApi(); await reinitConditionPetiApi(); - // await reinitDisposalApi(); await datatablesAssetStatusList(); EasyLoading.showSuccess('Data berhasil diperbarui'); @@ -309,502 +296,772 @@ class AssetStatusPageState extends State { if (connection) { print("Internet connection available"); } else { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar(content: Text("No Internet"))); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("Tidak ada koneksi internet"))); } }); } // Datatables ------------------------------------------------------------------------ Future datatablesAssetStatusList() async { - await Controller().fetchAssetStatusLocalController().then((value) { - setState(() { - _data = (value as List) - .map((e) => AssetStatusModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await Controller().fetchAssetStatusLocalController().then((value) { + setState(() { + _data = (value as List) + .map((e) => AssetStatusModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesPetiList() async { - await Controller().fetchPetiData().then((value) { - setState(() { - _petiData = (value as List) - .map((e) => PetiAssetModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await Controller().fetchPetiData().then((value) { + setState(() { + _petiData = (value as List) + .map((e) => PetiAssetModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesTipePetiList() async { - await Controller().fetchTipePetiData().then((value) { - setState(() { - _tipePetiData = (value as List) - .map((e) => TypePetiModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await Controller().fetchTipePetiData().then((value) { + setState(() { + _tipePetiData = (value as List) + .map((e) => TypePetiModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesCustomerList() async { - await Controller().fetchCustomerData().then((value) { - setState(() { - _customerData = (value as List) - .map((e) => CustomerModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await Controller().fetchCustomerData().then((value) { + setState(() { + _customerData = (value as List) + .map((e) => CustomerModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesWarehouseList() async { - await Controller().fetchWarehouseData().then((value) { - setState(() { - _warehouseData = (value as List) - .map((e) => WarehouseModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await Controller().fetchWarehouseData().then((value) { + setState(() { + _warehouseData = (value as List) + .map((e) => WarehouseModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } - void _loadMoreData() { - if (mounted && !_isLoading) { - setState(() { - _currentPage++; - }); - datatablesAssetStatusList(); + String _formatDate(String? date) { + if (date != null) { + DateTime parsedDate = DateTime.parse(date); + String formattedDate = + DateFormat('EEEE, dd MMMM yyyy', 'id_ID').format(parsedDate); + return formattedDate; + } else { + return ''; } } + List get _filteredData { + return _data != null + ? _data!.where((item) { + // Sesuaikan dengan properti yang ingin Anda cari + return item.exit_pic! + .toLowerCase() + .contains(_searchQuery.toLowerCase()) || + _formatDate(item.exit_at.toString()) + .toLowerCase() + .contains(_searchQuery.toLowerCase()) || + _formatDate(item.est_pengembalian.toString()) + .toLowerCase() + .contains(_searchQuery.toLowerCase()) || + (_petiData?.firstWhere((peti) => peti.id == item.peti_id, orElse: () => PetiAssetModel(fix_lot: ''))?.fix_lot ?? '') + .toLowerCase() + .contains(_searchQuery.toLowerCase()) || + (_customerData + ?.firstWhere( + (customer) => customer.id == item.customer_id, + orElse: () => CustomerModel(name: '')) + ?.name ?? + '') + .toLowerCase() + .contains(_searchQuery.toLowerCase()) || + (_warehouseData + ?.firstWhere( + (warehouse) => warehouse.id == item.warehouse_id, + orElse: () => WarehouseModel(name: '')) + ?.name ?? + '') + .toLowerCase() + .contains(_searchQuery.toLowerCase()); + }).toList() + : []; + } + @override Widget build(BuildContext context) { // Add this function outside the build method - void showSyncDialog(BuildContext context) { - showDialog( - context: context, - builder: (BuildContext context) { - return Dialog( - // Dialog shape and style - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - backgroundColor: Colors.grey[100], - elevation: 0, - - // Dialog content - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // Dialog title with close button - Container( - width: double.infinity, - color: Colors.indigo[700], // Indigo background - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: Text( - "Sync Server Peminjaman", - style: TextStyle( - color: Colors.white, - fontWeight: FontWeight.bold, - fontSize: 16.0, - ), - ), - ), - IconButton( - icon: Icon( - Icons.close, - color: Colors.white, - ), - onPressed: () { - Navigator.pop(context); // Close dialog - }, - ), - ], - ), - ), - - // Divider - Divider( - height: 1, - thickness: 1, - color: Colors.black, // Black divider - ), - - // Re-init Button - Container( - width: double.infinity, - child: TextButton( - onPressed: () { - Navigator.pop(context); // Close dialog - fetchDataFromApiAndSync(); - }, - child: Text( - "Upload + Download", - style: TextStyle( - color: Colors.black, - fontSize: 16.0, - fontFamily: 'Poppins', - ), - ), - ), - ), - - // Divider - // Divider( - // height: 1, - // thickness: 1, - // color: Colors.black, // Black divider - // ), - - // Upload Only Button - // Container( - // width: double.infinity, - // child: TextButton( - // onPressed: () { - // Navigator.pop(context); // Close dialog - // syncToMysql(); - // }, - // child: Text( - // "Upload Only", - // style: TextStyle( - // color: Colors.black, - // fontSize: 16.0, - // fontFamily: 'Poppins', - // ), - // ), - // ), - // ), - ], - ), - ); - }, - ); - } + // void showSyncDialog(BuildContext context) { + // showDialog( + // context: context, + // builder: (BuildContext context) { + // return Dialog( + // // Dialog shape and style + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(16), + // ), + // backgroundColor: Colors.grey[100], + // elevation: 0, + + // // Dialog content + // child: Column( + // mainAxisSize: MainAxisSize.min, + // children: [ + // // Dialog title with close button + // Container( + // width: double.infinity, + // color: Colors.indigo[700], // Indigo background + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Padding( + // padding: const EdgeInsets.all(16.0), + // child: Text( + // "Sync Server Peminjaman", + // style: TextStyle( + // color: Colors.white, + // fontWeight: FontWeight.bold, + // fontSize: 16.0, + // ), + // ), + // ), + // IconButton( + // icon: Icon( + // Icons.close, + // color: Colors.white, + // ), + // onPressed: () { + // Navigator.pop(context); // Close dialog + // }, + // ), + // ], + // ), + // ), + + // // Divider + // Divider( + // height: 1, + // thickness: 1, + // color: Colors.black, // Black divider + // ), + + // // Re-init Button + // Container( + // width: double.infinity, + // child: TextButton( + // onPressed: () { + // Navigator.pop(context); // Close dialog + // fetchDataFromApiAndSync(); + // }, + // child: Text( + // "Upload + Download", + // style: TextStyle( + // color: Colors.black, + // fontSize: 16.0, + // fontFamily: 'Poppins', + // ), + // ), + // ), + // ), + // ], + // ), + // ); + // }, + // ); + // } return DefaultTabController( length: 1, child: Scaffold( - appBar: AppBar( - backgroundColor: Colors.indigo[700], - elevation: 0, - title: Text('Data Peminjaman Peti', - style: TextStyle( - fontSize: 16, - )), - actions: [ - IconButton( - icon: Icon(Icons.backup), - onPressed: () async { - if (await SyncronizationPeminjamanData.isInternet()) { - // Display custom dialog when the IconButton is pressed - showSyncDialog(context); - } else { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text("No internet connection")), - ); - } + appBar: appBarPeminjaman(context), + body: _isLoading + ? Column( + children: [ + // shimmerSearch(), + Expanded( + child: ListView.builder( + itemCount: + 4, // Set the number of shimmer cards based on your data count + itemBuilder: (context, index) { + return ShimmerLoadingAssetStatusCard(); + }, + ), + ), + ], + ) + : bodyPeminjaman(), + bottomNavigationBar: bottomAppBar(context), + ), + ); + } + + BottomAppBar bottomAppBar(BuildContext context) { + return BottomAppBar( + color: Color.fromARGB(255, 5, 28, 158), // Warna latar belakang + child: Container( + height: 65.0, + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + InkWell( + customBorder: CircleBorder(), + onTap: () { + // Aksi ketika ikon diklik + Navigator.pushNamed(context, '/peminjaman-barang/create'); }, + child: Container( + width: 45, + height: 45, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.greenAccent[700], + ), + child: Icon( + Icons.add, + size: 30, + color: Colors.white, + ), + ), ), ], - leading: IconButton( - icon: Icon(Icons.arrow_back, color: Colors.white), - onPressed: () { - Navigator.pushNamed(context, '/home'); - }, - ), - bottom: TabBar( - indicator: BoxDecoration(color: Color.fromARGB(255, 50, 39, 122)), - tabs: [ - Tab(text: 'Peminjaman Hari ini'), + ), + ), + ); + } + + Column bodyPeminjaman() { + return Column( + children: [ + // Container( + // margin: EdgeInsets.only(top: 7, bottom: 7), + // child: Padding( + // padding: const EdgeInsets.symmetric(horizontal: 16), + // child: TextField( + // style: TextStyle(fontSize: 16), + // decoration: InputDecoration( + // hintText: 'Masukkan data pencarian...', + // prefixIcon: Icon(Icons.search), + // border: InputBorder.none, + // enabledBorder: OutlineInputBorder( + // borderRadius: BorderRadius.circular(12), + // borderSide: BorderSide(color: Colors.grey, width: 1.0), + // ), + // focusedBorder: OutlineInputBorder( + // borderRadius: BorderRadius.circular(12), + // borderSide: BorderSide(color: Colors.indigo, width: 1.0), + // ), + // contentPadding: EdgeInsets.all(16), + // labelStyle: TextStyle( + // color: Colors.grey, + // fontSize: 16, + // ), + // hintStyle: TextStyle( + // color: Colors.grey, + // fontSize: 16, + // ), + // prefixIconConstraints: BoxConstraints( + // minWidth: 40, + // ), + // suffixIcon: _searchQuery.isNotEmpty + // ? IconButton( + // icon: Icon(Icons.clear), + // onPressed: () { + // setState(() { + // _searchQuery = ''; + // }); + // }, + // ) + // : null, + // ), + // onChanged: (value) { + // setState(() { + // _searchQuery = value; + // }); + // }, + // ), + // ), + // ), + Expanded( + child: TabBarView( + children: [ + SingleChildScrollView( + child: Column( + children: _filteredData.isNotEmpty + ? _filteredData.asMap().entries.map((entry) { + final index = entry.key + 1; + final item = entry.value; + + return AssetStatusCard( + assetStatus: item, + petiData: _petiData ?? [], + tipePetiData: _tipePetiData ?? [], + customerData: _customerData ?? [], + warehouseData: _warehouseData ?? [], + index: index, + ); + }).toList() + // : [Text('No results')], + : [ + Center( + child: Column( + children: [ + Image.asset( + 'assets/item/empty.png', + width: 250, // Set the width as needed + height: 250, // Set the height as needed + ), + Text( + 'Tidak ada data ditemukan', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ], + ), + ), ], ), ), - body: _isLoading - ? Center( - child: LoadingAnimationWidget.staggeredDotsWave( - color: Colors.indigo, - size: 40, - ), - ) - : TabBarView( + ], + ); + } + + AppBar appBarPeminjaman(BuildContext context) { + Future peminjamanCount = widget.controllerHome.getPeminjamanCount(); + + return AppBar( + backgroundColor: Colors.indigo[700], + elevation: 0, + title: Text('Data Peminjaman Peti', + style: TextStyle( + fontSize: 16, + )), + // actions: [ + // IconButton( + // icon: Icon(Icons.backup), + // onPressed: () async { + // if (await SyncronizationPeminjamanData.isInternet()) { + // // Display custom dialog when the IconButton is pressed + // showSyncDialog(context); + // } else { + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar(content: Text("Tidak ada koneksi internet")), + // ); + // } + // }, + // ), + // ], + leading: IconButton( + icon: Icon(Icons.arrow_back, color: Colors.white), + onPressed: () { + Navigator.pushNamed(context, '/home'); + }, + ), + bottom: TabBar( + indicator: BoxDecoration( + color: Color.fromARGB(255, 255, 165, 9), + ), + tabs: [ + Tab( + height: 65, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(0), + border: Border.all(color: Colors.grey, width: 1.0), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SingleChildScrollView( - child: Column( - children: [ - SizedBox( - width: double.infinity, - child: PaginatedDataTable( - // header: Text('Searching'), // Removed const - rowsPerPage: _pageSize, - availableRowsPerPage: [10, 25, 50], // Removed const - onRowsPerPageChanged: (value) { - setState(() { - _pageSize = value!; - }); - }, - columns: [ - DataColumn(label: Text('No')), - DataColumn(label: Text('')), - DataColumn(label: Text('Kode Peti')), - DataColumn(label: Text('Nama Customer')), - DataColumn(label: Text('Tgl Peminjaman')), - DataColumn(label: Text('Est Peminjaman')), - DataColumn(label: Text('PJ Peminjaman')), - DataColumn(label: Text('Asal Gudang')), - DataColumn(label: Text('Tujuan Gudang')), - ], - source: _DataSourceLokal( - data: _data!, - context: context, - petiData: _petiData != null ? _petiData : [], - tipePetiData: - _tipePetiData != null ? _tipePetiData : [], - customerData: - _customerData != null ? _customerData : [], - warehouseData: - _warehouseData != null ? _warehouseData : [], - ), - ), + Expanded( + child: TextField( + style: TextStyle(fontSize: 18), + decoration: InputDecoration( + hintText: 'Masukkan data pencarian...', + prefixIcon: Icon(Icons.search), + border: InputBorder.none, + contentPadding: EdgeInsets.all(10), + labelStyle: TextStyle( + color: Colors.grey, + fontSize: 12, ), - ], + hintStyle: TextStyle( + color: Colors.grey, + fontSize: 12, + ), + // suffixIcon: _searchQuery.isNotEmpty + // ? IconButton( + // icon: Icon(Icons.clear), + // onPressed: () { + // setState(() { + // // _searchQuery = null; // Mengganti dengan null + // }); + // }, + // ) + // : null, + ), + onChanged: (value) { + setState(() { + _searchQuery = value.isNotEmpty + ? value + : ''; // Memperbarui dengan null jika value kosong + }); + }, ), ), + Text( + 'Total: $_peminjamanCount', + style: TextStyle(color: Colors.black), + ), ], ), - bottomNavigationBar: BottomAppBar( - color: Color.fromARGB(255, 5, 28, 158), // Warna latar belakang - child: Container( - height: 65.0, - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - InkWell( - customBorder: CircleBorder(), - onTap: () { - // Aksi ketika ikon diklik - Navigator.pushNamed(context, '/peminjaman-barang/create'); - }, - child: Container( - width: 45, - height: 45, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.greenAccent[700], - ), - child: Icon( - Icons.add, - size: 30, - color: Colors.white, - ), - ), - ), - ], ), ), - ), + ], ), ); } } -class _DataSourceLokal extends DataTableSource { - final List data; - List? petiData; - List? tipePetiData; - List? customerData; - List? warehouseData; - final BuildContext context; +class AssetStatusCard extends StatelessWidget { + final AssetStatusModel assetStatus; + final List petiData; + final List tipePetiData; + final List customerData; + final List warehouseData; + final int index; // Tambahkan parameter nomor urutan - _DataSourceLokal({ - required this.data, + AssetStatusCard({ + required this.assetStatus, required this.petiData, required this.tipePetiData, required this.customerData, required this.warehouseData, - required this.context, + required this.index, // Inisialisasi parameter nomor urutan }); + @override - DataRow? getRow(int index) { - if (index >= data.length) { - return null; - } + Widget build(BuildContext context) { + PetiAssetModel? petiSqfliteApi = petiData.firstWhereOrNull( + (peti) => peti.id == assetStatus.peti_id, + ); + + TypePetiModel? tipePetiSqfliteApi = tipePetiData.firstWhereOrNull( + (tipePeti) => tipePeti.id == petiSqfliteApi?.tipe_peti_id, + ); + + CustomerModel? customerSqfliteApi = customerData.firstWhereOrNull( + (customer) => customer.id == assetStatus.customer_id, + ); + + WarehouseModel? warehouseSqfliteApi = warehouseData.firstWhereOrNull( + (warehouse) => warehouse.id == assetStatus.warehouse_id, + ); - data.sort((a, b) { - if (a.created_at == null && b.created_at == null) { - return 0; // Both dates are null, consider them equal - } else if (a.created_at == null) { - return 1; // Null is considered greater than non-null - } else if (b.created_at == null) { - return -1; // Non-null is considered smaller than null + // WarehouseModel? warehouseTujuanSqfliteApi = warehouseData.firstWhereOrNull( + // (warehouse) => warehouse.id == assetStatus.exit_warehouse, + // ); + + String _formatDate(String? date) { + if (date != null) { + DateTime parsedDate = DateTime.parse(date); + String formattedDate = + DateFormat('EEEE, dd MMMM yyyy', 'id_ID').format(parsedDate); + return formattedDate; } else { - return b.created_at!.compareTo(a.created_at!); // Compare non-null dates + return ''; } - }); - - final item = data[index]; - - // Menemukan data peti yang sesuai dengan asset - PetiAssetModel? petiSqfliteApi; - if (item.peti_id != null) { - petiSqfliteApi = petiData!.firstWhere( - (peti) => peti.id == item.peti_id, - orElse: () => PetiAssetModel( - id: null, - tipe_peti_id: null, - warna: 'null', - packing_no: null, - customer_id: null, - warehouse_id: null, - kondisipeti_id: null, - jumlah: null, - date_pembuatan: DateTime.now(), - created_by: 'null', - updated_by: 'null', - fix_lot: '', - ), - ); } - TypePetiModel? tipePetiSqfliteApi; - if (petiSqfliteApi != null && petiSqfliteApi.tipe_peti_id != null) { - tipePetiSqfliteApi = tipePetiData?.firstWhere( - (tipePeti) => tipePeti.id == petiSqfliteApi?.tipe_peti_id, - orElse: () => TypePetiModel( - id: null, - type: 'null', - size_peti: 'null', - description: 'null', - created_by: 'null', - updated_by: 'null', - ), - ); + Future _deletePeminjaman() async { + try { + // Panggil fungsi untuk menghapus peminjaman berdasarkan ID + await Controller().deletePeminjamanById(assetStatus.id.toString()); + // Navigasi kembali ke halaman sebelumnya atau halaman yang sesuai + Navigator.pushReplacementNamed(context, '/peminjaman-barang'); + } catch (e) { + // Tangani kesalahan jika terjadi + print('Gagal menghapus peminjaman: $e'); + } } - CustomerModel? customerSqfliteApi; - if (petiSqfliteApi != null && petiSqfliteApi.customer_id != null) { - customerSqfliteApi = customerData?.firstWhere( - (customer) => customer.id == item.customer_id, - orElse: () => CustomerModel( - id: null, - name: 'null', - code_customer: 'null', - lot_no: 'null', - created_by: 'null', - updated_by: 'null', - ), + Future _showDeleteConfirmationDialog() async { + return showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Icon( + Icons.info, + color: Colors.blue, + ), + SizedBox(width: 8), + Text( + 'Konfirmasi Hapus', + style: TextStyle( + fontSize: 18, + ), + ), + ], + ), + IconButton( + icon: Icon( + Icons.close, + color: Colors.black54, + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ), + content: SingleChildScrollView( + child: ListBody( + children: [ + Text( + 'Anda yakin ingin menghapus peminjaman ini? ${petiSqfliteApi!.fix_lot.toString()}', + style: TextStyle( + fontSize: 16, + ), + ), + ], + ), + ), + actions: [ + Container( + margin: EdgeInsets.only(right: 3.0), + child: ElevatedButton( + child: Text('Hapus'), + onPressed: () { + // Panggil fungsi untuk menghapus peminjaman berdasarkan ID + _deletePeminjaman(); + // Navigator.pushNamed(context, '/peminjaman-barang'); + EasyLoading.showSuccess( + 'Berhasil menghapus data peminjaman'); + }, + style: ElevatedButton.styleFrom( + primary: Colors.red, + ), + ), + ), + ], + ); + }, ); } - WarehouseModel? warehouseSqfliteApi; - if (item.warehouse_id != null) { - warehouseSqfliteApi = warehouseData?.firstWhere( - (warehouse) => warehouse.id == item.warehouse_id, - orElse: () => WarehouseModel( - id: null, - name: 'null', - created_by: 'null', - updated_by: 'null', + return Slidable( + key: Key(assetStatus.id.toString()), + endActionPane: ActionPane( + motion: ScrollMotion(), + children: [ + SlidableAction( + onPressed: (context) { + _showDeleteConfirmationDialog(); + }, + backgroundColor: Color(0xFFFE4A49), + foregroundColor: Colors.white, + icon: Icons.delete, + label: 'Hapus', + ), + ], + ), + child: GestureDetector( + onTap: () { + // Tindakan yang dilakukan saat card diklik + if (assetStatus != null) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => DetailPeminjamanBarangPage( + peminjamanId: assetStatus.id.toString(), + ), + ), + ); + } + }, + child: Card( + color: Colors.white60, + elevation: 0.0, + shape: RoundedRectangleBorder( + side: BorderSide(color: Colors.grey, width: 1.0), + ), + child: Padding( + padding: const EdgeInsets.only( + top: 8.0, + bottom: 8.0, + left: 16.0, + right: 16.0, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildAvatarAndIndex(index), + Divider(), + _buildInfoRow( + 'Nama Peminjam:', + '${customerSqfliteApi?.name ?? '-'}', + 'PIC:', + '${assetStatus.exit_pic ?? '-'}', + 13), + _buildInfoRow( + 'Tanggal Peminjaman:', + '${_formatDate(assetStatus.exit_at.toString())}', + 'Estimasi Pengembalian:', + '${_formatDate(assetStatus.est_pengembalian.toString())}', + 13), + _buildInfoRow('Tujuan Gudang:', + '${warehouseSqfliteApi?.name ?? '-'}', '', '', 13), + ], + ), + ), ), - ); - } - - WarehouseModel? warehouseTujuanSqfliteApi; - warehouseTujuanSqfliteApi = warehouseData?.firstWhereOrNull( - (warehouse) => warehouse.id == item.exit_warehouse, + ), ); + } - return DataRow(cells: [ - DataCell( - Text( - (index + 1).toString(), - ), - ), - DataCell( - GestureDetector( - onTap: () { - if (item.id != null) { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => DetailPeminjamanBarangPage( - peminjamanId: item.id.toString(), + Widget _buildAvatarAndIndex(int index) { + PetiAssetModel? petiSqfliteApi = petiData.firstWhereOrNull( + (peti) => peti.id == assetStatus.peti_id, + ); + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildAvatar(index), + Expanded( + child: Padding( + padding: const EdgeInsets.only( + left: 8.0, + top: 8.0, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '${petiSqfliteApi?.fix_lot ?? '-'}', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14.5, ), ), - ); - - print('asset id: ${item.id}'); - } - }, - child: Icon(Icons.article, - size: 40, - color: Colors.indigo[700]), // Ganti ikon sesuai kebutuhan - ), - ), - DataCell( - Text( - petiSqfliteApi != null && petiSqfliteApi.fix_lot != null - ? petiSqfliteApi!.fix_lot.toString() - : '-', - ), - ), - DataCell( - Text( - customerSqfliteApi != null && customerSqfliteApi.name != null - ? customerSqfliteApi!.name.toString() - : '-', - ), - ), - DataCell( - Text( - item.exit_at != null - ? DateFormat('dd-MM-yyyy').format(item.exit_at!) - : '-', - ), - ), - DataCell( - Text( - item.est_pengembalian != null - ? DateFormat('dd-MM-yyyy').format(item.est_pengembalian!) - : '-', + ], + ), + ), ), - ), - DataCell( - Text( - item.exit_pic != null ? item.exit_pic.toString() : '-', + ], + ); + } + + Widget _buildAvatar(int index) { + return Container( + child: CircleAvatar( + radius: 11, + backgroundColor: Colors.indigo[700], + child: Text( + '$index', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 13, + color: Colors.white, + ), ), ), - DataCell( - Text( - warehouseSqfliteApi != null && warehouseSqfliteApi.name != null - ? warehouseSqfliteApi.name.toString() - : '-', + ); + } + + Widget _buildInfoRow(String title1, String content1, String title2, + String content2, double fontSize) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title1, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: fontSize, + ), + ), + SizedBox(height: 3), + Text( + content1, + style: TextStyle( + fontSize: fontSize - + 0.5, // Mengurangkan ukuran font agar cocok dengan judul + ), + ), + ], + ), ), - ), - DataCell( - Text( - warehouseTujuanSqfliteApi != null && - warehouseTujuanSqfliteApi.name != null - ? warehouseTujuanSqfliteApi.name.toString() - : '-', + SizedBox(width: 10), // Memberi jarak antara dua kolom + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title2, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: fontSize, + ), + ), + SizedBox(height: 3), + Text( + content2, + style: TextStyle( + fontSize: fontSize - + 0.5, // Mengurangkan ukuran font agar cocok dengan judul + ), + ), + ], + ), ), - ), - ]); + ], + ); } - - @override - bool get isRowCountApproximate => false; - - @override - int get rowCount => data.length; - - @override - int get selectedRowCount => 0; } diff --git a/lib/pages/peminjaman_barang/show.dart b/lib/pages/peminjaman_barang/show.dart index d391e85..00f2691 100644 --- a/lib/pages/peminjaman_barang/show.dart +++ b/lib/pages/peminjaman_barang/show.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:shimmer/shimmer.dart'; import 'package:siopas/models/asset_status_model.dart'; import 'package:siopas/models/customer_model.dart'; import 'package:siopas/models/m_asset_status_model.dart'; @@ -10,6 +11,7 @@ import 'package:collection/collection.dart'; import '../../models/warehouse_mode.dart'; import '../../services/controllerApi.dart'; +import '../../widget/loading_shimmer_show.dart'; class DetailPeminjamanBarangPage extends StatefulWidget { final String peminjamanId; @@ -31,19 +33,38 @@ class _DetailPeminjamanBarangPageState List? customerData; List? warehouseData; - bool loading = true; + late Future _dataFuture; + bool loading = true; // Atur loading ke true pada awalnya @override void initState() { super.initState(); - getPeminjamanIdData(); - customerListAPI(); - petiListAPI(); - warehouseListAPI(); + + // Set loading ke true pada awalnya + if (mounted) { + if (mounted) { + setState(() { + loading = false; + }); + } + } + + _dataFuture = fetchData(); + } + + Future fetchData() async { + await getPeminjamanIdData(); + await customerListAPI(); + await petiListAPI(); + await warehouseListAPI(); initializeDateFormatting('id_ID', null); - setState(() { - loading = false; - }); + + // Tandai bahwa proses loading telah selesai + if (mounted) { + setState(() { + loading = false; + }); + } } Future customerListAPI() async { @@ -91,8 +112,9 @@ class _DetailPeminjamanBarangPageState peminjamanInfo = peminjamans.firstWhereOrNull( (peminjaman) => peminjaman.id.toString() == widget.peminjamanId, ); - - setState(() {}); + if (mounted) { + setState(() {}); + } } String _formatDate(String? date) { @@ -134,10 +156,10 @@ class _DetailPeminjamanBarangPageState warehouseSqfliteApi = warehouseData?.firstWhereOrNull( (warehouse) => warehouse.id == peminjamanInfo!.warehouse_id, ); - WarehouseModel? warehouseTujuanSqfliteApi; - warehouseTujuanSqfliteApi = warehouseData?.firstWhereOrNull( - (warehouse) => warehouse.id == peminjamanInfo!.exit_warehouse, - ); + // WarehouseModel? warehouseTujuanSqfliteApi; + // warehouseTujuanSqfliteApi = warehouseData?.firstWhereOrNull( + // (warehouse) => warehouse.id == peminjamanInfo!.exit_warehouse, + // ); Future _showDeleteConfirmationDialog() async { return showDialog( @@ -224,10 +246,10 @@ class _DetailPeminjamanBarangPageState ), ), leading: IconButton( - icon: Icon(Icons.arrow_back, color: Colors.white), onPressed: () { - Navigator.pushNamed(context, '/peminjaman-barang'); + Navigator.pop(context); }, + icon: Icon(Icons.arrow_back), ), actions: [ IconButton( @@ -238,109 +260,123 @@ class _DetailPeminjamanBarangPageState ), ], ), - body: Padding( - padding: EdgeInsets.all(16.0), - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15.0), - ), - elevation: 5, - child: Column( - children: [ - Card( + body: FutureBuilder( + future: _dataFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return ShimmerShow(); + } else if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else { + return Padding( + padding: EdgeInsets.all(16.0), + child: Card( shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.vertical(top: Radius.circular(15.0)), + borderRadius: BorderRadius.circular(15.0), ), - elevation: 0, - margin: EdgeInsets.all(0), - color: Colors.indigo[700], - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Icon(Icons.article, size: 30, color: Colors.white), - SizedBox(width: 10), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'ID:', - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - ), - SizedBox(height: 5), - Text( - petiSqfliteApi != null && - petiSqfliteApi.fix_lot != null - ? petiSqfliteApi!.fix_lot.toString() - : '-', - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.bold, - color: Colors.white, + elevation: 5, + child: Column( + children: [ + Card( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.vertical(top: Radius.circular(15.0)), + ), + elevation: 0, + margin: EdgeInsets.all(0), + color: Colors.indigo[700], + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(Icons.article, + size: 30, color: Colors.white), + SizedBox(width: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'ID:', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + SizedBox(height: 5), + Text( + petiSqfliteApi != null && + petiSqfliteApi.fix_lot != null + ? petiSqfliteApi!.fix_lot.toString() + : '-', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ], ), - ), - ], - ), - ], + ], + ), + ], + ), + ), + ), + SizedBox(height: 10), + if (peminjamanInfo != null) ...[ + _buildDetailItem( + 'Kode Peti', + petiSqfliteApi != null && petiSqfliteApi.fix_lot != null + ? petiSqfliteApi!.fix_lot.toString() + : '-', ), + Divider(thickness: 1), + _buildDetailItem( + 'Nama Customer', + customerSqfliteApi != null && + customerSqfliteApi.name != null + ? customerSqfliteApi!.name.toString() + : '-', + ), + Divider(thickness: 1), + _buildDetailItem('Tgl Peminjaman', + _formatDate(peminjamanInfo!.exit_at.toString())), + Divider(thickness: 1), + _buildDetailItem( + 'Est Peminjaman', + _formatDate( + peminjamanInfo!.est_pengembalian.toString())), + Divider(thickness: 1), + _buildDetailItem( + 'PJ Peminjaman', peminjamanInfo!.exit_pic.toString()), + Divider(thickness: 1), + _buildDetailItem( + ' Gudang', + warehouseSqfliteApi != null && + warehouseSqfliteApi.name != null + ? warehouseSqfliteApi!.name.toString() + : '-'), + + Divider(thickness: 1), + _buildDetailItem( + 'PIC', + peminjamanInfo!.exit_pic != null + ? peminjamanInfo!.exit_pic.toString() + : '-'), + + Divider(thickness: 1), + // ... tambahkan data lainnya sesuai kebutuhan ], - ), + ], ), ), - SizedBox(height: 10), - if (peminjamanInfo != null) ...[ - _buildDetailItem( - 'Kode Peti', - petiSqfliteApi != null && petiSqfliteApi.fix_lot != null - ? petiSqfliteApi!.fix_lot.toString() - : '-', - ), - Divider(thickness: 1), - _buildDetailItem( - 'Nama Customer', - customerSqfliteApi != null && customerSqfliteApi.name != null - ? customerSqfliteApi!.name.toString() - : '-', - ), - Divider(thickness: 1), - _buildDetailItem('Tgl Peminjaman', - _formatDate(peminjamanInfo!.exit_at.toString())), - Divider(thickness: 1), - _buildDetailItem('Est Peminjaman', - _formatDate(peminjamanInfo!.est_pengembalian.toString())), - Divider(thickness: 1), - _buildDetailItem( - 'PJ Peminjaman', peminjamanInfo!.exit_pic.toString()), - Divider(thickness: 1), - _buildDetailItem( - 'Asal Gudang', - // peminjamanInfo!.exit_warehouse.toString()), - warehouseSqfliteApi != null && - warehouseSqfliteApi.name != null - ? warehouseSqfliteApi!.name.toString() - : '-'), - Divider(thickness: 1), - _buildDetailItem( - 'Tujuan Gudang', - // peminjamanInfo!.exit_warehouse.toString()), - warehouseTujuanSqfliteApi != null && - warehouseTujuanSqfliteApi.name != null - ? warehouseTujuanSqfliteApi!.name.toString() - : '-'), - Divider(thickness: 1), - // ... tambahkan data lainnya sesuai kebutuhan - ], - ], - ), - ), + ); + } + }, ), ); } diff --git a/lib/pages/pengembalian_barang/edit.dart b/lib/pages/pengembalian_barang/edit.dart index 68e4130..eb5100c 100644 --- a/lib/pages/pengembalian_barang/edit.dart +++ b/lib/pages/pengembalian_barang/edit.dart @@ -90,9 +90,11 @@ class _CreatePengembalianBarangPageState kondisiPetiListAPI(); initializeDateFormatting('id_ID', null); - setState(() { - loading = false; // Mengatur loading ke false setelah tugas selesai - }); + if (mounted) { + setState(() { + loading = false; // Mengatur loading ke false setelah tugas selesai + }); + } } void _getUserToken() async { @@ -179,67 +181,98 @@ class _CreatePengembalianBarangPageState (scanData) { if (!scanned) { try { - setState(() { - result = scanData; - List lines = result!.code!.split('\n'); - String idPeti = ''; - String idWarehouse = ''; - - for (String line in lines) { - if (line.contains(';')) { - List values = line.split(';'); - if (values.length >= 3) { - idPeti = values[1]; - idWarehouse = values[2]; - break; + if (mounted) { + setState(() { + result = scanData; + List lines = result!.code!.split('\n'); + String idPeti = ''; + String idWarehouse = ''; + + for (String line in lines) { + if (line.contains(';')) { + List values = line.split(';'); + if (values.length >= 3) { + idPeti = values[1]; + idWarehouse = values[2]; + break; + } } } - } - int? petiId = int.tryParse(idPeti); - int? warehouseId = int.tryParse(idWarehouse); - // AuthProvider authProvider = Provider.of(context, listen: false); - // UserModel user = authProvider.user; - - // Dalam fungsi yang menangani pemindaian QR code - // Dalam fungsi yang menangani pemindaian QR code - if (petiId != null && warehouseId != null) { - // Check apakah peti dengan warehouse_id yang sesuai ada dalam daftar yang diizinkan - PetiAssetModel? allowedPeti = _valpeti?.firstWhereOrNull( - (peti) => - peti.id == petiId && - peti.deleted_at != true && - peti.status == 'AKTIF', - ); - - if (allowedPeti != null) { - setState(() { - isQRCodeScanned = true; - // Mengisi _filteredPetiList untuk dropdown hasil QR Code - _filteredPetiList = [ - _valpeti!.firstWhere((peti) => peti.id == allowedPeti.id) - ]; + int? petiId = int.tryParse(idPeti); + int? warehouseId = int.tryParse(idWarehouse); + // AuthProvider authProvider = Provider.of(context, listen: false); + // UserModel user = authProvider.user; + + // Dalam fungsi yang menangani pemindaian QR code + // Dalam fungsi yang menangani pemindaian QR code + if (petiId != null && warehouseId != null) { + // Check apakah peti dengan warehouse_id yang sesuai ada dalam daftar yang diizinkan + PetiAssetModel? allowedPeti = _valpeti?.firstWhereOrNull( + (peti) => + peti.id == petiId && + peti.deleted_at != true && + peti.status == 'AKTIF', + ); - petiSqfliteApi = allowedPeti; - }); + if (allowedPeti != null) { + setState(() { + isQRCodeScanned = true; + // Mengisi _filteredPetiList untuk dropdown hasil QR Code + _filteredPetiList = [ + _valpeti! + .firstWhere((peti) => peti.id == allowedPeti.id) + ]; + + petiSqfliteApi = allowedPeti; + }); + } else { + // Tampilkan pesan error jika data tidak sesuai dengan hak akses + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + 'Data Peti tidak ditemukan atau tidak sesuai dengan hak akses.', + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + backgroundColor: Colors.red[700], + action: SnackBarAction( + label: 'Tutup', + onPressed: () { + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + }, + ), + ), + ); + setState(() { + isQRCodeScanned = false; + petiSqfliteApi = null; + warehouseSqfliteApi = null; + }); + } } else { - // Tampilkan pesan error jika data tidak sesuai dengan hak akses + // Tampilkan pesan error jika nilai yang dipindai tidak sesuai ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text( - 'Data Peti tidak ditemukan atau tidak sesuai dengan hak akses.', - style: TextStyle( - color: Colors.white, - fontSize: 12, - ), - ), - backgroundColor: Colors.red[700], - action: SnackBarAction( - label: 'Tutup', - onPressed: () { - ScaffoldMessenger.of(context).hideCurrentSnackBar(); - }, + content: Row( + children: [ + Icon( + Icons.warning, + color: Colors.black, + ), + SizedBox(width: 8), + Text( + 'Nilai QR Code tidak sesuai dengan yang diharapkan.', + style: TextStyle( + color: Colors.black, + fontSize: 12, + ), + ), + ], ), + backgroundColor: Colors.yellow[700], ), ); setState(() { @@ -248,38 +281,10 @@ class _CreatePengembalianBarangPageState warehouseSqfliteApi = null; }); } - } else { - // Tampilkan pesan error jika nilai yang dipindai tidak sesuai - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Row( - children: [ - Icon( - Icons.warning, - color: Colors.black, - ), - SizedBox(width: 8), - Text( - 'Nilai QR Code tidak sesuai dengan yang diharapkan.', - style: TextStyle( - color: Colors.black, - fontSize: 12, - ), - ), - ], - ), - backgroundColor: Colors.yellow[700], - ), - ); - setState(() { - isQRCodeScanned = false; - petiSqfliteApi = null; - warehouseSqfliteApi = null; - }); - } - scanned = true; - }); + scanned = true; + }); + } controller.stopCamera(); @@ -292,10 +297,12 @@ class _CreatePengembalianBarangPageState controller.stopCamera(); // Reset nilai dropdown Peti dan Warehouse - setState(() { - petiSqfliteApi = null; - warehouseSqfliteApi = null; - }); + if (mounted) { + setState(() { + petiSqfliteApi = null; + warehouseSqfliteApi = null; + }); + } print('Error scanning QR Code: $e'); ScaffoldMessenger.of(context).showSnackBar( @@ -521,16 +528,18 @@ class _CreatePengembalianBarangPageState selectedItem: petiSqfliteApi, onChanged: (PetiAssetModel? value) { - setState(() { - petiSqfliteApi = value; - if (value != null) { - // Perbarui _unrestrictedPetiList sesuai pemilihan manual - _unrestrictedPetiList = [ - _valpeti!.firstWhere( - (peti) => peti.id == value.id) - ]; - } - }); + if (mounted) { + setState(() { + petiSqfliteApi = value; + if (value != null) { + // Perbarui _unrestrictedPetiList sesuai pemilihan manual + _unrestrictedPetiList = [ + _valpeti!.firstWhere( + (peti) => peti.id == value.id) + ]; + } + }); + } }, validator: (PetiAssetModel? value) { if (value == null) { @@ -711,9 +720,11 @@ class _CreatePengembalianBarangPageState }).toList() ?? [], onChanged: (WarehouseModel? value) { - setState(() { - warehouseSqfliteApi = value; - }); + if (mounted) { + setState(() { + warehouseSqfliteApi = value; + }); + } }, ), ), @@ -769,9 +780,11 @@ class _CreatePengembalianBarangPageState }).toList() ?? [], onChanged: (ConditionPetiModel? value) { - setState(() { - conditionPetiSqfliteApi = value; - }); + if (mounted) { + setState(() { + conditionPetiSqfliteApi = value; + }); + } }, ), ), diff --git a/lib/pages/pengembalian_barang/index.dart b/lib/pages/pengembalian_barang/index.dart index dc2f2c8..da30bc1 100644 --- a/lib/pages/pengembalian_barang/index.dart +++ b/lib/pages/pengembalian_barang/index.dart @@ -69,9 +69,11 @@ class PengembalianBarangPageState extends State { _getUserToken(); // Set _isLoading ke true sebelum memulai tugas - setState(() { - _isLoading = true; - }); + if (mounted) { + setState(() { + _isLoading = true; + }); + } Future.wait([ warehouseListAPI(), @@ -88,9 +90,11 @@ class PengembalianBarangPageState extends State { datatablesConditionList(), ]).then((_) { // Set _isLoading ke false setelah semua tugas selesai - setState(() { - _isLoading = false; - }); + if (mounted) { + setState(() { + _isLoading = false; + }); + } }); // Inisialisasi _data di sini jika diperlukan @@ -313,79 +317,91 @@ class PengembalianBarangPageState extends State { if (connection) { print("Internet connection available"); } else { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar(content: Text("No Internet"))); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("Tidak ada koneksi internet"))); } }); } // Datatables ------------------------------------------------------------------------ Future datatablesPengembalianList() async { - await ControllerPengembalian() - .fetchPengembalianLocalController() - .then((value) { - setState(() { - _data = (value as List) - .map((e) => AssetStatusModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await ControllerPengembalian() + .fetchPengembalianLocalController() + .then((value) { + setState(() { + _data = (value as List) + .map((e) => AssetStatusModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesPetiList() async { - await ControllerPengembalian().fetchPetiData().then((value) { - setState(() { - _petiData = (value as List) - .map((e) => PetiAssetModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await ControllerPengembalian().fetchPetiData().then((value) { + setState(() { + _petiData = (value as List) + .map((e) => PetiAssetModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesTipePetiList() async { - await ControllerPengembalian().fetchTipePetiData().then((value) { - setState(() { - _tipePetiData = (value as List) - .map((e) => TypePetiModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await ControllerPengembalian().fetchTipePetiData().then((value) { + setState(() { + _tipePetiData = (value as List) + .map((e) => TypePetiModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesCustomerList() async { - await ControllerPengembalian().fetchCustomerData().then((value) { - setState(() { - _customerData = (value as List) - .map((e) => CustomerModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await ControllerPengembalian().fetchCustomerData().then((value) { + setState(() { + _customerData = (value as List) + .map((e) => CustomerModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesWarehouseList() async { - await ControllerPengembalian().fetchWarehouseData().then((value) { - setState(() { - _warehouseData = (value as List) - .map((e) => WarehouseModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await ControllerPengembalian().fetchWarehouseData().then((value) { + setState(() { + _warehouseData = (value as List) + .map((e) => WarehouseModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } Future datatablesConditionList() async { - await ControllerPengembalian().fetchConditionData().then((value) { - setState(() { - _conditionData = (value as List) - .map((e) => ConditionPetiModel.fromJson(e)) - .toList(); - loading = false; + if (mounted) { + await ControllerPengembalian().fetchConditionData().then((value) { + setState(() { + _conditionData = (value as List) + .map((e) => ConditionPetiModel.fromJson(e)) + .toList(); + loading = false; + }); }); - }); + } } void _loadMoreData() { @@ -524,7 +540,7 @@ class PengembalianBarangPageState extends State { showSyncDialog(context); } else { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text("No internet connection")), + SnackBar(content: Text("Tidak ada koneksi internet")), ); } }, @@ -562,9 +578,11 @@ class PengembalianBarangPageState extends State { rowsPerPage: _pageSize, availableRowsPerPage: [10, 25, 50], // Removed const onRowsPerPageChanged: (value) { - setState(() { - _pageSize = value!; - }); + if (mounted) { + setState(() { + _pageSize = value!; + }); + } }, columns: [ DataColumn(label: Text('No')), diff --git a/lib/pages/pengembalian_barang/show.dart b/lib/pages/pengembalian_barang/show.dart index 0dc076f..4366693 100644 --- a/lib/pages/pengembalian_barang/show.dart +++ b/lib/pages/pengembalian_barang/show.dart @@ -48,12 +48,14 @@ class _DetailPengembalianBarangPageState initializeDateFormatting('id_ID', null); // Delay sejenak sebelum memanggil EasyLoading.dismiss() - Future.delayed(Duration(seconds: 1), () { - setState(() { - loading = false; // Mengatur loading ke false setelah tugas selesai + if (mounted) { + Future.delayed(Duration(seconds: 1), () { + setState(() { + loading = false; // Mengatur loading ke false setelah tugas selesai + }); + EasyLoading.dismiss(); }); - EasyLoading.dismiss(); - }); + } } Future customerListAPI() async { @@ -115,7 +117,9 @@ class _DetailPengembalianBarangPageState (pengembalian) => pengembalian.id.toString() == widget.pengembalianId, ); - setState(() {}); + if (mounted) { + setState(() {}); + } } String _formatDate(String? date) { @@ -351,6 +355,12 @@ class _DetailPengembalianBarangPageState : '-', ), Divider(thickness: 1), + _buildDetailItem( + 'PIC', + pengembalianInfo!.enter_pic != null + ? pengembalianInfo!.enter_pic.toString() + : '-'), + Divider(thickness: 1), // ... tambahkan data lainnya sesuai kebutuhan ], ], diff --git a/lib/pages/sign_in_page.dart b/lib/pages/sign_in_page.dart index 4750b03..a0cbcdb 100644 --- a/lib/pages/sign_in_page.dart +++ b/lib/pages/sign_in_page.dart @@ -172,9 +172,13 @@ class __FormContentState extends State<_FormContent> { // final String roleId = 'A5C7B207-1A1C-43B8-89BF-222222222222'; print('token dapat login: ${user.token}'); - if (user.role_id == 2) { + if (user != null && user.role_id == 2) { print('Berhasil login HALAMAN USER'); - Navigator.pushNamed(context, '/home'); + if (context != null) { + Navigator.pushReplacementNamed(context, '/home'); + } else { + print('Context is null'); + } } else { print('Tidak ada informasi peran (roles) yang tersedia'); } @@ -239,6 +243,7 @@ class __FormContentState extends State<_FormContent> { prefixIcon: Icon(Icons.email_outlined), border: OutlineInputBorder(), ), + keyboardType: TextInputType.emailAddress, ), _gap(), TextFormField( diff --git a/lib/pages/transfer_peti/index.dart b/lib/pages/transfer_peti/index.dart index 29ff830..8f83f93 100644 --- a/lib/pages/transfer_peti/index.dart +++ b/lib/pages/transfer_peti/index.dart @@ -299,8 +299,8 @@ class TransferPetiPageState extends State { if (connection) { print("Internet connection available"); } else { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar(content: Text("No Internet"))); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("Tidak ada koneksi internet"))); } }); } @@ -500,7 +500,7 @@ class TransferPetiPageState extends State { showSyncDialog(context); } else { ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text("No internet connection")), + SnackBar(content: Text("Tidak ada koneksi internet")), ); } }, diff --git a/lib/widget/component_query.dart b/lib/widget/component_query.dart new file mode 100644 index 0000000..53c06f2 --- /dev/null +++ b/lib/widget/component_query.dart @@ -0,0 +1,13 @@ +import 'package:intl/intl.dart'; +import 'package:flutter/material.dart'; + +String _formatDate(String? date) { + if (date != null) { + DateTime parsedDate = DateTime.parse(date); + String formattedDate = + DateFormat('EEEE, dd MMMM yyyy', 'id_ID').format(parsedDate); + return formattedDate; + } else { + return ''; + } +} diff --git a/lib/widget/loading_shimmer_show.dart b/lib/widget/loading_shimmer_show.dart new file mode 100644 index 0000000..a34ca62 --- /dev/null +++ b/lib/widget/loading_shimmer_show.dart @@ -0,0 +1,299 @@ +import 'package:flutter/material.dart'; +import 'package:shimmer/shimmer.dart'; + +class ShimmerShow extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.all(16.0), + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15.0), + ), + elevation: 5, + child: Shimmer.fromColors( + baseColor: Colors.grey[300]!, + highlightColor: Colors.grey[100]!, + child: Column( + children: [ + Card( + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.vertical(top: Radius.circular(15.0)), + ), + elevation: 0, + margin: EdgeInsets.all(0), + color: Colors.grey[300], + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(Icons.article, size: 30, color: Colors.white), + SizedBox(width: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'ID:', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + SizedBox(height: 5), + Text( + '-', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ], + ), + ], + ), + ], + ), + ), + ), + SizedBox(height: 10), + _buildShimmerDetailItem(), + Divider(thickness: 1), + _buildShimmerDetailItem(), + Divider(thickness: 1), + _buildShimmerDetailItem(), + Divider(thickness: 1), + _buildShimmerDetailItem(), + Divider(thickness: 1), + _buildShimmerDetailItem(), + Divider(thickness: 1), + _buildShimmerDetailItem(), + Divider(thickness: 1), + _buildShimmerDetailItem(), + Divider(thickness: 1), + _buildShimmerDetailItem(), + Divider(thickness: 1), + _buildShimmerDetailItem(), + Divider(thickness: 1), + _buildShimmerDetailItem(), + // ... tambahkan shimmer item lainnya sesuai kebutuhan + ], + ), + ), + ), + ); + } + + Widget _buildShimmerDetailItem() { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 80, + height: 12, + color: Colors.grey[300], + ), + Container( + width: 120, + height: 12, + color: Colors.grey[300], + ), + ], + ), + ); + } +} + +class ShimmerLoadingAssetStatusCard extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Column( + children: [ + Card( + elevation: 0.0, + shape: RoundedRectangleBorder( + side: BorderSide(color: Colors.grey, width: 1.0), + // borderRadius: BorderRadius.circular(10), + ), + child: Shimmer.fromColors( + baseColor: Colors.grey[300]!, + highlightColor: Colors.grey[100]!, + child: Padding( + padding: const EdgeInsets.only( + top: 8.0, + bottom: 8.0, + left: 16.0, + right: 16.0, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildAvatarAndIndex(), + Divider(), + _buildInfoRow('Nama Peminjam:', '', 'PIC:', '', 11.5), + _buildInfoRow('Tanggal Peminjaman:', '', + 'Estimasi Pengembalian:', '', 11.5), + _buildInfoRow('Asal Gudang:', '', 'Tujuan Gudang:', '', 11.5), + ], + ), + ), + ), + ), + ], + ); + } + + Widget _buildAvatarAndIndex() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildAvatar(), + Expanded( + child: Padding( + padding: const EdgeInsets.only( + left: 8.0, + top: 8.0, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Text( + // '', + // style: TextStyle( + // fontWeight: FontWeight.bold, + // fontSize: 11.5, + // ), + // ), + lineDivider(), + ], + ), + ), + ), + ], + ); + } + + Widget lineDivider() { + return Container( + height: 13, + width: double.infinity, + decoration: BoxDecoration( + color: Colors.grey[500], + borderRadius: BorderRadius.vertical( + top: Radius.circular(6), // Adjust top radius as needed + bottom: Radius.circular(6), // Adjust bottom radius as needed + ), + ), + ); + } + + Widget _buildAvatar() { + return Container( + child: CircleAvatar( + radius: 11, + backgroundColor: Colors.indigo, + ), + ); + } + + Widget _buildInfoRow(String title1, String content1, String title2, + String content2, double fontSize) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title1, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: fontSize, + ), + ), + SizedBox(height: 3), + lineDivider(), + // Text( + // content1, + // style: TextStyle( + // fontSize: fontSize - 0.5, + // ), + // ), + ], + ), + ), + SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // lineDivider(), + Text( + title2, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: fontSize, + ), + ), + SizedBox(height: 3), + lineDivider() + // Text( + // content2, + // style: TextStyle( + // fontSize: fontSize - 0.5, + // ), + // ), + ], + ), + ), + ], + ); + } +} + +Widget shimmerSearch() { + return Container( + margin: EdgeInsets.only(top: 8, bottom: 8), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Shimmer.fromColors( + baseColor: Colors.grey[300]!, + highlightColor: Colors.grey[100]!, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.grey, width: 1.0), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + Icon(Icons.search), + SizedBox(width: 8), + Expanded( + child: Container( + height: 16, // Match the font size in the original search + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + ), + ), + ], + ), + ), + ), + ), + ), + ); +} diff --git a/pubspec.lock b/pubspec.lock index 2c58dc7..e82952d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -222,6 +222,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.13.1" + flutter_slidable: + dependency: "direct main" + description: + name: flutter_slidable + sha256: "19ed4813003a6ff4e9c6bcce37e792a2a358919d7603b2b31ff200229191e44c" + url: "https://pub.dev" + source: hosted + version: "3.0.1" flutter_spinkit: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5b3b83d..324933c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -55,6 +55,7 @@ dependencies: dropdown_search: ^5.0.6 shimmer: ^3.0.0 loading_animation_widget: ^1.2.0+4 + flutter_slidable: ^3.0.1 @@ -95,6 +96,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - assets/img/ + - assets/item/ # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see