Calendar Added Sucessfully
commit
6f9ec4f051
|
@ -214,24 +214,24 @@ xdg_directories
|
||||||
3.3
|
3.3
|
||||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.1.0/
|
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.1.0/
|
||||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.1.0/lib/
|
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.1.0/lib/
|
||||||
shayog
|
|
||||||
3.6
|
|
||||||
file:///C:/Users/Admin/Downloads/shayog/
|
|
||||||
file:///C:/Users/Admin/Downloads/shayog/lib/
|
|
||||||
sky_engine
|
sky_engine
|
||||||
3.2
|
3.2
|
||||||
file:///C:/src/flutter/flutter/bin/cache/pkg/sky_engine/
|
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/bin/cache/pkg/sky_engine/
|
||||||
file:///C:/src/flutter/flutter/bin/cache/pkg/sky_engine/lib/
|
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/bin/cache/pkg/sky_engine/lib/
|
||||||
flutter
|
flutter
|
||||||
3.3
|
3.3
|
||||||
file:///C:/src/flutter/flutter/packages/flutter/
|
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter/
|
||||||
file:///C:/src/flutter/flutter/packages/flutter/lib/
|
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter/lib/
|
||||||
flutter_test
|
flutter_test
|
||||||
3.3
|
3.3
|
||||||
file:///C:/src/flutter/flutter/packages/flutter_test/
|
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter_test/
|
||||||
file:///C:/src/flutter/flutter/packages/flutter_test/lib/
|
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter_test/lib/
|
||||||
flutter_web_plugins
|
flutter_web_plugins
|
||||||
3.2
|
3.2
|
||||||
file:///C:/src/flutter/flutter/packages/flutter_web_plugins/
|
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter_web_plugins/
|
||||||
file:///C:/src/flutter/flutter/packages/flutter_web_plugins/lib/
|
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter_web_plugins/lib/
|
||||||
|
shayog
|
||||||
|
3.6
|
||||||
|
file:///C:/Users/Admin/Downloads/shayog%205/shayog/
|
||||||
|
file:///C:/Users/Admin/Downloads/shayog%205/shayog/lib/
|
||||||
2
|
2
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
3.27.3
|
3.27.1
|
|
@ -1,5 +1,5 @@
|
||||||
sdk.dir=C:\\Users\\Admin\\AppData\\Local\\Android\\sdk
|
sdk.dir=C:\\Users\\Admin\\.jdks\\openjdk-23.0.1
|
||||||
flutter.sdk=C:\\src\\flutter\\flutter
|
flutter.sdk=C:\\Users\\Admin\\Downloads\\flutter_windows_3.27.1-stable\\flutter
|
||||||
flutter.buildMode=release
|
flutter.buildMode=release
|
||||||
flutter.versionName=1.0.0
|
flutter.versionName=1.0.0
|
||||||
flutter.versionCode=1
|
flutter.versionCode=1
|
|
@ -1,6 +1,6 @@
|
||||||
// This is a generated file; do not edit or check into version control.
|
// This is a generated file; do not edit or check into version control.
|
||||||
FLUTTER_ROOT=C:\src\flutter\flutter
|
FLUTTER_ROOT=C:\Users\Admin\Downloads\flutter_windows_3.27.1-stable\flutter
|
||||||
FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog
|
FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog 5\shayog
|
||||||
COCOAPODS_PARALLEL_CODE_SIGN=true
|
COCOAPODS_PARALLEL_CODE_SIGN=true
|
||||||
FLUTTER_TARGET=lib\main.dart
|
FLUTTER_TARGET=lib\main.dart
|
||||||
FLUTTER_BUILD_DIR=build
|
FLUTTER_BUILD_DIR=build
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# This is a generated file; do not edit or check into version control.
|
# This is a generated file; do not edit or check into version control.
|
||||||
export "FLUTTER_ROOT=C:\src\flutter\flutter"
|
export "FLUTTER_ROOT=C:\Users\Admin\Downloads\flutter_windows_3.27.1-stable\flutter"
|
||||||
export "FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog"
|
export "FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog 5\shayog"
|
||||||
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
|
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
|
||||||
export "FLUTTER_TARGET=lib\main.dart"
|
export "FLUTTER_TARGET=lib\main.dart"
|
||||||
export "FLUTTER_BUILD_DIR=build"
|
export "FLUTTER_BUILD_DIR=build"
|
||||||
|
|
|
@ -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(
|
||||||
|
@ -258,7 +244,7 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
|
||||||
CompositedTransformTarget(
|
CompositedTransformTarget(
|
||||||
link: layerLink,
|
link: layerLink,
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onTap: _toggleDropdown,
|
onTap: _toggleDropdown,
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: EdgeInsets.symmetric(
|
padding: EdgeInsets.symmetric(
|
||||||
vertical: widget.isHeight ? 12 : 6.4, horizontal: 16),
|
vertical: widget.isHeight ? 12 : 6.4, horizontal: 16),
|
||||||
|
@ -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
|
|
||||||
// ? widget.itemLabel(selectedItem as T)
|
|
||||||
// : widget.hintText,
|
|
||||||
// style: 12.txtSBoldGrey,
|
|
||||||
// overflow: TextOverflow.ellipsis,
|
|
||||||
// ),
|
|
||||||
),
|
),
|
||||||
const Icon(
|
// selectedItem != null
|
||||||
Icons.keyboard_arrow_down_outlined,
|
// ? InkWell(
|
||||||
size: 20,
|
// onTap: (){
|
||||||
color: Colors.black,
|
// setState(() {
|
||||||
),
|
//
|
||||||
],
|
// selectedItem = null;
|
||||||
),
|
//
|
||||||
),
|
// });
|
||||||
),
|
//
|
||||||
),
|
// _openDropdown();
|
||||||
if (_errorText != null)
|
// },
|
||||||
Padding(
|
//
|
||||||
padding: const EdgeInsets.only(top: 8.0),
|
// child:
|
||||||
child: Text(
|
// Icon(Icons.close, size: 14, color: Colors.black))
|
||||||
_errorText!,
|
// :
|
||||||
style: TextStyle(
|
widget.icon ?? InkWell(
|
||||||
color: Colors.red,
|
onTap: _toggleDropdown,
|
||||||
fontSize: 12,
|
child: Icon(
|
||||||
),
|
Icons.keyboard_arrow_down_outlined,
|
||||||
),
|
size: 20,
|
||||||
)
|
color: Colors.black,
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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(() {
|
|
||||||
// _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
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
CompositedTransformTarget(
|
|
||||||
link: layerLink,
|
|
||||||
child: GestureDetector(
|
|
||||||
onTap: _toggleDropdown,
|
|
||||||
child: Container(
|
|
||||||
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,
|
|
||||||
size: 20,
|
|
||||||
color: Colors.black,
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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),
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// );
|
||||||
|
// },
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
|
@ -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"
|
||||||
backClr: AppColors.clrD9,
|
?Icon(
|
||||||
borderClr: AppColors.clrGrey,
|
Icons.keyboard_arrow_down_outlined,
|
||||||
items: ctrl.userNames,
|
size: 20,
|
||||||
itemLabel: (item) => item,
|
color: Colors.black,
|
||||||
onSelected: (selected) {
|
) : GestureDetector(
|
||||||
ctrl.selectUser.value = selected;
|
onTap: () {
|
||||||
},
|
controller.selectUser.value =
|
||||||
hintText: ctrl.selectUser.value);
|
"Select User Name";
|
||||||
},
|
},
|
||||||
),
|
child: Icon(Icons.close,size: 14)),
|
||||||
|
|
||||||
|
backClr: AppColors.clrD9,
|
||||||
|
borderClr: AppColors.clrGrey,
|
||||||
|
items: controller.userNames,
|
||||||
|
itemLabel: (item) => item,
|
||||||
|
onSelected: (selected) {
|
||||||
|
controller.selectUser.value =
|
||||||
|
selected ?? "";
|
||||||
|
},
|
||||||
|
hintText: controller.selectUser.value),
|
||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
SizedBox(width: 16),
|
SizedBox(width: 16),
|
||||||
|
@ -68,19 +79,27 @@ 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"
|
||||||
backClr: AppColors.clrD9,
|
?Icon(
|
||||||
borderClr: AppColors.clrGrey,
|
Icons.keyboard_arrow_down_outlined,
|
||||||
items: controller.userTypesNames,
|
size: 20,
|
||||||
itemLabel: (item) => item,
|
color: Colors.black,
|
||||||
onSelected: (selected) {
|
) : GestureDetector(
|
||||||
controller.selectType.value = selected;
|
onTap: () {
|
||||||
|
controller.selectType.value =
|
||||||
|
"Select UserType";
|
||||||
},
|
},
|
||||||
hintText: controller.selectType.value);
|
child: Icon(Icons.close,size: 14)),
|
||||||
},
|
backClr: AppColors.clrD9,
|
||||||
),
|
borderClr: AppColors.clrGrey,
|
||||||
|
items: controller.userTypesNames,
|
||||||
|
itemLabel: (item) => item,
|
||||||
|
onSelected: (selected) {
|
||||||
|
controller.selectType.value = selected;
|
||||||
|
},
|
||||||
|
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,
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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,17 +43,68 @@ 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,
|
||||||
|
borderClr: AppColors.clrGrey,
|
||||||
|
items: paymentCtrl.plant,
|
||||||
|
itemLabel: (item) =>
|
||||||
|
"${item.plantCode} - ${item.plantDesc}",
|
||||||
|
onSelected: (selected) {
|
||||||
|
paymentCtrl.selectedPlant.value =
|
||||||
|
"${selected?.plantCode} - ${selected?.plantDesc}";
|
||||||
|
},
|
||||||
|
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,
|
backClr: AppColors.clrD9,
|
||||||
borderClr: AppColors.clrGrey,
|
borderClr: AppColors.clrGrey,
|
||||||
items: paymentCtrl.plant,
|
items: paymentCtrl.product,
|
||||||
itemLabel: (item) =>
|
itemLabel: (item) =>
|
||||||
"${item.plantCode}-${item.plantDesc}",
|
"${item.materialCode} - ${item.materialDescription}",
|
||||||
onSelected: (selected) {
|
onSelected: (selected) {
|
||||||
paymentCtrl.selectedPlant.value =
|
paymentCtrl.selectedProduct.value =
|
||||||
"${selected?.plantCode}-${selected?.plantDesc}";
|
"${selected.materialCode} - ${selected.materialDescription}";
|
||||||
},
|
},
|
||||||
hintText: paymentCtrl.selectedPlant.value,
|
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}"),
|
||||||
|
|
|
@ -344,206 +344,226 @@ class GenerateFrightBill extends StatelessWidget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return Column(
|
return Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.end,
|
|
||||||
children: [
|
children: [
|
||||||
Container(
|
SizedBox(
|
||||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
width: MediaQuery.sizeOf(context).width,
|
||||||
margin: EdgeInsets.only(top: 16),
|
height: controller.isFilterVisibleGenerateFreight.value == true
|
||||||
height: 45,
|
? MediaQuery.of(context).size.height * 0.3
|
||||||
color: AppColors.primaryClr,
|
: MediaQuery.of(context).size.height * 0.64,
|
||||||
child: Row(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
TextView(
|
Container(
|
||||||
text: AppStrings.viewGrnDetails,
|
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||||
style: 14.txtBoldWhite),
|
margin: EdgeInsets.only(top: 16),
|
||||||
Spacer(),
|
height: 45,
|
||||||
CommonBtn(
|
color: AppColors.primaryClr,
|
||||||
width: 150,
|
child: Row(
|
||||||
bkClr: AppColors.white,
|
children: [
|
||||||
borderClr: AppColors.primaryClr,
|
TextView(
|
||||||
style: 12.txtBoldBlue,
|
text: AppStrings.viewGrnDetails,
|
||||||
text: "Generate Freight Bill",
|
style: 14.txtBoldWhite),
|
||||||
clickAction: () {
|
Spacer(),
|
||||||
bool hasSelectedRows = controller.grnDetails
|
CommonBtn(
|
||||||
.any((element) => element.isSelected);
|
width: 150,
|
||||||
if (!hasSelectedRows) {
|
bkClr: AppColors.white,
|
||||||
showPopup(
|
borderClr: AppColors.primaryClr,
|
||||||
context: context,
|
style: 12.txtBoldBlue,
|
||||||
onClick: () {
|
text: "Generate Freight Bill",
|
||||||
Get.back();
|
clickAction: () {
|
||||||
});
|
bool hasSelectedRows = controller.grnDetails
|
||||||
} else {
|
.any((element) => element.isSelected);
|
||||||
CommonAlertDialog.showDialog(
|
if (!hasSelectedRows) {
|
||||||
dismissable: false,
|
showPopup(
|
||||||
message: "Are you sure want to\nsave this?",
|
context: context,
|
||||||
positiveText: "Save",
|
onClick: () {
|
||||||
negativeText: "Cancel",
|
Get.back();
|
||||||
positiveBtCallback: () {
|
});
|
||||||
Get.back();
|
} else {
|
||||||
controller.addFreightBill();
|
CommonAlertDialog.showDialog(
|
||||||
showFreightBill(context);
|
dismissable: false,
|
||||||
},
|
message:
|
||||||
negativeBtCallback: () {
|
"Are you sure want to\nsave this?",
|
||||||
Get.back();
|
positiveText: "Save",
|
||||||
});
|
negativeText: "Cancel",
|
||||||
}
|
positiveBtCallback: () {
|
||||||
}),
|
Get.back();
|
||||||
],
|
controller.addFreightBill();
|
||||||
),
|
showFreightBill(context);
|
||||||
),
|
},
|
||||||
Container(
|
negativeBtCallback: () {
|
||||||
margin: EdgeInsets.only(bottom: 16, top: 16),
|
Get.back();
|
||||||
height:
|
});
|
||||||
controller.isFilterVisibleGenerateFreight.value == true
|
}
|
||||||
? MediaQuery.of(context).size.height * 0.3
|
}),
|
||||||
: MediaQuery.of(context).size.height * 0.64,
|
],
|
||||||
child: RawScrollbar(
|
),
|
||||||
thumbColor: AppColors.clrD9,
|
),
|
||||||
radius: Radius.circular(2),
|
Container(
|
||||||
trackVisibility: true,
|
margin: EdgeInsets.only(bottom: 16, top: 16),
|
||||||
thumbVisibility: true,
|
child: RawScrollbar(
|
||||||
thickness: 14,
|
thumbColor: AppColors.clrD9,
|
||||||
controller: controller.verticalScrollController,
|
radius: Radius.circular(2),
|
||||||
child: SingleChildScrollView(
|
trackVisibility: true,
|
||||||
controller: controller.verticalScrollController,
|
thumbVisibility: true,
|
||||||
child: RawScrollbar(
|
thickness: 14,
|
||||||
thumbColor: AppColors.clrD9,
|
controller: controller.verticalScrollController,
|
||||||
radius: Radius.circular(2),
|
child: SingleChildScrollView(
|
||||||
thickness: 14,
|
controller: controller.verticalScrollController,
|
||||||
trackVisibility: true,
|
child: RawScrollbar(
|
||||||
thumbVisibility: true,
|
thumbColor: AppColors.clrD9,
|
||||||
controller: controller.horizontalScrollController,
|
radius: Radius.circular(2),
|
||||||
child: SingleChildScrollView(
|
thickness: 14,
|
||||||
scrollDirection: Axis.horizontal,
|
trackVisibility: true,
|
||||||
controller: controller.horizontalScrollController,
|
thumbVisibility: true,
|
||||||
child: Container(
|
controller: controller.horizontalScrollController,
|
||||||
margin: EdgeInsets.only(bottom: 24),
|
child: SingleChildScrollView(
|
||||||
decoration: BoxDecoration(
|
scrollDirection: Axis.horizontal,
|
||||||
border: Border.all(
|
controller: controller.horizontalScrollController,
|
||||||
color: Colors.grey.shade400,
|
child: Container(
|
||||||
width: 1.0,
|
margin: EdgeInsets.only(bottom: 24),
|
||||||
),
|
decoration: BoxDecoration(
|
||||||
),
|
border: Border.all(
|
||||||
child: DataTable(
|
color: Colors.grey.shade400,
|
||||||
dataRowHeight: 40,
|
width: 1.0,
|
||||||
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,
|
|
||||||
child: Checkbox(
|
|
||||||
value: controller.selectAllField.value,
|
|
||||||
onChanged: (value) {
|
|
||||||
controller.selectAll(value ?? false);
|
|
||||||
},
|
|
||||||
activeColor: AppColors.primaryClr,
|
|
||||||
checkColor: Colors.white,
|
|
||||||
materialTapTargetSize: MaterialTapTargetSize
|
|
||||||
.shrinkWrap,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
child: DataTable(
|
||||||
// dataColumn(AppStrings.srNo),
|
dataRowHeight: 40,
|
||||||
dataColumn(AppStrings.mrnNo),
|
headingRowHeight: 40,
|
||||||
dataColumn(AppStrings.plantNo),
|
headingRowColor:
|
||||||
dataColumn(AppStrings.product),
|
WidgetStateProperty.all(AppColors.clrF2),
|
||||||
dataColumn(AppStrings.date),
|
border: TableBorder(
|
||||||
dataColumn(AppStrings.fromLocation),
|
horizontalInside:
|
||||||
dataColumn(AppStrings.vehicleNo),
|
BorderSide(color: AppColors.clrGrey),
|
||||||
dataColumn(AppStrings.transporterLrNo),
|
verticalInside:
|
||||||
dataColumn(AppStrings.transporterLrNoDate),
|
BorderSide(color: AppColors.clrGrey),
|
||||||
dataColumn(AppStrings.dispQty),
|
bottom:
|
||||||
dataColumn(AppStrings.netQty),
|
BorderSide(color: AppColors.clrGrey),
|
||||||
dataColumn(AppStrings.billingQty),
|
left: BorderSide(color: AppColors.clrGrey),
|
||||||
dataColumn(AppStrings.uom),
|
right: BorderSide(color: AppColors.clrGrey),
|
||||||
dataColumn(AppStrings.freightRate),
|
top: BorderSide(color: AppColors.clrGrey),
|
||||||
dataColumn(AppStrings.freightAmount),
|
),
|
||||||
],
|
columns: [
|
||||||
rows: List<DataRow>.generate(
|
DataColumn(
|
||||||
controller.grnDetails.length, (index) {
|
label: Transform.scale(
|
||||||
final stoppage = controller.grnDetails[index];
|
scale: 0.80,
|
||||||
return DataRow(
|
child: Checkbox(
|
||||||
selected: stoppage.isSelected,
|
value:
|
||||||
cells: [
|
controller.selectAllField.value,
|
||||||
DataCell(
|
onChanged: (value) {
|
||||||
Transform.scale(
|
controller
|
||||||
scale: 0.80,
|
.selectAll(value ?? false);
|
||||||
child: Checkbox(
|
},
|
||||||
value: stoppage.isSelected,
|
activeColor: AppColors.primaryClr,
|
||||||
onChanged: (value) {
|
checkColor: Colors.white,
|
||||||
controller.toggleSelection(
|
materialTapTargetSize:
|
||||||
index, value ?? false);
|
MaterialTapTargetSize.shrinkWrap,
|
||||||
},
|
),
|
||||||
activeColor: AppColors.primaryClr,
|
|
||||||
checkColor: Colors.white,
|
|
||||||
materialTapTargetSize:
|
|
||||||
MaterialTapTargetSize.shrinkWrap,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
// dataColumn(AppStrings.srNo),
|
||||||
// editableCell(index, "0${index + 1}"),
|
dataColumn(AppStrings.mrnNo),
|
||||||
editableCell(index, stoppage.grnNo ?? ""),
|
dataColumn(AppStrings.plantNo),
|
||||||
editableCell(
|
dataColumn(AppStrings.product),
|
||||||
index, stoppage.plantCode ?? ""),
|
dataColumn(AppStrings.date),
|
||||||
editableCell(
|
dataColumn(AppStrings.fromLocation),
|
||||||
index, stoppage.materialCode ?? ""),
|
dataColumn(AppStrings.vehicleNo),
|
||||||
editableCell(
|
dataColumn(AppStrings.transporterLrNo),
|
||||||
index,
|
dataColumn(AppStrings.transporterLrNoDate),
|
||||||
DateFormat('yyyy-MM-dd').format(
|
dataColumn(AppStrings.dispQty),
|
||||||
stoppage.grnDate ??
|
dataColumn(AppStrings.netQty),
|
||||||
DateTime.now())),
|
dataColumn(AppStrings.billingQty),
|
||||||
editableCell(
|
dataColumn(AppStrings.uom),
|
||||||
index, stoppage.fromLocation ?? ""),
|
dataColumn(AppStrings.freightRate),
|
||||||
editableCell(
|
dataColumn(AppStrings.freightAmount),
|
||||||
index, stoppage.vehicleNo ?? ""),
|
],
|
||||||
editableCell(index, stoppage.lrNo ?? ""),
|
rows: List<DataRow>.generate(
|
||||||
editableCell(
|
controller.grnDetails.length, (index) {
|
||||||
index,
|
final stoppage =
|
||||||
DateFormat('yyyy-MM-dd').format(
|
controller.grnDetails[index];
|
||||||
stoppage.lrDate ?? DateTime.now())),
|
return DataRow(
|
||||||
editableCell(index,
|
selected: stoppage.isSelected,
|
||||||
stoppage.dispQty?.toString() ?? ""),
|
cells: [
|
||||||
editableCell(index,
|
DataCell(
|
||||||
stoppage.netQty?.toString() ?? ""),
|
Transform.scale(
|
||||||
editableCell(index,
|
scale: 0.80,
|
||||||
stoppage.billingQty?.toString() ?? ""),
|
child: Checkbox(
|
||||||
editableCell(index, "-"),
|
value: stoppage.isSelected,
|
||||||
editableCell(index,
|
onChanged: (value) {
|
||||||
stoppage.freightRate?.toString() ?? ""),
|
controller.toggleSelection(
|
||||||
editableCell(
|
index, value ?? false);
|
||||||
index,
|
},
|
||||||
stoppage.shipmentCost?.toString() ??
|
activeColor: AppColors.primaryClr,
|
||||||
""),
|
checkColor: Colors.white,
|
||||||
],
|
materialTapTargetSize:
|
||||||
);
|
MaterialTapTargetSize
|
||||||
}),
|
.shrinkWrap,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
// 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, "-"),
|
||||||
|
editableCell(
|
||||||
|
index,
|
||||||
|
stoppage.freightRate?.toString() ??
|
||||||
|
""),
|
||||||
|
editableCell(
|
||||||
|
index,
|
||||||
|
stoppage.shipmentCost?.toString() ??
|
||||||
|
""),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
CustomPagination(
|
Padding(
|
||||||
currentPage: controller.currentPageViewFreight.value + 1,
|
padding: EdgeInsets.only(bottom: 4),
|
||||||
totalPages: controller.totalPagesViewFreight.value,
|
child: CustomPagination(
|
||||||
onPageChanged: (page) {
|
currentPage: controller.currentPageGenerateFreight.value + 1,
|
||||||
controller.viewFreightView(page: page - 1);
|
totalPages: controller.totalPagesGenerateFreight.value,
|
||||||
},
|
onPageChanged: (page) {
|
||||||
),
|
controller.postData(page: page - 1);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -41,328 +41,83 @@ class _TransportViewState extends State<InvoiceManagement> {
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
padding: EdgeInsets.only(bottom: 4),
|
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||||
margin: EdgeInsets.all(16),
|
height: 50,
|
||||||
child: Column(
|
color: AppColors.primaryClr,
|
||||||
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Container(
|
ListView.separated(
|
||||||
margin: EdgeInsets.only(bottom: 12),
|
shrinkWrap: true,
|
||||||
height: 55,
|
padding: EdgeInsets.symmetric(horizontal: 16),
|
||||||
color: AppColors.primaryClr,
|
scrollDirection: Axis.horizontal,
|
||||||
child: Row(
|
itemBuilder: (context, index) {
|
||||||
children: [
|
return Obx(
|
||||||
ListView.separated(
|
() => InkWell(
|
||||||
padding: EdgeInsets.symmetric(horizontal: 16),
|
|
||||||
scrollDirection: Axis.horizontal,
|
|
||||||
shrinkWrap: true,
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
return Obx(
|
|
||||||
() => InkWell(
|
|
||||||
onTap: () {
|
|
||||||
ctrl.selectedState.value = index;
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
margin: EdgeInsets.only(bottom: 10, top: 10),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border(
|
|
||||||
bottom: BorderSide(
|
|
||||||
color: ctrl.selectedState.value ==
|
|
||||||
index
|
|
||||||
? Colors.white
|
|
||||||
: AppColors.primaryClr,
|
|
||||||
width: 3))),
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
ctrl.userTabs[index].title ?? "",
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12,
|
|
||||||
fontWeight: FontWeight.w900,
|
|
||||||
color: Colors.white),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
separatorBuilder: (context, index) {
|
|
||||||
return SizedBox(width: 16);
|
|
||||||
},
|
|
||||||
itemCount: ctrl.userTabs.length),
|
|
||||||
Spacer(),
|
|
||||||
InkWell(
|
|
||||||
child: Image.asset(AppImages.refresh,
|
|
||||||
height: 10, width: 10)),
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: Text(
|
|
||||||
AppStrings.refresh,
|
|
||||||
style: TextStyle(
|
|
||||||
color: AppColors.white,
|
|
||||||
fontSize: 10,
|
|
||||||
fontWeight: FontWeight.normal),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
GestureDetector(
|
|
||||||
behavior: HitTestBehavior.translucent,
|
|
||||||
onTap: () {
|
onTap: () {
|
||||||
print("cdgsa");
|
ctrl.selectedState.value = index;
|
||||||
ctrl.isSelected.value = !ctrl.isSelected.value;
|
|
||||||
if (ctrl.isSelected.value == 0) {
|
|
||||||
ctrl.toggleFilter();
|
|
||||||
} else if (ctrl.isSelected.value == 1) {
|
|
||||||
ctrl.toggleViewFreight();
|
|
||||||
} else if (ctrl.isSelected.value == 2) {
|
|
||||||
ctrl.togglePending();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
child: Row(
|
child: Container(
|
||||||
children: [
|
margin: EdgeInsets.only(bottom: 10, top: 10),
|
||||||
Image.asset(AppImages.filter,
|
decoration: BoxDecoration(
|
||||||
height: 16, width: 16),
|
border: Border(
|
||||||
Padding(
|
bottom: BorderSide(
|
||||||
padding: const EdgeInsets.all(8.0),
|
color: ctrl.selectedState.value == index
|
||||||
child: TextView(
|
? Colors.white
|
||||||
text: AppStrings.filter,
|
: AppColors.primaryClr,
|
||||||
style: 12.txtBoldWhite,
|
width: 3))),
|
||||||
),
|
child: Center(
|
||||||
|
child: TextView(
|
||||||
|
text: ctrl.invoiceTabs[index].title ?? "",
|
||||||
|
style: 12.txtBoldWhite,
|
||||||
),
|
),
|
||||||
],
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (context, index) {
|
||||||
|
return SizedBox(width: 16);
|
||||||
|
},
|
||||||
|
itemCount: ctrl.invoiceTabs.length,
|
||||||
|
),
|
||||||
|
Spacer(),
|
||||||
|
InkWell(
|
||||||
|
onTap: (){
|
||||||
|
paymentCtrl.resetDropdowns();
|
||||||
|
},
|
||||||
|
child: Image.asset(AppImages.refresh, height: 16, width: 16)),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text(
|
||||||
|
AppStrings.refresh,
|
||||||
|
style: 12.txtBoldWhite,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
InkWell(
|
||||||
|
onTap: () {
|
||||||
|
switch (ctrl.selectedState.value) {
|
||||||
|
case 0:
|
||||||
|
return ctrl.invoiceFilter();
|
||||||
|
case 1:
|
||||||
|
return ctrl.cancelledFilter();
|
||||||
|
case 2:
|
||||||
|
return ctrl.paymentFilter();
|
||||||
|
default:
|
||||||
|
return ctrl.ccnFilter();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Image.asset(AppImages.filter, height: 16, width: 16),
|
||||||
|
),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: TextView(
|
||||||
|
text: AppStrings.filter,
|
||||||
|
style: 12.txtBoldWhite,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Obx(
|
|
||||||
() => ctrl.isSelected.value
|
|
||||||
? Container(
|
|
||||||
padding: EdgeInsets.all(8),
|
|
||||||
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", isRequired: true),
|
|
||||||
SizedBox(height: 8),
|
|
||||||
CustomDropdown(
|
|
||||||
backClr: AppColors.clrD9,
|
|
||||||
borderClr: AppColors.clrGrey,
|
|
||||||
items: ctrl.plant,
|
|
||||||
|
|
||||||
itemLabel: (item) =>
|
|
||||||
"${item.plantCode} - ${item.plantDesc}",
|
|
||||||
onSelected: (selected) {
|
|
||||||
if (selected != null) {
|
|
||||||
ctrl.selectPlantFreight.value =
|
|
||||||
selected.plantCode ?? "";
|
|
||||||
ctrl.showPlantErrorFreight.value =
|
|
||||||
false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hintText: "Select Plant",
|
|
||||||
),
|
|
||||||
Obx(() =>
|
|
||||||
ctrl.showPlantErrorFreight.value
|
|
||||||
? Text(
|
|
||||||
'Required',
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.red,
|
|
||||||
fontSize: 12),
|
|
||||||
)
|
|
||||||
: Text('')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(width: 16),
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
TextView(text: "Freight Bill Date",isRequired: true,),
|
|
||||||
SizedBox(height: 8),
|
|
||||||
Container(
|
|
||||||
height: 35,
|
|
||||||
child: TextFormField(
|
|
||||||
key: ctrl.fromTextFieldKey,
|
|
||||||
controller: ctrl.fromController,
|
|
||||||
onTap: () async {
|
|
||||||
final pickedDate =
|
|
||||||
await showWebDatePicker(
|
|
||||||
width: 20.w,
|
|
||||||
context: ctrl
|
|
||||||
.fromTextFieldKey.currentContext!,
|
|
||||||
initialDate:
|
|
||||||
ctrl.fromSelectedDate,
|
|
||||||
firstDate: DateTime(2000),
|
|
||||||
lastDate: DateTime.now(),
|
|
||||||
);
|
|
||||||
|
|
||||||
if (pickedDate != null) {
|
|
||||||
ctrl.fromSelectedDate =
|
|
||||||
pickedDate;
|
|
||||||
String formattedDate = ctrl
|
|
||||||
.getFormattedDate(pickedDate);
|
|
||||||
ctrl.fromController.text =
|
|
||||||
formattedDate;
|
|
||||||
ctrl.dateCheck.value = true;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
decoration: InputDecoration(
|
|
||||||
fillColor: AppColors.clrD9,
|
|
||||||
filled: true,
|
|
||||||
hintText: 'Select Freight Bill Date ',
|
|
||||||
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: ctrl.dateCheck.value
|
|
||||||
? InkWell(
|
|
||||||
onTap: () {
|
|
||||||
ctrl.dateCheck.value =
|
|
||||||
false;
|
|
||||||
ctrl.fromController
|
|
||||||
.clear();
|
|
||||||
ctrl.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: "Freight Bill No.", isRequired: true),
|
|
||||||
SizedBox(height: 8),
|
|
||||||
CustomDropdown<String>(
|
|
||||||
backClr: AppColors.clrD9,
|
|
||||||
borderClr: AppColors.clrGrey,
|
|
||||||
items: ctrl.freightBill,
|
|
||||||
itemLabel: (item) => item,
|
|
||||||
onSelected: (selected) {
|
|
||||||
if (selected != null) {
|
|
||||||
ctrl.selectFreightBillValidate.value =
|
|
||||||
selected;
|
|
||||||
ctrl.showTransactionErrorViewFreight
|
|
||||||
.value = false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
hintText: "Select Freight Bill No.",
|
|
||||||
),
|
|
||||||
Obx(() => ctrl
|
|
||||||
.showTransactionErrorViewFreight.value
|
|
||||||
? Text(
|
|
||||||
'Required',
|
|
||||||
style: TextStyle(
|
|
||||||
color: Colors.red, fontSize: 12),
|
|
||||||
)
|
|
||||||
: Text('')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
// 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: [
|
|
||||||
// _commonText(
|
|
||||||
// "Freight Bill Date",
|
|
||||||
// ),
|
|
||||||
// SizedBox(height: 8),
|
|
||||||
// InputField(
|
|
||||||
// title: "Select Bill Date",
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// )),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// 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),
|
|
||||||
// CommonBtn(
|
|
||||||
// text: AppStrings.submit,
|
|
||||||
// clickAction: () {},
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// ))
|
|
||||||
],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: SizedBox(),
|
|
||||||
),
|
|
||||||
Obx(() {
|
Obx(() {
|
||||||
switch (ctrl.selectedState.value) {
|
switch (ctrl.selectedState.value) {
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
@ -524,13 +524,13 @@ class PendingGeneration extends StatelessWidget {
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
// CustomPagination(
|
CustomPagination(
|
||||||
// currentPage: controller.currentPage.value,
|
currentPage: controller.currentPagePendingFreight.value,
|
||||||
// totalPages: controller.totalPages.value,
|
totalPages: controller.totalPagesPendingFreight.value,
|
||||||
// onPageChanged: (int page) {
|
onPageChanged: (int page) {
|
||||||
// // controller.onPageChanged(page);
|
// controller.grnPending(page: page -1);
|
||||||
// },
|
},
|
||||||
// ),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -161,8 +161,7 @@ class _TransportViewState extends State<TransportView> {
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
color: Colors.white,
|
// padding: EdgeInsets.only(bottom: 16),
|
||||||
padding: EdgeInsets.only(bottom: 16),
|
|
||||||
margin: EdgeInsets.all(16),
|
margin: EdgeInsets.all(16),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
|
@ -258,26 +257,53 @@ class _TransportViewState extends State<TransportView> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Obx(
|
Obx(
|
||||||
() => SimpleDropdown(
|
() => ctrl.selectedUser.value == 0
|
||||||
|
? SimpleDropdown(
|
||||||
|
onSelected: (newValue) {
|
||||||
|
ctrl.selectedDropdownItemGenerateFreight.value =
|
||||||
|
newValue;
|
||||||
|
ctrl.postData();
|
||||||
|
},
|
||||||
|
items: ctrl.selectElementSize,
|
||||||
|
selectedItem:
|
||||||
|
ctrl.selectedDropdownItemGenerateFreight.value,
|
||||||
|
)
|
||||||
|
: ctrl.selectedUser.value == 1
|
||||||
|
? SimpleDropdown(
|
||||||
|
onSelected: (newValue) {
|
||||||
|
ctrl.selectedDropdownItemViewFreight
|
||||||
|
.value = newValue;
|
||||||
|
ctrl.viewFreightView();
|
||||||
|
},
|
||||||
|
items: ctrl.selectElementSize,
|
||||||
|
selectedItem: ctrl
|
||||||
|
.selectedDropdownItemViewFreight.value,
|
||||||
|
)
|
||||||
|
: ctrl.selectedUser.value == 2
|
||||||
|
? SimpleDropdown(
|
||||||
onSelected: (newValue) {
|
onSelected: (newValue) {
|
||||||
ctrl.selectedDropdownItemViewFreight.value = newValue;
|
ctrl.selectedDropdownItemViewFreight
|
||||||
|
.value = newValue;
|
||||||
ctrl.viewFreightView();
|
ctrl.viewFreightView();
|
||||||
},
|
},
|
||||||
items: ctrl.selectElementSize,
|
items: ctrl.selectElementSize,
|
||||||
selectedItem: ctrl.selectedDropdownItemViewFreight.value,
|
selectedItem: ctrl
|
||||||
|
.selectedDropdownItemViewFreight.value,
|
||||||
|
)
|
||||||
|
: SimpleDropdown(
|
||||||
|
onSelected: (newValue) {
|
||||||
|
ctrl.selectedDropdownItemViewFreight
|
||||||
|
.value = newValue;
|
||||||
|
ctrl.viewFreightView();
|
||||||
|
},
|
||||||
|
items: ctrl.selectElementSize,
|
||||||
|
selectedItem: ctrl
|
||||||
|
.selectedDropdownItemViewFreight.value,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
// Obx(() => SimpleDropdown<int>(
|
SizedBox(
|
||||||
// items: [1, 2, 3, 4],
|
width: 10,
|
||||||
// selectedItem: ctrl. selectedDropdownItem.value, // Bind external state
|
),
|
||||||
// onSelected: (val) => ctrl. selectedDropdownItem.value = val,
|
|
||||||
// width: 150,
|
|
||||||
// borderClr: Colors.blue,
|
|
||||||
// )),
|
|
||||||
|
|
||||||
SizedBox(width: 10,),
|
|
||||||
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -153,9 +153,10 @@ class TransportController extends GetxController {
|
||||||
getInvoiceView();
|
getInvoiceView();
|
||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
Rxn<int> selectedDropdownItemViewFreight = Rxn<int>();
|
Rxn<int> selectedDropdownItemViewFreight = Rxn<int>();
|
||||||
|
Rxn<int> selectedDropdownItemPendingFreight = Rxn<int>();
|
||||||
|
Rxn<int> selectedDropdownItemGenerateFreight = Rxn<int>();
|
||||||
|
|
||||||
refreshApis() {
|
refreshApis() {
|
||||||
getFreightBills();
|
getFreightBills();
|
||||||
|
@ -164,6 +165,8 @@ class TransportController extends GetxController {
|
||||||
getSubFreightBillsView();
|
getSubFreightBillsView();
|
||||||
postData();
|
postData();
|
||||||
selectedDropdownItemViewFreight.value = null;
|
selectedDropdownItemViewFreight.value = null;
|
||||||
|
selectedDropdownItemPendingFreight.value = null;
|
||||||
|
selectedDropdownItemGenerateFreight.value = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
getInvoiceView() async {
|
getInvoiceView() async {
|
||||||
|
@ -220,7 +223,12 @@ class TransportController extends GetxController {
|
||||||
var grnPendingLoader = false.obs;
|
var grnPendingLoader = false.obs;
|
||||||
var errorMessage = ''.obs;
|
var errorMessage = ''.obs;
|
||||||
|
|
||||||
postData() async {
|
// for Generate
|
||||||
|
var totalElementsGenerateFreight = 0.obs;
|
||||||
|
RxInt currentPageGenerateFreight = 1.obs;
|
||||||
|
RxInt totalPagesGenerateFreight = 3.obs;
|
||||||
|
|
||||||
|
postData({int page = 0}) async {
|
||||||
try {
|
try {
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
Map<String, String> requestBody = {
|
Map<String, String> requestBody = {
|
||||||
|
@ -231,18 +239,24 @@ class TransportController extends GetxController {
|
||||||
"grnFromDate": "",
|
"grnFromDate": "",
|
||||||
"grnToDate": ""
|
"grnToDate": ""
|
||||||
};
|
};
|
||||||
var response = await PostRequests.addFreightBill(requestBody);
|
var response = await PostRequests.addFreightBill(
|
||||||
|
page: page,
|
||||||
|
size: selectedDropdownItemGenerateFreight.value ?? 1,
|
||||||
|
requestBody: requestBody);
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
List<Content> flattenedContent =
|
List<Content> flattenedContent =
|
||||||
response.content!.expand((list) => list).toList();
|
response.content!.expand((list) => list).toList();
|
||||||
grnDetails.assignAll(flattenedContent);
|
grnDetails.assignAll(flattenedContent);
|
||||||
|
totalPagesGenerateFreight.value = response.totalPages ?? 0;
|
||||||
|
totalElementsGenerateFreight.value = response.totalElements ?? 0;
|
||||||
|
currentPageGenerateFreight.value = page;
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
isLoading.value = false;
|
isLoading.value = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void displayFilteredData() async {
|
void displayFilteredData({int page = 0}) async {
|
||||||
try {
|
try {
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
Map<String, String> requestBody = {
|
Map<String, String> requestBody = {
|
||||||
|
@ -254,7 +268,10 @@ class TransportController extends GetxController {
|
||||||
"grnToDate": ""
|
"grnToDate": ""
|
||||||
};
|
};
|
||||||
|
|
||||||
var response = await PostRequests.addFreightBill(requestBody);
|
var response = await PostRequests.addFreightBill(
|
||||||
|
page: page,
|
||||||
|
size: selectedDropdownItemGenerateFreight.value ?? 4,
|
||||||
|
requestBody: requestBody);
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
List<Content> flattenedContent =
|
List<Content> flattenedContent =
|
||||||
response.content!.expand((list) => list).toList();
|
response.content!.expand((list) => list).toList();
|
||||||
|
@ -272,12 +289,14 @@ class TransportController extends GetxController {
|
||||||
selectTransactionTypeFreight.value.toUpperCase());
|
selectTransactionTypeFreight.value.toUpperCase());
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
print("Filtered Data: ${filteredData.length}");
|
if (page == 0) {
|
||||||
|
grnDetails.assignAll(flattenedContent);
|
||||||
grnDetails.assignAll(filteredData);
|
} else {
|
||||||
|
grnDetails.addAll(flattenedContent);
|
||||||
print("✅ Filtered Data: ${filteredData.length} items displayed.");
|
}
|
||||||
print("✅ Filtered Data: ${grnDetails.length} items displayed.");
|
totalPagesGenerateFreight.value = response.totalPages ?? 0;
|
||||||
|
totalElementsGenerateFreight.value = response.totalElements ?? 0;
|
||||||
|
currentPageGenerateFreight.value = page;
|
||||||
} else {
|
} else {
|
||||||
print("❌ No response from API.");
|
print("❌ No response from API.");
|
||||||
}
|
}
|
||||||
|
@ -411,13 +430,6 @@ class TransportController extends GetxController {
|
||||||
}
|
}
|
||||||
|
|
||||||
RxString selectedPlant = "".obs;
|
RxString selectedPlant = "".obs;
|
||||||
List plantList = [
|
|
||||||
"Plant 1",
|
|
||||||
"Plant 2",
|
|
||||||
"Plant 3",
|
|
||||||
"Plant 4",
|
|
||||||
"Plant 5",
|
|
||||||
];
|
|
||||||
RxString selectedFreight = "".obs;
|
RxString selectedFreight = "".obs;
|
||||||
|
|
||||||
addFreightBill() async {
|
addFreightBill() async {
|
||||||
|
@ -457,23 +469,36 @@ class TransportController extends GetxController {
|
||||||
////////////////////////////////////////// PRIYA ///////////////////////////////////////////////
|
////////////////////////////////////////// PRIYA ///////////////////////////////////////////////
|
||||||
var freightBillData = <FreightBill>[].obs;
|
var freightBillData = <FreightBill>[].obs;
|
||||||
|
|
||||||
var totalElementsViewFreight = 0.obs;
|
|
||||||
var pageSize = 2.obs;
|
var pageSize = 2.obs;
|
||||||
var sortField = "grn_date".obs;
|
var sortField = "grn_date".obs;
|
||||||
var sortDirection = "desc".obs;
|
var sortDirection = "desc".obs;
|
||||||
|
|
||||||
|
// view freight
|
||||||
|
var totalElementsViewFreight = 0.obs;
|
||||||
RxInt currentPageViewFreight = 1.obs;
|
RxInt currentPageViewFreight = 1.obs;
|
||||||
RxInt totalPagesViewFreight = 3.obs;
|
RxInt totalPagesViewFreight = 3.obs;
|
||||||
final int limit = 10;
|
|
||||||
RxList selectElementSize = [
|
|
||||||
4,
|
|
||||||
8,
|
|
||||||
12,
|
|
||||||
16,
|
|
||||||
20,
|
|
||||||
].obs;
|
|
||||||
|
|
||||||
viewFreightView({int page = 0}) async {
|
// for pending
|
||||||
|
var totalElementsPendingFreight = 0.obs;
|
||||||
|
RxInt currentPagePendingFreight = 1.obs;
|
||||||
|
RxInt totalPagesPendingFreight = 3.obs;
|
||||||
|
|
||||||
|
final int limit = 10;
|
||||||
|
// RxList selectElementSize = [
|
||||||
|
// 4,
|
||||||
|
// 8,
|
||||||
|
// 12,
|
||||||
|
// 16,
|
||||||
|
// 20,
|
||||||
|
// ].obs;
|
||||||
|
RxList selectElementSize = [
|
||||||
|
2,
|
||||||
|
4,
|
||||||
|
6,
|
||||||
|
8,
|
||||||
|
10,
|
||||||
|
].obs;
|
||||||
|
viewFreightView({int page = 0}) async {
|
||||||
try {
|
try {
|
||||||
freightViewLoader.value = true;
|
freightViewLoader.value = true;
|
||||||
|
|
||||||
|
@ -488,7 +513,9 @@ class TransportController extends GetxController {
|
||||||
};
|
};
|
||||||
|
|
||||||
var response = await PostRequests.viewFreightBill(
|
var response = await PostRequests.viewFreightBill(
|
||||||
page: page, size: selectedDropdownItemViewFreight.value ?? 4, requestBody: requestBody);
|
page: page,
|
||||||
|
size: selectedDropdownItemViewFreight.value ?? 4,
|
||||||
|
requestBody: requestBody);
|
||||||
|
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
List<FreightBill> flattenedContent =
|
List<FreightBill> flattenedContent =
|
||||||
|
@ -514,6 +541,38 @@ class TransportController extends GetxController {
|
||||||
|
|
||||||
var grnPendingData = <GrnPending>[].obs;
|
var grnPendingData = <GrnPending>[].obs;
|
||||||
|
|
||||||
|
// grnPending({int page = 0}) async {
|
||||||
|
// try {
|
||||||
|
// grnPendingLoader.value = true;
|
||||||
|
//
|
||||||
|
// Map<String, String> requestBody = {
|
||||||
|
// "plant": "",
|
||||||
|
// "productNane": "",
|
||||||
|
// "transactionType": "",
|
||||||
|
// "fromLocation": "",
|
||||||
|
// "grnFromDate": "",
|
||||||
|
// "grnToDate": ""
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// var response = await PostRequests.grnPending(
|
||||||
|
// page: page,
|
||||||
|
// size: selectedDropdownItemPendingFreight.value ?? 4,
|
||||||
|
// requestBody: requestBody,
|
||||||
|
// );
|
||||||
|
// if (response != null) {
|
||||||
|
// List<GrnPending> flattenedContent =
|
||||||
|
// response.content!.expand((list) => list).toList();
|
||||||
|
// grnPendingData.assignAll(flattenedContent);
|
||||||
|
// totalPagesPendingFreight.value = response.totalPages ?? 0;
|
||||||
|
// totalElementsPendingFreight.value = response.totalElements ?? 0;
|
||||||
|
// currentPagePendingFreight.value = page;
|
||||||
|
// print(
|
||||||
|
// 'response from pending tab${response.first.toString()} and ${flattenedContent.length} and ${grnPendingData.value[0].codeValue} and ${grnPendingData.value[0].plantCode} and ${grnPendingData.value[0].materialCode}');
|
||||||
|
// }
|
||||||
|
// } finally {
|
||||||
|
// grnPendingLoader.value = false;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
grnPending() async {
|
grnPending() async {
|
||||||
try {
|
try {
|
||||||
grnPendingLoader.value = true;
|
grnPendingLoader.value = true;
|
||||||
|
@ -532,7 +591,7 @@ class TransportController extends GetxController {
|
||||||
);
|
);
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
List<GrnPending> flattenedContent =
|
List<GrnPending> flattenedContent =
|
||||||
response.content!.expand((list) => list).toList();
|
response.content!.expand((list) => list).toList();
|
||||||
grnPendingData.assignAll(flattenedContent);
|
grnPendingData.assignAll(flattenedContent);
|
||||||
print(
|
print(
|
||||||
'response from pending tab${response.first.toString()} and ${flattenedContent.length} and ${grnPendingData.value[0].codeValue} and ${grnPendingData.value[0].plantCode} and ${grnPendingData.value[0].materialCode}');
|
'response from pending tab${response.first.toString()} and ${flattenedContent.length} and ${grnPendingData.value[0].codeValue} and ${grnPendingData.value[0].plantCode} and ${grnPendingData.value[0].materialCode}');
|
||||||
|
@ -541,8 +600,7 @@ class TransportController extends GetxController {
|
||||||
grnPendingLoader.value = false;
|
grnPendingLoader.value = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void displayFilteredDataFromViewFreight({int page = 0}) async {
|
||||||
void displayFilteredDataFromViewFreight({int page = 0, int size = 4}) async {
|
|
||||||
try {
|
try {
|
||||||
freightViewLoader.value = true;
|
freightViewLoader.value = true;
|
||||||
|
|
||||||
|
@ -556,12 +614,10 @@ class TransportController extends GetxController {
|
||||||
"grnToDate": "",
|
"grnToDate": "",
|
||||||
};
|
};
|
||||||
|
|
||||||
print(
|
|
||||||
"🔎 Filter Request - Page: $page, Size: $size, Plant: ${selectPlantViewFreight.value}, "
|
|
||||||
"Product: ${selectProductViewFreight.value}, Freight Bill: ${selectFreightBillValidate.value}");
|
|
||||||
|
|
||||||
var response = await PostRequests.viewFreightBill(
|
var response = await PostRequests.viewFreightBill(
|
||||||
page: page, size: size, requestBody: requestBody); // Pass pagination
|
page: page,
|
||||||
|
size: selectedDropdownItemViewFreight.value ?? 4,
|
||||||
|
requestBody: requestBody); // Pass pagination
|
||||||
|
|
||||||
if (response != null && response.content != null) {
|
if (response != null && response.content != null) {
|
||||||
List<FreightBill> flattenedContent =
|
List<FreightBill> flattenedContent =
|
||||||
|
@ -594,6 +650,57 @@ class TransportController extends GetxController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// void displayFilteredDataFromPending({int page = 0}) async {
|
||||||
|
// try {
|
||||||
|
// isLoading.value = true;
|
||||||
|
// Map<String, String> requestBody = {
|
||||||
|
// "plant": selectPlantPending.value,
|
||||||
|
// "productNane": selectProductPending.value,
|
||||||
|
// "transactionType": selectTransactionTypePending.value.toUpperCase(),
|
||||||
|
// "fromLocation": selectLocation.value,
|
||||||
|
// "grnFromDate": "",
|
||||||
|
// "grnToDate": ""
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// var response = await PostRequests.grnPending(
|
||||||
|
// page: page,
|
||||||
|
// size: selectedDropdownItemPendingFreight.value ?? 4,
|
||||||
|
// requestBody: requestBody,
|
||||||
|
// );
|
||||||
|
// if (response != null) {
|
||||||
|
// List<GrnPending> flattenedContent =
|
||||||
|
// response.content!.expand((list) => list).toList();
|
||||||
|
//
|
||||||
|
// List<GrnPending> filteredData = flattenedContent.where((item) {
|
||||||
|
// return (selectPlantFreight.value.isEmpty ||
|
||||||
|
// item.plantCode == selectPlantFreight.value) &&
|
||||||
|
// (selectProductFreight.value.isEmpty ||
|
||||||
|
// item.materialCode == selectProductFreight.value) &&
|
||||||
|
// (selectTransactionTypeFreight.value.isEmpty ||
|
||||||
|
// item.codeValue ==
|
||||||
|
// selectTransactionTypeFreight.value.toUpperCase());
|
||||||
|
// }).toList();
|
||||||
|
//
|
||||||
|
// if (page == 0) {
|
||||||
|
// grnPendingData.assignAll(flattenedContent);
|
||||||
|
// } else {
|
||||||
|
// grnPendingData.addAll(flattenedContent);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // Update pagination details
|
||||||
|
// totalPagesPendingFreight.value = response.totalPages ?? 0;
|
||||||
|
// totalElementsPendingFreight.value = response.totalElements ?? 0;
|
||||||
|
// currentPagePendingFreight.value = page;
|
||||||
|
//
|
||||||
|
// print(
|
||||||
|
// "✅ pending Data: ${filteredData.length} items displayed pending.");
|
||||||
|
// } else {
|
||||||
|
// print("❌ No response from API.");
|
||||||
|
// }
|
||||||
|
// } finally {
|
||||||
|
// isLoading.value = false;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
void displayFilteredDataFromPending() async {
|
void displayFilteredDataFromPending() async {
|
||||||
try {
|
try {
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
|
@ -609,11 +716,11 @@ class TransportController extends GetxController {
|
||||||
var response = await PostRequests.grnPending(requestBody);
|
var response = await PostRequests.grnPending(requestBody);
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
List<GrnPending> flattenedContent =
|
List<GrnPending> flattenedContent =
|
||||||
response.content!.expand((list) => list).toList();
|
response.content!.expand((list) => list).toList();
|
||||||
|
|
||||||
List<GrnPending> filteredData = flattenedContent.where((item) {
|
List<GrnPending> filteredData = flattenedContent.where((item) {
|
||||||
return (selectPlantFreight.value.isEmpty ||
|
return (selectPlantFreight.value.isEmpty ||
|
||||||
item.plantCode == selectPlantFreight.value) &&
|
item.plantCode == selectPlantFreight.value) &&
|
||||||
(selectProductFreight.value.isEmpty ||
|
(selectProductFreight.value.isEmpty ||
|
||||||
item.materialCode == selectProductFreight.value) &&
|
item.materialCode == selectProductFreight.value) &&
|
||||||
(selectTransactionTypeFreight.value.isEmpty ||
|
(selectTransactionTypeFreight.value.isEmpty ||
|
||||||
|
|
|
@ -2,7 +2,7 @@ class ApiUrls {
|
||||||
ApiUrls._();
|
ApiUrls._();
|
||||||
static const String baseUrl = "http://46.28.44.130:9092/";
|
static const String baseUrl = "http://46.28.44.130:9092/";
|
||||||
static const addFreightBill =
|
static const addFreightBill =
|
||||||
'bill/grndetails?page=0&size=20&sort=grn_date,desc';
|
'bill/grndetails';
|
||||||
static const getFreightBills = 'bill/dropdown';
|
static const getFreightBills = 'bill/dropdown';
|
||||||
static const getAllPayments = "http://46.28.44.130:9092/invoice/getPayments";
|
static const getAllPayments = "http://46.28.44.130:9092/invoice/getPayments";
|
||||||
static const generateFreightBill =
|
static const generateFreightBill =
|
||||||
|
|
|
@ -20,12 +20,17 @@ import 'ApiUrls.dart';
|
||||||
class PostRequests {
|
class PostRequests {
|
||||||
PostRequests._();
|
PostRequests._();
|
||||||
|
|
||||||
static Future<GenerateFreightBills?> addFreightBill(
|
static Future<GenerateFreightBills?> addFreightBill({
|
||||||
|
int page = 0,
|
||||||
|
int size = 15,
|
||||||
|
String sort = 'last_updated_on,desc',
|
||||||
|
Map<String, dynamic>? requestBody,
|
||||||
|
|
||||||
|
}
|
||||||
Map<String, String> requestBody) async {
|
) async {
|
||||||
var apiResponse =
|
var apiResponse =
|
||||||
await RemoteService.simplePost(requestBody, ApiUrls.addFreightBill);
|
await RemoteService.simplePost(requestBody ?? {},'${ApiUrls.addFreightBill}?page=$page&size=$size&sort=$sort'
|
||||||
|
);
|
||||||
|
|
||||||
if (apiResponse != null) {
|
if (apiResponse != null) {
|
||||||
return generateFreightBillsFromJson(apiResponse.response!);
|
return generateFreightBillsFromJson(apiResponse.response!);
|
||||||
|
@ -34,8 +39,6 @@ class PostRequests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static Future<GenerateBillsResModel?> freightBill(
|
static Future<GenerateBillsResModel?> freightBill(
|
||||||
List<Map<String, dynamic>> requestBody) async {
|
List<Map<String, dynamic>> requestBody) async {
|
||||||
var apiResponse =
|
var apiResponse =
|
||||||
|
@ -75,7 +78,7 @@ class PostRequests {
|
||||||
static Future<PaymentResModel?> getAllPayments(
|
static Future<PaymentResModel?> getAllPayments(
|
||||||
Map<String, String> requestBody) async {
|
Map<String, String> requestBody) async {
|
||||||
var apiResponse =
|
var apiResponse =
|
||||||
await RemoteService.postUser(requestBody, ApiUrls.getAllPayments);
|
await RemoteService.postUser(requestBody, ApiUrls.getAllPayments);
|
||||||
|
|
||||||
if (apiResponse != null) {
|
if (apiResponse != null) {
|
||||||
return paymentResModelFromJson(apiResponse.response!);
|
return paymentResModelFromJson(apiResponse.response!);
|
||||||
|
@ -83,6 +86,7 @@ class PostRequests {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<EditUserResModel?> editUser(
|
static Future<EditUserResModel?> editUser(
|
||||||
Map<String, String> requestBody, String id) async {
|
Map<String, String> requestBody, String id) async {
|
||||||
var apiResponse =
|
var apiResponse =
|
||||||
|
@ -96,23 +100,13 @@ class PostRequests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<ViewFreightBillResModel?> viewFreightBillF(
|
|
||||||
Map<String, String> requestBody,
|
|
||||||
) async {
|
|
||||||
var apiResponse = await RemoteService.postUser(requestBody,
|
|
||||||
'${ApiUrls.viewFreightBill}');
|
|
||||||
|
|
||||||
if (apiResponse != null) {
|
|
||||||
return viewFreightBillResModelFromJson(apiResponse.response!);
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static Future<ViewFreightBillResModel?> viewFreightBill({
|
static Future<ViewFreightBillResModel?> viewFreightBill({
|
||||||
int page = 0,
|
int page = 0,
|
||||||
int size = 15,
|
int size = 15,
|
||||||
String sort = 'last_updated_on,desc',
|
String sort = 'last_updated_on,desc',
|
||||||
Map<String, String>? requestBody,
|
Map<String, dynamic>? requestBody,
|
||||||
}) async {
|
}) async {
|
||||||
// Construct dynamic URL with query parameters
|
// Construct dynamic URL with query parameters
|
||||||
String url = 'http://46.28.44.130:9092/bill/freightbill'
|
String url = 'http://46.28.44.130:9092/bill/freightbill'
|
||||||
|
@ -120,9 +114,8 @@ class PostRequests {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var apiResponse = await RemoteService.postUser(
|
var apiResponse = await RemoteService.postUser(
|
||||||
requestBody ?? {}, // Use empty map if no request body
|
requestBody ?? {}, // Use empty map if no request body
|
||||||
url
|
url);
|
||||||
);
|
|
||||||
|
|
||||||
if (apiResponse == null) return null;
|
if (apiResponse == null) return null;
|
||||||
if (apiResponse.response == null || apiResponse.response!.isEmpty) {
|
if (apiResponse.response == null || apiResponse.response!.isEmpty) {
|
||||||
|
@ -223,21 +216,40 @@ class PostRequests {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<GrnPendingBillsResModel?> grnPending(
|
static Future<GrnPendingBillsResModel?> grnPending(
|
||||||
Map<String, String> requestBody) async {
|
Map<String, String> requestBody) async {
|
||||||
var apiResponse =
|
var apiResponse =
|
||||||
await RemoteService.postUser(requestBody, ApiUrls.grnPendingDetails);
|
await RemoteService.postUser(requestBody, ApiUrls.grnPendingDetails);
|
||||||
if (apiResponse != null) {
|
if (apiResponse != null) {
|
||||||
return grnPendingBillsResModelFromJson(apiResponse.response!);
|
return grnPendingBillsResModelFromJson(apiResponse.response!);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// static Future<GrnPendingBillsResModel?> grnPending({
|
||||||
|
// int page = 0,
|
||||||
|
// int size = 15,
|
||||||
|
// String sort = 'last_updated_on,desc',
|
||||||
|
// Map<String, dynamic>? requestBody,
|
||||||
|
// }) async {
|
||||||
|
// String url = 'http://46.28.44.130:9092/bill/grndetailsPanding'
|
||||||
|
// '?page=$page&size=$size&sort=$sort';
|
||||||
|
//
|
||||||
|
// var apiResponse = await RemoteService.postUser(
|
||||||
|
// requestBody ?? {}, url
|
||||||
|
// );
|
||||||
|
// print('response from pending ${apiResponse?.response.toString()} and ${requestBody.toString()}');
|
||||||
|
// if (apiResponse != null) {
|
||||||
|
// return grnPendingBillsResModelFromJson(apiResponse.response!);
|
||||||
|
// } else {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
static Future<GetInvoiceResponse?> getInvoice(
|
static Future<GetInvoiceResponse?> getInvoice(
|
||||||
Map<String, String> requestBody) async {
|
Map<String, String> requestBody) async {
|
||||||
var apiResponse =
|
var apiResponse =
|
||||||
await RemoteService.postUser(requestBody, ApiUrls.getInvoiceDetails);
|
await RemoteService.postUser(requestBody, ApiUrls.getInvoiceDetails);
|
||||||
print('response data from invoice ${apiResponse.toString()}');
|
print('response data from invoice ${apiResponse.toString()}');
|
||||||
if (apiResponse != null) {
|
if (apiResponse != null) {
|
||||||
return getInvoiceResponseFromJson(apiResponse.response!);
|
return getInvoiceResponseFromJson(apiResponse.response!);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// This is a generated file; do not edit or check into version control.
|
// This is a generated file; do not edit or check into version control.
|
||||||
FLUTTER_ROOT=C:\src\flutter\flutter
|
FLUTTER_ROOT=C:\Users\Admin\Downloads\flutter_windows_3.27.1-stable\flutter
|
||||||
FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog
|
FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog 5\shayog
|
||||||
COCOAPODS_PARALLEL_CODE_SIGN=true
|
COCOAPODS_PARALLEL_CODE_SIGN=true
|
||||||
FLUTTER_BUILD_DIR=build
|
FLUTTER_BUILD_DIR=build
|
||||||
FLUTTER_BUILD_NAME=1.0.0
|
FLUTTER_BUILD_NAME=1.0.0
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# This is a generated file; do not edit or check into version control.
|
# This is a generated file; do not edit or check into version control.
|
||||||
export "FLUTTER_ROOT=C:\src\flutter\flutter"
|
export "FLUTTER_ROOT=C:\Users\Admin\Downloads\flutter_windows_3.27.1-stable\flutter"
|
||||||
export "FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog"
|
export "FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog 5\shayog"
|
||||||
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
|
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
|
||||||
export "FLUTTER_BUILD_DIR=build"
|
export "FLUTTER_BUILD_DIR=build"
|
||||||
export "FLUTTER_BUILD_NAME=1.0.0"
|
export "FLUTTER_BUILD_NAME=1.0.0"
|
||||||
|
|
Loading…
Reference in New Issue