This commit is contained in:
venbaittech 2025-05-29 10:01:30 +05:30
commit 41ed141e13
9 changed files with 270 additions and 184 deletions

View File

@ -706,18 +706,18 @@ class _TravelAgentListPlansState extends State<TravelAgentListPlans> {
isViewMode: true); isViewMode: true);
}, },
), ),
IconButton( // IconButton(
icon: Image.asset( // icon: Image.asset(
'assets/images/IconsImg/edit.png', // 'assets/images/IconsImg/edit.png',
width: 20, // width: 20,
height: 15), // height: 15),
onPressed: () { // onPressed: () {
Navigator.pop(context); // Navigator.pop(context);
ApiService.viewPlan( // ApiService.viewPlan(
context, plan.planId, // context, plan.planId,
isViewMode: false); // isViewMode: false);
}, // },
), // ),
IconButton( IconButton(
icon: Icon( icon: Icon(
Icons.cancel_rounded, Icons.cancel_rounded,

View File

@ -98,6 +98,41 @@ class StatusDashboardState extends State<StatusDashboard> {
} }
} }
Color getStatusColor(String status) {
if (status == "Domestic") return Colors.white;
if (status == "International") return Colors.white;
if (status == "Partially Approved") return Colors.yellow.shade100;
if (status == "Pending Approval") return Colors.greenAccent.shade100;
if (status == "Approved") return Colors.green.shade100;
if (status == "Completed") return Colors.green.shade500;
if (status == "Rejected") return Colors.red.shade100;
if (status == "Cancelled") return Colors.red.shade200;
return Colors.grey.shade100;
}
IconData getStatusIcon(String title) {
switch (title) {
case "Domestic":
return Icons.directions_bus_filled_outlined;
case "International":
return Icons.airplanemode_active;
case "Partially Approved":
return Icons.pending;
case "Approved":
return Icons.check_circle_outline;
case "Completed":
return Icons.done_all;
case "Rejected":
return Icons.cancel_outlined;
case "Cancelled":
return Icons.cancel_schedule_send_outlined;
default:
return Icons.info_outline;
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final typeBasedCount = List<Map<String, dynamic>>.from( final typeBasedCount = List<Map<String, dynamic>>.from(
@ -111,9 +146,12 @@ class StatusDashboardState extends State<StatusDashboard> {
print("statusBasedCount - => $statusBasedCount"); print("statusBasedCount - => $statusBasedCount");
// 👇 Local function to create the card widget // 👇 Local function to create the card widget
Widget buildInfoCard(String title, int count, double width) { Widget buildInfoCard(String title, int count, double width) {
print('title $title');
final color = getStatusColor(title);
final icon = getStatusIcon(title);
return Card( return Card(
elevation: 3, elevation: 3,
color: Colors.white, color: color,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
child: Container( child: Container(
width: width, width: width,
@ -121,10 +159,15 @@ class StatusDashboardState extends State<StatusDashboard> {
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Icon(icon, size: 32, color: (title == 'Domestic' || title == 'International') ? Colors.green : Colors.black54), // 👈 Add Icon here
const SizedBox(height: 8),
Text( Text(
title, title,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: const TextStyle(fontWeight: FontWeight.w600), style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: (title == 'Domestic' || title == 'International') ? 16 : 14,
),
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text( Text(
@ -132,7 +175,7 @@ class StatusDashboardState extends State<StatusDashboard> {
style: const TextStyle( style: const TextStyle(
fontSize: 22, fontSize: 22,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: Colors.blue, // color: Colors.blue,
), ),
), ),
], ],
@ -154,54 +197,63 @@ class StatusDashboardState extends State<StatusDashboard> {
body: Padding( body: Padding(
padding: isDesktop padding: isDesktop
? EdgeInsets.symmetric( ? EdgeInsets.symmetric(
horizontal: MediaQuery.of(context).size.width * 0.1, horizontal: MediaQuery.of(context).size.width *
vertical: 0, 0.1, // 30% of screen width as horizontal padding
vertical: 10, // 5% of screen height as vertical padding
) )
: const EdgeInsets.all(0), : EdgeInsets.all(0),
child: Row( child:Container(
children: [ // padding: const EdgeInsets.all(10.0),
Expanded( decoration: BoxDecoration(
child: Padding( color: isDesktop ? Colors.white : const Color(0xFFFCFCFC),
padding: const EdgeInsets.all(12.0), borderRadius: BorderRadius.circular(12), // 👈 Set your desired radius
child: Column( ),
crossAxisAlignment: CrossAxisAlignment.start, // color: isDesktop ? Colors.white : Color(0xFFFCFCFC),
children: [ child: Row(
Wrap( children: [
spacing: 10, Expanded(
runSpacing: 10, child: Padding(
children: typeBasedCount.map((item) { padding: const EdgeInsets.all(30.0),
double cardWidth = isDesktop child: Column(
? (MediaQuery.of(context).size.width * 0.75 - 10) / 2 // 80% width padding adjusted crossAxisAlignment: CrossAxisAlignment.center,
: MediaQuery.of(context).size.width - 24; // full width with padding children: [
Wrap(
spacing: 10,
runSpacing: 10,
children: typeBasedCount.map((item) {
double cardWidth = isDesktop
? (MediaQuery.of(context).size.width * 0.75 - 10) / 2 // 80% width padding adjusted
: MediaQuery.of(context).size.width - 24; // full width with padding
return SizedBox( return SizedBox(
width: cardWidth, width: cardWidth,
child: buildInfoCard(item['value'], item['count'], cardWidth), child: buildInfoCard(item['value'], item['count'], cardWidth),
); );
}).toList(), }).toList(),
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
Wrap( Wrap(
spacing: 10, spacing: 10,
runSpacing: 10, runSpacing: 10,
children: statusBasedCount.map((item) { children: statusBasedCount.map((item) {
double cardWidth = isDesktop double cardWidth = isDesktop
? (MediaQuery.of(context).size.width * 0.90 - 50) / 6 // desktop layout: 6 cards per row ? (MediaQuery.of(context).size.width * 0.90 - 50) / 6 // desktop layout: 6 cards per row
: MediaQuery.of(context).size.width - 24; // mobile: full width : MediaQuery.of(context).size.width - 24; // mobile: full width
return SizedBox( return SizedBox(
width: cardWidth, width: cardWidth,
child: buildInfoCard(item['value'], item['count'], cardWidth), child: buildInfoCard(item['value'], item['count'], cardWidth),
); );
}).toList(), }).toList(),
), ),
], ],
), ),
), ),
), ),
], ],
), ),
)
), ),
); );
}); });

View File

@ -493,7 +493,7 @@ class ForexDataState extends State<ForexData> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
"Cash", "Cash (%)",
style: GoogleFonts.poppins( style: GoogleFonts.poppins(
fontSize: 12, fontSize: 12,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@ -540,7 +540,7 @@ class ForexDataState extends State<ForexData> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
"Card", "Card (%)",
style: GoogleFonts.poppins( style: GoogleFonts.poppins(
fontSize: 12, fontSize: 12,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,

View File

@ -276,7 +276,7 @@ class _GroupListState extends State<GroupList> {
children: [ children: [
Expanded( Expanded(
child: Container( child: Container(
// height: MediaQuery.of(context).size.height * 0.89, height: MediaQuery.of(context).size.height * 0.75,
padding: const EdgeInsets.all(10), padding: const EdgeInsets.all(10),
// margin: const EdgeInsets.only(bottom: 10), // margin: const EdgeInsets.only(bottom: 10),
color: Colors.white, color: Colors.white,
@ -309,125 +309,124 @@ class _GroupListState extends State<GroupList> {
itemCount: apiAllGroups!.length, itemCount: apiAllGroups!.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final group = apiAllGroups![index]; final group = apiAllGroups![index];
return Card( return Card(
// color: bodyColor, // color: bodyColor,
// color: Color(0xFFF5F5F5), // color: Color(0xFFF5F5F5),
color: Colors.white, color: Colors.white,
margin: EdgeInsets.symmetric(vertical: 6, horizontal: 10), margin: EdgeInsets.symmetric(vertical: 6, horizontal: 10),
child: Padding( child: Padding(
padding: const EdgeInsets.all(12.0), padding: const EdgeInsets.all(12.0),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
children: [ children: [
Expanded( Expanded(
child: Text("Group Name", child: Text("Group Name",
style: GoogleFonts.poppins(
fontSize: 11.5, fontWeight: FontWeight.w400)),
),
Expanded(
child: Text("Domestic Policy",
style: GoogleFonts.poppins(
fontSize: 11.5, fontWeight: FontWeight.w400)),
),
Expanded(
child: Text("International Policy",
style: GoogleFonts.poppins(
fontSize: 11.5, fontWeight: FontWeight.w400)),
),
Expanded(
child: Text("Description",
style: GoogleFonts.poppins(
fontSize: 11.5, fontWeight: FontWeight.w400)),
),
],
),
SizedBox(height: 4),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text("${group['name']}",
style: GoogleFonts.poppins(
fontSize: 13, fontWeight: FontWeight.w600)),
),
Expanded(
child: Text("${group['domestic_policy_name'] ?? 'N/A'}",
style: GoogleFonts.poppins(
fontSize: 13, fontWeight: FontWeight.w600)),
),
Expanded(
child: Text("${group['international_policy_name']}",
style: GoogleFonts.poppins( style: GoogleFonts.poppins(
fontSize: 13, fontWeight: FontWeight.w600))), fontSize: 11.5, fontWeight: FontWeight.w400)),
Expanded( ),
child: Text("${group['description'] ?? 'N/A'}", Expanded(
child: Text("Domestic Policy",
style: GoogleFonts.poppins( style: GoogleFonts.poppins(
fontSize: 13, fontWeight: FontWeight.w600))), fontSize: 11.5, fontWeight: FontWeight.w400)),
], ),
), Expanded(
Row( child: Text("International Policy",
mainAxisAlignment: MainAxisAlignment.end, style: GoogleFonts.poppins(
children: [ fontSize: 11.5, fontWeight: FontWeight.w400)),
GestureDetector( ),
onTap: () async { Expanded(
child: Text("Description",
if (group['group_id'] != null) { style: GoogleFonts.poppins(
final newGroupID = int.tryParse(group['group_id'].toString()); fontSize: 11.5, fontWeight: FontWeight.w400)),
if (newGroupID != null) { ),
final data = await apiService.getGroupDetailsFind(newGroupID); // Always an int ],
showDialog( ),
context: context, SizedBox(height: 4),
builder: (context) => GroupData( Row(
isDesktop: isDesktop, mainAxisAlignment: MainAxisAlignment.spaceBetween,
groupId: newGroupID, // Pass the ID children: [
groupData: data, Expanded(
layoutColor: layoutColor!, child: Text("${group['name']}",
fetchGetGroup: refreshData style: GoogleFonts.poppins(
), fontSize: 13, fontWeight: FontWeight.w600)),
); ),
Expanded(
child: Text("${group['domestic_policy_name'] ?? 'N/A'}",
style: GoogleFonts.poppins(
fontSize: 13, fontWeight: FontWeight.w600)),
),
Expanded(
child: Text("${group['international_policy_name']}",
style: GoogleFonts.poppins(
fontSize: 13, fontWeight: FontWeight.w600))),
Expanded(
child: Text("${group['description'] ?? 'N/A'}",
style: GoogleFonts.poppins(
fontSize: 13, fontWeight: FontWeight.w600))),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
GestureDetector(
onTap: () async {
if (group['group_id'] != null) {
final newGroupID = int.tryParse(
group['group_id'].toString());
if (newGroupID != null) {
final data = await apiService.getGroupDetailsFind(
newGroupID); // Always an int
showDialog(
context: context,
builder: (context) =>
GroupData(
isDesktop: isDesktop,
groupId: newGroupID,
// Pass the ID
groupData: data,
layoutColor: layoutColor!,
fetchGetGroup: refreshData
),
);
}
} else {
print("something went wrong check properly");
} }
},
} else { // onTap: () {
print("something went wrong check properly"); // context.go("/CreateGroup", extra: group);
} // },
}, child: Image.asset('assets/images/IconsImg/edit.png',
width: 20, height: 15),
),
SizedBox(
width: 5,
),
GestureDetector(
onTap: () {
final idStr = group['group_id'];
final id = int.tryParse(idStr.toString());
// onTap: () { if (id == null) {
// context.go("/CreateGroup", extra: group); print("group_id is null");
// }, return;
child: Image.asset('assets/images/IconsImg/edit.png', }
width: 20, height: 15), final status = group['is_active'];
), // print("GroupId : ${group['group_id']} ");
SizedBox( deleteGroup(group, id, status);
width: 5, },
), child: Image.asset('assets/images/IconsImg/delete.png',
GestureDetector( width: 20, height: 15),
onTap: () { ),
final idStr = group['group_id']; ],
final id = int.tryParse(idStr.toString()); ),
],
if (id == null) { ),
print("group_id is null");
return;
}
final status = group['is_active'];
// print("GroupId : ${group['group_id']} ");
deleteGroup(group, id, status);
},
child: Image.asset('assets/images/IconsImg/delete.png',
width: 20, height: 15),
),
],
),
],
), ),
), );
);
}, },
); );
} }

View File

@ -214,6 +214,14 @@ class BusListWidget extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
Text(
"${item["from"]} - ${item["to"]}",
style: GoogleFonts.poppins(
fontSize: 14,
fontWeight: FontWeight.w800,
),
),
Spacer(),
GestureDetector( GestureDetector(
onTap: () => onOpen(true, item, "Bus"), onTap: () => onOpen(true, item, "Bus"),
child: Image.asset('assets/images/IconsImg/edit.png', child: Image.asset('assets/images/IconsImg/edit.png',

View File

@ -192,6 +192,14 @@ class InsuranceListWidget extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
Text(
getRequestForInsuranceType(item["type_of_insurance"]!.toString()),
style: GoogleFonts.poppins(
fontSize: 14,
fontWeight: FontWeight.w800,
),
),
Spacer(),
GestureDetector( GestureDetector(
onTap: () => onOpen(true, item, "Insurance"), onTap: () => onOpen(true, item, "Insurance"),
child: Image.asset('assets/images/IconsImg/edit.png', child: Image.asset('assets/images/IconsImg/edit.png',

View File

@ -152,6 +152,14 @@ class MiscellaneousListWidget extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
Text(
getRequestValue(item["special_request"]?.toString()),
style: GoogleFonts.poppins(
fontSize: 14,
fontWeight: FontWeight.w800,
),
),
Spacer(),
GestureDetector( GestureDetector(
onTap: () => onOpen(true, item, "Miscellaneous"), onTap: () => onOpen(true, item, "Miscellaneous"),
child: Image.asset('assets/images/IconsImg/edit.png', child: Image.asset('assets/images/IconsImg/edit.png',

View File

@ -291,6 +291,14 @@ class VisaListWidget extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
Text(
getRequestForVisa(item["type_of_visa"]!.toString()),
style: GoogleFonts.poppins(
fontSize: 14,
fontWeight: FontWeight.w800,
),
),
Spacer(),
GestureDetector( GestureDetector(
onTap: () => onOpen(true, item, "Visa"), onTap: () => onOpen(true, item, "Visa"),
child: Image.asset('assets/images/IconsImg/edit.png', child: Image.asset('assets/images/IconsImg/edit.png',

View File

@ -21,6 +21,7 @@ class PlanPopupMenu extends StatelessWidget {
required this.layoutColor, required this.layoutColor,
}) : super(key: key); }) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Align( return Align(
@ -51,15 +52,17 @@ class PlanPopupMenu extends StatelessWidget {
isViewMode: true); isViewMode: true);
}, },
), ),
IconButton(
icon: Image.asset('assets/images/IconsImg/edit.png', // IconButton(
width: 20, height: 15), // icon: Image.asset('assets/images/IconsImg/edit.png',
onPressed: () { // width: 20, height: 15),
Navigator.pop(context); // onPressed: () {
ApiService.viewPlan(context, plan.planId, // Navigator.pop(context);
isViewMode: false); // ApiService.viewPlan(context, plan.planId,
}, // isViewMode: false);
), // },
// ),
IconButton( IconButton(
icon: Icon(Icons.cancel_rounded, size: 18), icon: Icon(Icons.cancel_rounded, size: 18),
onPressed: () { onPressed: () {