1)Udpate code

This commit is contained in:
saritabirare 2024-10-09 14:55:41 +05:30
parent 476bfc4035
commit 9bf45659dc
8 changed files with 718 additions and 57 deletions

View File

@ -30,5 +30,37 @@ class GetProductRDController extends GetxController {
isLoading(false); // End loading isLoading(false); // End loading
} }
} }
Future<void> getRDPendingProduct() async {
try {
SharedPreferences prefs = await SharedPreferences.getInstance();
String? token = prefs.getString('token');
isLoading(true); // Start loading
final response = await GetProductRDService().getRDPendingProduct(token!); // Fetch products from API
if (response != null) {
productRDList.assignAll(response); // Assign products to the observable list
}
} finally {
isLoading(false); // End loading
}
}
Future<void> getRDCancleProduct() async {
try {
SharedPreferences prefs = await SharedPreferences.getInstance();
String? token = prefs.getString('token');
isLoading(true); // Start loading
final response = await GetProductRDService().getRDCancleProduct(token!); // Fetch products from API
if (response != null) {
productRDList.assignAll(response); // Assign products to the observable list
}
} finally {
isLoading(false); // End loading
}
}
} }

View File

@ -35,4 +35,74 @@ class GetProductRDService {
return null; return null;
} }
} }
Future<List<PlacedOrdersResponse>?> getRDPendingProduct(String token) async {
try {
String url = ApiUrls.getRdPendingOrdergUrl; // Base URL to fetch product manuals
final response = await commonApiService<List<PlacedOrdersResponse>>(
method: "GET",
url: url,
additionalHeaders: { // Pass the token here
'Authorization': 'Bearer $token',
},
fromJson: (json) {
if (json['plcaedOrders'] != null) {
// If the productManuals key is present, map the response to a list of ProductManualModel objects
final List<PlacedOrdersResponse> productManuals = (json['plcaedOrders'] as List)
.map((manualJson) => PlacedOrdersResponse.fromJson(manualJson))
.toList();
return productManuals; // Return the list of product manuals
} else {
return [];
}
},
);
return response;
} catch (e) {
print("fkfgghgh ,${e.toString()}");
//print(e.toString());
return null;
}
}
Future<List<PlacedOrdersResponse>?> getRDCancleProduct(String token) async {
try {
String url = ApiUrls.getrdCancleOrderUrl; // Base URL to fetch product manuals
final response = await commonApiService<List<PlacedOrdersResponse>>(
method: "GET",
url: url,
additionalHeaders: { // Pass the token here
'Authorization': 'Bearer $token',
},
fromJson: (json) {
if (json['plcaedOrders'] != null) {
// If the productManuals key is present, map the response to a list of ProductManualModel objects
final List<PlacedOrdersResponse> productManuals = (json['plcaedOrders'] as List)
.map((manualJson) => PlacedOrdersResponse.fromJson(manualJson))
.toList();
return productManuals; // Return the list of product manuals
} else {
return [];
}
},
);
return response;
} catch (e) {
print("fkfgghgh ,${e.toString()}");
//print(e.toString());
return null;
}
}
} }

View File

@ -4,6 +4,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import '../models/rd_order_item_model.dart'; import '../models/rd_order_item_model.dart';
import '../models/rd_placed_order_model.dart'; import '../models/rd_placed_order_model.dart';
import '../utils/show_snackbar.dart';
class RDOrderPlacedController extends GetxController { class RDOrderPlacedController extends GetxController {
final RDOrderPlacedService _rdOrderPlacedService = RDOrderPlacedService(); final RDOrderPlacedService _rdOrderPlacedService = RDOrderPlacedService();
@ -41,15 +42,39 @@ class RDOrderPlacedController extends GetxController {
try { try {
// Construct the order details from the observable variable // Construct the order details from the observable variable
PlacedOrdersProcessing orderDetails = placedOrder1.value; PlacedOrdersProcessing orderDetails = placedOrder1.value;
print("Order Details: ${orderDetails.toJson()}"); // Debugging the order details print("Order Details: ${orderDetails
.toJson()}"); // Debugging the order details
// Call the service to place the order // Call the service to place the order
await _rdOrderPlacedService.placRDeOrder(orderDetails, token!); await _rdOrderPlacedService.placRDeOrder(orderDetails, token!);
} catch (e) { } catch (e) {
print("Error placing order: $e"); print("Error placing order: $e");
} finally { } finally {
isLoading.value = false; isLoading.value = false;
} }
} }
}
Future<void> CancleRDProduct(String orderId, String reason) async {
try {
SharedPreferences prefs = await SharedPreferences.getInstance();
String? token = prefs.getString('token'); // Get the token
if (token == null || token.isEmpty) {
throw Exception("Token is missing. Please login again.");
}
isLoading(true); // Show loading indicator
// Call the service function and pass the token, orderId, and reason
await _rdOrderPlacedService.RDOrderCancel(token, orderId, reason);
// Optionally refresh the data or show success message
print("Order cancellation process complete.");
} catch (e) {
print("Error: $e");
} finally {
isLoading(false); // Hide loading indicator
}
}
}

View File

@ -10,8 +10,8 @@
final int hsnCode; // Ensure HSN_Code is int final int hsnCode; // Ensure HSN_Code is int
final String description; final String description;
final List<String> image; final List<String> image;
final int quantity; int? quantity;
final int remainingQuantity; int? remainingQuantity;
int? processquantity; int? processquantity;
RDOrderItem({ RDOrderItem({
required this.productId, required this.productId,
@ -24,8 +24,8 @@
required this.hsnCode, required this.hsnCode,
required this.description, required this.description,
required this.image, required this.image,
required this.quantity, this.quantity,
required this.remainingQuantity, this.remainingQuantity,
this.processquantity, this.processquantity,
}); });

View File

@ -0,0 +1,271 @@
import 'package:cheminova/controller/get_order_placed_controller.dart';
import 'package:cheminova/controller/rd_get_order_controller.dart';
import 'package:cheminova/models/rd_get_order_model.dart';
import 'package:cheminova/models/rd_order_item_model.dart';
import 'package:cheminova/models/rd_placed_order_model.dart';
import 'package:cheminova/screens/order/checkout_screen.dart';
import 'package:cheminova/widgets/my_drawer.dart';
import 'package:cheminova/widgets/product_card.dart';
import 'package:cheminova/widgets/product_card1.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:get/get.dart';
import 'package:google_fonts/google_fonts.dart';
import '../../controller/cart_controller.dart';
import '../../controller/rd_processing_order_controller.dart';
import '../../models/oder_place_model.dart';
import '../../models/product_model1.dart';
import '../../utils/show_snackbar.dart';
class PartialProcessingDialogScreen extends StatefulWidget {
PlacedOrdersResponse? productModel;
PartialProcessingDialogScreen({super.key, this.productModel});
@override
State<PartialProcessingDialogScreen> createState() => _PartialProcessingDialogScreenState();
}
class _PartialProcessingDialogScreenState extends State<PartialProcessingDialogScreen> {
final RDOrderPlacedController controller = Get.put(RDOrderPlacedController());
bool _selectAll = true; // Default to true to select all products
@override
void initState() {
super.initState();
}
void _showPartialOrderDialog() {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text("Confirm Partial Order"),
content: Text("Do you want to place a partial order for the selected items?"),
actions: [
TextButton(
onPressed: () async {
// Create a map to store order items
Map<String, RDOrderItem> orderItemMap = {};
// Populate the map with items and their quantities
for (var item in widget.productModel!.orderItem) {
var productId = item.productId; // Adjust if needed
if (orderItemMap.containsKey(productId)) {
// If the product already exists, aggregate the quantity
var existingItem = orderItemMap[productId]!;
existingItem.quantity = (existingItem.quantity ?? 0) + (item.quantity ?? 0);
} else {
// If it's a new product, add it to the map
orderItemMap[productId] = RDOrderItem(
productId: productId,
sku: item.sku,
name: item.name,
categoryName: item.categoryName,
brandName: item.brandName,
price: item.price,
gst: item.gst,
hsnCode: item.hsnCode,
description: item.description,
image: [], // Handle images appropriately
quantity: item.quantity ?? 0,
remainingQuantity: item.remainingQuantity ?? 0,
processquantity: item.processquantity ?? 0,
);
}
}
// Convert the map to a list
List<RDOrderItem> orderItems = orderItemMap.values.toList();
controller.placedOrder1.value = PlacedOrdersProcessing(
orderId: widget.productModel!.id,
invoiceItems: orderItems,
);
// Debugging: Print the JSON payload
print(controller.placedOrder1.value.toJson());
await controller.placeRDOrder();
// Show confirmation snackbar
showSnackbar( "Partial Order processed and invoice created successfully");
Future.delayed(const Duration(seconds: 1), () {
Get.back(); // Close the dialog
});
setState(() {}); // Refresh the UI
},
child: Text("Confirm"),
),
TextButton(
onPressed: () {
Get.back(); // Close the dialog
},
child: Text("Cancel"),
),
],
);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
extendBodyBehindAppBar: true,
appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
leading: Builder(
builder: (context) {
return GestureDetector(
onTap: () => Scaffold.of(context).openDrawer(),
child: Padding(
padding: const EdgeInsets.all(16.0),
child: SvgPicture.asset(
'assets/svg/menu.svg',
),
),
);
},
),
actions: [
GestureDetector(
onTap: () => Get.back(),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: SvgPicture.asset(
'assets/svg/back_arrow.svg',
),
),
),
],
title: const Center(
child: Text(
"Modify Product Availability",
),
),
),
drawer: MyDrawer(),
body: Stack(
fit: StackFit.expand,
children: [
Image.asset(
'assets/images/image_1.png',
fit: BoxFit.cover,
),
SafeArea(
child: Column(
children: [
SizedBox(height: Get.height * 0.02),
Card(
margin: const EdgeInsets.symmetric(horizontal: 18),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(19),
side: const BorderSide(color: Color(0xFFFDFDFD)),
),
color: const Color(0xFFB4D1E5).withOpacity(0.9),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
height: Get.height * 0.6,
child: ListView.builder(
padding: EdgeInsets.zero,
itemCount: widget.productModel!.orderItem.length,
itemBuilder: (context, index) {
final orderItem = widget.productModel!.orderItem[index];
return Row(
children: [
Expanded(
child: ProductCard1(
productModel: orderItem,
),
),
],
);
},
),
),
const SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Subtotal ",
style: GoogleFonts.roboto(
fontSize: 15,
color: Colors.black,
fontWeight: FontWeight.bold,
),
),
Text("${widget.productModel!.subtotal ?? 0}"),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"GST ",
style: GoogleFonts.roboto(
fontSize: 15,
color: Colors.black,
fontWeight: FontWeight.bold,
),
),
Text("${widget.productModel!.gstTotal ?? 0}"),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Total Amount ",
style: GoogleFonts.roboto(
fontSize: 15,
color: Colors.black,
fontWeight: FontWeight.bold,
),
),
Text("${widget.productModel!.grandTotal ?? 0}"),
],
),
],
),
),
),
SizedBox(height: Get.height * 0.020),
SizedBox(
width: Get.width * 0.9,
height: Get.height * 0.06,
child: ElevatedButton(
onPressed: _showPartialOrderDialog, // Show dialog when pressed
style: ElevatedButton.styleFrom(
foregroundColor: Colors.white,
backgroundColor: const Color(0xFF00784C),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
),
child: Text(
"Submit",
style: GoogleFonts.roboto(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
),
),
],
),
),
],
),
);
}
}

View File

@ -51,11 +51,30 @@ class _RdOrderDetailScreenState
"cancelled", "cancelled",
"delivered", "delivered",
]; ];
String selectedStatus = "All";
List<String> _statusList = ["new", "processing", "partial processing", "cancelled"]; // Default status list
// Define different status lists for different categories
final Map<String, List<String>> statusLists = {
"new": ["new", "processing", "partial processing", "cancelled"],
"pending": ["pending", "processing", "dispatched", "cancelled"],
"dispatched": ["dispatched", "delivered", "returned", "cancelled"],
"delivered": ["delivered", "returned", "cancelled"],
};
String selectedStatus = "new";
String _groupValue = "cheque"; String _groupValue = "cheque";
// Function to format date from the API to a more readable format // Function to format date from the API to a more readable format
// This function updates the dropdown list dynamically based on category selection
void updateStatusList(String category) {
setState(() {
_statusList = statusLists[category]!; // Update status list based on the selected category
selectedStatus = _statusList.first; // Set the default selection to the first item
});
}
String formatDate(String apiDate) { String formatDate(String apiDate) {
DateTime parsedDate = DateTime.parse(apiDate); DateTime parsedDate = DateTime.parse(apiDate);
@ -121,7 +140,6 @@ class _RdOrderDetailScreenState
// controller.fetchOrderItems(widget.placedOrderList!.id); // controller.fetchOrderItems(widget.placedOrderList!.id);
} }
// Method to show confirmation dialog
void _showConfirmationDialog() { void _showConfirmationDialog() {
String dialogTitle; String dialogTitle;
String dialogContent; String dialogContent;
@ -157,9 +175,9 @@ class _RdOrderDetailScreenState
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text(dialogContent), Text(dialogContent),
SizedBox(height: 10), // Space between text and text field SizedBox(height: 10),
TextField( TextField(
controller: reasonController, // Text controller for cancellation reason controller: reasonController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: 'Cancellation Reason', labelText: 'Cancellation Reason',
border: OutlineInputBorder(), border: OutlineInputBorder(),
@ -171,60 +189,90 @@ class _RdOrderDetailScreenState
actions: [ actions: [
TextButton( TextButton(
onPressed: () async { onPressed: () async {
// Check if the selected status is "cancelled" and if necessary reason is provided if (selectedStatus == "cancelled") {
if (selectedStatus == "cancelled" && reasonController.text.isEmpty) { // Ensure the reason is provided for cancellation
// Show a warning if the reason is empty if (reasonController.text.isEmpty) {
Get.snackbar("Error", "Please provide a reason for cancelling the order."); showSnackbar("Please provide a reason for cancelling the order.");
return; // Exit early if reason is empty
}
// Proceed with cancellation
await controller.CancleRDProduct(widget.placedOrderList!.id, reasonController.text);
// Notify user about successful cancellation
showSnackbar("Order cancelled successfully");
// Update the status in your UI or backend to reflect the cancelled state
setState(() {
// Update the status in the local model/UI
});
// Close the dialog after a short delay
Future.delayed(Duration(seconds: 1), () {
Get.back(); // Close the dialog
});
return; // Exit here to prevent further processing
}
if (selectedStatus == "partial processing") {
Get.to(() => PartialProcessingDialogScreen(productModel: widget.placedOrderList));
return; return;
} }
// Handle "partial processing" status // Create a map to track products by their IDs and aggregate quantities
if (selectedStatus == "partial processing") { Map<String, RDOrderItem> orderItemMap = {};
// Navigate to the Partial Processing screen without dismissing the dialog
Get.to(() => PartialProcessingDialogScreen(productModel: widget.placedOrderList)); // Populate the map with items and their quantities
return; // Exit to ensure dialog doesn't close yet for (var item in _getPlacedOrderController.productRDList) {
var productId = item.orderItem[0].productId;
if (orderItemMap.containsKey(productId)) {
// If the product already exists, aggregate the quantity
var existingItem = orderItemMap[productId]!; // Get the existing item
existingItem.quantity = (existingItem.quantity ?? 0) + (item.orderItem[0].quantity ?? 0);
} else {
// If it's a new product, add it to the map
orderItemMap[productId] = RDOrderItem(
productId: productId,
sku: item.orderItem[0].sku,
name: item.orderItem[0].name,
categoryName: item.orderItem[0].categoryName,
brandName: item.orderItem[0].brandName,
price: item.orderItem[0].price,
gst: item.orderItem[0].gst,
hsnCode: item.orderItem[0].hsnCode,
description: item.orderItem[0].description,
image: [], // Handle images appropriately
quantity: item.orderItem[0].quantity??0,
remainingQuantity: item.orderItem[0].remainingQuantity??0,
processquantity: item.orderItem[0].processquantity??0,
);
}
} }
List<RDOrderItem> orderItems = _getPlacedOrderController.productRDList.map<RDOrderItem>((product) { // Convert the map to a list
return RDOrderItem( List<RDOrderItem> orderItems = orderItemMap.values.toList();
productId: product.orderItem[0].productId,
sku: product.orderItem[0].sku,
name: product.orderItem[0].name, // You had an empty name in your code
categoryName: product.orderItem[0].categoryName,
brandName: product.orderItem[0].brandName,
price: product.orderItem[0].price,
gst: product.orderItem[0].gst,
hsnCode: product.orderItem[0].hsnCode, // Fixed hsnCode, hashCode was incorrect
description: product.orderItem[0].description,
image: [], // Ensure images are properly handled
quantity: product.orderItem[0].quantity,
remainingQuantity: product.orderItem[0].remainingQuantity,
processquantity: product.orderItem[0].processquantity,
);
}).toList();
// Updating the placedOrder1 with orderId and items // Ensure the placed order contains the correct orderId and items
controller.placedOrder1.value = PlacedOrdersProcessing( controller.placedOrder1.value = PlacedOrdersProcessing(
orderId: _getPlacedOrderController.productRDList[0].id, orderId: widget.placedOrderList!.id,
invoiceItems: orderItems, invoiceItems: orderItems,
); );
// Debugging: Print the JSON payload // Debugging: Print the JSON payload
print(controller.placedOrder1.value.toJson()); print(controller.placedOrder1.value.toJson());
await controller.placeRDOrder(); await controller.placeRDOrder();
// Call your update status method here showSnackbar("Order processed and invoice created successfully");
showSnackbar("Order processed and invoice created successfully"); Future.delayed(Duration(seconds: 1), () {
Get.back(); // Close the dialog
});
// Delay closing the dialog to ensure the user sees the success message setState(() {}); // Refresh the UI
Future.delayed(Duration(seconds: 1), () { },
Get.back(); // Close the dialog after a delay
});
setState(() {}); // Refresh the UI
},
child: Text("Confirm"), child: Text("Confirm"),
), ),
TextButton( TextButton(
@ -240,6 +288,8 @@ class _RdOrderDetailScreenState
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -558,13 +608,7 @@ class _RdOrderDetailScreenState
), ),
), ),
), ),
items: [ items: _statusList.map((String status) {
"new",
"processing",
"partial processing",
"cancelled",
].map((String status) {
return DropdownMenuItem<String>( return DropdownMenuItem<String>(
value: status, value: status,
child: Text(capitalizeFirstLetter(status)), child: Text(capitalizeFirstLetter(status)),

View File

@ -42,11 +42,29 @@ class ApiUrls {
//============================== Rd Order Details ==============================// //============================== Rd Order Details ==============================//
static const String getRdOrderUrl = '/api/pd-get-new-orders'; static const String getRdOrderUrl = '/api/pd-get-new-orders';
//============================== Rd Single Order Details ==============================//
static const String getRdSingleOrderUrl = '/api/pd-get-single-place-order';
//============================== Rd Processing Details ==============================// //============================== Rd Processing Details ==============================//
static const String getRdOrderProcessingUrl = '/api/pd-process-order'; static const String getRdOrderProcessingUrl = '/api/pd-process-order';
//============================== Rd Cancel Details ==============================// //============================== Rd Cancel Details ==============================//
static const String rdCancleOrderUrl = ' api/pd-cancel-order'; static const String rdCancleOrderUrl = '/api/pd-cancel-order';
static const String getrdCancleOrderUrl = '/api/pd-get-cancelled-orders';
//============================== Pending Order Details ==============================//
static const String getRdPendingOrdergUrl = '/api/pd-get-pending-orders';
//============================== RD ProcessingInvoice Order Details ==============================//
static const String getRdProcessingInvoiceOrdergUrl = '/api/pd-get-processing-invoices';
//============================== RD dispatched Order Details ==============================//
static const String getRdDispatchedOrdergUrl = '/api/pd-get-dispatched-invoices';
//============================== RD delivered Order Details ==============================//
static const String getRdDliveredOrdergUrl = '/api/pd-get-delivered-invoices';

View File

@ -0,0 +1,201 @@
import 'package:cheminova/controller/cart_controller.dart';
import 'package:cheminova/controller/rd_get_order_controller.dart';
import 'package:cheminova/models/rd_get_order_model.dart';
import 'package:cheminova/models/rd_order_item_model.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:google_fonts/google_fonts.dart';
class ProductCard1 extends StatefulWidget {
final RDOrderItem productModel; // The specific product to be displayed
int? quantity;
ProductCard1({
super.key,
required this.productModel, // Pass the product model explicitly
this.quantity = 1,
});
@override
State<ProductCard1> createState() => _ProductCard1State();
}
class _ProductCard1State extends State<ProductCard1> {
String capitalizeFirstLetter(String text) {
if (text.isEmpty) return text;
return text[0].toUpperCase() + text.substring(1).toLowerCase();
}
@override
Widget build(BuildContext context) {
final CartController _cartController = Get.put(CartController());
// Current quantity the user wants to process
int processQuantity = widget.productModel.processquantity ?? 1;
// Total available quantity
int availableQuantity = widget.productModel.remainingQuantity ?? 1;
return Card(
child: Row(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: ClipRRect(
borderRadius: BorderRadius.circular(15.0),
child: Container(
height: Get.height * 0.15,
width: Get.width * 0.31,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/images/product.png"),
fit: BoxFit.cover,
),
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 3.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Display product name with capitalization
Text(
capitalizeFirstLetter(widget.productModel.name),
style: GoogleFonts.roboto(
fontSize: 16,
fontWeight: FontWeight.w500,
),
),
// Display category name
Text(
capitalizeFirstLetter(widget.productModel.categoryName),
style: GoogleFonts.roboto(
fontSize: 14,
fontWeight: FontWeight.w400,
),
),
// Display the price of the product
Text(
"${widget.productModel.price.toString()}",
style: GoogleFonts.roboto(
fontSize: 22,
fontWeight: FontWeight.w700,
),
),
Row(
children: [
Text(
"Ordered Quantity : ",
style: GoogleFonts.roboto(
fontSize: 15,
fontWeight: FontWeight.w700,
),
),
Text(
" ${widget.productModel.quantity}",
style: GoogleFonts.roboto(
fontSize: 15,
),
),
],
),
// Quantity adjustment buttons
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Availability :",
style: GoogleFonts.roboto(
fontSize: 15,
fontWeight: FontWeight.w700,
),
),
Container(
height: Get.height * 0.04,
width: Get.width * 0.21,
decoration: BoxDecoration(
color: const Color(0xFF004791),
borderRadius: BorderRadius.circular(10),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
// Decrease quantity button
SizedBox(
height: 24,
width: 24,
child: ElevatedButton(
onPressed: () {
setState(() {
if (processQuantity > 1) {
processQuantity--;
widget.productModel.processquantity = processQuantity;
}
});
},
style: ElevatedButton.styleFrom(
padding: EdgeInsets.zero,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
child: Text(
'-',
style: GoogleFonts.roboto(
fontSize: 16,
fontWeight: FontWeight.w800,
),
),
),
),
// Display the current process quantity
Text(
"$processQuantity",
style: const TextStyle(
color: Colors.white,
fontSize: 16,
),
),
// Increase quantity button
SizedBox(
height: 22,
width: 22,
child: ElevatedButton(
onPressed: () {
setState(() {
if (processQuantity < availableQuantity) {
processQuantity++;
widget.productModel.processquantity = processQuantity;
}
});
},
style: ElevatedButton.styleFrom(
padding: EdgeInsets.zero,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
child: Text(
'+',
style: GoogleFonts.roboto(
fontSize: 16,
fontWeight: FontWeight.w800,
),
),
),
),
],
),
),
],
),
]),
),
)
],
),
);
}
}