diff --git a/lib/components/common/custom_drop_down.dart b/lib/components/common/custom_drop_down.dart index b4d96ac..e42730c 100644 --- a/lib/components/common/custom_drop_down.dart +++ b/lib/components/common/custom_drop_down.dart @@ -546,6 +546,13 @@ class _CustomDropdownState extends State> { style: 12.txtSBoldGrey, overflow: TextOverflow.ellipsis, ), + // Text( + // selectedItem != null + // ? widget.itemLabel(selectedItem as T) + // : widget.hintText, + // style: 12.txtSBoldGrey, + // overflow: TextOverflow.ellipsis, + // ), ), const Icon( Icons.keyboard_arrow_down_outlined, diff --git a/lib/feature/presentation/screens/dashboard/dashboard_screen.dart b/lib/feature/presentation/screens/dashboard/dashboard_screen.dart index 1f2e237..394253f 100644 --- a/lib/feature/presentation/screens/dashboard/dashboard_screen.dart +++ b/lib/feature/presentation/screens/dashboard/dashboard_screen.dart @@ -24,6 +24,7 @@ class _DashboardScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: AppColors.white, appBar: AppBar( automaticallyImplyLeading: false, backgroundColor: AppColors.secondaryClr, diff --git a/lib/feature/presentation/screens/transporter/view/sub_views/generate_fright_bill.dart b/lib/feature/presentation/screens/transporter/view/sub_views/generate_fright_bill.dart index f23be03..48bb4af 100644 --- a/lib/feature/presentation/screens/transporter/view/sub_views/generate_fright_bill.dart +++ b/lib/feature/presentation/screens/transporter/view/sub_views/generate_fright_bill.dart @@ -5,6 +5,7 @@ import 'package:shayog/components/common/common_button.dart'; import 'package:shayog/components/styles/app_colors.dart'; import 'package:shayog/components/styles/textStyles.dart'; import 'package:shayog/feature/presentation/widgets/text_view.dart'; +import 'package:shayog/services/model/generate_freight_model.dart'; import 'package:sizer/sizer.dart'; import 'package:vph_web_date_picker/vph_web_date_picker.dart'; import '../../../../../../../components/common/common_btn.dart'; @@ -24,282 +25,345 @@ class GenerateFrightBill extends StatelessWidget { Widget build(BuildContext context) { return Column( children: [ - Container( - padding: EdgeInsets.all(16), - color: AppColors.clrF2, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextView(text: - "Plant"), - SizedBox(height: 8), - CustomDropdown( - backClr: AppColors.clrD9, - borderClr: AppColors.clrGrey, - items: controller.plant, - itemLabel: (item) => "${item.plantCode}-${item.plantDesc}", - onSelected: (selected) { - if (selected != null) { - controller.selectPlant.value = selected.plantCode ?? ""; - print( - "selectPlant${controller.selectPlant.value}"); - } - }, - hintText: "Select Plant", - ), - ], - ), - ), - SizedBox(width: 16), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextView(text:"Product Name"), - SizedBox(height: 8), - CustomDropdown( - width: 250, - backClr: AppColors.clrD9, - borderClr: AppColors.clrGrey, - items: controller.product, - itemLabel: (item) => "${item.materialCode}-${item.materialDescription}", - onSelected: (selected) { - if (selected != null) { - controller.selectProduct.value = selected; - print( - "selectPlant${controller.selectProduct.value}"); - } - }, - hintText: "Select Product Name", - ), - ], - ), - ), - SizedBox(width: 16), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextView(text:"Transaction Type"), - SizedBox(height: 8), - CustomDropdown( - backClr: AppColors.clrD9, - borderClr: AppColors.clrGrey, - items: controller.transactionType, - itemLabel: (item) => item, - onSelected: (selected) { - if (selected != null) { - controller.selectTransactionType.value = selected; - print( - "selectTransactionType${controller.selectTransactionType.value}"); - } - }, - hintText: "Select Transaction Type", - ), - ], - ), - ), - ], - ), - Padding( - padding: const EdgeInsets.only(top: 16.0, left: 0, right: 8), - child: Row( + Obx( + () => controller.isFilterVisible.value + ? Column( children: [ - Expanded( + Container( + padding: EdgeInsets.all(16), + color: AppColors.clrF2, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - TextView(text:"MRN Date Range"), + Row( + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextView(text: "Plant", isRequired: true), + SizedBox(height: 8), + CustomDropdown( + backClr: AppColors.clrD9, + borderClr: AppColors.clrGrey, + items: controller.plant, - Container( - margin: EdgeInsets.only(top: 8), - height: 35, - child: TextFormField( - - key: controller.fromTextFieldKey, - controller: controller.fromController, - onTap: () async { - final pickedDate = await showWebDatePicker( - width: 20.w, - context: controller - .fromTextFieldKey.currentContext!, - initialDate: controller.fromSelectedDate, - firstDate: DateTime(2000), - lastDate: DateTime.now(), - ); - - if (pickedDate != null) { - controller.fromSelectedDate = pickedDate; - String formattedDate = - controller.getFormattedDate(pickedDate); - controller.fromController.text = - formattedDate; - controller.dateCheck.value = true; - } - }, - decoration: InputDecoration( - fillColor:AppColors.clrD9, - filled: true, - hintText: 'Select MRN Date Range', - hintStyle: TextStyle( - fontSize: 12, - overflow: TextOverflow.ellipsis), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(2.0), - borderSide: - BorderSide(color: AppColors.black), + itemLabel: (item) => + "${item.plantCode} - ${item.plantDesc}", + // Dropdown should show both + onSelected: (selected) { + if (selected != null) { + controller.selectPlantFreight.value = + selected.plantCode ?? ""; + controller.showPlantErrorFreight + .value = false; + } + }, + hintText: "Select Plant", + ), + Obx(() => controller + .showPlantErrorFreight.value + ? Padding( + padding: + const EdgeInsets.only(top: 4), + child: Text( + 'Please select a plant', + style: TextStyle( + color: Colors.red, + fontSize: 12), + ), + ) + : SizedBox.shrink()), + ], ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(2.0), - borderSide: - BorderSide(color: AppColors.clrGrey), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(2.0), - borderSide: - BorderSide(color: AppColors.clrGrey), - ), - disabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(2.0), - borderSide: - BorderSide(color: AppColors.clrGrey), - ), - suffixIcon: controller.dateCheck.value - ? InkWell( - onTap: () { - controller.dateCheck.value = false; - controller.fromController.clear(); - controller.fromSelectedDate = - DateTime.now(); - }, - child: Icon(Icons.close, size: 1.2.w), - ) - : null, - contentPadding: const EdgeInsets.symmetric( - horizontal: 12.0, vertical: 0.0), ), + SizedBox(width: 16), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextView( + text: "Product Name", isRequired: true), + SizedBox(height: 8), + CustomDropdown( + width: 250, + backClr: AppColors.clrD9, + borderClr: AppColors.clrGrey, + items: controller.product, + itemLabel: (item) => + "${item.materialCode}-${item.materialDescription}", + onSelected: (selected) { + if (selected != null) { + controller.selectProductFreight + .value = selected.materialCode; + controller.showProductErrorFreight + .value = false; + } + }, + hintText: "Select Product Name", + ), + Obx(() => controller + .showProductErrorFreight.value + ? Padding( + padding: + const EdgeInsets.only(top: 4), + child: Text( + 'Please select a Product', + style: TextStyle( + color: Colors.red, + fontSize: 12), + ), + ) + : SizedBox.shrink()), + ], + ), + ), + SizedBox(width: 16), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextView( + text: "Transaction Type", + isRequired: true), + SizedBox(height: 8), + CustomDropdown( + backClr: AppColors.clrD9, + borderClr: AppColors.clrGrey, + items: controller.transactionType, + itemLabel: (item) => item, + onSelected: (selected) { + if (selected != null) { + controller + .selectTransactionTypeFreight + .value = selected; + controller.showTransactionErrorFreight + .value = false; + } + }, + hintText: "Select Transaction Type", + ), + Obx(() => controller + .showTransactionErrorFreight.value + ? Padding( + padding: + const EdgeInsets.only(top: 4), + child: Text( + 'Please select Transaction Type', + style: TextStyle( + color: Colors.red, + fontSize: 12), + ), + ) + : SizedBox.shrink()), + ], + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.only( + top: 16.0, left: 0, right: 8), + child: Row( + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + TextView(text: "MRN Date Range"), + Container( + margin: EdgeInsets.only(top: 8), + height: 35, + child: TextFormField( + key: controller.fromTextFieldKey, + controller: controller.fromController, + onTap: () async { + final pickedDate = + await showWebDatePicker( + width: 20.w, + context: controller + .fromTextFieldKey + .currentContext!, + initialDate: + controller.fromSelectedDate, + firstDate: DateTime(2000), + lastDate: DateTime.now(), + ); + + if (pickedDate != null) { + controller.fromSelectedDate = + pickedDate; + String formattedDate = controller + .getFormattedDate(pickedDate); + controller.fromController.text = + formattedDate; + controller.dateCheck.value = true; + } + }, + decoration: InputDecoration( + fillColor: AppColors.clrD9, + filled: true, + hintText: 'Select MRN Date Range', + hintStyle: TextStyle( + fontSize: 12, + overflow: + TextOverflow.ellipsis), + border: OutlineInputBorder( + borderRadius: + BorderRadius.circular(2.0), + borderSide: BorderSide( + color: AppColors.black), + ), + enabledBorder: OutlineInputBorder( + borderRadius: + BorderRadius.circular(2.0), + borderSide: BorderSide( + color: AppColors.clrGrey), + ), + focusedBorder: OutlineInputBorder( + borderRadius: + BorderRadius.circular(2.0), + borderSide: BorderSide( + color: AppColors.clrGrey), + ), + disabledBorder: OutlineInputBorder( + borderRadius: + BorderRadius.circular(2.0), + borderSide: BorderSide( + color: AppColors.clrGrey), + ), + suffixIcon: controller + .dateCheck.value + ? InkWell( + onTap: () { + controller.dateCheck + .value = false; + controller.fromController + .clear(); + controller + .fromSelectedDate = + DateTime.now(); + }, + child: Icon(Icons.close, + size: 1.2.w), + ) + : null, + contentPadding: + const EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 0.0), + ), + ), + ), + ], + ), + ), + SizedBox(width: 16), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + TextView(text: "From Location"), + SizedBox(height: 8), + CustomDropdown( + backClr: AppColors.clrD9, + borderClr: AppColors.clrGrey, + items: controller.fromLocation, + itemLabel: (item) => item, + onSelected: (selected) { + if (selected != null) { + controller.selectLocation.value = + selected; + } + }, + hintText: "Select From Location", + ), + ], + ), + ), + SizedBox( + width: 16, + ), + Expanded( + //flex: 2, + child: Column( + children: [ + TextView( + text: "", + ), + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Row( + mainAxisAlignment: + MainAxisAlignment.end, + children: [ + CommonBtn( + bkClr: Colors.white, + text: AppStrings.cancel, + clickAction: () => + controller.clearFilters(), + ), + SizedBox(width: 16), + CommonButton( + borderRadius: 4, + height: 30, + width: 100, + text: AppStrings.submit, + // clickAction: () { + // // controller.postData(); + // controller.handleFilterSubmit(); + // }, + clickAction: () => + controller.handleFilterSubmit(), + ), + // CommonButton( + // borderRadius: 4, + // height: 30, + // width: 100, + // text: AppStrings.submit, + // clickAction: () { + // controller.validateFields(); + // + // if (controller.showPlantError.value || + // controller.showProductError.value || + // controller.showTransactionError.value + // ) { + // print('controller.showProductError.value ${controller.showProductError.value}'); + // + // } else { + // controller.postData(); + // } + // }, + // ), + ], + ), + ), + ], + )) + ], ), ), ], ), ), - SizedBox(width: 16), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextView(text:"From Location"), - SizedBox(height: 8), - CustomDropdown( - backClr: AppColors.clrD9, - borderClr: AppColors.clrGrey, - items: controller.fromLocation, - itemLabel: (item) => item, - onSelected: (selected) { - if (selected != null) { - controller.selectLocation.value = selected; - } - }, - hintText: "Select From Location", - ), - ], - ), - ), - SizedBox( - width: 16, - ), - Expanded( - //flex: 2, - child: Column( - children: [ - TextView(text: - "", - ), - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - CommonBtn( - bkClr: Colors.white, - text: AppStrings.cancel, - clickAction: () {}, - ), - SizedBox(width: 16), - CommonButton( - borderRadius: 4, - height: 30, - width: 100, - text: AppStrings.submit, - - clickAction: () { - controller.postData(); - }, - ), - ], - ), - ), - ], - )) ], - ), - ), - ], - ), - ), - Container( - padding: EdgeInsets.symmetric(horizontal: 10), - margin: EdgeInsets.only(top: 16), - height: 45, - color: AppColors.primaryClr, - child: Row( - children: [ - TextView(text: AppStrings.viewGrnDetails, style: 14.txtBoldWhite), - Spacer(), - CommonBtn( - width: 150, - bkClr: AppColors.white, - borderClr: AppColors.primaryClr, - style: 12.txtBoldBlue, - text: "Generate Freight Bill", - // text: AppStrings.save, - clickAction: () { - bool hasSelectedRows = controller.grnDetails - .any((element) => element.isSelected); - if (!hasSelectedRows) { - showPopup(context: context, onClick: () { - Get.back(); - }); - } else { - CommonAlertDialog.showDialog( - message: "Are you sure want to\nsave this?", - positiveText: "Save", - negativeText: "Cancel", - positiveBtCallback: () { - Get.back(); - controller.addFreightBill(); - - showFreightBill(context); - }, - negativeBtCallback: () {}); - } - }), - ], - ), + ) + : SizedBox.shrink(), ), Obx(() { + List filteredData = controller.filterGrnDetails.where((item) { + return (controller.selectPlantFreight.value.isEmpty || item.plantCode == controller.selectPlantFreight.value) && + (controller.selectProductFreight.value.isEmpty || item.materialCode == controller.selectProductFreight.value) && + (controller.selectTransactionTypeFreight.value.isEmpty || item.transporterCode == controller.selectTransactionTypeFreight.value); + }).toList(); if (controller.isLoading.value) { return Center(child: CircularProgressIndicator()); } @@ -308,138 +372,375 @@ class GenerateFrightBill extends StatelessWidget { return Center(child: Text(controller.errorMessage.value)); } - if (controller.grnDetails.isEmpty) { + if (controller.grnDetails.isEmpty ) { return Center(child: Text('No data available.')); } - return Scrollbar( - thumbVisibility: true, - controller: controller.verticalScrollController, - child: SingleChildScrollView( - controller: controller.verticalScrollController, - child: Scrollbar( - thumbVisibility: true, - controller: controller.horizontalScrollController, - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - controller: controller.horizontalScrollController, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: Colors.grey.shade400, - width: 1.0, - ), - ), - child: DataTable( - dataRowHeight: 28, - headingRowHeight: 40, - headingRowColor: WidgetStateProperty.all(AppColors.clrF2), - border: TableBorder( - horizontalInside: BorderSide(color: AppColors.clrGrey), - verticalInside: BorderSide(color: AppColors.clrGrey), - bottom: BorderSide(color: AppColors.clrGrey), - left: BorderSide(color: AppColors.clrGrey), - right: BorderSide(color: AppColors.clrGrey), - top: BorderSide(color: AppColors.clrGrey), - ), - columns: [ - DataColumn( - label: Transform.scale( - scale: 0.80, - // Adjust this scale to make the checkbox bigger or smaller - child: Checkbox( - value: controller.selectAllField.value, + return controller.isFilterVisible.value + // If filter is visible, check if any of the fields are empty + ? + controller.selectPlantFreight.value.isEmpty + || + controller.selectProductFreight.value.isEmpty || + controller.selectTransactionTypeFreight.value.isEmpty - onChanged: (value) { - controller.selectAll(value ?? false); - }, - activeColor: AppColors.primaryClr, - checkColor: Colors.white, - materialTapTargetSize: MaterialTapTargetSize - .shrinkWrap, // Avoids large tap area - ), + // If the fields are empty, show a message or do not display the table + ? Center(child: Text('No Data Found', style: TextStyle(fontSize: 16, color: Colors.grey))) + : + + Column( + children: [ + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + margin: EdgeInsets.only(top: 16), + height: 45, + color: AppColors.primaryClr, + child: Row( + children: [ + TextView( + text: AppStrings.viewGrnDetails, + style: 14.txtBoldWhite), + Spacer(), + CommonBtn( + width: 150, + bkClr: AppColors.white, + borderClr: AppColors.primaryClr, + style: 12.txtBoldBlue, + text: "Generate Freight Bill", + clickAction: () { + bool hasSelectedRows = controller.grnDetails + .any((element) => element.isSelected); + if (!hasSelectedRows) { + showPopup( + context: context, + onClick: () { + Get.back(); + }); + } else { + CommonAlertDialog.showDialog( + message: "Are you sure want to\nsave this?", + positiveText: "Save", + negativeText: "Cancel", + positiveBtCallback: () { + Get.back(); + controller.addFreightBill(); + showFreightBill(context); + }, + negativeBtCallback: () {}); + } + }), + ], + ), + ), + Scrollbar( + thumbVisibility: true, + controller: controller.verticalScrollController, + child: SingleChildScrollView( + controller: controller.verticalScrollController, + child: Scrollbar( + thumbVisibility: true, + controller: controller.horizontalScrollController, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + controller: controller.horizontalScrollController, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.shade400, + width: 1.0, ), ), - // dataColumn(AppStrings.srNo), - dataColumn(AppStrings.mrnNo), - dataColumn(AppStrings.plantNo), - dataColumn(AppStrings.product), - dataColumn(AppStrings.date), - dataColumn(AppStrings.fromLocation), - dataColumn(AppStrings.vehicleNo), - dataColumn(AppStrings.transporterLrNo), - dataColumn(AppStrings.transporterLrNoDate), - dataColumn(AppStrings.dispQty), - dataColumn(AppStrings.netQty), - dataColumn(AppStrings.billingQty), - dataColumn(AppStrings.vom), - dataColumn(AppStrings.freightRate), - dataColumn(AppStrings.freightAmount), - ], - rows: List.generate(controller.grnDetails.length, - (index) { - final stoppage = controller.grnDetails[index]; - - return DataRow( - selected: stoppage.isSelected, - cells: [ - DataCell( - Transform.scale( + child: DataTable( + dataRowHeight: 28, + headingRowHeight: 40, + headingRowColor: + WidgetStateProperty.all(AppColors.clrF2), + border: TableBorder( + horizontalInside: + BorderSide(color: AppColors.clrGrey), + verticalInside: + BorderSide(color: AppColors.clrGrey), + bottom: BorderSide(color: AppColors.clrGrey), + left: BorderSide(color: AppColors.clrGrey), + right: BorderSide(color: AppColors.clrGrey), + top: BorderSide(color: AppColors.clrGrey), + ), + columns: [ + DataColumn( + label: Transform.scale( scale: 0.80, + // Adjust this scale to make the checkbox bigger or smaller child: Checkbox( - value: stoppage.isSelected, + value: controller.selectAllField.value, + onChanged: (value) { - controller.toggleSelection( - index, value ?? false); + controller.selectAllFilter(value ?? false); }, activeColor: AppColors.primaryClr, - // Custom color when selected checkColor: Colors.white, - // Custom color for check mark materialTapTargetSize: MaterialTapTargetSize .shrinkWrap, // Avoids large tap area ), ), ), - // editableCell(index, "0${index + 1}"), - editableCell(index, stoppage.grnNo ?? ""), - editableCell(index, stoppage.plantCode ?? ""), - editableCell(index, stoppage.materialCode ?? ""), - editableCell( - index, - DateFormat('yyyy-MM-dd').format( - stoppage.grnDate ?? DateTime.now())), - editableCell(index, stoppage.fromLocation ?? ""), - editableCell(index, stoppage.vehicleNo ?? ""), - editableCell(index, stoppage.lrNo ?? ""), - editableCell( - index, - DateFormat('yyyy-MM-dd') - .format(stoppage.lrDate ?? DateTime.now())), - editableCell( - index, stoppage.dispQty?.toString() ?? ""), - editableCell( - index, stoppage.netQty?.toString() ?? ""), - editableCell( - index, stoppage.billingQty?.toString() ?? ""), - editableCell( - index, stoppage.freightRate?.toString() ?? ""), - editableCell( - index, stoppage.shipmentCost?.toString() ?? ""), - editableCell( - index, stoppage.statusId?.toString() ?? ""), + // dataColumn(AppStrings.srNo), + dataColumn(AppStrings.mrnNo), + dataColumn(AppStrings.plantNo), + dataColumn(AppStrings.product), + dataColumn(AppStrings.date), + dataColumn(AppStrings.fromLocation), + dataColumn(AppStrings.vehicleNo), + dataColumn(AppStrings.transporterLrNo), + dataColumn(AppStrings.transporterLrNoDate), + dataColumn(AppStrings.dispQty), + dataColumn(AppStrings.netQty), + dataColumn(AppStrings.billingQty), + dataColumn(AppStrings.vom), + dataColumn(AppStrings.freightRate), + dataColumn(AppStrings.freightAmount), ], - ); - }), + rows: List.generate( + controller.filterGrnDetails.length, (index) { + final stoppage = controller.filterGrnDetails[index]; + + return DataRow( + selected: stoppage.isSelected, + cells: [ + DataCell( + Transform.scale( + scale: 0.80, + child: Checkbox( + value: stoppage.isSelected, + onChanged: (value) { + controller.toggleSelectionFilter( + index, value ?? false); + }, + activeColor: AppColors.primaryClr, + // Custom color when selected + checkColor: Colors.white, + // Custom color for check mark + materialTapTargetSize: MaterialTapTargetSize + .shrinkWrap, // Avoids large tap area + ), + ), + ), + // editableCell(index, "0${index + 1}"), + editableCell(index, stoppage.grnNo ?? ""), + editableCell(index, stoppage.plantCode ?? ""), + editableCell( + index, stoppage.materialCode ?? ""), + editableCell( + index, + DateFormat('yyyy-MM-dd').format( + stoppage.grnDate ?? DateTime.now())), + editableCell( + index, stoppage.fromLocation ?? ""), + editableCell(index, stoppage.vehicleNo ?? ""), + editableCell(index, stoppage.lrNo ?? ""), + editableCell( + index, + DateFormat('yyyy-MM-dd').format( + stoppage.lrDate ?? DateTime.now())), + editableCell( + index, stoppage.dispQty?.toString() ?? ""), + editableCell( + index, stoppage.netQty?.toString() ?? ""), + editableCell(index, + stoppage.billingQty?.toString() ?? ""), + editableCell(index, + stoppage.freightRate?.toString() ?? ""), + editableCell(index, + stoppage.shipmentCost?.toString() ?? ""), + editableCell( + index, stoppage.statusId?.toString() ?? ""), + ], + ); + }), + ), + ), ), ), ), ), - ), + ], + ): + Column( + children: [ + Container( + padding: EdgeInsets.symmetric(horizontal: 10), + margin: EdgeInsets.only(top: 16), + height: 45, + color: AppColors.primaryClr, + child: Row( + children: [ + TextView( + text: AppStrings.viewGrnDetails, + style: 14.txtBoldWhite), + Spacer(), + CommonBtn( + width: 150, + bkClr: AppColors.white, + borderClr: AppColors.primaryClr, + style: 12.txtBoldBlue, + text: "Generate Freight Bill", + clickAction: () { + bool hasSelectedRows = controller.grnDetails + .any((element) => element.isSelected); + if (!hasSelectedRows) { + showPopup( + context: context, + onClick: () { + Get.back(); + }); + } else { + CommonAlertDialog.showDialog( + message: "Are you sure want to\nsave this?", + positiveText: "Save", + negativeText: "Cancel", + positiveBtCallback: () { + Get.back(); + controller.addFreightBill(); + showFreightBill(context); + }, + negativeBtCallback: () {}); + } + }), + ], + ), + ), + Scrollbar( + thumbVisibility: true, + controller: controller.verticalScrollController, + child: SingleChildScrollView( + controller: controller.verticalScrollController, + child: Scrollbar( + thumbVisibility: true, + controller: controller.horizontalScrollController, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + controller: controller.horizontalScrollController, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.shade400, + width: 1.0, + ), + ), + child: DataTable( + dataRowHeight: 28, + headingRowHeight: 40, + headingRowColor: + WidgetStateProperty.all(AppColors.clrF2), + border: TableBorder( + horizontalInside: + BorderSide(color: AppColors.clrGrey), + verticalInside: + BorderSide(color: AppColors.clrGrey), + bottom: BorderSide(color: AppColors.clrGrey), + left: BorderSide(color: AppColors.clrGrey), + right: BorderSide(color: AppColors.clrGrey), + top: BorderSide(color: AppColors.clrGrey), + ), + columns: [ + DataColumn( + label: Transform.scale( + scale: 0.80, + // Adjust this scale to make the checkbox bigger or smaller + child: Checkbox( + value: controller.selectAllField.value, + + onChanged: (value) { + controller.selectAll(value ?? false); + }, + activeColor: AppColors.primaryClr, + checkColor: Colors.white, + materialTapTargetSize: MaterialTapTargetSize + .shrinkWrap, // Avoids large tap area + ), + ), + ), + // dataColumn(AppStrings.srNo), + dataColumn(AppStrings.mrnNo), + dataColumn(AppStrings.plantNo), + dataColumn(AppStrings.product), + dataColumn(AppStrings.date), + dataColumn(AppStrings.fromLocation), + dataColumn(AppStrings.vehicleNo), + dataColumn(AppStrings.transporterLrNo), + dataColumn(AppStrings.transporterLrNoDate), + dataColumn(AppStrings.dispQty), + dataColumn(AppStrings.netQty), + dataColumn(AppStrings.billingQty), + dataColumn(AppStrings.vom), + dataColumn(AppStrings.freightRate), + dataColumn(AppStrings.freightAmount), + ], + rows: List.generate( + controller.grnDetails.length, (index) { + final stoppage = controller.grnDetails[index]; + + return DataRow( + selected: stoppage.isSelected, + cells: [ + DataCell( + Transform.scale( + scale: 0.80, + child: Checkbox( + value: stoppage.isSelected, + onChanged: (value) { + controller.toggleSelection( + index, value ?? false); + }, + activeColor: AppColors.primaryClr, + // Custom color when selected + checkColor: Colors.white, + // Custom color for check mark + materialTapTargetSize: MaterialTapTargetSize + .shrinkWrap, // Avoids large tap area + ), + ), + ), + // editableCell(index, "0${index + 1}"), + editableCell(index, stoppage.grnNo ?? ""), + editableCell(index, stoppage.plantCode ?? ""), + editableCell( + index, stoppage.materialCode ?? ""), + editableCell( + index, + DateFormat('yyyy-MM-dd').format( + stoppage.grnDate ?? DateTime.now())), + editableCell( + index, stoppage.fromLocation ?? ""), + editableCell(index, stoppage.vehicleNo ?? ""), + editableCell(index, stoppage.lrNo ?? ""), + editableCell( + index, + DateFormat('yyyy-MM-dd').format( + stoppage.lrDate ?? DateTime.now())), + editableCell( + index, stoppage.dispQty?.toString() ?? ""), + editableCell( + index, stoppage.netQty?.toString() ?? ""), + editableCell(index, + stoppage.billingQty?.toString() ?? ""), + editableCell(index, + stoppage.freightRate?.toString() ?? ""), + editableCell(index, + stoppage.shipmentCost?.toString() ?? ""), + editableCell( + index, stoppage.statusId?.toString() ?? ""), + ], + ); + }), + ), + ), + ), + ), + ), + ), + ], ); }), ], ); } - - } diff --git a/lib/feature/presentation/screens/transporter/view/sub_views/pending_generation.dart b/lib/feature/presentation/screens/transporter/view/sub_views/pending_generation.dart index ddf65a1..59dbb06 100644 --- a/lib/feature/presentation/screens/transporter/view/sub_views/pending_generation.dart +++ b/lib/feature/presentation/screens/transporter/view/sub_views/pending_generation.dart @@ -41,7 +41,7 @@ class PendingGeneration extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ TextView(text: - "Plant"), + "Plant", isRequired: true), SizedBox(height: 8), CustomDropdown( backClr: AppColors.clrD9, @@ -50,13 +50,21 @@ class PendingGeneration extends StatelessWidget { itemLabel: (item) => "${item.plantCode}-${item.plantDesc}", onSelected: (selected) { if (selected != null) { - controller.selectPlant.value = selected.plantCode ?? ""; - print( - "selectPlant${controller.selectPlant.value}"); + controller.selectPlantPending.value = selected.plantCode ?? ""; + controller.showPlantErrorPending.value = false; } }, hintText: "Select Plant", ), + Obx(() => controller.showPlantErrorPending.value + ? Padding( + padding: const EdgeInsets.only(top: 4), + child: Text( + 'Please select a plant', + style: TextStyle(color: Colors.red, fontSize: 12), + ), + ) + : SizedBox.shrink()), ], ), ), @@ -66,7 +74,7 @@ class PendingGeneration extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - TextView(text:"Product Name"), + TextView(text:"Product Name", isRequired: true), SizedBox(height: 8), CustomDropdown( width: 250, @@ -76,7 +84,7 @@ class PendingGeneration extends StatelessWidget { itemLabel: (item) => "${item.materialCode}-${item.materialDescription}", onSelected: (selected) { if (selected != null) { - controller.selectProduct.value = selected; + controller.selectProductPending.value = selected; print( "selectPlant${controller.selectProduct.value}"); } @@ -92,7 +100,7 @@ class PendingGeneration extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - TextView(text:"Transaction Type"), + TextView(text:"Transaction Type", isRequired: true), SizedBox(height: 8), CustomDropdown( backClr: AppColors.clrD9, @@ -101,13 +109,20 @@ class PendingGeneration extends StatelessWidget { itemLabel: (item) => item, onSelected: (selected) { if (selected != null) { - controller.selectTransactionType.value = selected; - print( - "selectTransactionType${controller.selectTransactionType.value}"); - } + controller.selectTransactionTypePending.value = selected; + controller.showTransactionErrorPending.value = false; } }, hintText: "Select Transaction Type", ), + Obx(() => controller.showTransactionErrorPending.value + ? Padding( + padding: const EdgeInsets.only(top: 4), + child: Text( + 'Please select Transaction Type', + style: TextStyle(color: Colors.red, fontSize: 12), + ), + ) + : SizedBox.shrink()), ], ), ), @@ -258,7 +273,16 @@ class PendingGeneration extends StatelessWidget { text: AppStrings.submit, clickAction: () { - controller.postData(); + controller.validateFieldsPending(); + if (controller.showPlantErrorPending.value || + controller.showProductErrorPending.value || + controller.showTransactionErrorPending.value + ) { + + } else { + controller.postData(); + } + }, ), ], diff --git a/lib/feature/presentation/screens/transporter/view/sub_views/view_freight_bill.dart b/lib/feature/presentation/screens/transporter/view/sub_views/view_freight_bill.dart index 96f4436..3137d68 100644 --- a/lib/feature/presentation/screens/transporter/view/sub_views/view_freight_bill.dart +++ b/lib/feature/presentation/screens/transporter/view/sub_views/view_freight_bill.dart @@ -41,24 +41,35 @@ class ViewFreightBill extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - TextView(text: "Plant"), + TextView(text: "Plant", isRequired: true), SizedBox(height: 8), CustomDropdown( backClr: AppColors.clrD9, borderClr: AppColors.clrGrey, items: controller.plant, itemLabel: (item) => - "${item.plantCode}-${item.plantDesc}", + "${item.plantCode}-${item.plantDesc}", onSelected: (selected) { if (selected != null) { controller.selectPlant.value = selected.plantCode ?? ""; + controller.showPlantErrorFreight.value = false; print( "selectPlant${controller.selectPlant.value}"); } }, hintText: "Select Plant", ), + Obx(() => + controller.showPlantErrorFreight.value + ? Padding( + padding: const EdgeInsets.only(top: 4), + child: Text( + 'Please select a plant', + style: TextStyle(color: Colors.red, fontSize: 12), + ), + ) + : SizedBox.shrink()), ], ), ), @@ -68,7 +79,7 @@ class ViewFreightBill extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - TextView(text: "Product Name"), + TextView(text: "Product Name", isRequired: true), SizedBox(height: 8), CustomDropdown( width: 250, @@ -76,12 +87,13 @@ class ViewFreightBill extends StatelessWidget { borderClr: AppColors.clrGrey, items: controller.product, itemLabel: (item) => - "${item.materialCode}-${item.materialDescription}", + "${item.materialCode}-${item.materialDescription}", onSelected: (selected) { if (selected != null) { controller.selectProduct.value = selected; print( - "selectPlant${controller.selectProduct.value}"); + "selectPlant${controller.selectProduct + .value}"); } }, hintText: "Select Product Name", @@ -95,7 +107,7 @@ class ViewFreightBill extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - TextView(text: "Transaction Type"), + TextView(text: "Transaction Type", isRequired: true), SizedBox(height: 8), CustomDropdown( backClr: AppColors.clrD9, @@ -105,12 +117,25 @@ class ViewFreightBill extends StatelessWidget { onSelected: (selected) { if (selected != null) { controller.selectTransactionType.value = selected; + controller.showTransactionErrorFreight.value = + false; print( - "selectTransactionType${controller.selectTransactionType.value}"); + "selectTransactionType${controller + .selectTransactionType.value}"); } }, hintText: "Select Transaction Type", ), + Obx(() => + controller.showTransactionErrorFreight.value + ? Padding( + padding: const EdgeInsets.only(top: 4), + child: Text( + 'Please select Transaction Type', + style: TextStyle(color: Colors.red, fontSize: 12), + ), + ) + : SizedBox.shrink()), ], ), ), @@ -145,7 +170,7 @@ class ViewFreightBill extends StatelessWidget { if (pickedDate != null) { controller.fromSelectedDate = pickedDate; String formattedDate = - controller.getFormattedDate(pickedDate); + controller.getFormattedDate(pickedDate); controller.fromController.text = formattedDate; controller.dateCheck.value = true; @@ -161,33 +186,33 @@ class ViewFreightBill extends StatelessWidget { border: OutlineInputBorder( borderRadius: BorderRadius.circular(2.0), borderSide: - BorderSide(color: AppColors.black), + BorderSide(color: AppColors.black), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(2.0), borderSide: - BorderSide(color: AppColors.clrGrey), + BorderSide(color: AppColors.clrGrey), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(2.0), borderSide: - BorderSide(color: AppColors.clrGrey), + BorderSide(color: AppColors.clrGrey), ), disabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(2.0), borderSide: - BorderSide(color: AppColors.clrGrey), + BorderSide(color: AppColors.clrGrey), ), suffixIcon: controller.dateCheck.value ? InkWell( - onTap: () { - controller.dateCheck.value = false; - controller.fromController.clear(); - controller.fromSelectedDate = - DateTime.now(); - }, - child: Icon(Icons.close, size: 1.2.w), - ) + onTap: () { + controller.dateCheck.value = false; + controller.fromController.clear(); + controller.fromSelectedDate = + DateTime.now(); + }, + child: Icon(Icons.close, size: 1.2.w), + ) : null, contentPadding: const EdgeInsets.symmetric( horizontal: 12.0, vertical: 0.0), @@ -224,37 +249,50 @@ class ViewFreightBill extends StatelessWidget { width: 16, ), Expanded( - //flex: 2, + //flex: 2, child: Column( - children: [ - TextView( - text: "", - ), - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - CommonBtn( - bkClr: Colors.white, - text: AppStrings.cancel, - clickAction: () {}, + children: [ + TextView( + text: "", + ), + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + CommonBtn( + bkClr: Colors.white, + text: AppStrings.cancel, + clickAction: () {}, + ), + SizedBox(width: 16), + CommonButton( + borderRadius: 4, + height: 30, + width: 100, + text: AppStrings.submit, + clickAction: () { + + if (controller.showPlantErrorFreight + .value || + controller.showProductErrorFreight + .value || + controller.showTransactionErrorFreight + .value + ) { + print( + 'controller.showProductError.value ${controller + .showProductError.value}'); + } else { + controller.postData(); + } + }, + ), + ], ), - SizedBox(width: 16), - CommonButton( - borderRadius: 4, - height: 30, - width: 100, - text: AppStrings.submit, - clickAction: () { - controller.postData(); - }, - ), - ], - ), - ), - ], - )) + ), + ], + )) ], ), ), @@ -335,12 +373,12 @@ class ViewFreightBill extends StatelessWidget { dataRowHeight: 28, headingRowHeight: 38, headingRowColor: - WidgetStateProperty.all(AppColors.clrF2), + WidgetStateProperty.all(AppColors.clrF2), border: TableBorder( horizontalInside: - BorderSide(color: AppColors.clrGrey), + BorderSide(color: AppColors.clrGrey), verticalInside: - BorderSide(color: AppColors.clrGrey), + BorderSide(color: AppColors.clrGrey), bottom: BorderSide(color: AppColors.clrGrey), left: BorderSide(color: AppColors.clrGrey), right: BorderSide(color: AppColors.clrGrey), @@ -351,8 +389,9 @@ class ViewFreightBill extends StatelessWidget { dataColumn(AppStrings.plant), dataColumn( AppStrings.productName, - onSort: (_, __) => controller.changeSort( - AppStrings.productName.toLowerCase()), + onSort: (_, __) => + controller.changeSort( + AppStrings.productName.toLowerCase()), ), dataColumn(AppStrings.freightBillNo), dataColumn(AppStrings.freightBillDate), @@ -393,7 +432,7 @@ class ViewFreightBill extends StatelessWidget { rows: List.generate( controller.freightBillData.length, (index) { final freightBill = - controller.freightBillData[index]; + controller.freightBillData[index]; return DataRow( cells: [ @@ -414,7 +453,8 @@ class ViewFreightBill extends StatelessWidget { editableCell(index, "${freightBill.trasnporterInvoiceNo}"), editableCell(index, - "${freightBill.trasnporterInvoiceNoDate}"), + "${freightBill + .trasnporterInvoiceNoDate}"), editableCell( index, "${freightBill.billingQty}"), editableCell(index, "${freightBill.uom}"), @@ -430,12 +470,14 @@ class ViewFreightBill extends StatelessWidget { editableCell( index, "${freightBill.freightAmount}"), editableCell(index, - "${freightBill.trasnporterInvoiceNoDate}"), + "${freightBill + .trasnporterInvoiceNoDate}"), editableCell(index, "${freightBill.status}"), editableCell( index, "${freightBill.totalGst}"), editableCell(index, - "${freightBill.trasnporterInvoiceNoDate}"), + "${freightBill + .trasnporterInvoiceNoDate}"), editableCell(index, "${freightBill.utr5No}"), editableCell( index, "${freightBill.utr1Date}"), @@ -490,8 +532,8 @@ class ViewFreightBill extends StatelessWidget { ); } - void showFreightBillDetailsDialog( - BuildContext context, FreightBill freightBill) { + void showFreightBillDetailsDialog(BuildContext context, + FreightBill freightBill) { showDialog( context: context, builder: (BuildContext context) { @@ -536,12 +578,12 @@ class ViewFreightBill extends StatelessWidget { dataRowHeight: 28, headingRowHeight: 38, headingRowColor: - WidgetStateProperty.all(AppColors.clrF2), + WidgetStateProperty.all(AppColors.clrF2), border: TableBorder( horizontalInside: - BorderSide(color: AppColors.clrGrey), + BorderSide(color: AppColors.clrGrey), verticalInside: - BorderSide(color: AppColors.clrGrey), + BorderSide(color: AppColors.clrGrey), bottom: BorderSide(color: AppColors.clrGrey), left: BorderSide(color: AppColors.clrGrey), right: BorderSide(color: AppColors.clrGrey), @@ -552,8 +594,9 @@ class ViewFreightBill extends StatelessWidget { dataColumn(AppStrings.mrnNo), dataColumn( AppStrings.plantName, - onSort: (_, __) => controller.changeSort( - AppStrings.productName.toLowerCase()), + onSort: (_, __) => + controller.changeSort( + AppStrings.productName.toLowerCase()), ), dataColumn(AppStrings.product), dataColumn(AppStrings.date), @@ -571,7 +614,7 @@ class ViewFreightBill extends StatelessWidget { rows: List.generate( controller.freightBillData.length, (index) { final freightBill = - controller.freightBillData[index]; + controller.freightBillData[index]; return DataRow( cells: [ editableCell(index, "0${index + 1}"), diff --git a/lib/feature/presentation/screens/transporter/view/transport_view.dart b/lib/feature/presentation/screens/transporter/view/transport_view.dart index ae0bf68..0b97add 100644 --- a/lib/feature/presentation/screens/transporter/view/transport_view.dart +++ b/lib/feature/presentation/screens/transporter/view/transport_view.dart @@ -163,202 +163,38 @@ class _TransportViewState extends State { style: 12.txtBoldWhite, ), ), + Obx( - () => Visibility( - visible: ctrl.selectedUser.value >= 1, + () => Visibility( + visible: ctrl.selectedUser.value == 0, child: InkWell( - onTap: ctrl.toggleContainer, - child: Image.asset(AppImages.filter, - height: 16, width: 16)), + onTap: () { + ctrl.toggleFilter(); // Toggle visibility on tap + }, + child: Image.asset(AppImages.filter, height: 16, width: 16), + ), ), ), - Visibility( - visible: ctrl.selectedUser.value >= 1, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: TextView( - text: AppStrings.filter, - style: 12.txtBoldWhite, + + Obx( + () => Visibility( + visible: ctrl.selectedUser.value == 0, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: TextView( + text: AppStrings.filter, + style: 12.txtBoldWhite, + ), ), ), ), ], + ), + + ), - Obx( - () => ctrl.isSelected.value - ? Container( - margin: EdgeInsets.symmetric(vertical: 16), - padding: EdgeInsets.all(16), - color: AppColors.clrF2, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextView( - text: "Plant", - ), - SizedBox(height: 8), - CustomDropdown( - backClr: AppColors.clrD9, - borderClr: AppColors.clrGrey, - items: ctrl.plantList, - itemLabel: (item) => item, - onSelected: (selected) { - if (selected != null) { - ctrl.selectedPlant.value = selected; - } - }, - hintText: 'Select Plant'), - ], - )), - SizedBox(width: 16), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextView( - text: "Freight Bill No.", - ), - SizedBox(height: 8), - CustomDropdown( - backClr: AppColors.clrD9, - borderClr: AppColors.clrGrey, - items: ctrl.freightBillList, - itemLabel: (item) => item, - onSelected: (selected) { - if (selected != null) { - ctrl.selectedFreight.value = - selected; - } - }, - hintText: 'Select Freight Number'), - ], - )), - SizedBox(width: 16), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextView( - text: "Product Name", - ), - SizedBox(height: 8), - CustomDropdown( - backClr: AppColors.clrD9, - borderClr: AppColors.clrGrey, - items: ctrl.plantList, - itemLabel: (item) => item, - onSelected: (selected) { - if (selected != null) { - ctrl.selectedPlant.value = selected; - } - }, - hintText: 'Select Product'), - ], - )), - ], - ), - SizedBox(height: 12), - Row( - children: [ - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - TextView( - text: "Plant", - ), - SizedBox(height: 8), - CustomDropdown( - backClr: AppColors.clrD9, - borderClr: AppColors.clrGrey, - items: ctrl.plantList, - itemLabel: (item) => item, - onSelected: (selected) { - if (selected != null) { - ctrl.selectedPlant.value = - selected; - } - }, - hintText: 'Select Product'), - ], - )), - SizedBox(width: 16), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - TextView( - text: "Transaction Type", - ), - SizedBox(height: 8), - CustomDropdown( - backClr: AppColors.clrD9, - borderClr: AppColors.clrGrey, - items: ctrl.plantList, - itemLabel: (item) => item, - onSelected: (selected) { - if (selected != null) { - ctrl.selectedPlant.value = - selected; - } - }, - hintText: 'Select Product'), - ], - )), - SizedBox(width: 16), - Expanded( - child: Column( - children: [ - TextView( - text: "", - ), - SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.end, - children: [ - CommonBtn( - bkClr: Colors.white, - text: AppStrings.cancel, - clickAction: () { - ctrl.isSelected.value = false; - }, - ), - SizedBox(width: 16), - CommonBtn( - text: AppStrings.submit, - style: 14.txtSBoldWhite, - clickAction: () { - ctrl.isSelected.value = false; - }, - ), - ], - ), - ], - ), - ), - ], - ), - ], - ), - ) - : SizedBox(), - ), + Obx(() { switch (ctrl.selectedUser.value) { case 0: diff --git a/lib/feature/presentation/screens/transporter/view_model/transport_controller.dart b/lib/feature/presentation/screens/transporter/view_model/transport_controller.dart index 801cbe3..4b161d6 100644 --- a/lib/feature/presentation/screens/transporter/view_model/transport_controller.dart +++ b/lib/feature/presentation/screens/transporter/view_model/transport_controller.dart @@ -20,13 +20,23 @@ class TransportController extends GetxController { var selectProduct = ''.obs; var selectLocation = ''.obs; var selectTransactionType = ''.obs; + RxString selectPlantFreight = ''.obs; + var selectProductFreight = ''.obs; + var selectLocationFreight = ''.obs; + var selectTransactionTypeFreight = ''.obs; + RxString selectPlantPending = ''.obs; + var selectProductPending = ''.obs; + var selectLocationPending = ''.obs; + var selectTransactionTypePending = ''.obs; var selectedItem = false.obs; var grnDetails = [].obs; + var filterGrnDetails = [].obs; var product = [].obs; var plant = [].obs; var freightBill = [].obs; var fromLocation = [].obs; var grnList = [].obs; + RxBool showE = false.obs; RxBool selectAllField = false.obs; void toggleSelection(int index, bool? value) { @@ -34,6 +44,26 @@ class TransportController extends GetxController { grnDetails.refresh(); } + void toggleSelectionFilter(int index, bool? value) { + filterGrnDetails[index].isSelected = value!; + filterGrnDetails.refresh(); + } + RxBool isFilterVisible = false.obs; + final int initialRecordCount = 20; + + // Validation variables + RxBool showPlantError = false.obs; + RxBool showProductError = false.obs; + RxBool showTransactionError = false.obs; + + void toggleFilter() { + isFilterVisible.value = !isFilterVisible.value; // Toggle the value + if (!isFilterVisible.value) { + // Clear filters when hiding + clearFilters(); + } + } + void selectAll(bool value) { for (var item in grnDetails) { item.isSelected = value; @@ -41,12 +71,48 @@ class TransportController extends GetxController { selectAllField.value = value; grnDetails.refresh(); } + void selectAllFilter(bool value) { + for (var item in filterGrnDetails) { + item.isSelected = value; + } + selectAllField.value = value; + filterGrnDetails.refresh(); + } + + RxBool showPlantErrorFreight = false.obs; + RxBool showProductErrorFreight = false.obs; + RxBool showTransactionErrorFreight = false.obs; + final selectProductValFreight = ''.obs; + RxBool showPlantErrorPending = false.obs; + RxBool showProductErrorPending = false.obs; + RxBool showTransactionErrorPending = false.obs; + final selectProductValPending = Rx(null); + + void validateFields() { + showPlantError.value = selectPlant.value.isEmpty; + showTransactionError.value = selectTransactionType.value.isEmpty; + } + + void validateFieldsPending() { + showPlantErrorPending.value = selectPlantPending.value.isEmpty; + showTransactionErrorPending.value = + selectTransactionTypePending.value.isEmpty; + showProductErrorPending.value = selectProductValPending.value == null; + } + + void validateFieldsGenerateFreight() { + showPlantErrorFreight.value = selectPlantFreight.value.isEmpty; + showTransactionErrorFreight.value = + selectTransactionTypeFreight.value.isEmpty; + showProductErrorFreight.value = selectProductFreight.value.isEmpty; + } @override void onInit() { getFreightBills(); viewFreightView(); grnPending(); + postData(); super.onInit(); } @@ -104,6 +170,100 @@ class TransportController extends GetxController { } } + + void displayFilteredData() async { + try { + isLoading.value = true; + + // Construct requestBody to filter based on selected values + Map requestBody = { + "plant": selectPlantFreight.value, + "productNane": selectProductFreight.value, + "transactionType": selectTransactionTypeFreight.value, + "fromLocation": selectLocation.value, // If required + "grnFromDate": "", + "grnToDate": "" + }; + + // Make the API call + var response = await PostRequests.addFreightBill(requestBody); + if (response != null) { + print("API Response: $response"); // Debug print the API response + + List flattenedContent = + response.content!.expand((list) => list).toList(); + print("Flattened content size: ${flattenedContent.length}"); + print("Filter criteria: Plant: ${selectPlantFreight.value}, Product: ${selectProductFreight.value}, Transaction: ${selectTransactionTypeFreight.value}"); + + // Apply filters locally on the fetched data + List filteredData = flattenedContent.where((item) { + return (selectPlantFreight.value.isEmpty || item.plantCode == selectPlantFreight.value) + && + (selectProductFreight.value.isEmpty || item.materialCode == selectProductFreight.value) && + (selectTransactionTypeFreight.value.isEmpty || item.transporterCode == selectTransactionTypeFreight.value + ); + }).toList(); + + print("Filtered Data: ${filteredData.length}"); + + filterGrnDetails.assignAll(filteredData); + + print("✅ Filtered Data: ${filteredData.length} items displayed."); + } else { + print("❌ No response from API."); + } + + + } finally { + isLoading.value = false; + } + } + + // void handleFilterSubmit() { + // validateFieldsGenerateFreight(); + // + // if (showPlantError.value || + // showProductError.value || + // showTransactionError.value) { + // print('show errr'); + // } else { + // postData(); + // } + // } + void handleFilterSubmit() { + // Step 1: Validate input fields + + validateFieldsGenerateFreight(); + + // Step 2: Check if any required field is empty + if (selectPlantFreight.value.isEmpty || + selectProductFreight.value.isEmpty || + selectTransactionTypeFreight.value.isEmpty + ) { + print('⚠️ Required fields are empty. Showing filtered data instead of calling API.'); + + // TODO: Implement logic to show filtered data here + displayFilteredData(); + + } else { + // Step 3: If all fields are filled, proceed with API call + print('✅ All fields are valid. Calling API...'); + // postData(); + // displayFilteredData(); + } + } + + void clearFilters() { + selectPlantFreight.value = ''; + selectProductFreight.value = ''; + selectTransactionTypeFreight.value = ''; + fromController.clear(); + showPlantError.value = false; + showProductError.value = false; + showTransactionError.value = false; + postData(); // Reload initial data + } + getFreightBills() async { try { isLoading.value = true; @@ -161,9 +321,9 @@ class TransportController extends GetxController { addFreightBill() async { try { grnListLoader.value = true; - +final addDataFromgrnDetails = grnDetails.isEmpty ? filterGrnDetails : grnDetails; // Filter the selected rows - final List> selectedGrns = grnDetails + final List> selectedGrns = addDataFromgrnDetails .where((grn) => grn.isSelected) // Get only the selected rows .map((grn) => { "grn_id": grn.grnId, @@ -206,6 +366,7 @@ class TransportController extends GetxController { var pageSize = 2.obs; var sortField = "grn_date".obs; var sortDirection = "desc".obs; + // viewFreightView({int? page, String? sort, String? direction}) async { // try { // freightViewLoader.value = true; @@ -244,6 +405,7 @@ class TransportController extends GetxController { RxInt currentPage = 1.obs; RxInt totalPages = 3.obs; final int limit = 10; + viewFreightView() async { try { freightViewLoader.value = true; @@ -310,6 +472,7 @@ class TransportController extends GetxController { } var grnPendingData = [].obs; + grnPending() async { try { grnPendingLoader.value = true; diff --git a/pubspec.lock b/pubspec.lock index 38f08bf..95b745e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -305,5 +305,5 @@ packages: source: hosted version: "1.1.0" sdks: - dart: ">=3.6.1 <4.0.0" + dart: ">=3.6.0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index 982d53e..6846a75 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ^3.6.1 + sdk: ^3.6.0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions