import 'package:flutter/material.dart'; import 'package:superport/models/company_model.dart'; import 'package:superport/models/user_model.dart'; import 'package:superport/screens/common/theme_tailwind.dart'; import 'package:superport/screens/common/main_layout.dart'; import 'package:superport/screens/common/custom_widgets.dart'; import 'package:superport/services/mock_data_service.dart'; import 'package:superport/utils/constants.dart'; import 'package:superport/screens/user/controllers/user_list_controller.dart'; import 'package:superport/screens/user/widgets/user_table.dart'; import 'package:superport/utils/user_utils.dart'; import 'package:superport/screens/common/widgets/pagination.dart'; // 담당자 목록 화면 (UI만 담당) class UserListScreen extends StatefulWidget { const UserListScreen({super.key}); @override State createState() => _UserListScreenState(); } class _UserListScreenState extends State { late final UserListController _controller; final MockDataService _dataService = MockDataService(); // 페이지네이션 상태 추가 int _currentPage = 1; final int _pageSize = 10; @override void initState() { super.initState(); _controller = UserListController(dataService: _dataService); _controller.loadUsers(); _controller.addListener(_refresh); } @override void dispose() { _controller.removeListener(_refresh); super.dispose(); } // 상태 갱신용 setState 래퍼 void _refresh() { setState(() {}); } // 사용자 추가 화면 이동 void _navigateToAddScreen() async { final result = await Navigator.pushNamed(context, '/user/add'); if (result == true) { _controller.loadUsers(); } } // 사용자 수정 화면 이동 void _navigateToEditScreen(int id) async { final result = await Navigator.pushNamed( context, '/user/edit', arguments: id, ); if (result == true) { _controller.loadUsers(); } } // 사용자 삭제 다이얼로그 void _showDeleteDialog(int id) { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('삭제 확인'), content: const Text('이 사용자 정보를 삭제하시겠습니까?'), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('취소'), ), TextButton( onPressed: () { _controller.deleteUser(id, () { Navigator.pop(context); }); }, child: const Text('삭제'), ), ], ), ); } // 회사명 반환 함수 (내부에서만 사용) String _getCompanyName(int companyId) { final company = _dataService.getCompanyById(companyId); return company?.name ?? '-'; } @override Widget build(BuildContext context) { // 대시보드 폭에 맞게 조정 final screenWidth = MediaQuery.of(context).size.width; final maxContentWidth = screenWidth > 1200 ? 1200.0 : screenWidth - 32; // 페이지네이션 데이터 슬라이싱 final int totalCount = _controller.users.length; final int startIndex = (_currentPage - 1) * _pageSize; final int endIndex = (startIndex + _pageSize) > totalCount ? totalCount : (startIndex + _pageSize); final pagedUsers = _controller.users.sublist(startIndex, endIndex); return MainLayout( title: '담당자 관리', currentRoute: Routes.user, actions: [ IconButton( icon: const Icon(Icons.refresh), onPressed: _controller.loadUsers, color: Colors.grey, ), ], child: Padding( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ PageTitle( title: '담당자 목록', width: maxContentWidth - 32, rightWidget: ElevatedButton.icon( onPressed: _navigateToAddScreen, icon: const Icon(Icons.add), label: const Text('추가'), style: AppThemeTailwind.primaryButtonStyle, ), ), Expanded( child: DataTableCard( width: maxContentWidth - 32, child: UserTable( users: pagedUsers, width: maxContentWidth - 32, getRoleName: getRoleName, getBranchName: _controller.getBranchName, getCompanyName: _getCompanyName, onEdit: _navigateToEditScreen, onDelete: _showDeleteDialog, ), ), ), // 페이지네이션 위젯 추가 if (totalCount > _pageSize) Padding( padding: const EdgeInsets.symmetric(vertical: 12), child: Pagination( totalCount: totalCount, currentPage: _currentPage, pageSize: _pageSize, onPageChanged: (page) { setState(() { _currentPage = page; }); }, ), ), ], ), ), ); } }