Compare commits
No commits in common. "6f9ec4f05157fb48bf158858a760a17c8d262f55" and "597cedae0d4b093c5b143aec147e4a2d610a8288" have entirely different histories.
6f9ec4f051
...
597cedae0d
|
@ -259,24 +259,6 @@
|
|||
"packageUri": "lib/",
|
||||
"languageVersion": "3.1"
|
||||
},
|
||||
{
|
||||
"name": "syncfusion_flutter_calendar",
|
||||
"rootUri": "file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/syncfusion_flutter_calendar-28.2.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "3.3"
|
||||
},
|
||||
{
|
||||
"name": "syncfusion_flutter_core",
|
||||
"rootUri": "file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/syncfusion_flutter_core-28.2.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "3.3"
|
||||
},
|
||||
{
|
||||
"name": "syncfusion_flutter_datepicker",
|
||||
"rootUri": "file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/syncfusion_flutter_datepicker-28.2.4",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "3.3"
|
||||
},
|
||||
{
|
||||
"name": "table_calendar",
|
||||
"rootUri": "file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/table_calendar-3.2.0",
|
||||
|
@ -295,12 +277,6 @@
|
|||
"packageUri": "lib/",
|
||||
"languageVersion": "3.4"
|
||||
},
|
||||
{
|
||||
"name": "timezone",
|
||||
"rootUri": "file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/timezone-0.10.0",
|
||||
"packageUri": "lib/",
|
||||
"languageVersion": "2.19"
|
||||
},
|
||||
{
|
||||
"name": "typed_data",
|
||||
"rootUri": "file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.4.0",
|
||||
|
@ -356,7 +332,7 @@
|
|||
"languageVersion": "3.6"
|
||||
}
|
||||
],
|
||||
"generated": "2025-02-08T10:58:04.981413Z",
|
||||
"generated": "2025-02-07T11:05:55.892643Z",
|
||||
"generator": "pub",
|
||||
"generatorVersion": "3.6.1",
|
||||
"flutterRoot": "file:///C:/src/flutter/flutter",
|
||||
|
|
|
@ -154,18 +154,6 @@ string_scanner
|
|||
3.1
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/string_scanner-1.3.0/
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/string_scanner-1.3.0/lib/
|
||||
syncfusion_flutter_calendar
|
||||
3.3
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/syncfusion_flutter_calendar-28.2.4/
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/syncfusion_flutter_calendar-28.2.4/lib/
|
||||
syncfusion_flutter_core
|
||||
3.3
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/syncfusion_flutter_core-28.2.4/
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/syncfusion_flutter_core-28.2.4/lib/
|
||||
syncfusion_flutter_datepicker
|
||||
3.3
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/syncfusion_flutter_datepicker-28.2.4/
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/syncfusion_flutter_datepicker-28.2.4/lib/
|
||||
table_calendar
|
||||
3.0
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/table_calendar-3.2.0/
|
||||
|
@ -178,10 +166,6 @@ test_api
|
|||
3.4
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.7.3/
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/test_api-0.7.3/lib/
|
||||
timezone
|
||||
2.19
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/timezone-0.10.0/
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/timezone-0.10.0/lib/
|
||||
typed_data
|
||||
3.5
|
||||
file:///C:/Users/Admin/AppData/Local/Pub/Cache/hosted/pub.dev/typed_data-1.4.0/
|
||||
|
@ -214,24 +198,24 @@ xdg_directories
|
|||
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/lib/
|
||||
sky_engine
|
||||
3.2
|
||||
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/bin/cache/pkg/sky_engine/
|
||||
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/bin/cache/pkg/sky_engine/lib/
|
||||
flutter
|
||||
3.3
|
||||
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter/
|
||||
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter/lib/
|
||||
flutter_test
|
||||
3.3
|
||||
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter_test/
|
||||
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter_test/lib/
|
||||
flutter_web_plugins
|
||||
3.2
|
||||
file:///C:/Users/Admin/Downloads/flutter_windows_3.27.1-stable/flutter/packages/flutter_web_plugins/
|
||||
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/
|
||||
file:///C:/Users/Admin/Downloads/shayog/
|
||||
file:///C:/Users/Admin/Downloads/shayog/lib/
|
||||
sky_engine
|
||||
3.2
|
||||
file:///C:/src/flutter/flutter/bin/cache/pkg/sky_engine/
|
||||
file:///C:/src/flutter/flutter/bin/cache/pkg/sky_engine/lib/
|
||||
flutter
|
||||
3.3
|
||||
file:///C:/src/flutter/flutter/packages/flutter/
|
||||
file:///C:/src/flutter/flutter/packages/flutter/lib/
|
||||
flutter_test
|
||||
3.3
|
||||
file:///C:/src/flutter/flutter/packages/flutter_test/
|
||||
file:///C:/src/flutter/flutter/packages/flutter_test/lib/
|
||||
flutter_web_plugins
|
||||
3.2
|
||||
file:///C:/src/flutter/flutter/packages/flutter_web_plugins/
|
||||
file:///C:/src/flutter/flutter/packages/flutter_web_plugins/lib/
|
||||
2
|
||||
|
|
|
@ -1 +1 @@
|
|||
3.27.1
|
||||
3.27.3
|
|
@ -1,5 +1,5 @@
|
|||
sdk.dir=C:\\Users\\Admin\\.jdks\\openjdk-23.0.1
|
||||
flutter.sdk=C:\\Users\\Admin\\Downloads\\flutter_windows_3.27.1-stable\\flutter
|
||||
sdk.dir=C:\\Users\\Admin\\AppData\\Local\\Android\\sdk
|
||||
flutter.sdk=C:\\src\\flutter\\flutter
|
||||
flutter.buildMode=release
|
||||
flutter.versionName=1.0.0
|
||||
flutter.versionCode=1
|
|
@ -1,6 +1,6 @@
|
|||
// This is a generated file; do not edit or check into version control.
|
||||
FLUTTER_ROOT=C:\Users\Admin\Downloads\flutter_windows_3.27.1-stable\flutter
|
||||
FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog 5\shayog
|
||||
FLUTTER_ROOT=C:\src\flutter\flutter
|
||||
FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog
|
||||
COCOAPODS_PARALLEL_CODE_SIGN=true
|
||||
FLUTTER_TARGET=lib\main.dart
|
||||
FLUTTER_BUILD_DIR=build
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
# This is a generated file; do not edit or check into version control.
|
||||
export "FLUTTER_ROOT=C:\Users\Admin\Downloads\flutter_windows_3.27.1-stable\flutter"
|
||||
export "FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog 5\shayog"
|
||||
export "FLUTTER_ROOT=C:\src\flutter\flutter"
|
||||
export "FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog"
|
||||
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
|
||||
export "FLUTTER_TARGET=lib\main.dart"
|
||||
export "FLUTTER_BUILD_DIR=build"
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
import 'package:shayog/components/styles/app_colors.dart';
|
||||
import 'package:shayog/components/styles/textStyles.dart';
|
||||
|
||||
|
@ -6,8 +8,7 @@ class CustomDropdown<T> extends StatefulWidget {
|
|||
final List<T> items;
|
||||
final String Function(T) itemLabel;
|
||||
final Function(T?) onSelected;
|
||||
VoidCallback? onTap;
|
||||
late final String hintText;
|
||||
final String hintText;
|
||||
final bool enableSearch;
|
||||
final double? width;
|
||||
final EdgeInsetsGeometry padding;
|
||||
|
@ -17,9 +18,8 @@ class CustomDropdown<T> extends StatefulWidget {
|
|||
final Color? borderClr;
|
||||
final Color? backClr;
|
||||
final String? Function(T?)? validator;
|
||||
Widget? icon;
|
||||
|
||||
CustomDropdown({
|
||||
const CustomDropdown({
|
||||
super.key,
|
||||
required this.items,
|
||||
required this.itemLabel,
|
||||
|
@ -34,8 +34,6 @@ class CustomDropdown<T> extends StatefulWidget {
|
|||
this.borderClr,
|
||||
this.backClr,
|
||||
this.validator,
|
||||
this.onTap,
|
||||
this.icon,
|
||||
});
|
||||
|
||||
@override
|
||||
|
@ -79,6 +77,8 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
void _selectItem(T item) {
|
||||
setState(() {
|
||||
selectedItem = item;
|
||||
|
@ -98,13 +98,7 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
|
|||
_openDropdown();
|
||||
}
|
||||
}
|
||||
void clearField() {
|
||||
setState(() {
|
||||
|
||||
selectedItem = null; // Clear the selected item
|
||||
});
|
||||
_openDropdown();
|
||||
}
|
||||
void _openDropdown() {
|
||||
setState(() {
|
||||
isSearching = false;
|
||||
|
@ -204,7 +198,6 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
|
|||
style: 11.txtSBoldGrey,
|
||||
),
|
||||
),
|
||||
// onTap: widget.onTap,
|
||||
onTap: () => _selectItem(item),
|
||||
);
|
||||
},
|
||||
|
@ -233,9 +226,30 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
|
|||
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(
|
||||
|
@ -244,7 +258,7 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
|
|||
CompositedTransformTarget(
|
||||
link: layerLink,
|
||||
child: GestureDetector(
|
||||
onTap: _toggleDropdown,
|
||||
onTap: _toggleDropdown,
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(
|
||||
vertical: widget.isHeight ? 12 : 6.4, horizontal: 16),
|
||||
|
@ -263,38 +277,338 @@ class _CustomDropdownState<T> extends State<CustomDropdown<T>> {
|
|||
Expanded(
|
||||
child: Text(
|
||||
widget.hintText,
|
||||
|
||||
// selectedItem == null ? widget.hintText : widget.itemLabel(selectedItem as T),
|
||||
|
||||
|
||||
// selectedItem != null
|
||||
// ? widget.itemLabel(selectedItem as T)
|
||||
// : widget.hintText,
|
||||
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,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
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(() {
|
||||
// _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,
|
||||
),
|
||||
// selectedItem != null
|
||||
// ? InkWell(
|
||||
// onTap: (){
|
||||
// setState(() {
|
||||
//
|
||||
// selectedItem = null;
|
||||
//
|
||||
// });
|
||||
//
|
||||
// _openDropdown();
|
||||
// },
|
||||
//
|
||||
// child:
|
||||
// Icon(Icons.close, size: 14, color: Colors.black))
|
||||
// :
|
||||
widget.icon ?? InkWell(
|
||||
onTap: _toggleDropdown,
|
||||
child: Icon(
|
||||
Icons.keyboard_arrow_down_outlined,
|
||||
size: 20,
|
||||
color: Colors.black,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
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;
|
||||
}
|
||||
}
|
|
@ -1,51 +0,0 @@
|
|||
// 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),
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
// }
|
|
@ -11,5 +11,4 @@ static Color black = Color(0xff000000);
|
|||
static Color white = Color(0xffFFFFFF);
|
||||
static Color green = Color(0xff10A711);
|
||||
static Color red = Colors.red;
|
||||
static Color calendarBack = Color(0xff00008B);
|
||||
}
|
|
@ -6,7 +6,6 @@ import '../../../../../components/common/common_btn.dart';
|
|||
import '../../../../../components/common/common_button.dart';
|
||||
import '../../../../../components/common/custom_drop_down.dart';
|
||||
import '../../../../../components/common/data_cell.dart';
|
||||
|
||||
import '../../../../../components/styles/app_colors.dart';
|
||||
import '../../../../../components/styles/app_strings.dart';
|
||||
import '../../../widgets/custom_pagination.dart';
|
||||
|
@ -44,29 +43,19 @@ class ManageUser extends StatelessWidget {
|
|||
text: "User Name",
|
||||
),
|
||||
SizedBox(height: 4),
|
||||
CustomDropdown(
|
||||
icon: controller.selectUser.value ==
|
||||
"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,
|
||||
borderClr: AppColors.clrGrey,
|
||||
items: controller.userNames,
|
||||
itemLabel: (item) => item,
|
||||
onSelected: (selected) {
|
||||
controller.selectUser.value =
|
||||
selected ?? "";
|
||||
},
|
||||
hintText: controller.selectUser.value),
|
||||
GetX<DashboardCtrl>(
|
||||
builder: (ctrl) {
|
||||
return CustomDropdown(
|
||||
backClr: AppColors.clrD9,
|
||||
borderClr: AppColors.clrGrey,
|
||||
items: ctrl.userNames,
|
||||
itemLabel: (item) => item,
|
||||
onSelected: (selected) {
|
||||
ctrl.selectUser.value = selected;
|
||||
},
|
||||
hintText: ctrl.selectUser.value);
|
||||
},
|
||||
),
|
||||
],
|
||||
)),
|
||||
SizedBox(width: 16),
|
||||
|
@ -79,27 +68,19 @@ class ManageUser extends StatelessWidget {
|
|||
text: "User Type",
|
||||
),
|
||||
SizedBox(height: 8),
|
||||
CustomDropdown(
|
||||
icon: controller.selectType.value ==
|
||||
"Select UserType"
|
||||
?Icon(
|
||||
Icons.keyboard_arrow_down_outlined,
|
||||
size: 20,
|
||||
color: Colors.black,
|
||||
) : GestureDetector(
|
||||
onTap: () {
|
||||
controller.selectType.value =
|
||||
"Select UserType";
|
||||
GetX<DashboardCtrl>(
|
||||
builder: (controller) {
|
||||
return CustomDropdown(
|
||||
backClr: AppColors.clrD9,
|
||||
borderClr: AppColors.clrGrey,
|
||||
items: controller.userTypesNames,
|
||||
itemLabel: (item) => item,
|
||||
onSelected: (selected) {
|
||||
controller.selectType.value = selected;
|
||||
},
|
||||
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),
|
||||
hintText: controller.selectType.value);
|
||||
},
|
||||
),
|
||||
],
|
||||
)),
|
||||
SizedBox(width: 16),
|
||||
|
@ -113,24 +94,13 @@ class ManageUser extends StatelessWidget {
|
|||
),
|
||||
SizedBox(height: 8),
|
||||
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,
|
||||
borderClr: AppColors.clrGrey,
|
||||
items: controller.userEmail,
|
||||
itemLabel: (item) => item,
|
||||
onSelected: (selected) {
|
||||
controller.selectEmail.value = selected;
|
||||
|
||||
},
|
||||
hintText: controller.selectEmail.value),
|
||||
],
|
||||
|
@ -150,18 +120,6 @@ class ManageUser extends StatelessWidget {
|
|||
),
|
||||
SizedBox(height: 8),
|
||||
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,
|
||||
borderClr: AppColors.clrGrey,
|
||||
items: controller.userEmpCode,
|
||||
|
@ -183,18 +141,7 @@ class ManageUser extends StatelessWidget {
|
|||
),
|
||||
SizedBox(height: 8),
|
||||
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,
|
||||
borderClr: AppColors.clrGrey,
|
||||
items: controller.userStatus,
|
||||
|
@ -232,6 +179,7 @@ class ManageUser extends StatelessWidget {
|
|||
text: AppStrings.submit,
|
||||
textStyle: 14.txtSBoldWhite,
|
||||
clickAction: () {
|
||||
//controller.isSelected.value = false;
|
||||
controller.getManageUser();
|
||||
controller.getAllUser();
|
||||
},
|
||||
|
@ -263,7 +211,7 @@ class ManageUser extends StatelessWidget {
|
|||
decoration:
|
||||
BoxDecoration(border: Border.all(color: AppColors.clrGrey)),
|
||||
child: RawScrollbar(
|
||||
thumbColor: AppColors.primaryClr.withOpacity(0.4),
|
||||
thumbColor: AppColors.clrD9,
|
||||
radius: Radius.circular(2),
|
||||
trackVisibility: true,
|
||||
thumbVisibility: true,
|
||||
|
@ -272,7 +220,7 @@ class ManageUser extends StatelessWidget {
|
|||
child: SingleChildScrollView(
|
||||
controller: controller.verticalScrollController,
|
||||
child: RawScrollbar(
|
||||
thumbColor: AppColors.primaryClr.withOpacity(0.4),
|
||||
thumbColor: AppColors.clrD9,
|
||||
radius: Radius.circular(2),
|
||||
thickness: 14,
|
||||
trackVisibility: true,
|
||||
|
|
|
@ -111,7 +111,6 @@ class DashboardCtrl extends GetxController {
|
|||
RxList<AllUser> getAllUserMain = <AllUser>[].obs;
|
||||
RxInt limit = 20.obs;
|
||||
var userLoading = false.obs;
|
||||
var changeColor = false.obs;
|
||||
|
||||
setNextPage() {
|
||||
if (currentPage.value < totalPages.value.toInt()) {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:shayog/components/common/input_field.dart';
|
||||
import 'package:shayog/components/styles/textStyles.dart';
|
||||
import 'package:shayog/feature/presentation/screens/transporter/invoice_management/payment_view/ctrl/payment_view_ctrl.dart';
|
||||
|
@ -28,7 +27,7 @@ class PaymentView extends StatelessWidget {
|
|||
() => controller.isPaymentFilter.value
|
||||
? Container(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 16.0, top: 8, right: 16),
|
||||
left: 16.0, top: 8, right: 16, bottom: 16),
|
||||
color: AppColors.clrF2,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
|
@ -43,68 +42,17 @@ class PaymentView extends StatelessWidget {
|
|||
children: [
|
||||
TextView(text: "Plant"),
|
||||
SizedBox(height: 8),
|
||||
|
||||
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,
|
||||
CustomDropdown(
|
||||
backClr: AppColors.clrD9,
|
||||
borderClr: AppColors.clrGrey,
|
||||
items: paymentCtrl.product,
|
||||
items: paymentCtrl.plant,
|
||||
itemLabel: (item) =>
|
||||
"${item.materialCode} - ${item.materialDescription}",
|
||||
"${item.plantCode}-${item.plantDesc}",
|
||||
onSelected: (selected) {
|
||||
paymentCtrl.selectedProduct.value =
|
||||
"${selected.materialCode} - ${selected.materialDescription}";
|
||||
paymentCtrl.selectedPlant.value =
|
||||
"${selected?.plantCode}-${selected?.plantDesc}";
|
||||
},
|
||||
hintText: paymentCtrl.selectedProduct.value,
|
||||
hintText: paymentCtrl.selectedPlant.value,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
@ -118,22 +66,11 @@ class PaymentView extends StatelessWidget {
|
|||
TextView(text: "Freight Bill No."),
|
||||
SizedBox(height: 8),
|
||||
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,
|
||||
borderClr: AppColors.clrGrey,
|
||||
items: paymentCtrl.freightBill,
|
||||
itemLabel: (item) => item,
|
||||
|
||||
onSelected: (selected) {
|
||||
paymentCtrl.selectedFreightBill.value =
|
||||
selected.toString();
|
||||
|
@ -144,7 +81,30 @@ 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),
|
||||
|
@ -229,10 +189,11 @@ class PaymentView extends StatelessWidget {
|
|||
? CircularProgressIndicator()
|
||||
: Container(
|
||||
margin: EdgeInsets.only(bottom: 16, top: 8),
|
||||
decoration: BoxDecoration(
|
||||
// height: MediaQuery.of(context).size.height * 0.4,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: AppColors.clrGrey)),
|
||||
child: RawScrollbar(
|
||||
thumbColor: AppColors.primaryClr.withOpacity(0.4),
|
||||
thumbColor: AppColors.clrD9,
|
||||
radius: Radius.circular(2),
|
||||
trackVisibility: true,
|
||||
thumbVisibility: true,
|
||||
|
@ -241,7 +202,7 @@ class PaymentView extends StatelessWidget {
|
|||
child: SingleChildScrollView(
|
||||
controller: paymentCtrl.verticalScrollController,
|
||||
child: RawScrollbar(
|
||||
thumbColor: AppColors.primaryClr.withOpacity(0.4),
|
||||
thumbColor: AppColors.clrD9,
|
||||
radius: Radius.circular(2),
|
||||
thickness: 14,
|
||||
trackVisibility: true,
|
||||
|
@ -313,13 +274,8 @@ class PaymentView extends StatelessWidget {
|
|||
index, "${stoppage.materialCode}"),
|
||||
editableCell(
|
||||
index, "${stoppage.freightbillCode}"),
|
||||
|
||||
editableCell(
|
||||
index,
|
||||
DateFormat('yyyy - MMM dd').format(
|
||||
DateTime.parse(stoppage
|
||||
.lastUpdatedOn
|
||||
.toString()))),
|
||||
index, "${stoppage.lastUpdatedOn}"),
|
||||
|
||||
editableCell(
|
||||
index, "${stoppage.shipmentNetQty}"),
|
||||
|
|
|
@ -344,226 +344,206 @@ class GenerateFrightBill extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
SizedBox(
|
||||
width: MediaQuery.sizeOf(context).width,
|
||||
height: controller.isFilterVisibleGenerateFreight.value == true
|
||||
? MediaQuery.of(context).size.height * 0.3
|
||||
: MediaQuery.of(context).size.height * 0.64,
|
||||
child: Column(
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
margin: EdgeInsets.only(top: 16),
|
||||
height: 45,
|
||||
color: AppColors.primaryClr,
|
||||
child: Row(
|
||||
children: [
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
margin: EdgeInsets.only(top: 16),
|
||||
height: 45,
|
||||
color: AppColors.primaryClr,
|
||||
child: Row(
|
||||
children: [
|
||||
TextView(
|
||||
text: AppStrings.viewGrnDetails,
|
||||
style: 14.txtBoldWhite),
|
||||
Spacer(),
|
||||
CommonBtn(
|
||||
width: 150,
|
||||
bkClr: AppColors.white,
|
||||
borderClr: AppColors.primaryClr,
|
||||
style: 12.txtBoldBlue,
|
||||
text: "Generate Freight Bill",
|
||||
clickAction: () {
|
||||
bool hasSelectedRows = controller.grnDetails
|
||||
.any((element) => element.isSelected);
|
||||
if (!hasSelectedRows) {
|
||||
showPopup(
|
||||
context: context,
|
||||
onClick: () {
|
||||
Get.back();
|
||||
});
|
||||
} else {
|
||||
CommonAlertDialog.showDialog(
|
||||
dismissable: false,
|
||||
message:
|
||||
"Are you sure want to\nsave this?",
|
||||
positiveText: "Save",
|
||||
negativeText: "Cancel",
|
||||
positiveBtCallback: () {
|
||||
Get.back();
|
||||
controller.addFreightBill();
|
||||
showFreightBill(context);
|
||||
},
|
||||
negativeBtCallback: () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
}),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin: EdgeInsets.only(bottom: 16, top: 16),
|
||||
child: RawScrollbar(
|
||||
thumbColor: AppColors.clrD9,
|
||||
radius: Radius.circular(2),
|
||||
trackVisibility: true,
|
||||
thumbVisibility: true,
|
||||
thickness: 14,
|
||||
controller: controller.verticalScrollController,
|
||||
child: SingleChildScrollView(
|
||||
controller: controller.verticalScrollController,
|
||||
child: RawScrollbar(
|
||||
thumbColor: AppColors.clrD9,
|
||||
radius: Radius.circular(2),
|
||||
thickness: 14,
|
||||
trackVisibility: true,
|
||||
thumbVisibility: true,
|
||||
controller: controller.horizontalScrollController,
|
||||
child: SingleChildScrollView(
|
||||
scrollDirection: Axis.horizontal,
|
||||
controller: controller.horizontalScrollController,
|
||||
child: Container(
|
||||
margin: EdgeInsets.only(bottom: 24),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: Colors.grey.shade400,
|
||||
width: 1.0,
|
||||
TextView(
|
||||
text: AppStrings.viewGrnDetails,
|
||||
style: 14.txtBoldWhite),
|
||||
Spacer(),
|
||||
CommonBtn(
|
||||
width: 150,
|
||||
bkClr: AppColors.white,
|
||||
borderClr: AppColors.primaryClr,
|
||||
style: 12.txtBoldBlue,
|
||||
text: "Generate Freight Bill",
|
||||
clickAction: () {
|
||||
bool hasSelectedRows = controller.grnDetails
|
||||
.any((element) => element.isSelected);
|
||||
if (!hasSelectedRows) {
|
||||
showPopup(
|
||||
context: context,
|
||||
onClick: () {
|
||||
Get.back();
|
||||
});
|
||||
} else {
|
||||
CommonAlertDialog.showDialog(
|
||||
dismissable: false,
|
||||
message: "Are you sure want to\nsave this?",
|
||||
positiveText: "Save",
|
||||
negativeText: "Cancel",
|
||||
positiveBtCallback: () {
|
||||
Get.back();
|
||||
controller.addFreightBill();
|
||||
showFreightBill(context);
|
||||
},
|
||||
negativeBtCallback: () {
|
||||
Get.back();
|
||||
});
|
||||
}
|
||||
}),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin: EdgeInsets.only(bottom: 16, top: 16),
|
||||
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),
|
||||
trackVisibility: true,
|
||||
thumbVisibility: true,
|
||||
thickness: 14,
|
||||
controller: controller.verticalScrollController,
|
||||
child: SingleChildScrollView(
|
||||
controller: controller.verticalScrollController,
|
||||
child: RawScrollbar(
|
||||
thumbColor: AppColors.clrD9,
|
||||
radius: Radius.circular(2),
|
||||
thickness: 14,
|
||||
trackVisibility: true,
|
||||
thumbVisibility: true,
|
||||
controller: controller.horizontalScrollController,
|
||||
child: SingleChildScrollView(
|
||||
scrollDirection: Axis.horizontal,
|
||||
controller: controller.horizontalScrollController,
|
||||
child: Container(
|
||||
margin: EdgeInsets.only(bottom: 24),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: Colors.grey.shade400,
|
||||
width: 1.0,
|
||||
),
|
||||
),
|
||||
child: DataTable(
|
||||
dataRowHeight: 40,
|
||||
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(
|
||||
dataRowHeight: 40,
|
||||
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,
|
||||
),
|
||||
),
|
||||
),
|
||||
// dataColumn(AppStrings.srNo),
|
||||
dataColumn(AppStrings.mrnNo),
|
||||
dataColumn(AppStrings.plantNo),
|
||||
dataColumn(AppStrings.product),
|
||||
dataColumn(AppStrings.date),
|
||||
dataColumn(AppStrings.fromLocation),
|
||||
dataColumn(AppStrings.vehicleNo),
|
||||
dataColumn(AppStrings.transporterLrNo),
|
||||
dataColumn(AppStrings.transporterLrNoDate),
|
||||
dataColumn(AppStrings.dispQty),
|
||||
dataColumn(AppStrings.netQty),
|
||||
dataColumn(AppStrings.billingQty),
|
||||
dataColumn(AppStrings.uom),
|
||||
dataColumn(AppStrings.freightRate),
|
||||
dataColumn(AppStrings.freightAmount),
|
||||
],
|
||||
rows: List<DataRow>.generate(
|
||||
controller.grnDetails.length, (index) {
|
||||
final stoppage =
|
||||
controller.grnDetails[index];
|
||||
return DataRow(
|
||||
selected: stoppage.isSelected,
|
||||
cells: [
|
||||
DataCell(
|
||||
Transform.scale(
|
||||
scale: 0.80,
|
||||
child: Checkbox(
|
||||
value: stoppage.isSelected,
|
||||
onChanged: (value) {
|
||||
controller.toggleSelection(
|
||||
index, value ?? false);
|
||||
},
|
||||
activeColor: AppColors.primaryClr,
|
||||
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() ??
|
||||
""),
|
||||
],
|
||||
);
|
||||
}),
|
||||
),
|
||||
),
|
||||
),
|
||||
// dataColumn(AppStrings.srNo),
|
||||
dataColumn(AppStrings.mrnNo),
|
||||
dataColumn(AppStrings.plantNo),
|
||||
dataColumn(AppStrings.product),
|
||||
dataColumn(AppStrings.date),
|
||||
dataColumn(AppStrings.fromLocation),
|
||||
dataColumn(AppStrings.vehicleNo),
|
||||
dataColumn(AppStrings.transporterLrNo),
|
||||
dataColumn(AppStrings.transporterLrNoDate),
|
||||
dataColumn(AppStrings.dispQty),
|
||||
dataColumn(AppStrings.netQty),
|
||||
dataColumn(AppStrings.billingQty),
|
||||
dataColumn(AppStrings.uom),
|
||||
dataColumn(AppStrings.freightRate),
|
||||
dataColumn(AppStrings.freightAmount),
|
||||
],
|
||||
rows: List<DataRow>.generate(
|
||||
controller.grnDetails.length, (index) {
|
||||
final stoppage = controller.grnDetails[index];
|
||||
return DataRow(
|
||||
selected: stoppage.isSelected,
|
||||
cells: [
|
||||
DataCell(
|
||||
Transform.scale(
|
||||
scale: 0.80,
|
||||
child: Checkbox(
|
||||
value: stoppage.isSelected,
|
||||
onChanged: (value) {
|
||||
controller.toggleSelection(
|
||||
index, value ?? false);
|
||||
},
|
||||
activeColor: AppColors.primaryClr,
|
||||
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() ??
|
||||
""),
|
||||
],
|
||||
);
|
||||
}),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(bottom: 4),
|
||||
child: CustomPagination(
|
||||
currentPage: controller.currentPageGenerateFreight.value + 1,
|
||||
totalPages: controller.totalPagesGenerateFreight.value,
|
||||
onPageChanged: (page) {
|
||||
controller.postData(page: page - 1);
|
||||
},
|
||||
),
|
||||
)
|
||||
CustomPagination(
|
||||
currentPage: controller.currentPageViewFreight.value + 1,
|
||||
totalPages: controller.totalPagesViewFreight.value,
|
||||
onPageChanged: (page) {
|
||||
controller.viewFreightView(page: page - 1);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}),
|
||||
|
|
|
@ -41,83 +41,327 @@ class _TransportViewState extends State<InvoiceManagement> {
|
|||
return Column(
|
||||
children: [
|
||||
Container(
|
||||
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
||||
height: 50,
|
||||
color: AppColors.primaryClr,
|
||||
child: Row(
|
||||
padding: EdgeInsets.only(bottom: 4),
|
||||
margin: EdgeInsets.all(16),
|
||||
child: Column(
|
||||
children: [
|
||||
ListView.separated(
|
||||
shrinkWrap: true,
|
||||
padding: EdgeInsets.symmetric(horizontal: 16),
|
||||
scrollDirection: Axis.horizontal,
|
||||
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: TextView(
|
||||
text: ctrl.invoiceTabs[index].title ?? "",
|
||||
style: 12.txtBoldWhite,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
margin: EdgeInsets.only(bottom: 12),
|
||||
height: 55,
|
||||
color: AppColors.primaryClr,
|
||||
child: Row(
|
||||
children: [
|
||||
ListView.separated(
|
||||
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),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
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,
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () {
|
||||
print("cdgsa");
|
||||
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(
|
||||
children: [
|
||||
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,),
|
||||
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(() {
|
||||
switch (ctrl.selectedState.value) {
|
||||
case 0:
|
||||
|
@ -175,8 +419,8 @@ class _TransportViewState extends State<InvoiceManagement> {
|
|||
dataColumn("Freight Bill No."),
|
||||
//dataColumn(AppStrings.getInvoiceDate),
|
||||
dataColumn("Freight Bill date"),
|
||||
dataColumn("Plant Code - Plant Desc."),
|
||||
dataColumn("Material Code - Material Desc."),
|
||||
dataColumn("Plant Code/Plant Desc."),
|
||||
dataColumn("Material Code/Material Desc."),
|
||||
dataColumn("Freight Bill Amount"),
|
||||
dataColumn("GST Amount"),
|
||||
dataColumn("Status"),
|
||||
|
|
|
@ -524,13 +524,13 @@ class PendingGeneration extends StatelessWidget {
|
|||
],
|
||||
);
|
||||
}),
|
||||
CustomPagination(
|
||||
currentPage: controller.currentPagePendingFreight.value,
|
||||
totalPages: controller.totalPagesPendingFreight.value,
|
||||
onPageChanged: (int page) {
|
||||
// controller.grnPending(page: page -1);
|
||||
},
|
||||
),
|
||||
// CustomPagination(
|
||||
// currentPage: controller.currentPage.value,
|
||||
// totalPages: controller.totalPages.value,
|
||||
// onPageChanged: (int page) {
|
||||
// // controller.onPageChanged(page);
|
||||
// },
|
||||
// ),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:shayog/components/common/common_btn.dart';
|
||||
import 'package:shayog/feature/presentation/widgets/custom_pagination.dart';
|
||||
import 'package:sizer/sizer.dart';
|
||||
import 'package:table_calendar/table_calendar.dart';
|
||||
import 'package:vph_web_date_picker/vph_web_date_picker.dart';
|
||||
import '../../../../../../../components/common/data_cell.dart';
|
||||
import '../../../../../../../components/styles/app_colors.dart';
|
||||
|
@ -19,11 +17,6 @@ class ViewFreightBill extends StatelessWidget {
|
|||
|
||||
final ScrollController horizontalScrollController = ScrollController();
|
||||
final ScrollController verticalScrollController = ScrollController();
|
||||
final TextEditingController _dateController = TextEditingController();
|
||||
final ValueNotifier<DateTime?> _selectedDate1 =
|
||||
ValueNotifier<DateTime?>(null);
|
||||
final ValueNotifier<DateTime?> _selectedDate2 =
|
||||
ValueNotifier<DateTime?>(null);
|
||||
final controller = Get.put(TransportController());
|
||||
|
||||
@override
|
||||
|
@ -34,7 +27,7 @@ class ViewFreightBill extends StatelessWidget {
|
|||
children: [
|
||||
Obx(() => controller.isFilterVisibleViewFreight.value
|
||||
? Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 16),
|
||||
padding: EdgeInsets.symmetric(vertical: 10,horizontal: 16),
|
||||
color: AppColors.clrF2,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
|
@ -166,11 +159,29 @@ class ViewFreightBill extends StatelessWidget {
|
|||
margin: EdgeInsets.only(top: 8),
|
||||
height: 35,
|
||||
child: TextFormField(
|
||||
controller: _dateController,
|
||||
readOnly: true,
|
||||
key: controller.fromTextFieldKey,
|
||||
controller: controller.fromController,
|
||||
onTap: () async {
|
||||
_showCalendars(context);
|
||||
final pickedDate =
|
||||
await showWebDatePicker(
|
||||
width: 20.w,
|
||||
context: controller
|
||||
.fromTextFieldKey.currentContext!,
|
||||
initialDate:
|
||||
controller.fromSelectedDate,
|
||||
firstDate: DateTime(2000),
|
||||
lastDate: DateTime.now(),
|
||||
);
|
||||
|
||||
if (pickedDate != null) {
|
||||
controller.fromSelectedDate =
|
||||
pickedDate;
|
||||
String formattedDate = controller
|
||||
.getFormattedDate(pickedDate);
|
||||
controller.fromController.text =
|
||||
formattedDate;
|
||||
controller.dateCheck.value = true;
|
||||
}
|
||||
},
|
||||
decoration: InputDecoration(
|
||||
fillColor: AppColors.clrD9,
|
||||
|
@ -729,95 +740,4 @@ class ViewFreightBill extends StatelessWidget {
|
|||
},
|
||||
);
|
||||
}
|
||||
|
||||
void _showCalendars(BuildContext context) {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
isScrollControlled: true,
|
||||
builder: (context) {
|
||||
return Padding(
|
||||
padding: EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Expanded(child: CalendarWidget(isFirstCalendar: true, selectedDateNotifier: _selectedDate1)),
|
||||
SizedBox(width: 20),
|
||||
Expanded(child: CalendarWidget(isFirstCalendar: false, selectedDateNotifier: _selectedDate2)),
|
||||
],
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
ValueListenableBuilder(
|
||||
valueListenable: _selectedDate2,
|
||||
builder: (context, DateTime? date2, child) {
|
||||
return ElevatedButton(
|
||||
onPressed: (_selectedDate1.value != null && date2 != null)
|
||||
? () {
|
||||
_dateController.text =
|
||||
"${DateFormat('dd/MM/yyyy').format(_selectedDate1.value!)} - ${DateFormat('dd/MM/yyyy').format(date2)}";
|
||||
Navigator.pop(context);
|
||||
}
|
||||
: null,
|
||||
child: Text("Confirm"),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class CalendarWidget extends StatelessWidget {
|
||||
final bool isFirstCalendar;
|
||||
final ValueNotifier<DateTime?> selectedDateNotifier;
|
||||
|
||||
CalendarWidget({required this.isFirstCalendar, required this.selectedDateNotifier});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
DateTime initialMonth = isFirstCalendar ? DateTime.now() : DateTime(DateTime.now().year, DateTime.now().month + 1, 1);
|
||||
|
||||
return ValueListenableBuilder(
|
||||
valueListenable: selectedDateNotifier,
|
||||
builder: (context, DateTime? selectedDate, child) {
|
||||
return TableCalendar(
|
||||
firstDay: DateTime.utc(2000, 1, 1),
|
||||
lastDay: DateTime.utc(2100, 12, 31),
|
||||
focusedDay: initialMonth,
|
||||
calendarFormat: CalendarFormat.month,
|
||||
headerStyle: HeaderStyle(
|
||||
formatButtonVisible: false,
|
||||
titleCentered: true,
|
||||
titleTextStyle: TextStyle(fontSize: 14), // Smaller title
|
||||
),
|
||||
daysOfWeekStyle: DaysOfWeekStyle(
|
||||
weekdayStyle: TextStyle(fontSize: 12),
|
||||
weekendStyle: TextStyle(fontSize: 12),
|
||||
),
|
||||
calendarStyle: CalendarStyle(
|
||||
defaultTextStyle: TextStyle(fontSize: 12), // Smaller day numbers
|
||||
weekendTextStyle: TextStyle(fontSize: 12, color: AppColors.white),
|
||||
selectedTextStyle: TextStyle(fontSize: 14, fontWeight: FontWeight.bold),
|
||||
selectedDecoration: BoxDecoration(
|
||||
color: Colors.blueAccent,
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
weekendDecoration: BoxDecoration(
|
||||
color: AppColors.calendarBack, // Blue background for Sundays
|
||||
shape: BoxShape.circle,
|
||||
),
|
||||
),
|
||||
selectedDayPredicate: (day) => day == selectedDate,
|
||||
onDaySelected: (selectedDay, focusedDay) {
|
||||
selectedDateNotifier.value = selectedDay;
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -161,7 +161,8 @@ class _TransportViewState extends State<TransportView> {
|
|||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
// padding: EdgeInsets.only(bottom: 16),
|
||||
color: Colors.white,
|
||||
padding: EdgeInsets.only(bottom: 16),
|
||||
margin: EdgeInsets.all(16),
|
||||
child: Column(
|
||||
children: [
|
||||
|
@ -257,53 +258,26 @@ class _TransportViewState extends State<TransportView> {
|
|||
),
|
||||
),
|
||||
Obx(
|
||||
() => 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(
|
||||
() => SimpleDropdown(
|
||||
|
||||
onSelected: (newValue) {
|
||||
ctrl.selectedDropdownItemViewFreight
|
||||
.value = newValue;
|
||||
ctrl.selectedDropdownItemViewFreight.value = newValue;
|
||||
ctrl.viewFreightView();
|
||||
},
|
||||
items: ctrl.selectElementSize,
|
||||
selectedItem: ctrl
|
||||
.selectedDropdownItemViewFreight.value,
|
||||
)
|
||||
: SimpleDropdown(
|
||||
onSelected: (newValue) {
|
||||
ctrl.selectedDropdownItemViewFreight
|
||||
.value = newValue;
|
||||
ctrl.viewFreightView();
|
||||
},
|
||||
items: ctrl.selectElementSize,
|
||||
selectedItem: ctrl
|
||||
.selectedDropdownItemViewFreight.value,
|
||||
selectedItem: ctrl.selectedDropdownItemViewFreight.value,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
// Obx(() => SimpleDropdown<int>(
|
||||
// items: [1, 2, 3, 4],
|
||||
// selectedItem: ctrl. selectedDropdownItem.value, // Bind external state
|
||||
// onSelected: (val) => ctrl. selectedDropdownItem.value = val,
|
||||
// width: 150,
|
||||
// borderClr: Colors.blue,
|
||||
// )),
|
||||
|
||||
SizedBox(width: 10,),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
@ -153,10 +153,9 @@ class TransportController extends GetxController {
|
|||
getInvoiceView();
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
Rxn<int> selectedDropdownItemViewFreight = Rxn<int>();
|
||||
Rxn<int> selectedDropdownItemPendingFreight = Rxn<int>();
|
||||
Rxn<int> selectedDropdownItemGenerateFreight = Rxn<int>();
|
||||
|
||||
|
||||
|
||||
refreshApis() {
|
||||
getFreightBills();
|
||||
|
@ -165,8 +164,6 @@ class TransportController extends GetxController {
|
|||
getSubFreightBillsView();
|
||||
postData();
|
||||
selectedDropdownItemViewFreight.value = null;
|
||||
selectedDropdownItemPendingFreight.value = null;
|
||||
selectedDropdownItemGenerateFreight.value = null;
|
||||
}
|
||||
|
||||
getInvoiceView() async {
|
||||
|
@ -223,12 +220,7 @@ class TransportController extends GetxController {
|
|||
var grnPendingLoader = false.obs;
|
||||
var errorMessage = ''.obs;
|
||||
|
||||
// for Generate
|
||||
var totalElementsGenerateFreight = 0.obs;
|
||||
RxInt currentPageGenerateFreight = 1.obs;
|
||||
RxInt totalPagesGenerateFreight = 3.obs;
|
||||
|
||||
postData({int page = 0}) async {
|
||||
postData() async {
|
||||
try {
|
||||
isLoading.value = true;
|
||||
Map<String, String> requestBody = {
|
||||
|
@ -239,24 +231,18 @@ class TransportController extends GetxController {
|
|||
"grnFromDate": "",
|
||||
"grnToDate": ""
|
||||
};
|
||||
var response = await PostRequests.addFreightBill(
|
||||
page: page,
|
||||
size: selectedDropdownItemGenerateFreight.value ?? 1,
|
||||
requestBody: requestBody);
|
||||
var response = await PostRequests.addFreightBill(requestBody);
|
||||
if (response != null) {
|
||||
List<Content> flattenedContent =
|
||||
response.content!.expand((list) => list).toList();
|
||||
grnDetails.assignAll(flattenedContent);
|
||||
totalPagesGenerateFreight.value = response.totalPages ?? 0;
|
||||
totalElementsGenerateFreight.value = response.totalElements ?? 0;
|
||||
currentPageGenerateFreight.value = page;
|
||||
}
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
void displayFilteredData({int page = 0}) async {
|
||||
void displayFilteredData() async {
|
||||
try {
|
||||
isLoading.value = true;
|
||||
Map<String, String> requestBody = {
|
||||
|
@ -268,10 +254,7 @@ class TransportController extends GetxController {
|
|||
"grnToDate": ""
|
||||
};
|
||||
|
||||
var response = await PostRequests.addFreightBill(
|
||||
page: page,
|
||||
size: selectedDropdownItemGenerateFreight.value ?? 4,
|
||||
requestBody: requestBody);
|
||||
var response = await PostRequests.addFreightBill(requestBody);
|
||||
if (response != null) {
|
||||
List<Content> flattenedContent =
|
||||
response.content!.expand((list) => list).toList();
|
||||
|
@ -289,14 +272,12 @@ class TransportController extends GetxController {
|
|||
selectTransactionTypeFreight.value.toUpperCase());
|
||||
}).toList();
|
||||
|
||||
if (page == 0) {
|
||||
grnDetails.assignAll(flattenedContent);
|
||||
} else {
|
||||
grnDetails.addAll(flattenedContent);
|
||||
}
|
||||
totalPagesGenerateFreight.value = response.totalPages ?? 0;
|
||||
totalElementsGenerateFreight.value = response.totalElements ?? 0;
|
||||
currentPageGenerateFreight.value = page;
|
||||
print("Filtered Data: ${filteredData.length}");
|
||||
|
||||
grnDetails.assignAll(filteredData);
|
||||
|
||||
print("✅ Filtered Data: ${filteredData.length} items displayed.");
|
||||
print("✅ Filtered Data: ${grnDetails.length} items displayed.");
|
||||
} else {
|
||||
print("❌ No response from API.");
|
||||
}
|
||||
|
@ -430,6 +411,13 @@ class TransportController extends GetxController {
|
|||
}
|
||||
|
||||
RxString selectedPlant = "".obs;
|
||||
List plantList = [
|
||||
"Plant 1",
|
||||
"Plant 2",
|
||||
"Plant 3",
|
||||
"Plant 4",
|
||||
"Plant 5",
|
||||
];
|
||||
RxString selectedFreight = "".obs;
|
||||
|
||||
addFreightBill() async {
|
||||
|
@ -469,36 +457,23 @@ class TransportController extends GetxController {
|
|||
////////////////////////////////////////// PRIYA ///////////////////////////////////////////////
|
||||
var freightBillData = <FreightBill>[].obs;
|
||||
|
||||
var totalElementsViewFreight = 0.obs;
|
||||
var pageSize = 2.obs;
|
||||
var sortField = "grn_date".obs;
|
||||
var sortDirection = "desc".obs;
|
||||
|
||||
// view freight
|
||||
var totalElementsViewFreight = 0.obs;
|
||||
RxInt currentPageViewFreight = 1.obs;
|
||||
RxInt totalPagesViewFreight = 3.obs;
|
||||
|
||||
// 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,
|
||||
12,
|
||||
16,
|
||||
20,
|
||||
].obs;
|
||||
viewFreightView({int page = 0}) async {
|
||||
|
||||
viewFreightView({int page = 0}) async {
|
||||
try {
|
||||
freightViewLoader.value = true;
|
||||
|
||||
|
@ -513,9 +488,7 @@ class TransportController extends GetxController {
|
|||
};
|
||||
|
||||
var response = await PostRequests.viewFreightBill(
|
||||
page: page,
|
||||
size: selectedDropdownItemViewFreight.value ?? 4,
|
||||
requestBody: requestBody);
|
||||
page: page, size: selectedDropdownItemViewFreight.value ?? 4, requestBody: requestBody);
|
||||
|
||||
if (response != null) {
|
||||
List<FreightBill> flattenedContent =
|
||||
|
@ -541,38 +514,6 @@ class TransportController extends GetxController {
|
|||
|
||||
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 {
|
||||
try {
|
||||
grnPendingLoader.value = true;
|
||||
|
@ -591,7 +532,7 @@ class TransportController extends GetxController {
|
|||
);
|
||||
if (response != null) {
|
||||
List<GrnPending> flattenedContent =
|
||||
response.content!.expand((list) => list).toList();
|
||||
response.content!.expand((list) => list).toList();
|
||||
grnPendingData.assignAll(flattenedContent);
|
||||
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}');
|
||||
|
@ -600,7 +541,8 @@ class TransportController extends GetxController {
|
|||
grnPendingLoader.value = false;
|
||||
}
|
||||
}
|
||||
void displayFilteredDataFromViewFreight({int page = 0}) async {
|
||||
|
||||
void displayFilteredDataFromViewFreight({int page = 0, int size = 4}) async {
|
||||
try {
|
||||
freightViewLoader.value = true;
|
||||
|
||||
|
@ -614,10 +556,12 @@ class TransportController extends GetxController {
|
|||
"grnToDate": "",
|
||||
};
|
||||
|
||||
print(
|
||||
"🔎 Filter Request - Page: $page, Size: $size, Plant: ${selectPlantViewFreight.value}, "
|
||||
"Product: ${selectProductViewFreight.value}, Freight Bill: ${selectFreightBillValidate.value}");
|
||||
|
||||
var response = await PostRequests.viewFreightBill(
|
||||
page: page,
|
||||
size: selectedDropdownItemViewFreight.value ?? 4,
|
||||
requestBody: requestBody); // Pass pagination
|
||||
page: page, size: size, requestBody: requestBody); // Pass pagination
|
||||
|
||||
if (response != null && response.content != null) {
|
||||
List<FreightBill> flattenedContent =
|
||||
|
@ -650,57 +594,6 @@ 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 {
|
||||
try {
|
||||
isLoading.value = true;
|
||||
|
@ -716,11 +609,11 @@ class TransportController extends GetxController {
|
|||
var response = await PostRequests.grnPending(requestBody);
|
||||
if (response != null) {
|
||||
List<GrnPending> flattenedContent =
|
||||
response.content!.expand((list) => list).toList();
|
||||
response.content!.expand((list) => list).toList();
|
||||
|
||||
List<GrnPending> filteredData = flattenedContent.where((item) {
|
||||
return (selectPlantFreight.value.isEmpty ||
|
||||
item.plantCode == selectPlantFreight.value) &&
|
||||
item.plantCode == selectPlantFreight.value) &&
|
||||
(selectProductFreight.value.isEmpty ||
|
||||
item.materialCode == selectProductFreight.value) &&
|
||||
(selectTransactionTypeFreight.value.isEmpty ||
|
||||
|
|
|
@ -2,7 +2,7 @@ class ApiUrls {
|
|||
ApiUrls._();
|
||||
static const String baseUrl = "http://46.28.44.130:9092/";
|
||||
static const addFreightBill =
|
||||
'bill/grndetails';
|
||||
'bill/grndetails?page=0&size=20&sort=grn_date,desc';
|
||||
static const getFreightBills = 'bill/dropdown';
|
||||
static const getAllPayments = "http://46.28.44.130:9092/invoice/getPayments";
|
||||
static const generateFreightBill =
|
||||
|
|
|
@ -20,17 +20,12 @@ import 'ApiUrls.dart';
|
|||
class PostRequests {
|
||||
PostRequests._();
|
||||
|
||||
static Future<GenerateFreightBills?> addFreightBill({
|
||||
int page = 0,
|
||||
int size = 15,
|
||||
String sort = 'last_updated_on,desc',
|
||||
Map<String, dynamic>? requestBody,
|
||||
static Future<GenerateFreightBills?> addFreightBill(
|
||||
|
||||
}
|
||||
) async {
|
||||
|
||||
Map<String, String> requestBody) async {
|
||||
var apiResponse =
|
||||
await RemoteService.simplePost(requestBody ?? {},'${ApiUrls.addFreightBill}?page=$page&size=$size&sort=$sort'
|
||||
);
|
||||
await RemoteService.simplePost(requestBody, ApiUrls.addFreightBill);
|
||||
|
||||
if (apiResponse != null) {
|
||||
return generateFreightBillsFromJson(apiResponse.response!);
|
||||
|
@ -39,6 +34,8 @@ class PostRequests {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static Future<GenerateBillsResModel?> freightBill(
|
||||
List<Map<String, dynamic>> requestBody) async {
|
||||
var apiResponse =
|
||||
|
@ -78,7 +75,7 @@ class PostRequests {
|
|||
static Future<PaymentResModel?> getAllPayments(
|
||||
Map<String, String> requestBody) async {
|
||||
var apiResponse =
|
||||
await RemoteService.postUser(requestBody, ApiUrls.getAllPayments);
|
||||
await RemoteService.postUser(requestBody, ApiUrls.getAllPayments);
|
||||
|
||||
if (apiResponse != null) {
|
||||
return paymentResModelFromJson(apiResponse.response!);
|
||||
|
@ -86,7 +83,6 @@ class PostRequests {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static Future<EditUserResModel?> editUser(
|
||||
Map<String, String> requestBody, String id) async {
|
||||
var apiResponse =
|
||||
|
@ -100,13 +96,23 @@ 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({
|
||||
int page = 0,
|
||||
int size = 15,
|
||||
String sort = 'last_updated_on,desc',
|
||||
Map<String, dynamic>? requestBody,
|
||||
Map<String, String>? requestBody,
|
||||
}) async {
|
||||
// Construct dynamic URL with query parameters
|
||||
String url = 'http://46.28.44.130:9092/bill/freightbill'
|
||||
|
@ -114,8 +120,9 @@ class PostRequests {
|
|||
|
||||
try {
|
||||
var apiResponse = await RemoteService.postUser(
|
||||
requestBody ?? {}, // Use empty map if no request body
|
||||
url);
|
||||
requestBody ?? {}, // Use empty map if no request body
|
||||
url
|
||||
);
|
||||
|
||||
if (apiResponse == null) return null;
|
||||
if (apiResponse.response == null || apiResponse.response!.isEmpty) {
|
||||
|
@ -216,40 +223,21 @@ class PostRequests {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static Future<GrnPendingBillsResModel?> grnPending(
|
||||
Map<String, String> requestBody) async {
|
||||
var apiResponse =
|
||||
await RemoteService.postUser(requestBody, ApiUrls.grnPendingDetails);
|
||||
await RemoteService.postUser(requestBody, ApiUrls.grnPendingDetails);
|
||||
if (apiResponse != null) {
|
||||
return grnPendingBillsResModelFromJson(apiResponse.response!);
|
||||
} else {
|
||||
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(
|
||||
Map<String, String> requestBody) async {
|
||||
var apiResponse =
|
||||
await RemoteService.postUser(requestBody, ApiUrls.getInvoiceDetails);
|
||||
await RemoteService.postUser(requestBody, ApiUrls.getInvoiceDetails);
|
||||
print('response data from invoice ${apiResponse.toString()}');
|
||||
if (apiResponse != null) {
|
||||
return getInvoiceResponseFromJson(apiResponse.response!);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// This is a generated file; do not edit or check into version control.
|
||||
FLUTTER_ROOT=C:\Users\Admin\Downloads\flutter_windows_3.27.1-stable\flutter
|
||||
FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog 5\shayog
|
||||
FLUTTER_ROOT=C:\src\flutter\flutter
|
||||
FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog
|
||||
COCOAPODS_PARALLEL_CODE_SIGN=true
|
||||
FLUTTER_BUILD_DIR=build
|
||||
FLUTTER_BUILD_NAME=1.0.0
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/bin/sh
|
||||
# This is a generated file; do not edit or check into version control.
|
||||
export "FLUTTER_ROOT=C:\Users\Admin\Downloads\flutter_windows_3.27.1-stable\flutter"
|
||||
export "FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog 5\shayog"
|
||||
export "FLUTTER_ROOT=C:\src\flutter\flutter"
|
||||
export "FLUTTER_APPLICATION_PATH=C:\Users\Admin\Downloads\shayog"
|
||||
export "COCOAPODS_PARALLEL_CODE_SIGN=true"
|
||||
export "FLUTTER_BUILD_DIR=build"
|
||||
export "FLUTTER_BUILD_NAME=1.0.0"
|
||||
|
|
32
pubspec.lock
32
pubspec.lock
|
@ -333,30 +333,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
syncfusion_flutter_calendar:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: syncfusion_flutter_calendar
|
||||
sha256: "593427a43fe5022955b1938d8b7f61bb000602bf835211e8c3fb8a0e3e2c04e1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "28.2.4"
|
||||
syncfusion_flutter_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: syncfusion_flutter_core
|
||||
sha256: "3c1876b0a245de23de3b17a19e3106fed57d88f4fd2c8dc9bc1976705b1c31d5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "28.2.4"
|
||||
syncfusion_flutter_datepicker:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: syncfusion_flutter_datepicker
|
||||
sha256: "889b716d9de344852f651ecdcc726b6eeb9e326d95c1bb54df95631a5d7ead68"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "28.2.4"
|
||||
table_calendar:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -381,14 +357,6 @@ packages:
|
|||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.3"
|
||||
timezone:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: timezone
|
||||
sha256: ffc9d5f4d1193534ef051f9254063fa53d588609418c84299956c3db9383587d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.10.0"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
@ -42,7 +42,6 @@ dependencies:
|
|||
table_calendar: ^3.2.0
|
||||
file_picker: ^8.3.1
|
||||
path_provider: ^2.1.5
|
||||
syncfusion_flutter_calendar: ^28.2.4
|
||||
|
||||
|
||||
dev_dependencies:
|
||||
|
|
Loading…
Reference in New Issue