QueenFruits/Mobile Operasional/lib/features/pos/presentation/widgets/insufficient_stock_dialog.dart

296 lines
9.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:sizer/sizer.dart';
import 'package:niogu_app/core/constants/app_color.dart';
import 'package:niogu_app/core/constants/app_font_size.dart';
class InsufficientStockDialog extends StatelessWidget {
final String materialName;
final String currentStock;
final String totalNeeded;
final String missingAmount;
final String unit;
final String triggerProductName;
final int otherProductsCount;
final VoidCallback onAddStockPressed;
final VoidCallback onEditUsagePressed;
const InsufficientStockDialog({
super.key,
required this.materialName,
required this.currentStock,
required this.totalNeeded,
required this.missingAmount,
required this.unit,
required this.triggerProductName,
this.otherProductsCount = 0,
required this.onAddStockPressed,
required this.onEditUsagePressed,
});
@override
Widget build(BuildContext context) {
const Color warningColor = Color(0xFFE65100);
final bool isTablet = 100.w >= 600;
final double maxWidth = 100.w >= 1280
? 1200
: isTablet
? 800
: 400;
return Dialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4.w)),
backgroundColor: Colors.white,
elevation: 0,
child: Container(
padding: EdgeInsets.all(5.w),
width: double.infinity,
constraints: BoxConstraints(maxWidth: maxWidth),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: EdgeInsets.all(3.w),
decoration: BoxDecoration(
color: warningColor.withOpacity(0.1),
shape: BoxShape.circle,
),
child: Icon(
Icons.warning_amber_rounded,
color: warningColor,
size: 8.w,
),
),
SizedBox(height: 2.h),
Text(
"Peringatan Stok Bahan Baku",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: AppFontSize.medium.sp,
fontWeight: FontWeight.bold,
color: Colors.black87,
),
),
SizedBox(height: 1.h),
Text(
"Stok bahan baku tidak mencukupi untuk memproses pesanan ini.",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: isTablet
? AppFontSize.medium.sp
: AppFontSize.small.sp,
color: Colors.grey[600],
),
),
SizedBox(height: 3.h),
Container(
padding: EdgeInsets.all(4.w),
decoration: BoxDecoration(
color: Colors.grey[50],
borderRadius: BorderRadius.circular(2.5.w),
border: Border.all(color: Colors.grey.shade200),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(
Icons.inventory_2_outlined,
size: 4.w,
color: Colors.black54,
),
SizedBox(width: 2.w),
Expanded(
child: Text(
materialName,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: isTablet
? AppFontSize.medium.sp
: AppFontSize.small.sp,
),
),
),
],
),
Divider(height: 3.h, color: Colors.grey.shade300),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
_buildStatItem(isTablet, "Sisa", "$currentStock $unit"),
Container(
width: 1,
height: 4.h,
color: Colors.grey.shade300,
),
_buildStatItem(isTablet, "Butuh", "$totalNeeded $unit"),
Container(
width: 1,
height: 4.h,
color: Colors.grey.shade300,
),
_buildStatItem(
isTablet,
"Kurang",
"$missingAmount $unit",
isHighlight: true, // Merah
),
],
),
],
),
),
SizedBox(height: 2.h),
Container(
width: double.infinity,
padding: EdgeInsets.symmetric(horizontal: 3.w, vertical: 1.5.h),
decoration: BoxDecoration(
color: Colors.blue[50],
borderRadius: BorderRadius.circular(2.w),
border: Border.all(color: Colors.blue.withOpacity(0.2)),
),
child: Row(
children: [
Icon(
Icons.shopping_bag_outlined,
size: 4.5.w,
color: Colors.blue[700],
),
SizedBox(width: 3.w),
Expanded(
child: RichText(
text: TextSpan(
style: TextStyle(
fontSize: isTablet
? AppFontSize.medium.sp
: AppFontSize.small.sp,
color: Colors.blue[900],
overflow: TextOverflow.ellipsis,
),
children: [
const TextSpan(text: "Digunakan oleh: "),
TextSpan(
text: triggerProductName,
style: const TextStyle(fontWeight: FontWeight.bold),
),
if (otherProductsCount > 0)
TextSpan(
text: " +$otherProductsCount lainnya",
style: TextStyle(
color: Colors.blue[700],
overflow: TextOverflow.ellipsis,
),
),
],
),
),
),
],
),
),
SizedBox(height: 3.5.h),
Column(
children: [
SizedBox(
width: double.infinity,
height: 6.h,
child: ElevatedButton.icon(
onPressed: () {
context.pop();
onAddStockPressed();
},
style: ElevatedButton.styleFrom(
backgroundColor: AppColor.primaryColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(2.5.w),
),
elevation: 0,
),
icon: Icon(
Icons.add_box_rounded,
color: Colors.white,
size: 5.w,
),
label: Text(
"Tambah Bahan Baku",
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: AppFontSize.medium.sp,
),
),
),
),
SizedBox(height: 1.5.h),
SizedBox(
width: double.infinity,
height: 6.h,
child: OutlinedButton(
onPressed: () {
context.pop();
onEditUsagePressed();
},
style: OutlinedButton.styleFrom(
side: BorderSide(color: AppColor.primaryColor),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(2.5.w),
),
),
child: Text(
"Ubah Jumlah Penggunaan",
style: TextStyle(
color: AppColor.primaryColor,
fontWeight: FontWeight.bold,
fontSize: AppFontSize.medium.sp,
),
),
),
),
],
),
],
),
),
);
}
Widget _buildStatItem(
bool isTablet,
String label,
String value, {
bool isHighlight = false,
}) {
return Column(
children: [
Text(
label,
style: TextStyle(
fontSize: isTablet ? AppFontSize.medium.sp : AppFontSize.small.sp,
color: Colors.grey[600],
),
),
SizedBox(height: 0.5.h),
Text(
value,
style: TextStyle(
fontSize: isTablet ? AppFontSize.medium.sp : AppFontSize.small.sp,
fontWeight: FontWeight.bold,
color: isHighlight ? Colors.red : Colors.black87,
),
),
],
);
}
}