import 'package:flutter/material.dart'; import 'package:shadcn_ui/shadcn_ui.dart'; import 'package:superport/data/models/vendor_dto.dart'; import 'package:superport/core/constants/app_constants.dart'; class VendorTable extends StatelessWidget { final List vendors; final int currentPage; final int totalPages; final Function(int) onPageChanged; final Function(int) onEdit; final Function(int, String) onDelete; final Function(int) onRestore; const VendorTable({ super.key, required this.vendors, required this.currentPage, required this.totalPages, required this.onPageChanged, required this.onEdit, required this.onDelete, required this.onRestore, }); @override Widget build(BuildContext context) { final theme = ShadTheme.of(context); return Column( children: [ Expanded( child: ShadCard( child: SingleChildScrollView( child: DataTable( horizontalMargin: 16, columnSpacing: 24, columns: const [ DataColumn(label: Text('No')), DataColumn(label: Text('벤더명')), DataColumn(label: Text('등록일')), DataColumn(label: Text('상태')), DataColumn(label: Text('작업')), ], rows: vendors.asMap().entries.map((entry) { final index = entry.key; final vendor = entry.value; final rowNumber = (currentPage - 1) * AppConstants.vendorPageSize + index + 1; return DataRow( cells: [ DataCell( Text( rowNumber.toString(), style: const TextStyle( fontWeight: FontWeight.w400, color: Colors.grey, ), ), ), DataCell( Text( vendor.name, style: const TextStyle(fontWeight: FontWeight.w500), ), ), DataCell( Text( vendor.createdAt != null ? vendor.createdAt!.toLocal().toString().split(' ')[0] : '-', ), ), DataCell( Container( padding: const EdgeInsets.symmetric( horizontal: 8, vertical: 4, ), decoration: BoxDecoration( color: vendor.isActive ? Colors.green.withValues(alpha: 0.1) : Colors.grey.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(12), ), child: Text( vendor.isActive ? '활성' : '비활성', style: TextStyle( color: vendor.isActive ? Colors.green.shade700 : Colors.grey.shade700, fontSize: 12, fontWeight: FontWeight.w500, ), ), ), ), DataCell( Row( mainAxisSize: MainAxisSize.min, children: [ if (vendor.id != null) ...[ if (vendor.isActive) ...[ ShadButton.ghost( onPressed: () => onEdit(vendor.id!), size: ShadButtonSize.sm, child: const Icon(Icons.edit, size: 16), ), const SizedBox(width: 4), ShadButton.ghost( onPressed: () => onDelete(vendor.id!, vendor.name), size: ShadButtonSize.sm, child: Icon( Icons.delete, size: 16, color: theme.colorScheme.destructive, ), ), ] else ShadButton.ghost( onPressed: () => onRestore(vendor.id!), size: ShadButtonSize.sm, child: const Icon( Icons.restore, size: 16, color: Color(0xFF10B981), ), ), ], ], ), ), ], ); }).toList(), ), ), ), ), // 페이지네이션 if (totalPages > 1) Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( border: Border( top: BorderSide( color: theme.colorScheme.border, width: 1, ), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ ShadButton.ghost( onPressed: currentPage > 1 ? () => onPageChanged(currentPage - 1) : null, size: ShadButtonSize.sm, child: const Icon(Icons.chevron_left, size: 16), ), const SizedBox(width: 8), ...List.generate( totalPages > 5 ? 5 : totalPages, (index) { int pageNumber; if (totalPages <= 5) { pageNumber = index + 1; } else if (currentPage <= 3) { pageNumber = index + 1; } else if (currentPage >= totalPages - 2) { pageNumber = totalPages - 4 + index; } else { pageNumber = currentPage - 2 + index; } if (pageNumber > totalPages) return const SizedBox.shrink(); return Padding( padding: const EdgeInsets.symmetric(horizontal: 2), child: pageNumber == currentPage ? ShadButton( onPressed: () => onPageChanged(pageNumber), size: ShadButtonSize.sm, child: Text(pageNumber.toString()), ) : ShadButton.outline( onPressed: () => onPageChanged(pageNumber), size: ShadButtonSize.sm, child: Text(pageNumber.toString()), ), ); }, ), const SizedBox(width: 8), ShadButton.ghost( onPressed: currentPage < totalPages ? () => onPageChanged(currentPage + 1) : null, size: ShadButtonSize.sm, child: const Icon(Icons.chevron_right, size: 16), ), const SizedBox(width: 24), Text( '페이지 $currentPage / $totalPages', style: theme.textTheme.muted, ), ], ), ), ], ); } }