import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:intl/intl.dart'; class AccomodationListWidget extends StatelessWidget { final List> accommodationList; final Function(bool, Map, String) onOpen; final Function(Map) onDeleteAccommodation; final Function(String, bool) onAddNew; final bool isViewMode; const AccomodationListWidget({ super.key, required this.accommodationList, required this.onOpen, required this.onDeleteAccommodation, required this.onAddNew, required this.isViewMode, }); @override Widget build(BuildContext context) { final isDesktop = MediaQuery.of(context).size.width > 1024; return Padding( padding: const EdgeInsets.all(16.0), child: Container( margin: const EdgeInsets.only(top: 16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // Header with title and button Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ if ((!isDesktop) && accommodationList.isNotEmpty) Text( " ", style: const TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), MouseRegion( cursor: isViewMode ? SystemMouseCursors.forbidden : SystemMouseCursors.click, child: GestureDetector( onTap: isViewMode ? null : () { print("New data"); onAddNew("Accomodation", true); }, child: Row( mainAxisSize: MainAxisSize.min, // Ensures content fits nicely children: [ // Text( // "Add New", // style: TextStyle(fontSize: 13), // ), // SizedBox(width: 8), // spacing between icon and text Icon( Icons.add_circle_sharp, size: 30, color: Color(0xFF114D8B), ) // Container( // decoration: BoxDecoration( // shape: BoxShape.circle, // border: Border.all( // color: Color(0xFF114D8B), // Outline color // width: 2, // Outline thickness // ), // ), // height: 30, // width: 30, // child: Center( // child: Icon( // Icons.add, // size: 20, // color: Colors.black, // ), // ), // ), ], ), ), // onPressed: isViewMode // ? null // : () { // print("New data"); // // }, // child: Row( // mainAxisSize: MainAxisSize.min, // children: [ // Icon( // Icons.add_circle_sharp, // size: 30, // color: Color(0xFF114D8B), // ) // ], // ), ), // MouseRegion( // cursor: isViewMode // ? SystemMouseCursors.forbidden // : SystemMouseCursors.click, // child: ElevatedButton( // style: ElevatedButton.styleFrom( // backgroundColor: Color(0xFF114D8B), // foregroundColor: Colors.white, // disabledBackgroundColor: Color(0xFF114D8B), // disabledForegroundColor: Colors.white, // shape: RoundedRectangleBorder( // borderRadius: BorderRadius.circular(8), // side: BorderSide(color: Color(0xFF114D8B), width: 2), // ), // padding: // EdgeInsets.symmetric(horizontal: 20, vertical: 12), // ), // onPressed: isViewMode // ? null // : () { // print("New data"); // onAddNew("Accomodation", true); // }, // child: Row( // mainAxisSize: // MainAxisSize.min, // Ensures content fits nicely // children: [ // // spacing between icon and text // Icon( // Icons.add_circle_sharp, // size: 30, // color: Color(0xFF114D8B), // ) // ], // ), // ), // ), ], ), const SizedBox(height: 16), // Scroll behavior based on device _buildData(context, isDesktop) ], ), ), ); } Widget _buildData(BuildContext context, bool isDesktop) { List> filteredList = accommodationList.where((item) => item["is_active"] == "1").toList(); print("filteredList- $filteredList"); // String formatDate(String dateString) { // try { // DateTime date = DateTime.parse(dateString); // return DateFormat('d MMM yy').format(date); // Example: 4 Apr 25 // } catch (e) { // return "Invalid Date"; // } // } String formatDate(String dateString) { try { DateTime date = DateFormat("dd-MM-yyyy").parse(dateString); return DateFormat('dd MMM yy').format(date); // Example: 23 May 25 } catch (e) { return "Invalid Date"; } } String formatTime(String timeString) { try { final parts = timeString.split(':'); int hour = int.parse(parts[0]); int minute = int.parse(parts[1]); final now = DateTime.now(); DateTime dateTime; if (hour == 24 && minute == 0) { // 24:00 is treated as 00:00 on the next day dateTime = DateTime(now.year, now.month, now.day) .add(const Duration(days: 1)); } else { if (hour < 0 || hour > 23 || minute < 0 || minute > 59) { throw FormatException("Invalid hour or minute"); } dateTime = DateTime(now.year, now.month, now.day, hour, minute); } return DateFormat('HH:mm').format(dateTime); // 24-hour format } catch (e) { return "Invalid Time"; } } // String formatTime(String timeString) { // try { // final parts = timeString.split(':'); // final now = DateTime.now(); // final dateTime = DateTime( // now.year, // now.month, // now.day, // int.parse(parts[0]), // int.parse(parts[1]), // ); // return DateFormat.jm().format(dateTime); // e.g., 12:16 PM or 12 AM // } catch (e) { // return "Invalid Time"; // } // } return ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemCount: filteredList.length, itemBuilder: (context, index) { final item = filteredList[index]; return Container( margin: EdgeInsets.symmetric(horizontal: 8, vertical: 6), decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), // color: Colors.orange.shade50, color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black12, blurRadius: 3, offset: Offset(0, 1), ), ], border: Border( top: BorderSide( color: Colors.white70, // Change color to match your theme width: 2, ), ), ), child: Padding( padding: EdgeInsets.all(12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Text( item["hotel_name"]!, style: GoogleFonts.poppins( fontSize: 14, fontWeight: FontWeight.w800, color: !isDesktop ? Color(0xFF114D8B) : Color(0xFF575A74),) ), Spacer(), GestureDetector( onTap: () => onOpen(true, item, "Accomodation"), child: Tooltip( message: 'Edit Accomodation Details', child: Image.asset( 'assets/images/IconsImg/edit.png', width: 20, height: 15, color: Color(0xFF114D8B), ), ), ), SizedBox(width: 10), GestureDetector( onTap: () => onDeleteAccommodation(item), child: Tooltip( message: 'Delete Accommodation Details', child: Image.asset( 'assets/images/IconsImg/delete.png', width: 20, height: 15, color: Colors.red, ), ), ), ], ), Divider( color: Colors.blueGrey.shade50, ), SizedBox(height: 4), isDesktop ? Row( children: [ Expanded( flex: 2, child: Text( " DestinationCity", style: GoogleFonts.poppins( fontSize: 11, ), )), Expanded( flex: 2, child: Text( " Check (in) ", style: GoogleFonts.poppins( fontSize: 11, ), )), Expanded( flex: 2, child: Text( " Check (out) ", style: GoogleFonts.poppins( fontSize: 11, ), )), Expanded( flex: 2, child: Text( " Comments", style: GoogleFonts.poppins( fontSize: 11, ), )), ], ) : SizedBox.shrink(), isDesktop ? Row( children: [ Expanded( flex: 2, child: Text( item["destination_city"], style: GoogleFonts.poppins( fontSize: 12, fontWeight: FontWeight.w600, ), ), ), SizedBox(width: 10), Expanded( flex: 2, child: Text( "${formatDate(item["checkin_date"]!)} ${formatTime(item["checkin_time"]!)}", style: GoogleFonts.poppins( fontSize: 12, fontWeight: FontWeight.w600, ), ), ), SizedBox(width: 10), Expanded( flex: 2, child: Text( "${formatDate(item["checkout_date"]!)} ${formatTime(item["checkout_time"]!)}", style: GoogleFonts.poppins( fontSize: 12, fontWeight: FontWeight.w600, ), ), ), SizedBox(width: 10), Expanded( flex: 2, child: _buildComments( "Comments:", item["comments"] ?? "N/A"), ), ], ) : Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Wrap( spacing: 20, // horizontal space between items runSpacing: 10, // vertical space between rows children: [ _buildInfoColumn("City", item["destination_city"]), _buildInfoColumn("Check (In)", "${formatDate(item["checkin_date"]!)} ${formatTime(item["checkin_time"]!)}"), _buildInfoColumn("Check (Out)", "${formatDate(item["checkout_date"]!)} ${formatTime(item["checkout_time"]!)}"), // City - long name handled with flexible space // Expanded( // flex: 3, // child: _buildInfoColumn("City", item["destination_city"]), // ), // SizedBox(width: 8), // Check In and Check Out stacked right side // Expanded( // flex: 4, // child: Column( // crossAxisAlignment: CrossAxisAlignment.end, // children: [ // _buildInfoColumn( // "Check In", // "${formatDate(item["checkin_date"]!)} ${formatTime(item["checkin_time"]!)}", // ), // SizedBox(height: 6), // _buildInfoColumn( // "Check Out", // "${formatDate(item["checkout_date"]!)} ${formatTime(item["checkout_time"]!)}", // ), // ], // ), // ), ], ), const SizedBox(height: 10), const Text( "Comment", style: TextStyle(fontWeight: FontWeight.w500), ), const SizedBox(height: 5), if (item["comments"] != null && item["comments"].toString().trim().isNotEmpty) Container( width: double.infinity, padding: const EdgeInsets.all(8), decoration: BoxDecoration( border: Border.all(color: Color(0xFF7098DD), width: 1), borderRadius: BorderRadius.circular(6), ), child: Text( item["comments"], style: const TextStyle(fontSize: 12), ), ) else const Text( "N/A", style: TextStyle(fontSize: 12), ), ], ) // Column( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // _buildRow("City:", item["destination_city"]), // SizedBox(width: 10), // SizedBox(width: 10), // _buildDateTimeRow( // "Check-in:", // formatDate(item["checkin_date"]!), // item["checkin_time"]!, // ), // SizedBox(width: 10), // _buildRow( // "Date(out):", formatDate(item["checkout_date"]!)), // SizedBox(width: 10), // _buildRow("Comments:", item["comments"] ?? "N/A"), // ], // ) ], ), ), ); }, ); } Widget _buildComments(String title, String value) { // Define character limits based on title Map limits = { // "Special Request:": 30, "Comments:": 20, // Add more keys and limits if needed }; int limit = limits[title] ?? 50; // Default limit if title not found bool exceedsLimit = value.length > limit; String wrapText(String text, int maxLineLength) { final pattern = RegExp('.{1,$maxLineLength}(\\s+|\$)'); return pattern.allMatches(text).map((m) => m.group(0)!).join('\n'); } return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: exceedsLimit ? Tooltip( message: wrapText(value, 50), decoration: BoxDecoration( color: Colors.grey.shade200, // Black background borderRadius: BorderRadius.circular(6), ), textStyle: TextStyle(color: Colors.black), // Tooltip text color padding: EdgeInsets.all(8), preferBelow: false, child: Text(value.substring(0, limit) + "...", style: GoogleFonts.poppins( fontSize: 12, fontWeight: FontWeight.w600, ), overflow: TextOverflow.ellipsis), ) : Text( value, style: GoogleFonts.poppins( fontSize: 12, fontWeight: FontWeight.w600, ), ), ), ], ); } // Helper widget Widget _buildInfoColumn(String label, String value) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( label, style: GoogleFonts.poppins( fontSize: 12, fontWeight: FontWeight.bold, color: Colors.black87, ), ), SizedBox(height: 4), Text( value, style: GoogleFonts.poppins( fontSize: 12, color: Colors.black87, ), ), ], ); } // Widget _buildRow(String title, String value) { // // Define character limits based on title // Map limits = { // // "Special Request:": 30, // "Comments:": 10, // // Add more keys and limits if needed // }; // // int limit = limits[title] ?? 50; // Default limit if title not found // bool exceedsLimit = value.length > limit; // // String wrapText(String text, int maxLineLength) { // final pattern = RegExp('.{1,$maxLineLength}(\\s+|\$)'); // return pattern.allMatches(text).map((m) => m.group(0)!).join('\n'); // } // // return Row( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // Text( // title, // style: GoogleFonts.poppins( // fontSize: 12, // ), // ), // SizedBox(width: 8), // Expanded( // child: exceedsLimit // ? Tooltip( // message: wrapText(value, 50), // decoration: BoxDecoration( // color: Colors.grey.shade200, // Black background // borderRadius: BorderRadius.circular(6), // ), // textStyle: // TextStyle(color: Colors.black), // Tooltip text color // padding: EdgeInsets.all(8), // preferBelow: false, // child: Text(value.substring(0, limit) + "...", // style: TextStyle(fontSize: 12), // overflow: TextOverflow.ellipsis), // ) // : Text( // value, // style: TextStyle(fontSize: 12), // ), // ), // ], // ); // } // Widget _buildDateTimeRow(String title, String date, String time) { // return Row( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // Text( // title, // style: GoogleFonts.poppins( // fontSize: 12, // fontWeight: FontWeight.w600, // ), // ), // SizedBox(width: 8), // Expanded( // child: Text( // "$date, $time", // style: GoogleFonts.poppins( // fontSize: 12, // ), // ), // ), // ], // ); // } }