Dropdown changes and fix filter issue in payment and manage screen

feature_dev_prativa
Pratibha Chaudhary 2025-02-07 16:30:06 +05:30
parent f7f4cfb5d3
commit c612e11dfe
7 changed files with 276 additions and 426 deletions

View File

@ -1,6 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:shayog/components/styles/app_colors.dart'; import 'package:shayog/components/styles/app_colors.dart';
import 'package:shayog/components/styles/textStyles.dart'; import 'package:shayog/components/styles/textStyles.dart';
@ -8,7 +6,8 @@ class CustomDropdown<T> extends StatefulWidget {
final List<T> items; final List<T> items;
final String Function(T) itemLabel; final String Function(T) itemLabel;
final Function(T?) onSelected; final Function(T?) onSelected;
final String hintText; VoidCallback? onTap;
late final String hintText;
final bool enableSearch; final bool enableSearch;
final double? width; final double? width;
final EdgeInsetsGeometry padding; final EdgeInsetsGeometry padding;
@ -18,8 +17,9 @@ class CustomDropdown<T> extends StatefulWidget {
final Color? borderClr; final Color? borderClr;
final Color? backClr; final Color? backClr;
final String? Function(T?)? validator; final String? Function(T?)? validator;
Widget? icon;
const CustomDropdown({ CustomDropdown({
super.key, super.key,
required this.items, required this.items,
required this.itemLabel, required this.itemLabel,
@ -34,6 +34,8 @@ class CustomDropdown<T> extends StatefulWidget {
this.borderClr, this.borderClr,
this.backClr, this.backClr,
this.validator, this.validator,
this.onTap,
this.icon,
}); });
@override @override
@ -77,8 +79,6 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
}); });
} }
void _selectItem(T item) { void _selectItem(T item) {
setState(() { setState(() {
selectedItem = item; selectedItem = item;
@ -98,7 +98,13 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
_openDropdown(); _openDropdown();
} }
} }
void clearField() {
setState(() {
selectedItem = null; // Clear the selected item
});
_openDropdown();
}
void _openDropdown() { void _openDropdown() {
setState(() { setState(() {
isSearching = false; isSearching = false;
@ -198,6 +204,7 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
style: 11.txtSBoldGrey, style: 11.txtSBoldGrey,
), ),
), ),
// onTap: widget.onTap,
onTap: () => _selectItem(item), onTap: () => _selectItem(item),
); );
}, },
@ -226,30 +233,9 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
overlayEntry!.markNeedsBuild(); overlayEntry!.markNeedsBuild();
} }
} }
// String? validateAndGetErrorText() {
// setState(() {
// _errorText = widget.validator?.call(selectedItem);
// });
// return _errorText;
// }
String? validateAndGetErrorText() {
setState(() {
_errorText = selectedItem == null ? "This field is required" : null;
});
return _errorText;
}
void _onDropdownTap() {
if (selectedItem == null) {
setState(() {
_errorText = "Please select an item.";
});
} else {
setState(() {
_errorText = null;
});
}
_toggleDropdown();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
@ -277,338 +263,38 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
Expanded( Expanded(
child: Text( child: Text(
widget.hintText, widget.hintText,
// selectedItem != null
// ? widget.itemLabel(selectedItem as T) // selectedItem == null ? widget.hintText : widget.itemLabel(selectedItem as T),
// : widget.hintText,
style: 11.txtSBoldGrey, style: 11.txtSBoldGrey,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
// Text(
),
// selectedItem != null // selectedItem != null
// ? widget.itemLabel(selectedItem as T) // ? InkWell(
// : widget.hintText, // onTap: (){
// style: 12.txtSBoldGrey,
// overflow: TextOverflow.ellipsis,
// ),
),
const Icon(
Icons.keyboard_arrow_down_outlined,
size: 20,
color: Colors.black,
),
],
),
),
),
),
if (_errorText != null)
Padding(
padding: const EdgeInsets.only(top: 8.0),
child: Text(
_errorText!,
style: TextStyle(
color: Colors.red,
fontSize: 12,
),
),
)
],
);
}
}
class CustomDrop<T> extends StatefulWidget {
final List<T> items;
final String Function(T) itemLabel;
final Function(T?) onSelected;
final RxString hintText;
final bool enableSearch;
final double? width;
final EdgeInsetsGeometry padding;
final T? initialValue;
final bool showError;
final bool isHeight;
final Color? borderClr;
final Color? backClr;
final String? Function(T?)? validator;
const CustomDrop({
super.key,
required this.items,
required this.itemLabel,
required this.onSelected,
required this.hintText,
this.enableSearch = true,
this.width,
this.padding = const EdgeInsets.all(8.0),
this.initialValue,
this.showError = false,
this.isHeight = false,
this.borderClr,
this.backClr,
this.validator,
});
@override
_CustomDropdownState<T> createState() => _CustomDropdownState<T>();
}
class _CustomDropState<T> extends State<CustomDrop<T>> {
T? selectedItem;
String? _errorText;
List<T> filteredItems = [];
late TextEditingController searchController;
OverlayEntry? overlayEntry;
final LayerLink layerLink = LayerLink();
bool isDropdownOpen = false;
bool isSearching = false;
final dropdownKey = GlobalKey<_CustomDropdownState>();
@override
void initState() {
super.initState();
searchController = TextEditingController();
filteredItems = List.from(widget.items);
if (widget.initialValue != null) {
selectedItem = widget.initialValue;
}
searchController.addListener(() {
final text = searchController.text;
if (text.isEmpty) {
setState(() {
isSearching = false;
filteredItems = List.from(widget.items);
});
} else {
setState(() {
isSearching = true;
_filterList(text);
});
}
});
}
void _selectItem(T item) {
setState(() {
selectedItem = item;
isDropdownOpen = false;
_errorText = null; // Clear error when an item is selected
});
searchController.clear();
widget.onSelected(item);
_closeDropdown();
filteredItems = List.from(widget.items);
}
void _toggleDropdown() {
if (isDropdownOpen) {
_closeDropdown();
} else {
_openDropdown();
}
}
void _openDropdown() {
setState(() {
isSearching = false;
filteredItems = List.from(widget.items);
searchController.clear();
});
overlayEntry = _createOverlayEntry();
Overlay.of(context).insert(overlayEntry!);
setState(() {
isDropdownOpen = true;
});
}
void _closeDropdown() {
overlayEntry?.remove();
overlayEntry = null;
setState(() {
isDropdownOpen = false;
});
}
OverlayEntry _createOverlayEntry() {
final RenderBox renderBox = context.findRenderObject() as RenderBox;
return OverlayEntry(
builder: (context) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: _closeDropdown,
child: Stack(
children: [
Positioned(
width: widget.width ?? 250,
child: CompositedTransformFollower(
link: layerLink,
showWhenUnlinked: false,
offset: Offset(0, renderBox.size.height + 5),
child: Material(
elevation: 4,
borderRadius: BorderRadius.circular(8),
child: Container(
padding: EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8),
border: Border.all(
color: Colors.grey,
width: 1,
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
if (widget.enableSearch && widget.items.length > 1)
Padding(
padding: const EdgeInsets.only(bottom: 8.0),
child: SizedBox(
height: 32,
child: TextFormField(
// validator: widget.validator,
enabled: widget.enableSearch,
controller: searchController,
style: 12.txtSBoldGrey,
autovalidateMode:
AutovalidateMode.onUserInteraction,
decoration: InputDecoration(
hintText: 'Search...',
contentPadding: const EdgeInsets.symmetric(
vertical: 8.0,
horizontal: 12.0,
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
),
),
),
),
),
Container(
constraints: BoxConstraints(maxHeight: 200),
child: ListView.builder(
shrinkWrap: true,
itemCount: filteredItems.length,
itemBuilder: (context, index) {
final item = filteredItems[index];
return ListTile(
contentPadding: EdgeInsets.all(0),
minVerticalPadding: 0,
dense: true,
visualDensity: VisualDensity.compact,
title: Tooltip(
message: widget.itemLabel(item),
child: Text(
widget.itemLabel(item),
style: 11.txtSBoldGrey,
),
),
onTap: () => _selectItem(item),
);
},
),
),
],
),
),
),
),
),
],
),
);
},
);
}
void _filterList(String query) {
filteredItems = widget.items
.where((item) =>
widget.itemLabel(item).toLowerCase().contains(query.toLowerCase()))
.toList();
if (overlayEntry != null) {
overlayEntry!.markNeedsBuild();
}
}
// String? validateAndGetErrorText() {
// setState(() { // setState(() {
// _errorText = widget.validator?.call(selectedItem); //
// selectedItem = null;
//
// }); // });
// return _errorText; //
// } // _openDropdown();
String? validateAndGetErrorText() { // },
setState(() { //
_errorText = selectedItem == null ? "This field is required" : null; // child:
}); // Icon(Icons.close, size: 14, color: Colors.black))
return _errorText; // :
} widget.icon ?? InkWell(
void _onDropdownTap() {
if (selectedItem == null) {
setState(() {
_errorText = "Please select an item.";
});
} else {
setState(() {
_errorText = null;
});
}
_toggleDropdown();
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
CompositedTransformTarget(
link: layerLink,
child: GestureDetector(
onTap: _toggleDropdown, onTap: _toggleDropdown,
child: Container( child: Icon(
padding: EdgeInsets.symmetric(
vertical: widget.isHeight ? 12 : 6.4, horizontal: 16),
decoration: BoxDecoration(
color: widget.backClr ?? AppColors.white,
border: Border.all(
color: widget.borderClr ?? Colors.transparent,
width: 1,
),
borderRadius: BorderRadius.circular(2),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
selectedItem != null
? widget.itemLabel(selectedItem as T)
: widget.hintText.value,
style: 11.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, Icons.keyboard_arrow_down_outlined,
size: 20, size: 20,
color: Colors.black, color: Colors.black,
), ),
),
], ],
), ),
), ),

View File

@ -0,0 +1,16 @@
import 'package:get/get.dart';
class DropdownController extends GetxController {
// Observable selected item
var selectedItem = Rxn<String>(); // Replace `String` with your actual type if necessary
// Set the selected value
void selectItem(String item) {
selectedItem.value = item;
}
// Clear the selected value
void clearSelection() {
selectedItem.value = null;
}
}

View File

@ -0,0 +1,51 @@
// import 'package:flutter/material.dart';
// import 'package:get/get.dart';
//
// import 'drop_down_ctrl.dart';
//
// class Customdown extends StatelessWidget {
// // Instantiate the controller using Get.put() to make it accessible across the app
// final DropdownController dropdownController = Get.put(DropdownController());
//
// @override
// Widget build(BuildContext context) {
//
//
// return Obx(
// () {
// return GestureDetector(
// onTap: () async {
// // Open the custom dropdown menu on tap
// String? selectedItem = await showMenu<String>(
// context: context,
// position: RelativeRect.fromLTRB(100.0, 100.0, 100.0, 100.0),
// items: dropdownController.items
// .map((String value) {
// return PopupMenuItem<String>(
// value: value,
// child: Text(value),
// );
// })
// .toList(),
// );
// // Update the selected value using GetX when the user selects an item
// if (selectedItem != null) {
// dropdownController.updateValue(selectedItem);
// }
// },
// child: Container(
// padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
// decoration: BoxDecoration(
// border: Border.all(color: Colors.blue),
// borderRadius: BorderRadius.circular(5),
// ),
// child: Text(
// dropdownController.selectedValue.value, // Reactive update
// style: TextStyle(fontSize: 18, color: Colors.black),
// ),
// ),
// );
// },
// );
// }
// }

View File

@ -6,6 +6,7 @@ import '../../../../../components/common/common_btn.dart';
import '../../../../../components/common/common_button.dart'; import '../../../../../components/common/common_button.dart';
import '../../../../../components/common/custom_drop_down.dart'; import '../../../../../components/common/custom_drop_down.dart';
import '../../../../../components/common/data_cell.dart'; import '../../../../../components/common/data_cell.dart';
import '../../../../../components/styles/app_colors.dart'; import '../../../../../components/styles/app_colors.dart';
import '../../../../../components/styles/app_strings.dart'; import '../../../../../components/styles/app_strings.dart';
import '../../../widgets/custom_pagination.dart'; import '../../../widgets/custom_pagination.dart';
@ -43,19 +44,29 @@ class ManageUser extends StatelessWidget {
text: "User Name", text: "User Name",
), ),
SizedBox(height: 4), SizedBox(height: 4),
GetX<DashboardCtrl>( CustomDropdown(
builder: (ctrl) { icon: controller.selectUser.value ==
return CustomDropdown( "Select User Name"
?Icon(
Icons.keyboard_arrow_down_outlined,
size: 20,
color: Colors.black,
) : GestureDetector(
onTap: () {
controller.selectUser.value =
"Select User Name";
},
child: Icon(Icons.close,size: 14)),
backClr: AppColors.clrD9, backClr: AppColors.clrD9,
borderClr: AppColors.clrGrey, borderClr: AppColors.clrGrey,
items: ctrl.userNames, items: controller.userNames,
itemLabel: (item) => item, itemLabel: (item) => item,
onSelected: (selected) { onSelected: (selected) {
ctrl.selectUser.value = selected; controller.selectUser.value =
selected ?? "";
}, },
hintText: ctrl.selectUser.value); hintText: controller.selectUser.value),
},
),
], ],
)), )),
SizedBox(width: 16), SizedBox(width: 16),
@ -68,9 +79,19 @@ class ManageUser extends StatelessWidget {
text: "User Type", text: "User Type",
), ),
SizedBox(height: 8), SizedBox(height: 8),
GetX<DashboardCtrl>( CustomDropdown(
builder: (controller) { icon: controller.selectType.value ==
return CustomDropdown( "Select UserType"
?Icon(
Icons.keyboard_arrow_down_outlined,
size: 20,
color: Colors.black,
) : GestureDetector(
onTap: () {
controller.selectType.value =
"Select UserType";
},
child: Icon(Icons.close,size: 14)),
backClr: AppColors.clrD9, backClr: AppColors.clrD9,
borderClr: AppColors.clrGrey, borderClr: AppColors.clrGrey,
items: controller.userTypesNames, items: controller.userTypesNames,
@ -78,9 +99,7 @@ class ManageUser extends StatelessWidget {
onSelected: (selected) { onSelected: (selected) {
controller.selectType.value = selected; controller.selectType.value = selected;
}, },
hintText: controller.selectType.value); hintText: controller.selectType.value),
},
),
], ],
)), )),
SizedBox(width: 16), SizedBox(width: 16),
@ -94,13 +113,24 @@ class ManageUser extends StatelessWidget {
), ),
SizedBox(height: 8), SizedBox(height: 8),
CustomDropdown( CustomDropdown(
icon: controller.selectEmail.value ==
"Select Email"
?Icon(
Icons.keyboard_arrow_down_outlined,
size: 20,
color: Colors.black,
) : GestureDetector(
onTap: () {
controller.selectEmail.value =
"Select Email";
},
child: Icon(Icons.close,size: 14)),
backClr: AppColors.clrD9, backClr: AppColors.clrD9,
borderClr: AppColors.clrGrey, borderClr: AppColors.clrGrey,
items: controller.userEmail, items: controller.userEmail,
itemLabel: (item) => item, itemLabel: (item) => item,
onSelected: (selected) { onSelected: (selected) {
controller.selectEmail.value = selected; controller.selectEmail.value = selected;
}, },
hintText: controller.selectEmail.value), hintText: controller.selectEmail.value),
], ],
@ -120,6 +150,18 @@ class ManageUser extends StatelessWidget {
), ),
SizedBox(height: 8), SizedBox(height: 8),
CustomDropdown( CustomDropdown(
icon: controller.selectCode.value ==
"Select Employee Code"
?Icon(
Icons.keyboard_arrow_down_outlined,
size: 20,
color: Colors.black,
) : GestureDetector(
onTap: () {
controller.selectCode.value =
"Select Employee Code";
},
child: Icon(Icons.close,size: 14)),
backClr: AppColors.clrD9, backClr: AppColors.clrD9,
borderClr: AppColors.clrGrey, borderClr: AppColors.clrGrey,
items: controller.userEmpCode, items: controller.userEmpCode,
@ -141,7 +183,18 @@ class ManageUser extends StatelessWidget {
), ),
SizedBox(height: 8), SizedBox(height: 8),
CustomDropdown( CustomDropdown(
icon: controller.selectUserStatus.value ==
"Select Status"
?Icon(
Icons.keyboard_arrow_down_outlined,
size: 20,
color: Colors.black,
) : GestureDetector(
onTap: () {
controller.selectUserStatus.value =
"Select Status";
},
child: Icon(Icons.close,size: 14)),
backClr: AppColors.clrD9, backClr: AppColors.clrD9,
borderClr: AppColors.clrGrey, borderClr: AppColors.clrGrey,
items: controller.userStatus, items: controller.userStatus,
@ -179,7 +232,6 @@ class ManageUser extends StatelessWidget {
text: AppStrings.submit, text: AppStrings.submit,
textStyle: 14.txtSBoldWhite, textStyle: 14.txtSBoldWhite,
clickAction: () { clickAction: () {
//controller.isSelected.value = false;
controller.getManageUser(); controller.getManageUser();
controller.getAllUser(); controller.getAllUser();
}, },
@ -211,7 +263,7 @@ class ManageUser extends StatelessWidget {
decoration: decoration:
BoxDecoration(border: Border.all(color: AppColors.clrGrey)), BoxDecoration(border: Border.all(color: AppColors.clrGrey)),
child: RawScrollbar( child: RawScrollbar(
thumbColor: AppColors.clrD9, thumbColor: AppColors.primaryClr.withOpacity(0.4),
radius: Radius.circular(2), radius: Radius.circular(2),
trackVisibility: true, trackVisibility: true,
thumbVisibility: true, thumbVisibility: true,
@ -220,7 +272,7 @@ class ManageUser extends StatelessWidget {
child: SingleChildScrollView( child: SingleChildScrollView(
controller: controller.verticalScrollController, controller: controller.verticalScrollController,
child: RawScrollbar( child: RawScrollbar(
thumbColor: AppColors.clrD9, thumbColor: AppColors.primaryClr.withOpacity(0.4),
radius: Radius.circular(2), radius: Radius.circular(2),
thickness: 14, thickness: 14,
trackVisibility: true, trackVisibility: true,

View File

@ -111,6 +111,7 @@ class DashboardCtrl extends GetxController {
RxList<AllUser> getAllUserMain = <AllUser>[].obs; RxList<AllUser> getAllUserMain = <AllUser>[].obs;
RxInt limit = 20.obs; RxInt limit = 20.obs;
var userLoading = false.obs; var userLoading = false.obs;
var changeColor = false.obs;
setNextPage() { setNextPage() {
if (currentPage.value < totalPages.value.toInt()) { if (currentPage.value < totalPages.value.toInt()) {

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:shayog/components/common/input_field.dart'; import 'package:shayog/components/common/input_field.dart';
import 'package:shayog/components/styles/textStyles.dart'; import 'package:shayog/components/styles/textStyles.dart';
import 'package:shayog/feature/presentation/screens/transporter/invoice_management/payment_view/ctrl/payment_view_ctrl.dart'; import 'package:shayog/feature/presentation/screens/transporter/invoice_management/payment_view/ctrl/payment_view_ctrl.dart';
@ -27,7 +28,7 @@ class PaymentView extends StatelessWidget {
() => controller.isPaymentFilter.value () => controller.isPaymentFilter.value
? Container( ? Container(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
left: 16.0, top: 8, right: 16, bottom: 16), left: 16.0, top: 8, right: 16),
color: AppColors.clrF2, color: AppColors.clrF2,
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
@ -42,18 +43,69 @@ class PaymentView extends StatelessWidget {
children: [ children: [
TextView(text: "Plant"), TextView(text: "Plant"),
SizedBox(height: 8), SizedBox(height: 8),
CustomDropdown( CustomDropdown(
icon: paymentCtrl.selectedPlant.value ==
"Select Plant"
? Icon(
Icons.keyboard_arrow_down_outlined,
size: 20,
color: Colors.black,
) : GestureDetector(
onTap: () {
paymentCtrl.selectedPlant.value =
"Select Plant";
},
child: Icon(Icons.close,size: 14)),
backClr: AppColors.clrD9, backClr: AppColors.clrD9,
borderClr: AppColors.clrGrey, borderClr: AppColors.clrGrey,
items: paymentCtrl.plant, items: paymentCtrl.plant,
itemLabel: (item) => itemLabel: (item) =>
"${item.plantCode}-${item.plantDesc}", "${item.plantCode} - ${item.plantDesc}",
onSelected: (selected) { onSelected: (selected) {
paymentCtrl.selectedPlant.value = paymentCtrl.selectedPlant.value =
"${selected?.plantCode}-${selected?.plantDesc}"; "${selected?.plantCode} - ${selected?.plantDesc}";
}, },
hintText: paymentCtrl.selectedPlant.value, hintText: paymentCtrl.selectedPlant.value,
), ),
],
),
),
SizedBox(width: 16),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextView(text: "Product"),
SizedBox(height: 8),
CustomDropdown<dynamic>(
icon: paymentCtrl.selectedProduct.value ==
"Select Product Name"
? Icon(
Icons.keyboard_arrow_down_outlined,
size: 20,
color: Colors.black,
) : GestureDetector(
onTap: () {
paymentCtrl.selectedProduct.value =
"Select Product Name";
},
child: Icon(Icons.close,size: 14)),
width: 250,
backClr: AppColors.clrD9,
borderClr: AppColors.clrGrey,
items: paymentCtrl.product,
itemLabel: (item) =>
"${item.materialCode} - ${item.materialDescription}",
onSelected: (selected) {
paymentCtrl.selectedProduct.value =
"${selected.materialCode} - ${selected.materialDescription}";
},
hintText: paymentCtrl.selectedProduct.value,
),
], ],
), ),
), ),
@ -66,11 +118,22 @@ class PaymentView extends StatelessWidget {
TextView(text: "Freight Bill No."), TextView(text: "Freight Bill No."),
SizedBox(height: 8), SizedBox(height: 8),
CustomDropdown<String>( CustomDropdown<String>(
icon: paymentCtrl.selectedFreightBill.value ==
"Select Bill No."
? Icon(
Icons.keyboard_arrow_down_outlined,
size: 20,
color: Colors.black,
) : GestureDetector(
onTap: () {
paymentCtrl.selectedFreightBill.value =
"Select Bill No.";
},
child: Icon(Icons.close,size: 14)),
backClr: AppColors.clrD9, backClr: AppColors.clrD9,
borderClr: AppColors.clrGrey, borderClr: AppColors.clrGrey,
items: paymentCtrl.freightBill, items: paymentCtrl.freightBill,
itemLabel: (item) => item, itemLabel: (item) => item,
onSelected: (selected) { onSelected: (selected) {
paymentCtrl.selectedFreightBill.value = paymentCtrl.selectedFreightBill.value =
selected.toString(); selected.toString();
@ -81,30 +144,7 @@ class PaymentView extends StatelessWidget {
], ],
), ),
), ),
SizedBox(width: 16),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextView(text: "Product"),
SizedBox(height: 8),
CustomDropdown<dynamic>(
width: 250,
backClr: AppColors.clrD9,
borderClr: AppColors.clrGrey,
items: paymentCtrl.product,
itemLabel: (item) =>
"${item.materialCode}-${item.materialDescription}",
onSelected: (selected) {
paymentCtrl.selectedProduct.value =
"${selected.materialCode}-${selected.materialDescription}";
},
hintText: paymentCtrl.selectedProduct.value,
),
],
),
),
], ],
), ),
SizedBox(height: 12), SizedBox(height: 12),
@ -189,11 +229,10 @@ class PaymentView extends StatelessWidget {
? CircularProgressIndicator() ? CircularProgressIndicator()
: Container( : Container(
margin: EdgeInsets.only(bottom: 16, top: 8), margin: EdgeInsets.only(bottom: 16, top: 8),
// height: MediaQuery.of(context).size.height * 0.4,
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all(color: AppColors.clrGrey)), border: Border.all(color: AppColors.clrGrey)),
child: RawScrollbar( child: RawScrollbar(
thumbColor: AppColors.clrD9, thumbColor: AppColors.primaryClr.withOpacity(0.4),
radius: Radius.circular(2), radius: Radius.circular(2),
trackVisibility: true, trackVisibility: true,
thumbVisibility: true, thumbVisibility: true,
@ -202,7 +241,7 @@ class PaymentView extends StatelessWidget {
child: SingleChildScrollView( child: SingleChildScrollView(
controller: paymentCtrl.verticalScrollController, controller: paymentCtrl.verticalScrollController,
child: RawScrollbar( child: RawScrollbar(
thumbColor: AppColors.clrD9, thumbColor: AppColors.primaryClr.withOpacity(0.4),
radius: Radius.circular(2), radius: Radius.circular(2),
thickness: 14, thickness: 14,
trackVisibility: true, trackVisibility: true,
@ -274,8 +313,13 @@ class PaymentView extends StatelessWidget {
index, "${stoppage.materialCode}"), index, "${stoppage.materialCode}"),
editableCell( editableCell(
index, "${stoppage.freightbillCode}"), index, "${stoppage.freightbillCode}"),
editableCell( editableCell(
index, "${stoppage.lastUpdatedOn}"), index,
DateFormat('yyyy - MMM dd').format(
DateTime.parse(stoppage
.lastUpdatedOn
.toString()))),
editableCell( editableCell(
index, "${stoppage.shipmentNetQty}"), index, "${stoppage.shipmentNetQty}"),

View File

@ -27,7 +27,7 @@ class _TransportViewState extends State<InvoiceManagement> {
return Column( return Column(
children: [ children: [
Container( Container(
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), margin: EdgeInsets.symmetric(horizontal: 16),
height: 50, height: 50,
color: AppColors.primaryClr, color: AppColors.primaryClr,
child: Row( child: Row(