Siopas Inventory PETI for ISTW Mobile
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

194 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;
}