apskel-pos-flutter/lib/presentation/void/dialog/confirm_void_dialog.dart
2025-08-04 20:40:25 +07:00

398 lines
17 KiB
Dart

import 'package:enaklo_pos/core/extensions/int_ext.dart';
import 'package:enaklo_pos/data/models/response/order_response_model.dart';
import 'package:flutter/material.dart';
class ConfirmVoidDialog extends StatelessWidget {
final String message;
final String voidType;
final Order order;
final Map<String, int> selectedItemQuantities;
final String voidReason;
final Function() onTap;
const ConfirmVoidDialog(
{super.key,
required this.message,
required this.voidType,
required this.order,
required this.selectedItemQuantities,
required this.voidReason,
required this.onTap});
@override
Widget build(BuildContext context) {
return Dialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
elevation: 8,
child: Container(
width: MediaQuery.of(context).size.width * 0.9,
constraints: BoxConstraints(
maxWidth: 600,
maxHeight: MediaQuery.of(context).size.height * 0.8,
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// Header
Container(
width: double.infinity,
padding: EdgeInsets.all(20),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.red[400]!, Colors.red[600]!],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16),
topRight: Radius.circular(16),
),
),
child: Column(
children: [
Container(
width: 50,
height: 50,
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.2),
shape: BoxShape.circle,
),
child: Icon(
Icons.warning_rounded,
color: Colors.white,
size: 28,
),
),
SizedBox(height: 12),
Text(
'Konfirmasi Void',
style: TextStyle(
color: Colors.white,
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
Text(
'Tindakan ini tidak dapat dibatalkan',
style: TextStyle(
color: Colors.white.withOpacity(0.9),
fontSize: 12,
),
),
],
),
),
// Scrollable Content
Flexible(
child: SingleChildScrollView(
padding: EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Main message
Container(
width: double.infinity,
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.grey[50],
borderRadius: BorderRadius.circular(12),
border: Border.all(color: Colors.grey[200]!),
),
child: Text(
message,
style: TextStyle(
fontSize: 14,
height: 1.4,
color: Colors.grey[800],
),
),
),
if (voidType == 'item' &&
selectedItemQuantities.isNotEmpty) ...[
SizedBox(height: 16),
// Items section
Container(
width: double.infinity,
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: BorderRadius.circular(12),
border: Border.all(color: Colors.orange[200]!),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.all(16),
child: Row(
children: [
Container(
padding: EdgeInsets.all(6),
decoration: BoxDecoration(
color: Colors.orange[100],
borderRadius: BorderRadius.circular(6),
),
child: Icon(
Icons.list_alt_rounded,
color: Colors.orange[700],
size: 16,
),
),
SizedBox(width: 8),
Text(
'Item yang akan divoid:',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 14,
color: Colors.orange[800],
),
),
],
),
),
Container(
constraints: BoxConstraints(maxHeight: 120),
child: Scrollbar(
child: SingleChildScrollView(
padding: EdgeInsets.only(
left: 16, right: 16, bottom: 16),
child: Column(
children: selectedItemQuantities.entries
.map((entry) {
final item = order.orderItems!.firstWhere(
(item) => item.id == entry.key);
return Container(
margin: EdgeInsets.only(bottom: 6),
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: Colors.white,
borderRadius:
BorderRadius.circular(6),
boxShadow: [
BoxShadow(
color: Colors.black
.withOpacity(0.03),
blurRadius: 2,
offset: Offset(0, 1),
),
],
),
child: Row(
children: [
Container(
width: 6,
height: 6,
decoration: BoxDecoration(
color: Colors.red[400],
shape: BoxShape.circle,
),
),
SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
item.productName ??
'Unknown Product',
style: TextStyle(
fontWeight:
FontWeight.w600,
fontSize: 12,
),
maxLines: 1,
overflow:
TextOverflow.ellipsis,
),
Text(
'${entry.value} qty',
style: TextStyle(
fontSize: 10,
color: Colors.grey[600],
),
),
],
),
),
Container(
padding: EdgeInsets.symmetric(
horizontal: 6, vertical: 2),
decoration: BoxDecoration(
color: Colors.red[100],
borderRadius:
BorderRadius.circular(4),
),
child: Text(
((item.unitPrice ?? 0) *
entry.value)
.currencyFormatRpV2,
style: TextStyle(
fontSize: 10,
fontWeight: FontWeight.bold,
color: Colors.red[700],
),
),
),
],
),
);
}).toList(),
),
),
),
),
],
),
),
],
SizedBox(height: 16),
// Reason section
Container(
width: double.infinity,
padding: EdgeInsets.all(12),
decoration: BoxDecoration(
color: Colors.blue[50],
borderRadius: BorderRadius.circular(8),
border: Border.all(color: Colors.blue[200]!),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: EdgeInsets.all(6),
decoration: BoxDecoration(
color: Colors.blue[100],
borderRadius: BorderRadius.circular(6),
),
child: Icon(
Icons.note_alt_rounded,
color: Colors.blue[700],
size: 16,
),
),
SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Alasan:',
style: TextStyle(
fontWeight: FontWeight.w600,
color: Colors.blue[800],
fontSize: 12,
),
),
SizedBox(height: 2),
Text(
voidReason,
style: TextStyle(
fontStyle: FontStyle.italic,
color: Colors.blue[700],
fontSize: 12,
),
),
],
),
),
],
),
),
],
),
),
),
// Action buttons
Container(
padding: EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.grey[50],
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(16),
bottomRight: Radius.circular(16),
),
),
child: Row(
children: [
Expanded(
child: Container(
height: 44,
child: ElevatedButton(
onPressed: () => Navigator.pop(context),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.grey[300],
foregroundColor: Colors.grey[700],
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.close_rounded, size: 18),
SizedBox(width: 6),
Text(
'Batal',
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
],
),
),
),
),
SizedBox(width: 12),
Expanded(
child: Container(
height: 44,
child: ElevatedButton(
onPressed: () {
Navigator.pop(context);
onTap();
},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red[600],
foregroundColor: Colors.white,
elevation: 2,
shadowColor: Colors.red.withOpacity(0.3),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.delete_forever_rounded, size: 18),
SizedBox(width: 6),
Text(
voidType == 'all' ? 'Void Pesanan' : 'Void Item',
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
),
),
],
),
),
),
),
],
),
),
],
),
),
);
}
}