first commit
This commit is contained in:
207
lib/Screens/Sales/sales_cart_widget.dart
Normal file
207
lib/Screens/Sales/sales_cart_widget.dart
Normal file
@@ -0,0 +1,207 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:hugeicons/hugeicons.dart';
|
||||
import 'package:mobile_pos/Screens/Sales/provider/sales_cart_provider.dart';
|
||||
import 'package:mobile_pos/Screens/Sales/sales_add_to_cart_sales_widget.dart';
|
||||
import 'package:mobile_pos/constant.dart';
|
||||
import 'package:mobile_pos/generated/l10n.dart' as lang;
|
||||
|
||||
class SalesCartListWidget extends ConsumerWidget {
|
||||
const SalesCartListWidget({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final providerData = ref.watch(cartNotifier);
|
||||
final s = lang.S.of(context);
|
||||
final _theme = Theme.of(context);
|
||||
return providerData.cartItemList.isNotEmpty
|
||||
? Padding(
|
||||
padding: const EdgeInsets.only(bottom: 12),
|
||||
child: Theme(
|
||||
data: Theme.of(context).copyWith(dividerColor: Colors.transparent),
|
||||
child: ExpansionTile(
|
||||
initiallyExpanded: true,
|
||||
collapsedBackgroundColor: kMainColor2,
|
||||
backgroundColor: kMainColor2,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
side: BorderSide(
|
||||
color: kLineColor,
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
title: Text(
|
||||
lang.S.of(context).itemAdded,
|
||||
style: _theme.textTheme.titleMedium,
|
||||
),
|
||||
children: [
|
||||
Container(
|
||||
color: Colors.white,
|
||||
child: ListView.builder(
|
||||
shrinkWrap: true,
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
itemCount: providerData.cartItemList.length,
|
||||
itemBuilder: (context, index) {
|
||||
final item = providerData.cartItemList[index];
|
||||
|
||||
// Calculate values for display
|
||||
final double quantity = item.quantity.toDouble();
|
||||
final double unitPrice = (item.unitPrice ?? 0).toDouble();
|
||||
final double discountPerUnit = (item.discountAmount ?? 0).toDouble();
|
||||
final double totalDiscount = quantity * discountPerUnit;
|
||||
final double subTotal = quantity * unitPrice;
|
||||
final double finalTotal = subTotal - totalDiscount;
|
||||
|
||||
return ListTile(
|
||||
visualDensity: VisualDensity(horizontal: -4, vertical: -4),
|
||||
contentPadding: EdgeInsetsDirectional.symmetric(horizontal: 10),
|
||||
onTap: () => showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
context: context,
|
||||
builder: (context2) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10.0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
s.updateProduct,
|
||||
style: const TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
CloseButton(
|
||||
onPressed: () => Navigator.pop(context2),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
const Divider(thickness: 1, color: kBorderColorTextField),
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: SalesAddToCartForm(
|
||||
batchWiseStockModel: item,
|
||||
previousContext: context2,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
title: Text(
|
||||
item.productName.toString(),
|
||||
style: _theme.textTheme.titleMedium?.copyWith(
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
subtitle: RichText(
|
||||
text: TextSpan(
|
||||
style: DefaultTextStyle.of(context).style,
|
||||
children: [
|
||||
// Qty X Price
|
||||
TextSpan(
|
||||
text: '${formatPointNumber(quantity)} X $unitPrice ',
|
||||
style: _theme.textTheme.titleSmall?.copyWith(
|
||||
color: kPeraColor,
|
||||
),
|
||||
),
|
||||
// Show Discount if exists
|
||||
if (totalDiscount > 0)
|
||||
TextSpan(
|
||||
text: '- ${formatPointNumber(totalDiscount)} (Disc) ',
|
||||
style: _theme.textTheme.titleSmall?.copyWith(
|
||||
color: kPeraColor,
|
||||
),
|
||||
),
|
||||
// Final Total
|
||||
TextSpan(
|
||||
text: '= ${formatPointNumber(finalTotal)} ',
|
||||
style: _theme.textTheme.titleSmall?.copyWith(
|
||||
color: kTitleColor,
|
||||
),
|
||||
),
|
||||
// Batch Info
|
||||
if (item.productType == 'variant')
|
||||
TextSpan(
|
||||
text: '[${item.batchName}]',
|
||||
style: const TextStyle(fontSize: 12, fontStyle: FontStyle.italic),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
trailing: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 90,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: () => providerData.quantityDecrease(index),
|
||||
child: Container(
|
||||
height: 18,
|
||||
width: 18,
|
||||
decoration: const BoxDecoration(
|
||||
color: kMainColor,
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||
),
|
||||
child: const Center(
|
||||
child: Icon(Icons.remove, size: 14, color: Colors.white),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 5),
|
||||
SizedBox(
|
||||
width: 40,
|
||||
child: Center(
|
||||
child: Text(
|
||||
formatPointNumber(item.quantity),
|
||||
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
|
||||
color: kGreyTextColor,
|
||||
),
|
||||
maxLines: 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
GestureDetector(
|
||||
onTap: () => providerData.quantityIncrease(index),
|
||||
child: Container(
|
||||
height: 18,
|
||||
width: 18,
|
||||
decoration: const BoxDecoration(
|
||||
color: kMainColor,
|
||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||
),
|
||||
child: const Center(
|
||||
child: Icon(Icons.add, size: 14, color: Colors.white),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
GestureDetector(
|
||||
onTap: () => providerData.deleteToCart(index),
|
||||
child: HugeIcon(
|
||||
icon: HugeIcons.strokeRoundedDelete03,
|
||||
size: 20,
|
||||
color: Colors.red,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
)
|
||||
: SizedBox.shrink();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user