cashumit/lib/widgets/receipt_group_section.dart

101 lines
3.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:cashumit/models/receipt_group.dart';
import 'package:cashumit/widgets/account_settings_widget.dart';
import 'package:cashumit/widgets/receipt_item_list.dart';
import 'package:cashumit/widgets/horizontal_divider.dart';
import 'package:cashumit/utils/currency_format.dart';
import 'package:cashumit/utils/app_text_styles.dart';
/// Section untuk satu grup transaksi (akun sumber + daftar item + subtotal).
class ReceiptGroupSection extends StatelessWidget {
final ReceiptGroup group;
final int groupIndex;
final VoidCallback onSelectSource;
final VoidCallback onRemoveGroup;
final Function(int)? onEditItem;
final Function(int)? onRemoveItem;
final VoidCallback onAddItem;
final bool canRemove;
const ReceiptGroupSection({
super.key,
required this.group,
required this.groupIndex,
required this.onSelectSource,
required this.onRemoveGroup,
this.onEditItem,
this.onRemoveItem,
required this.onAddItem,
this.canRemove = true,
});
@override
Widget build(BuildContext context) {
final primaryColor = Theme.of(context).colorScheme.primary;
return Container(
margin: const EdgeInsets.only(bottom: 8),
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
border: Border.all(color: Colors.grey[300]!),
borderRadius: BorderRadius.circular(4),
color: Colors.white,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Header grup: dropdown "Dari:" + tombol hapus di kanan
Row(
children: [
Expanded(
child: SourceAccountSelector(
sourceAccount:
group.sourceAccountName ?? 'Pilih Sumber',
onSelectSource: onSelectSource,
),
),
if (canRemove) ...[
const SizedBox(width: 4),
IconButton(
icon: const Icon(Icons.delete_outline, size: 18),
padding: EdgeInsets.zero,
constraints: const BoxConstraints(),
onPressed: onRemoveGroup,
tooltip: 'Hapus grup',
color: Colors.red[400],
),
],
],
),
const SizedBox(height: 8),
const HorizontalDivider(),
const SizedBox(height: 8),
// Daftar item grup
ReceiptItemList(
items: group.items,
onEditItem: onEditItem,
onRemoveItem: onRemoveItem,
onAddItem: onAddItem,
),
const SizedBox(height: 8),
// Subtotal grup
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Subtotal:',
style: CourierStyles.bold.copyWith(fontSize: 13),
),
Text(
CurrencyFormat.formatRupiah(group.total),
style: CourierStyles.bold
.copyWith(fontSize: 13, color: primaryColor),
),
],
),
],
),
);
}
}