Commit 2a8fa440 authored by Sai Srinivas's avatar Sai Srinivas
Browse files

AttendanceScreen and hrm color and responsive

parents 96031396 9e243e0c
...@@ -42,8 +42,8 @@ android { ...@@ -42,8 +42,8 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "in.webgrid.generp" applicationId = "in.webgrid.generp"
minSdk = flutter.minSdkVersion minSdk = 23
targetSdk = flutter.targetSdkVersion targetSdk = 36
versionCode = flutter.versionCode versionCode = flutter.versionCode
versionName = flutter.versionName versionName = flutter.versionName
} }
......
...@@ -949,6 +949,11 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier { ...@@ -949,6 +949,11 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
nameError = "Please Enter Name"; nameError = "Please Enter Name";
isValid = false; isValid = false;
} }
if(nameError == "Name already exists"){
isValid = false;
}
if (customerMailIdController.text.trim().isNotEmpty && if (customerMailIdController.text.trim().isNotEmpty &&
!RegExp(r'\S+@\S+\.\S+').hasMatch(customerMailIdController.text)) { !RegExp(r'\S+@\S+\.\S+').hasMatch(customerMailIdController.text)) {
mailIdError = "Please enter a proper Email ID"; mailIdError = "Please enter a proper Email ID";
...@@ -963,6 +968,9 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier { ...@@ -963,6 +968,9 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
isValid = false; isValid = false;
} }
} }
if ( mobileError == "Mobile number already exists"){
isValid = false;
}
// if(designationController.text.trim().isEmpty){ // if(designationController.text.trim().isEmpty){
// designationError = "Please enter Designation"; // designationError = "Please enter Designation";
...@@ -973,6 +981,11 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier { ...@@ -973,6 +981,11 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
return isValid; return isValid;
} }
bool validateStep2() { bool validateStep2() {
bool isValid = true; bool isValid = true;
if (alternateMobileController.text.trim().isNotEmpty && if (alternateMobileController.text.trim().isNotEmpty &&
......
...@@ -52,6 +52,38 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -52,6 +52,38 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
_connectivity.disposeStream(); _connectivity.disposeStream();
} }
// Responsive text size function
double getResponsiveTextSize(BuildContext context, double baseSize) {
final double scale = MediaQuery.of(context).textScaleFactor;
final double width = MediaQuery.of(context).size.width;
if (width < 360) { // Small phones
return baseSize * 0.9;
} else if (width < 400) { // Medium phones
return baseSize;
} else { // Large phones
return baseSize * 1.1;
}
}
// Responsive padding function
double getResponsivePadding(BuildContext context) {
final double width = MediaQuery.of(context).size.width;
return width * 0.04; // 4% of screen width
}
// Responsive height function
double getResponsiveHeight(BuildContext context, double baseHeight) {
final double height = MediaQuery.of(context).size.height;
if (height < 700) { // Small height devices
return baseHeight * 0.8;
} else if (height < 800) { // Medium height devices
return baseHeight;
} else { // Large height devices
return baseHeight * 1.1;
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
switch (_source.keys.toList()[0]) { switch (_source.keys.toList()[0]) {
...@@ -80,6 +112,11 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -80,6 +112,11 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
} }
Widget _scaffold(BuildContext context) { Widget _scaffold(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
final bool isSmallScreen = constraints.maxWidth < 360;
final bool isLargeScreen = constraints.maxWidth > 400;
return Consumer<AttendanceNotifier>( return Consumer<AttendanceNotifier>(
builder: (context, attendance, index) { builder: (context, attendance, index) {
final timeString = final timeString =
...@@ -132,10 +169,6 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -132,10 +169,6 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
).format(DateTime(attendance.month.year, attendance.month.month - 1)); ).format(DateTime(attendance.month.year, attendance.month.month - 1));
final currentMonthName = DateFormat('MMM').format(attendance.month); final currentMonthName = DateFormat('MMM').format(attendance.month);
final year = DateFormat('yyyy').format(attendance.month); final year = DateFormat('yyyy').format(attendance.month);
// final monthLabel =
// prevMonthName == currentMonthName
// ? '$currentMonthName $year'
// : '$prevMonthName - $currentMonthName $year';
final monthLabel = '$currentMonthName $year'; final monthLabel = '$currentMonthName $year';
return RefreshIndicator.adaptive( return RefreshIndicator.adaptive(
...@@ -167,8 +200,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -167,8 +200,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
children: [ children: [
Container( Container(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: 15, left: getResponsivePadding(context),
right: 10, right: getResponsivePadding(context),
top: 15, top: 15,
), ),
child: Row( child: Row(
...@@ -179,7 +212,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -179,7 +212,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
heads[j], heads[j],
style: TextStyle( style: TextStyle(
color: AppColors.grey_thick, color: AppColors.grey_thick,
fontSize: 14, fontSize: getResponsiveTextSize(context, 14),
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
), ),
), ),
...@@ -188,7 +221,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -188,7 +221,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
), ),
), ),
SizedBox( Container(
padding: EdgeInsets.symmetric(horizontal: getResponsivePadding(context)-6),
child: Row( child: Row(
children: List.generate(2, (iii) { children: List.generate(2, (iii) {
final times = [formattedTime, formattedTime2]; final times = [formattedTime, formattedTime2];
...@@ -212,15 +246,15 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -212,15 +246,15 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
return Expanded( return Expanded(
child: Container( child: Container(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: 10, horizontal: isSmallScreen ? 8 : 10,
vertical: 15, vertical: isSmallScreen ? 11 : 16,
), ),
margin: EdgeInsets.symmetric( margin: EdgeInsets.symmetric(
horizontal: 5, horizontal: isSmallScreen ? 3 : 5,
vertical: 5, vertical: isSmallScreen ? 3 : 5,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Color(0xFFF3EDFF), color: Color(0xFFE6F6FF),
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
), ),
child: Column( child: Column(
...@@ -236,9 +270,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -236,9 +270,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
color: color:
times[iii] != "-" times[iii] != "-"
? Color(0xFF1286C7) ? Color(0xFF1286C7)
: Color(0xFFED3424), : Color(0xFF1286C7),
fontFamily: "JakartaRegular", fontFamily: "JakartaRegular",
fontSize: 20, fontSize: getResponsiveTextSize(context, 20),
), ),
), ),
TextSpan( TextSpan(
...@@ -249,18 +283,18 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -249,18 +283,18 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
? Color(0xFF1286C7) ? Color(0xFF1286C7)
: Color(0xFFED3424), : Color(0xFFED3424),
fontFamily: "JakartaRegular", fontFamily: "JakartaRegular",
fontSize: 14, fontSize: getResponsiveTextSize(context, 14),
), ),
), ),
], ],
), ),
), ),
SizedBox(height: 10), SizedBox(height: isSmallScreen ? 12 : 16),
Text( Text(
locations[iii], locations[iii],
style: TextStyle( style: TextStyle(
color: AppColors.semi_black, color: AppColors.semi_black,
fontSize: 12, fontSize: getResponsiveTextSize(context, 12),
), ),
), ),
], ],
...@@ -272,19 +306,22 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -272,19 +306,22 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
), ),
Container( Container(
padding: EdgeInsets.only(left: 10, top: 10), padding: EdgeInsets.only(
left: getResponsivePadding(context),
top: 10
),
child: Text( child: Text(
"Attendance Details", "Attendance Details",
style: TextStyle( style: TextStyle(
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
fontSize: 14, fontSize: getResponsiveTextSize(context, 14),
color: Color(0xFF818181), color: Color(0xFF818181),
), ),
), ),
), ),
Container( Container(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: 10, horizontal: getResponsivePadding(context),
vertical: 10, vertical: 10,
), ),
...@@ -295,9 +332,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -295,9 +332,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
gridDelegate: gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount( SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, crossAxisCount: 2,
crossAxisSpacing: 10, crossAxisSpacing: isSmallScreen ? 8 : 10,
mainAxisSpacing: 10, mainAxisSpacing: isSmallScreen ? 8 : 10,
childAspectRatio: 20 / 10, childAspectRatio: isSmallScreen ? 18/9 : 20/10,
), ),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final numbers = [ final numbers = [
...@@ -332,7 +369,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -332,7 +369,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
]; ];
return Container( return Container(
padding: EdgeInsets.symmetric(horizontal: 13), padding: EdgeInsets.symmetric(
horizontal: isSmallScreen ? 10 : 13
),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Color(colors[index]), color: Color(colors[index]),
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
...@@ -344,7 +383,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -344,7 +383,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
Text( Text(
numbers[index].toString(), numbers[index].toString(),
style: TextStyle( style: TextStyle(
fontSize: 20, fontSize: getResponsiveTextSize(context, 20),
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
color: Color(textcolors[index]), color: Color(textcolors[index]),
), ),
...@@ -356,7 +395,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -356,7 +395,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
child: Text( child: Text(
names[index], names[index],
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: getResponsiveTextSize(context, 14),
fontFamily: "JakartaRegular", fontFamily: "JakartaRegular",
color: AppColors.semi_black, color: AppColors.semi_black,
), ),
...@@ -366,6 +405,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -366,6 +405,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
flex: 1, flex: 1,
child: SvgPicture.asset( child: SvgPicture.asset(
assetNames[index], assetNames[index],
width: isSmallScreen ? 20 : 38,
height: isSmallScreen ? 20 : 38,
), ),
), ),
], ],
...@@ -383,8 +424,10 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -383,8 +424,10 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
///calendar ///calendar
Container( Container(
// padding: EdgeInsets.symmetric(horizontal: 10,vertical: 5), margin: EdgeInsets.symmetric(
margin: EdgeInsets.symmetric(horizontal: 15, vertical: 10), horizontal: getResponsivePadding(context),
vertical: 10
),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
color: Colors.white, color: Colors.white,
...@@ -392,7 +435,12 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -392,7 +435,12 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
child: Column( child: Column(
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.fromLTRB(30, 10, 30, 0), padding: EdgeInsets.fromLTRB(
isSmallScreen ? 20 : 30,
10,
isSmallScreen ? 20 : 30,
0
),
child: Container( child: Container(
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
...@@ -408,6 +456,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -408,6 +456,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.all(4.0),
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/svg/crm/calendar_left.svg", "assets/svg/crm/calendar_left.svg",
width: isSmallScreen ? 18 : 24,
height: isSmallScreen ? 18 : 24,
), ),
), ),
), ),
...@@ -420,6 +470,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -420,6 +470,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
style: TextStyle( style: TextStyle(
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
fontSize: getResponsiveTextSize(context, 14.5),
color: Color(0xFF2D2D2D), color: Color(0xFF2D2D2D),
), ),
), ),
...@@ -432,6 +483,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -432,6 +483,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
padding: const EdgeInsets.all(4.0), padding: const EdgeInsets.all(4.0),
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/svg/crm/calendar_right.svg", "assets/svg/crm/calendar_right.svg",
width: isSmallScreen ? 18 : 24,
height: isSmallScreen ? 18 : 24,
), ),
), ),
), ),
...@@ -444,12 +497,12 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -444,12 +497,12 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
_showInfoBottomSheet(context); _showInfoBottomSheet(context);
}, },
child: SizedBox( child: SizedBox(
width: 20, width: isSmallScreen ? 18 : 20,
height: 20, height: isSmallScreen ? 18 : 20,
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/svg/ic_info_new.svg", "assets/svg/ic_info_new.svg",
width: 20, width: isSmallScreen ? 18 : 20,
height: 20, height: isSmallScreen ? 18 : 20,
), ),
), ),
), ),
...@@ -459,7 +512,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -459,7 +512,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
), ),
SizedBox(height: 5), SizedBox(height: 5),
Padding( Padding(
padding: const EdgeInsets.fromLTRB(8, 10, 8, 0), padding: const EdgeInsets.fromLTRB(4, 10, 2, 0),
child: Container( child: Container(
child: Row( child: Row(
children: [ children: [
...@@ -482,6 +535,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -482,6 +535,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
['S', 'M', 'T', 'W', 'T', 'F', 'S'][i], ['S', 'M', 'T', 'W', 'T', 'F', 'S'][i],
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontSize: getResponsiveTextSize(context, 15),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
color: color:
i == 0 i == 0
...@@ -494,9 +548,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -494,9 +548,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
), ),
), ),
), ),
SizedBox(height: 3,),
Padding( Padding(
padding: const EdgeInsets.fromLTRB(0, 0, 0, 10), padding: const EdgeInsets.fromLTRB(4, 0, 2, 10),
child: Container( child: Container(
child: GridView.builder( child: GridView.builder(
itemCount: daysInPeriod + startingIndex, itemCount: daysInPeriod + startingIndex,
...@@ -505,7 +559,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -505,7 +559,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
crossAxisCount: 7, crossAxisCount: 7,
crossAxisSpacing: 2, crossAxisSpacing: 2,
mainAxisSpacing: 1, mainAxisSpacing: 1,
childAspectRatio: (255 / 245), childAspectRatio: isSmallScreen ? 1.0 : (255 / 245),
), ),
padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
shrinkWrap: true, shrinkWrap: true,
...@@ -581,22 +635,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -581,22 +635,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
elevation: 0, elevation: 0,
child: Column( child: Column(
children: [ children: [
// Row(
// mainAxisAlignment:
// MainAxisAlignment.center,
// children: [
// Text(
// "($datePenalty)",
// style: TextStyle(
// fontWeight: FontWeight.w400,
// color: Colors.black,
// fontSize: 5
// ),
// ),
// ],
// ),
Center( Center(
child: Container( child: Container(
padding : EdgeInsets.all(2),
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
border: Border.all( border: Border.all(
...@@ -616,8 +657,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -616,8 +657,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
? Color(0xFFFFFFFF) ? Color(0xFFFFFFFF)
: dateColor == 'g' : dateColor == 'g'
? Color( ? Color(
0xFFE7FFE5, 0xFFE8FFE6,
).withAlpha(50) )
: dateColor == 'r' : dateColor == 'r'
? Color( ? Color(
0xFFFF0000, 0xFFFF0000,
...@@ -636,7 +677,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -636,7 +677,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
child: Text( child: Text(
currentDay.toString(), currentDay.toString(),
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: getResponsiveTextSize(context, 13),
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
color: color:
isFutureDate isFutureDate
...@@ -680,7 +721,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -680,7 +721,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
attendance.attendanceStatus == 0 || attendance.attendanceStatus == 0 ||
attendance.attendanceStatus == 1 attendance.attendanceStatus == 1
? Container( ? Container(
height: 75, height: getResponsiveHeight(context, 75),
decoration: BoxDecoration(color: Colors.white), decoration: BoxDecoration(color: Colors.white),
padding: EdgeInsets.symmetric(vertical: 10), padding: EdgeInsets.symmetric(vertical: 10),
child: Align( child: Align(
...@@ -711,7 +752,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -711,7 +752,9 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
child: Container( child: Container(
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
height: 45, height: 45,
margin: EdgeInsets.symmetric(horizontal: 10), margin: EdgeInsets.symmetric(
horizontal: getResponsivePadding(context)
),
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
decoration: BoxDecoration( decoration: BoxDecoration(
color: AppColors.app_blue, color: AppColors.app_blue,
...@@ -724,7 +767,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -724,7 +767,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
: "Check Out", : "Check Out",
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: getResponsiveTextSize(context, 16),
color: Colors.white, color: Colors.white,
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
), ),
...@@ -741,6 +784,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -741,6 +784,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
); );
}, },
); );
},
);
} }
Future<void> _showInfoBottomSheet(BuildContext context) { Future<void> _showInfoBottomSheet(BuildContext context) {
...@@ -779,7 +824,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -779,7 +824,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
style: TextStyle( style: TextStyle(
color: AppColors.app_blue, color: AppColors.app_blue,
fontFamily: "JakartaSemiBold", fontFamily: "JakartaSemiBold",
fontSize: 16, fontSize: getResponsiveTextSize(context, 16),
), ),
), ),
SizedBox(height: 15), SizedBox(height: 15),
...@@ -825,8 +870,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -825,8 +870,8 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
Expanded( Expanded(
flex: 1, flex: 1,
child: Container( child: Container(
width: 18, width: 25,
height: 18, height: 25,
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: colors[index], color: colors[index],
...@@ -836,7 +881,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -836,7 +881,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
textSubs[index], textSubs[index],
style: TextStyle( style: TextStyle(
color: textColors[index], color: textColors[index],
fontSize: 10, fontSize: getResponsiveTextSize(context, 12),
), ),
), ),
), ),
...@@ -850,7 +895,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -850,7 +895,7 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
maxLines: 2, maxLines: 2,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: getResponsiveTextSize(context, 14),
color: Colors.black, color: Colors.black,
), ),
), ),
...@@ -878,7 +923,6 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -878,7 +923,6 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
isDismissible: true, isDismissible: true,
isScrollControlled: true, isScrollControlled: true,
showDragHandle: true, showDragHandle: true,
enableDrag: true, enableDrag: true,
context: context, context: context,
builder: (context) { builder: (context) {
...@@ -897,7 +941,6 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -897,7 +941,6 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
padding: EdgeInsets.only( padding: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom, bottom: MediaQuery.of(context).viewInsets.bottom,
), ),
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
...@@ -912,14 +955,14 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -912,14 +955,14 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
style: TextStyle( style: TextStyle(
color: AppColors.app_blue, color: AppColors.app_blue,
fontFamily: "JakartaSemiBold", fontFamily: "JakartaSemiBold",
fontSize: 16, fontSize: getResponsiveTextSize(context, 16),
), ),
), ),
Text( Text(
provider.date, provider.date,
style: TextStyle( style: TextStyle(
color: Color(0xFF818181), color: Color(0xFF818181),
fontSize: 12, fontSize: getResponsiveTextSize(context, 12),
), ),
), ),
], ],
...@@ -940,12 +983,14 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -940,12 +983,14 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
"Late Points ", "Late Points ",
style: TextStyle( style: TextStyle(
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
fontSize: getResponsiveTextSize(context, 14),
), ),
), ),
Text( Text(
provider.penalties, provider.penalties,
style: TextStyle( style: TextStyle(
color: Color(0xFF91481B), color: Color(0xFF91481B),
fontSize: getResponsiveTextSize(context, 14),
), ),
), ),
], ],
...@@ -954,13 +999,12 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -954,13 +999,12 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
], ],
), ),
Padding( Padding(
padding: EdgeInsets.symmetric(horizontal: 5), padding: EdgeInsets.symmetric(horizontal: 5, vertical: 15),
child: Divider( child: Divider(
color: Color(0xFFD7D7D7), color: Color(0xFFD7D7D7),
thickness: 0.5, thickness: 0.5,
), ),
), ),
SizedBox(height: 15),
...List.generate(4, (j) { ...List.generate(4, (j) {
final values = [ final values = [
"Check-in Time", "Check-in Time",
...@@ -974,31 +1018,43 @@ class _AttendanceScreenState extends State<AttendanceScreen> { ...@@ -974,31 +1018,43 @@ class _AttendanceScreenState extends State<AttendanceScreen> {
(provider.outtime), (provider.outtime),
(provider.outlocation), (provider.outlocation),
]; ];
return SizedBox(
height: 35, return Container(
margin: EdgeInsets.only(bottom: 12),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Expanded( Expanded(
flex: 2,
child: Text( child: Text(
values[j], values[j],
style: TextStyle( style: TextStyle(
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
color: AppColors.semi_black, color: AppColors.semi_black,
fontSize: getResponsiveTextSize(context, 14),
), ),
maxLines: 2,
overflow: TextOverflow.ellipsis,
), ),
), ),
SizedBox(width: 10),
Expanded( Expanded(
flex: 3,
child: Text( child: Text(
subvalues[j], subvalues[j].isEmpty ? "-" : subvalues[j],
style: TextStyle( style: TextStyle(
color: Color(0xFF818181), color: Color(0xFF818181),
fontSize: getResponsiveTextSize(context, 14),
), ),
maxLines: 3,
overflow: TextOverflow.ellipsis,
), ),
), ),
], ],
), ),
); );
}), }),
SizedBox(height: 10),
], ],
), ),
), ),
......
...@@ -1440,7 +1440,6 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> { ...@@ -1440,7 +1440,6 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
null, null,
TextInputAction.done, TextInputAction.done,
), ),
errorWidget(context, provider.addressError), errorWidget(context, provider.addressError),
], ],
), ),
...@@ -1620,4 +1619,33 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> { ...@@ -1620,4 +1619,33 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
}, },
); );
} }
void showCustomSnackBar(BuildContext context, String message) {
final snackBar = SnackBar(
behavior: SnackBarBehavior.floating,
backgroundColor: Colors.black87,
elevation: 6,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
content: Row(
children: [
Icon(Icons.info_outline, color: Colors.white),
SizedBox(width: 12),
Expanded(
child: Text(
message,
style: TextStyle(
color: Colors.white,
fontSize: 16,
fontWeight: FontWeight.w500,
),
),
),
],
),
duration: Duration(seconds: 3),
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
} }
...@@ -30,6 +30,38 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -30,6 +30,38 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
"Casual Leave List" "Casual Leave List"
]; ];
// Responsive text size function
double getResponsiveTextSize(BuildContext context, double baseSize) {
final double scale = MediaQuery.of(context).textScaleFactor;
final double width = MediaQuery.of(context).size.width;
if (width < 360) { // Small phones
return baseSize * 0.85;
} else if (width < 400) { // Medium phones
return baseSize;
} else { // Large phones
return baseSize * 1.1;
}
}
// Responsive padding function
double getResponsivePadding(BuildContext context) {
final double width = MediaQuery.of(context).size.width;
return width * 0.04; // 4% of screen width
}
// Responsive height function
double getResponsiveHeight(BuildContext context, double baseHeight) {
final double height = MediaQuery.of(context).size.height;
if (height < 700) { // Small height devices
return baseHeight * 0.85;
} else if (height < 800) { // Medium height devices
return baseHeight;
} else { // Large height devices
return baseHeight * 1.15;
}
}
@override @override
void initState() { void initState() {
super.initState(); super.initState();
...@@ -43,6 +75,9 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -43,6 +75,9 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final bool isSmallScreen = MediaQuery.of(context).size.width < 360;
final bool isLargeScreen = MediaQuery.of(context).size.width > 400;
return SafeArea( return SafeArea(
top: false, top: false,
child: Scaffold( child: Scaffold(
...@@ -55,14 +90,14 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -55,14 +90,14 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
onTap: () => Navigator.pop(context, true), onTap: () => Navigator.pop(context, true),
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/svg/appbar_back_button.svg", "assets/svg/appbar_back_button.svg",
height: 25, height: isSmallScreen ? 22 : 25,
), ),
), ),
const SizedBox(width: 10), SizedBox(width: isSmallScreen ? 8 : 10),
Text( Text(
"HRM", "HRM",
style: TextStyle( style: TextStyle(
fontSize: 18, fontSize: getResponsiveTextSize(context, 18),
fontFamily: "Plus Jakarta Sans", fontFamily: "Plus Jakarta Sans",
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: AppColors.semi_black, color: AppColors.semi_black,
...@@ -80,13 +115,16 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -80,13 +115,16 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
children: [ children: [
Container( Container(
width: double.infinity, width: double.infinity,
height: 490, height: getResponsiveHeight(context, 490),
color: const Color(0xffF6F6F8), color: const Color(0xffF6F6F8),
), ),
Container( Container(
width: double.infinity, width: double.infinity,
height: 490, height: getResponsiveHeight(context, 490),
padding: const EdgeInsets.only(top: 1, bottom: 30), padding: EdgeInsets.only(
top: 1,
bottom: getResponsiveHeight(context, 30)
),
decoration: const BoxDecoration( decoration: const BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
colors: [ colors: [
...@@ -101,10 +139,13 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -101,10 +139,13 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
), ),
Container( Container(
width: double.infinity, width: double.infinity,
padding: const EdgeInsets.only(top: 1, bottom: 30), padding: EdgeInsets.only(
top: 1,
bottom: getResponsiveHeight(context, 30)
),
child: Image.asset( child: Image.asset(
"assets/images/vector.png", "assets/images/vector.png",
height: 230, height: getResponsiveHeight(context, 230),
width: double.infinity, width: double.infinity,
fit: BoxFit.fitWidth, fit: BoxFit.fitWidth,
), ),
...@@ -116,26 +157,27 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -116,26 +157,27 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
/// Top Illustration & Button /// Top Illustration & Button
Container( Container(
width: double.infinity, width: double.infinity,
padding: const EdgeInsets.only(top: 60, bottom: 30), padding: EdgeInsets.only(
top: getResponsiveHeight(context, 60),
bottom: getResponsiveHeight(context, 30)
),
child: Column( child: Column(
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
"assets/images/capa.svg", "assets/images/capa.svg",
height: 146, height: getResponsiveHeight(context, 146),
width: 400, width: MediaQuery.of(context).size.width * 0.9,
), ),
const SizedBox(height: 32), SizedBox(height: getResponsiveHeight(context, 32)),
Container( Container(
padding: const EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: 20, horizontal: isSmallScreen ? 16 : 20,
vertical: 8, vertical: isSmallScreen ? 6 : 8,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border.all( border: Border.all(
color: const Color( color: const Color(0xFF1487C9),
0xFF1487C9, width: 1.2,
), // border color
width: 1.2, // thickness of the border
), ),
color: const Color(0xffEDF8FF), color: const Color(0xffEDF8FF),
borderRadius: BorderRadius.circular(30), borderRadius: BorderRadius.circular(30),
...@@ -154,23 +196,28 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -154,23 +196,28 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
"assets/svg/hrm/groupIc.svg", "assets/svg/hrm/groupIc.svg",
height: 29, height: isSmallScreen ? 25 : 29,
width: 29, width: isSmallScreen ? 25 : 29,
fit: BoxFit.contain, fit: BoxFit.contain,
), ),
const SizedBox(width: 7), SizedBox(width: isSmallScreen ? 5 : 7),
const Text( Flexible(
child: Text(
"Organization Structure", "Organization Structure",
style: TextStyle( style: TextStyle(
fontSize: 15, fontSize: getResponsiveTextSize(context, 15),
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
fontStyle: FontStyle.normal, fontStyle: FontStyle.normal,
fontFamily: "Plus Jakarta Sans", fontFamily: "Plus Jakarta Sans",
), ),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
), ),
const Icon( Icon(
Icons.chevron_right, Icons.chevron_right,
color: Colors.black54, color: Colors.black54,
size: isSmallScreen ? 18 : 20,
), ),
], ],
), ),
...@@ -183,9 +230,13 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -183,9 +230,13 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
/// Grid Section /// Grid Section
LayoutBuilder( LayoutBuilder(
builder: (context, constraints) { builder: (context, constraints) {
final screenWidth = constraints.maxWidth;
final crossAxisCount = (screenWidth / 180).floor().clamp(2, 4);
final childAspectRatio = screenWidth < 360 ? 1.5 : 1.7;
return Padding( return Padding(
padding: const EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: 8, horizontal: getResponsivePadding(context),
vertical: 10, vertical: 10,
), ),
child: Consumer<HrmAccessiblePagesProvider>( child: Consumer<HrmAccessiblePagesProvider>(
...@@ -197,7 +248,12 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -197,7 +248,12 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
} }
if (provider.errorMessage != null) { if (provider.errorMessage != null) {
return Center( return Center(
child: Text(provider.errorMessage!), child: Text(
provider.errorMessage!,
style: TextStyle(
fontSize: getResponsiveTextSize(context, 14),
),
),
); );
} }
...@@ -207,8 +263,7 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -207,8 +263,7 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
(page) => allowedPages.contains( (page) => allowedPages.contains(
page.pageName, page.pageName,
), ),
) ).toList();
.toList();
return GridView.builder( return GridView.builder(
itemCount: pages.length, itemCount: pages.length,
...@@ -216,19 +271,17 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -216,19 +271,17 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
gridDelegate: gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount( SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: (constraints.maxWidth / crossAxisCount: crossAxisCount,
180) crossAxisSpacing: isSmallScreen ? 2 : 4,
.floor() mainAxisSpacing: isSmallScreen ? 2 : 4,
.clamp(2, 6), childAspectRatio: childAspectRatio,
crossAxisSpacing: 1,
mainAxisSpacing: 2,
childAspectRatio: 1.8,
), ),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final page = pages[index]; final page = pages[index];
return _buildTile( return _buildTile(
label: page.pageName ?? "",//in page number there is 6 items comming from serever it showing only four context: context,
label: page.pageName ?? "",
subtitle: _getSubtitle( subtitle: _getSubtitle(
page.pageName ?? "", page.pageName ?? "",
), ),
...@@ -249,10 +302,7 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -249,10 +302,7 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
}, },
), ),
//////////// SizedBox(height: getResponsiveHeight(context, 40)),
SizedBox(height: 40,)
], ],
), ),
], ],
...@@ -266,12 +316,15 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -266,12 +316,15 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
/// Card builder /// Card builder
Widget _buildTile({ Widget _buildTile({
required BuildContext context,
required String label, required String label,
required String subtitle, required String subtitle,
required String assetIcon, required String assetIcon,
required Color txtColor, required Color txtColor,
VoidCallback? onTap, VoidCallback? onTap,
}) { }) {
final bool isSmallScreen = MediaQuery.of(context).size.width < 360;
return LayoutBuilder( return LayoutBuilder(
builder: (context, constraints) { builder: (context, constraints) {
return InkWell( return InkWell(
...@@ -279,18 +332,28 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -279,18 +332,28 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
borderRadius: BorderRadius.circular(14), borderRadius: BorderRadius.circular(14),
child: Container( child: Container(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
vertical: constraints.maxHeight * 0.05, vertical: constraints.maxHeight * 0.08,
horizontal: constraints.maxWidth * 0.05, horizontal: constraints.maxWidth * 0.06,
),
margin: EdgeInsets.symmetric(
vertical: isSmallScreen ? 4 : 7,
horizontal: isSmallScreen ? 3 : 5
), ),
margin: const EdgeInsets.symmetric(vertical: 7, horizontal: 5),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(14), borderRadius: BorderRadius.circular(14),
// boxShadow: [
// BoxShadow(
// color: Colors.black12,
// blurRadius: 4,
// offset: Offset(0, 2),
// ),
// ],
), ),
child: Row( child: Row(
children: [ children: [
Expanded( Expanded(
flex: 2, flex: 3,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
...@@ -299,25 +362,29 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -299,25 +362,29 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
child: Text( child: Text(
label, label,
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: getResponsiveTextSize(context, 14),
color: AppColors.app_blue, color: AppColors.app_blue,
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
height: 1.2,
), ),
softWrap: true, softWrap: true,
overflow: TextOverflow.visible, overflow: TextOverflow.ellipsis,
maxLines: isSmallScreen ? 2 : 3,
), ),
), ),
const SizedBox(height: 4), SizedBox(height: isSmallScreen ? 2 : 6),
Flexible( Flexible(
child: Text( child: Text(
subtitle, subtitle,
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: getResponsiveTextSize(context, 12),
color: AppColors.grey_semi, color: AppColors.grey_semi,
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
height: 1,
), ),
softWrap: true, softWrap: true,
overflow: TextOverflow.visible, overflow: TextOverflow.ellipsis,
maxLines: 2,
), ),
), ),
], ],
...@@ -326,8 +393,8 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -326,8 +393,8 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
Expanded( Expanded(
flex: 1, flex: 1,
child: Container( child: Container(
height: constraints.maxHeight * 0.39, height: constraints.maxHeight * 0.45,
width: constraints.maxHeight * 0.39, width: constraints.maxHeight * 0.45,
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: const Color(0xFFEDF8FF), color: const Color(0xFFEDF8FF),
...@@ -335,8 +402,8 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -335,8 +402,8 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
child: Center( child: Center(
child: SvgPicture.asset( child: SvgPicture.asset(
assetIcon, assetIcon,
height: constraints.maxHeight * 0.19, height: constraints.maxHeight * 0.22,
width: constraints.maxHeight * 0.19, width: constraints.maxHeight * 0.22,
), ),
), ),
), ),
...@@ -361,9 +428,9 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> { ...@@ -361,9 +428,9 @@ class _HrmdashboardScreenState extends State<HrmdashboardScreen> {
case "Tour Bill List": case "Tour Bill List":
return "Submit and manage claims"; return "Submit and manage claims";
case "Team Leave Request Approval": case "Team Leave Request Approval":
return ""; return "Approve & Reject";
case "Team Attendance Approval": case "Team Attendance Approval":
return ""; return "Team Attendance Request";
case "Advance List": case "Advance List":
return "Advance Payment"; return "Advance Payment";
case "Casual Leave List": case "Casual Leave List":
......
...@@ -15,8 +15,42 @@ class RewardListScreen extends StatefulWidget { ...@@ -15,8 +15,42 @@ class RewardListScreen extends StatefulWidget {
} }
class _RewardListScreenState extends State<RewardListScreen> { class _RewardListScreenState extends State<RewardListScreen> {
// Responsive text size function
double getResponsiveTextSize(BuildContext context, double baseSize) {
final double width = MediaQuery.of(context).size.width;
if (width < 360) { // Small phones
return baseSize * 0.85;
} else if (width < 400) { // Medium phones
return baseSize;
} else { // Large phones
return baseSize * 1.1;
}
}
// Responsive padding function
double getResponsivePadding(BuildContext context) {
final double width = MediaQuery.of(context).size.width;
return width * 0.04; // 4% of screen width
}
// Responsive height function
double getResponsiveHeight(BuildContext context, double baseHeight) {
final double height = MediaQuery.of(context).size.height;
if (height < 700) { // Small height devices
return baseHeight * 0.85;
} else if (height < 800) { // Medium height devices
return baseHeight;
} else { // Large height devices
return baseHeight * 1.15;
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final bool isSmallScreen = MediaQuery.of(context).size.width < 360;
final bool isLargeScreen = MediaQuery.of(context).size.width > 400;
return SafeArea( return SafeArea(
top: false, top: false,
child: ChangeNotifierProvider( child: ChangeNotifierProvider(
...@@ -33,14 +67,14 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -33,14 +67,14 @@ class _RewardListScreenState extends State<RewardListScreen> {
onTap: () => Navigator.pop(context, true), onTap: () => Navigator.pop(context, true),
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/svg/appbar_back_button.svg", "assets/svg/appbar_back_button.svg",
height: 25, height: isSmallScreen ? 22 : 25,
), ),
), ),
const SizedBox(width: 10), SizedBox(width: isSmallScreen ? 8 : 10),
Text( Text(
"Reward List", "Reward List",
style: TextStyle( style: TextStyle(
fontSize: 18, fontSize: getResponsiveTextSize(context, 18),
fontFamily: "Plus Jakarta Sans", fontFamily: "Plus Jakarta Sans",
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: AppColors.semi_black, color: AppColors.semi_black,
...@@ -64,10 +98,10 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -64,10 +98,10 @@ class _RewardListScreenState extends State<RewardListScreen> {
// }, // },
// child: SvgPicture.asset( // child: SvgPicture.asset(
// "assets/svg/search_ic.svg", // "assets/svg/search_ic.svg",
// height: 25, // height: isSmallScreen ? 22 : 25,
// ), // ),
// ), // ),
// const SizedBox(width: 20), // SizedBox(width: isSmallScreen ? 15 : 20),
// ], // ],
), ),
...@@ -80,10 +114,24 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -80,10 +114,24 @@ class _RewardListScreenState extends State<RewardListScreen> {
); );
} }
if (provider.errorMessage != null) { if (provider.errorMessage != null) {
return Center(child: Text(provider.errorMessage!)); return Center(
child: Text(
provider.errorMessage!,
style: TextStyle(
fontSize: getResponsiveTextSize(context, 14),
),
),
);
} }
if (provider.response == null) { if (provider.response == null) {
return const Center(child: Text("No details found")); return Center(
child: Text(
"No details found",
style: TextStyle(
fontSize: getResponsiveTextSize(context, 14),
),
),
);
} }
final rewardDetail = provider.response!; final rewardDetail = provider.response!;
final rewardResponse = provider.response!; final rewardResponse = provider.response!;
...@@ -93,16 +141,16 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -93,16 +141,16 @@ class _RewardListScreenState extends State<RewardListScreen> {
final disbursed = rewardResponse.disbursedAmount ?? "0"; final disbursed = rewardResponse.disbursedAmount ?? "0";
final balance = rewardResponse.balanceAmount ?? "0"; final balance = rewardResponse.balanceAmount ?? "0";
return SingleChildScrollView( return SingleChildScrollView(
padding: const EdgeInsets.all(16), padding: EdgeInsets.all(getResponsivePadding(context)),
child: Column( child: Column(
children: [ children: [
/// --- Top Summary Cards --- /// --- Top Summary Cards ---
Stack( Stack(
children: [ children: [
Container( Container(
height: 110, height: getResponsiveHeight(context, 110),
width: double.infinity, width: double.infinity,
padding: const EdgeInsets.all(18), padding: EdgeInsets.all(isSmallScreen ? 14 : 18),
decoration: BoxDecoration( decoration: BoxDecoration(
color: const Color(0xffd9ffd6), color: const Color(0xffd9ffd6),
borderRadius: BorderRadius.circular(18), borderRadius: BorderRadius.circular(18),
...@@ -113,19 +161,19 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -113,19 +161,19 @@ class _RewardListScreenState extends State<RewardListScreen> {
children: [ children: [
Text( Text(
"₹$achieved", // Achieved Amount from response "₹$achieved", // Achieved Amount from response
style: const TextStyle( style: TextStyle(
fontSize: 20, fontSize: getResponsiveTextSize(context, 20),
color: Color(0xff0D9C00), color: const Color(0xff0D9C00),
fontStyle: FontStyle.normal, fontStyle: FontStyle.normal,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
), ),
), ),
const SizedBox(height: 10), SizedBox(height: isSmallScreen ? 6 : 10),
const Text( Text(
"Achievement Amount", "Achievement Amount",
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: getResponsiveTextSize(context, 14),
color: Color(0xff2D2D2D), color: const Color(0xff2D2D2D),
fontStyle: FontStyle.normal, fontStyle: FontStyle.normal,
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
), ),
...@@ -136,19 +184,19 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -136,19 +184,19 @@ class _RewardListScreenState extends State<RewardListScreen> {
// Positioned SVG Icon // Positioned SVG Icon
Positioned( Positioned(
bottom: 8, bottom: isSmallScreen ? 6 : 8,
right: 12, right: isSmallScreen ? 10 : 12,
child: Container( child: Container(
height: 42, height: isSmallScreen ? 36 : 42,
width: 42, width: isSmallScreen ? 36 : 42,
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: const Color(0xA0FFFFFF), // icon bg color: const Color(0xA0FFFFFF), // icon bg
), ),
child: Center( child: Center(
child: SvgPicture.asset( child: SvgPicture.asset(
height: 25, height: isSmallScreen ? 20 : 25,
width: 25, width: isSmallScreen ? 20 : 25,
"assets/svg/hrm/achievement_ic.svg", "assets/svg/hrm/achievement_ic.svg",
fit: BoxFit.contain, fit: BoxFit.contain,
), ),
...@@ -157,14 +205,14 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -157,14 +205,14 @@ class _RewardListScreenState extends State<RewardListScreen> {
), ),
], ],
), ),
const SizedBox(height: 12), SizedBox(height: isSmallScreen ? 8 : 12),
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Container( child: Container(
height: 110, height: getResponsiveHeight(context, 110),
padding: const EdgeInsets.all(16), padding: EdgeInsets.all(isSmallScreen ? 12 : 16),
decoration: BoxDecoration( decoration: BoxDecoration(
color: const Color(0xffe8ddff), color: const Color(0xffe8ddff),
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
...@@ -177,18 +225,18 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -177,18 +225,18 @@ class _RewardListScreenState extends State<RewardListScreen> {
children: [ children: [
Text( Text(
"₹$disbursed", // Disbursed Amount "₹$disbursed", // Disbursed Amount
style: const TextStyle( style: TextStyle(
fontSize: 20, fontSize: getResponsiveTextSize(context, 20),
color: Color(0xff493272), color: const Color(0xff493272),
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
), ),
), ),
const SizedBox(height: 8), SizedBox(height: isSmallScreen ? 6 : 8),
const Text( Text(
"Disbursed \nAmount", "Disbursed \nAmount",
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: getResponsiveTextSize(context, 14),
color: Color(0xff2D2D2D), color: const Color(0xff2D2D2D),
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
), ),
), ),
...@@ -198,18 +246,16 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -198,18 +246,16 @@ class _RewardListScreenState extends State<RewardListScreen> {
bottom: 2, bottom: 2,
right: 2, right: 2,
child: Container( child: Container(
height: 42, height: isSmallScreen ? 36 : 42,
width: 42, width: isSmallScreen ? 36 : 42,
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: const Color( color: const Color(0xA0FFFFFF),
0xA0FFFFFF,
), // icon bg
), ),
child: Center( child: Center(
child: SvgPicture.asset( child: SvgPicture.asset(
height: 25, height: isSmallScreen ? 20 : 25,
width: 25, width: isSmallScreen ? 20 : 25,
"assets/svg/hrm/location_ic.svg", "assets/svg/hrm/location_ic.svg",
fit: BoxFit.contain, fit: BoxFit.contain,
), ),
...@@ -220,11 +266,11 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -220,11 +266,11 @@ class _RewardListScreenState extends State<RewardListScreen> {
), ),
), ),
), ),
const SizedBox(width: 12), SizedBox(width: isSmallScreen ? 8 : 12),
Expanded( Expanded(
child: Container( child: Container(
height: 110, height: getResponsiveHeight(context, 110),
padding: const EdgeInsets.all(16), padding: EdgeInsets.all(isSmallScreen ? 12 : 16),
decoration: BoxDecoration( decoration: BoxDecoration(
color: const Color(0xfffffbc3), color: const Color(0xfffffbc3),
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
...@@ -237,17 +283,17 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -237,17 +283,17 @@ class _RewardListScreenState extends State<RewardListScreen> {
children: [ children: [
Text( Text(
"₹$balance", // Balance Amount "₹$balance", // Balance Amount
style: const TextStyle( style: TextStyle(
fontSize: 18, fontSize: getResponsiveTextSize(context, 18),
color: Color(0xff605C00), color: const Color(0xff605C00),
), ),
), ),
const SizedBox(height: 8), SizedBox(height: isSmallScreen ? 6 : 8),
const Text( Text(
"Balance \nAmount", "Balance \nAmount",
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: getResponsiveTextSize(context, 14),
color: Color(0xff2D2D2D), color: const Color(0xff2D2D2D),
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
), ),
), ),
...@@ -257,18 +303,16 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -257,18 +303,16 @@ class _RewardListScreenState extends State<RewardListScreen> {
bottom: 2, bottom: 2,
right: 2, right: 2,
child: Container( child: Container(
height: 42, height: isSmallScreen ? 36 : 42,
width: 42, width: isSmallScreen ? 36 : 42,
decoration: BoxDecoration( decoration: BoxDecoration(
shape: BoxShape.circle, shape: BoxShape.circle,
color: const Color( color: const Color(0xA0FFFFFF),
0xA0FFFFFF,
), // icon bg
), ),
child: Center( child: Center(
child: SvgPicture.asset( child: SvgPicture.asset(
height: 25, height: isSmallScreen ? 20 : 25,
width: 25, width: isSmallScreen ? 20 : 25,
"assets/svg/hrm/ballance_ic.svg", "assets/svg/hrm/ballance_ic.svg",
fit: BoxFit.contain, fit: BoxFit.contain,
), ),
...@@ -282,14 +326,13 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -282,14 +326,13 @@ class _RewardListScreenState extends State<RewardListScreen> {
], ],
), ),
const SizedBox(height: 20), SizedBox(height: getResponsiveHeight(context, 20)),
/// --- Reward List Card --- /// --- Reward List Card ---
if (rewards != null) if (rewards != null)
_rewardListCard( _rewardListCard(
title: context: context,
rewards.description ?? title: rewards.description ?? "-",
"-", // rewardsList fields
dateTime: rewards.dateTime ?? "-", dateTime: rewards.dateTime ?? "-",
achieved: achieved, achieved: achieved,
disbursed: disbursed, disbursed: disbursed,
...@@ -297,7 +340,12 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -297,7 +340,12 @@ class _RewardListScreenState extends State<RewardListScreen> {
enteredBy: rewards.enteredBy ?? "-", enteredBy: rewards.enteredBy ?? "-",
) )
else else
const Text("No rewards available"), Text(
"No rewards available",
style: TextStyle(
fontSize: getResponsiveTextSize(context, 14),
),
),
], ],
), ),
); );
...@@ -312,6 +360,7 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -312,6 +360,7 @@ class _RewardListScreenState extends State<RewardListScreen> {
/// Reusable Reward Card Function /// Reusable Reward Card Function
Widget _rewardListCard({ Widget _rewardListCard({
required BuildContext context,
required String title, required String title,
required String dateTime, required String dateTime,
required String achieved, required String achieved,
...@@ -319,19 +368,14 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -319,19 +368,14 @@ class _RewardListScreenState extends State<RewardListScreen> {
required String balance, required String balance,
required String enteredBy, required String enteredBy,
}) { }) {
final bool isSmallScreen = MediaQuery.of(context).size.width < 360;
return Container( return Container(
margin: const EdgeInsets.only(bottom: 16), margin: EdgeInsets.only(bottom: getResponsiveHeight(context, 16)),
padding: const EdgeInsets.all(16), padding: EdgeInsets.all(isSmallScreen ? 12 : 16),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
// boxShadow: [
// BoxShadow(
// color: Colors.grey.withOpacity(0.1),
// blurRadius: 6,
// offset: const Offset(0, 3),
// )
// ],
), ),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
...@@ -340,35 +384,38 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -340,35 +384,38 @@ class _RewardListScreenState extends State<RewardListScreen> {
Row( Row(
children: [ children: [
CircleAvatar( CircleAvatar(
radius: 22.5, radius: isSmallScreen ? 18 : 22.5,
backgroundColor: Color(0xffEDF8FF), backgroundColor: Color(0xffEDF8FF),
child: SvgPicture.asset( child: SvgPicture.asset(
height: 28, height: isSmallScreen ? 22 : 28,
width: 28, width: isSmallScreen ? 22 : 28,
"assets/svg/hrm/rewardList.svg", "assets/svg/hrm/rewardList.svg",
fit: BoxFit.contain, fit: BoxFit.contain,
), ),
), ),
const SizedBox(width: 8), SizedBox(width: isSmallScreen ? 6 : 8),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
title, title,
style: const TextStyle( style: TextStyle(
fontSize: 14.5, fontSize: getResponsiveTextSize(context, 14.5),
color: Color(0xff2D2D2D), color: const Color(0xff2D2D2D),
fontFamily: "Plus Jakarta Sans", fontFamily: "Plus Jakarta Sans",
fontStyle: FontStyle.normal, fontStyle: FontStyle.normal,
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
), ),
maxLines: 2,
overflow: TextOverflow.ellipsis,
), ),
SizedBox(height: isSmallScreen ? 2 : 4),
Text( Text(
dateTime, dateTime,
style: const TextStyle( style: TextStyle(
fontSize: 12.5, fontSize: getResponsiveTextSize(context, 12.5),
color: Color(0xff818181), color: const Color(0xff818181),
fontFamily: "Plus Jakarta Sans", fontFamily: "Plus Jakarta Sans",
fontStyle: FontStyle.normal, fontStyle: FontStyle.normal,
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
...@@ -380,18 +427,21 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -380,18 +427,21 @@ class _RewardListScreenState extends State<RewardListScreen> {
], ],
), ),
const SizedBox(height: 12), SizedBox(height: isSmallScreen ? 8 : 12),
/// Amount Details /// Amount Details
Padding( Padding(
padding: const EdgeInsets.all(2.0), padding: const EdgeInsets.all(2.0),
child: Row( child: Row(
children: [ children: [
const Text( Text(
"Amount Details", "Amount Details",
style: TextStyle(fontSize: 14, fontFamily: "JakartaSemiBold"), style: TextStyle(
fontSize: getResponsiveTextSize(context, 14),
fontFamily: "JakartaSemiBold"
), ),
const SizedBox(width: 10), ),
SizedBox(width: isSmallScreen ? 6 : 10),
Expanded( Expanded(
child: DottedLine( child: DottedLine(
dashGapLength: 4, dashGapLength: 4,
...@@ -404,24 +454,27 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -404,24 +454,27 @@ class _RewardListScreenState extends State<RewardListScreen> {
], ],
), ),
), ),
const SizedBox(height: 6), SizedBox(height: isSmallScreen ? 4 : 6),
_buildKeyValue("Achieved Amount", achieved), _buildKeyValue(context, "Achieved Amount", achieved),
_buildKeyValue("Disbursed Amount", disbursed), _buildKeyValue(context, "Disbursed Amount", disbursed),
_buildKeyValue("Balance Amount", balance), _buildKeyValue(context, "Balance Amount", balance),
const SizedBox(height: 10), SizedBox(height: isSmallScreen ? 8 : 10),
/// Employee Details /// Employee Details
Padding( Padding(
padding: const EdgeInsets.all(2.0), padding: const EdgeInsets.all(2.0),
child: Row( child: Row(
children: [ children: [
const Text( Text(
"Employee Details", "Employee Details",
style: TextStyle(fontSize: 14, fontFamily: "JakartaSemiBold"), style: TextStyle(
fontSize: getResponsiveTextSize(context, 14),
fontFamily: "JakartaSemiBold"
), ),
const SizedBox(width: 10), ),
SizedBox(width: isSmallScreen ? 6 : 10),
Expanded( Expanded(
child: DottedLine( child: DottedLine(
dashGapLength: 4, dashGapLength: 4,
...@@ -435,31 +488,49 @@ class _RewardListScreenState extends State<RewardListScreen> { ...@@ -435,31 +488,49 @@ class _RewardListScreenState extends State<RewardListScreen> {
), ),
), ),
_buildKeyValue("Entered By", enteredBy), _buildKeyValue(context, "Entered By", enteredBy),
], ],
), ),
); );
} }
/// Key-Value Row /// Key-Value Row
Widget _buildKeyValue(String key, String value) { Widget _buildKeyValue(BuildContext context, String key, String value) {
final bool isSmallScreen = MediaQuery.of(context).size.width < 360;
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 3.5, horizontal: 2), padding: EdgeInsets.symmetric(
vertical: isSmallScreen ? 2.5 : 3.5,
horizontal: 2
),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Expanded(
flex: 2,
child: Text(
key, key,
style: TextStyle( style: TextStyle(
fontFamily: "JakartaRegular", fontFamily: "JakartaRegular",
fontSize: 14, fontSize: getResponsiveTextSize(context, 14),
color: AppColors.semi_black, color: AppColors.semi_black,
), ),
maxLines: 1,
overflow: TextOverflow.ellipsis,
), ),
),
Text( Expanded(
flex: 1,
child: Text(
value, value,
style: const TextStyle(fontSize: 14, color: Color(0xFF818181)), style: TextStyle(
fontSize: getResponsiveTextSize(context, 14),
color: const Color(0xFF818181)
),
textAlign: TextAlign.right,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
), ),
], ],
), ),
......
...@@ -445,10 +445,10 @@ packages: ...@@ -445,10 +445,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: fake_async name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.3" version: "1.3.2"
ffi: ffi:
dependency: transitive dependency: transitive
description: description:
...@@ -1180,26 +1180,26 @@ packages: ...@@ -1180,26 +1180,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker name: leak_tracker
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "11.0.2" version: "10.0.8"
leak_tracker_flutter_testing: leak_tracker_flutter_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_flutter_testing name: leak_tracker_flutter_testing
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.10" version: "3.0.9"
leak_tracker_testing: leak_tracker_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_testing name: leak_tracker_testing
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.2" version: "3.0.1"
lints: lints:
dependency: transitive dependency: transitive
description: description:
...@@ -1873,10 +1873,10 @@ packages: ...@@ -1873,10 +1873,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.6" version: "0.7.4"
timezone: timezone:
dependency: transitive dependency: transitive
description: description:
...@@ -2017,10 +2017,10 @@ packages: ...@@ -2017,10 +2017,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.0" version: "2.1.4"
vm_service: vm_service:
dependency: transitive dependency: transitive
description: description:
...@@ -2118,5 +2118,5 @@ packages: ...@@ -2118,5 +2118,5 @@ packages:
source: hosted source: hosted
version: "3.1.3" version: "3.1.3"
sdks: sdks:
dart: ">=3.8.0-0 <3.10.0-z" dart: ">=3.7.2 <3.10.0-z"
flutter: ">=3.27.0" flutter: ">=3.27.0"
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment