You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
4.7 KiB
193 lines
4.7 KiB
import 'dart:convert'; |
|
import 'dart:developer'; |
|
|
|
import 'package:flutter/material.dart'; |
|
import 'package:data_table_2/data_table_2.dart'; |
|
import 'package:provider/provider.dart'; |
|
import 'package:shared_preferences/shared_preferences.dart'; |
|
import 'package:siopas/models/asset_status_model.dart'; |
|
import 'package:siopas/providers/asset_status_provider.dart'; |
|
import 'package:siopas/widget/peminjaman_tile.dart'; |
|
import 'package:http/http.dart' as http; |
|
|
|
import '../../connection/connection.dart'; |
|
|
|
class AssetStatusPage extends StatefulWidget { |
|
const AssetStatusPage({super.key}); |
|
|
|
@override |
|
State<AssetStatusPage> createState() => AssetStatusPageState(); |
|
} |
|
|
|
class AssetStatusPageState extends State<AssetStatusPage> { |
|
String? token; |
|
int _currentPage = 1; |
|
int _pageSize = 10; |
|
List<AssetStatusModel> _data = []; |
|
bool _isLoading = false; |
|
|
|
@override |
|
void initState() { |
|
super.initState(); |
|
_getUserToken(); |
|
fetchData(); |
|
} |
|
|
|
void _getUserToken() async { |
|
SharedPreferences prefs = await SharedPreferences.getInstance(); |
|
if (mounted) { |
|
setState(() { |
|
token = prefs.getString('token'); |
|
}); |
|
} |
|
} |
|
|
|
Future<void> fetchData() async { |
|
if (mounted) { |
|
setState(() { |
|
_isLoading = true; |
|
}); |
|
|
|
try { |
|
final response = await http.get(Uri.parse('$baseUrl/asset-status')); |
|
|
|
if (response.statusCode == 200) { |
|
final jsonData = json.decode(response.body)['data']['asset_status']; |
|
|
|
final List<AssetStatusModel> newData = (jsonData as List) |
|
.map((item) => AssetStatusModel.fromJson(item)) |
|
.toList(); |
|
|
|
if (mounted) { |
|
setState(() { |
|
_data.addAll(newData); |
|
_isLoading = false; |
|
}); |
|
} |
|
} else { |
|
if (mounted) { |
|
setState(() { |
|
_isLoading = false; |
|
}); |
|
} |
|
throw Exception('Failed to fetch data'); |
|
} |
|
} catch (e) { |
|
if (mounted) { |
|
setState(() { |
|
_isLoading = false; |
|
}); |
|
} |
|
print('Error fetching data: $e'); |
|
} |
|
} |
|
} |
|
|
|
void _loadMoreData() { |
|
if (mounted && !_isLoading) { |
|
setState(() { |
|
_currentPage++; |
|
}); |
|
fetchData(); |
|
} |
|
} |
|
|
|
@override |
|
Widget build(BuildContext context) { |
|
return Scaffold( |
|
appBar: AppBar( |
|
backgroundColor: Colors.indigo[700], |
|
elevation: 0, |
|
title: Text('Data Peminjaman Barang', |
|
style: TextStyle( |
|
fontSize: 16, |
|
)), |
|
actions: [ |
|
IconButton( |
|
onPressed: () { |
|
// Tambahkan logika untuk tindakan ketika tombol + ditekan |
|
Navigator.pushNamed(context, '/peminjaman-barang/create'); |
|
}, |
|
icon: Icon(Icons.add), |
|
), |
|
], |
|
), |
|
body: _isLoading |
|
? const Center(child: CircularProgressIndicator()) |
|
: SingleChildScrollView( |
|
child: SizedBox( |
|
width: double.infinity, |
|
child: PaginatedDataTable( |
|
header: const Text('Data Table Header'), |
|
rowsPerPage: _pageSize, |
|
availableRowsPerPage: const [10, 25, 50], |
|
onRowsPerPageChanged: (value) { |
|
setState(() { |
|
_pageSize = value!; |
|
}); |
|
}, |
|
columns: const [ |
|
DataColumn(label: Text('No')), |
|
DataColumn(label: Text('Asset')), |
|
DataColumn(label: Text('Exit At')), |
|
DataColumn(label: Text('Exit Pic')), |
|
DataColumn(label: Text('Exit warehouse')), |
|
], |
|
source: _DataSource(data: _data), |
|
), |
|
), |
|
), |
|
); |
|
} |
|
} |
|
|
|
class _DataSource extends DataTableSource { |
|
final List<AssetStatusModel> data; |
|
|
|
_DataSource({required this.data}); |
|
|
|
@override |
|
DataRow? getRow(int index) { |
|
if (index >= data.length) { |
|
return null; |
|
} |
|
|
|
final item = data[index]; |
|
|
|
return DataRow(cells: [ |
|
DataCell( |
|
Text( |
|
item.id.toString(), |
|
), |
|
), |
|
DataCell( |
|
Text( |
|
item.asset.name.toString(), |
|
), |
|
), |
|
DataCell( |
|
Text( |
|
// item.asset.exit_at.toString(), |
|
item.exit_at.toString(), |
|
), |
|
), |
|
DataCell( |
|
Text( |
|
item.exit_pic.toString(), |
|
), |
|
), |
|
DataCell( |
|
Text(item.warehouse.name.toString()), |
|
), |
|
]); |
|
} |
|
|
|
@override |
|
bool get isRowCountApproximate => false; |
|
|
|
@override |
|
int get rowCount => data.length; |
|
|
|
@override |
|
int get selectedRowCount => 0; |
|
}
|
|
|