feat(pagination): 공통 컨트롤 도입과 사용자 관리 가이드 추가

- 테이블 푸터에서 SuperportPaginationControls를 사용하도록 각 관리 페이지 페이지네이션 로직을 정리

- SuperportPaginationControls 위젯을 추가하고 SuperportTable 푸터를 개선해 페이지 사이즈 선택과 이동 버튼을 분리

- 사용자 등록·계정 관리 요구사항을 문서화한 doc/user_setting.md를 작성하고 AGENTS.md 코멘트 규칙을 업데이트

- flutter analyze를 수행해 빌드 경고가 없음을 확인
This commit is contained in:
JiWoong Sul
2025-10-24 16:24:02 +09:00
parent 9d6cbb1ab2
commit 9beb161527
17 changed files with 432 additions and 502 deletions

View File

@@ -3,6 +3,7 @@ import 'dart:math' as math;
import 'package:flutter/material.dart';
import 'package:lucide_icons_flutter/lucide_icons.dart' as lucide;
import 'package:shadcn_ui/shadcn_ui.dart';
import 'package:superport_v2/widgets/components/superport_pagination_controls.dart';
/// 테이블 정렬 상태 정보를 보관하는 모델.
class SuperportTableSortState {
@@ -276,15 +277,14 @@ class _PaginationFooter extends StatelessWidget {
@override
Widget build(BuildContext context) {
final theme = ShadTheme.of(context);
final int totalPages =
pagination.totalPages <= 0 ? 1 : pagination.totalPages;
final int totalPages = pagination.totalPages <= 0
? 1
: pagination.totalPages;
final int currentPage = pagination.currentPage < 1
? 1
: (pagination.currentPage > totalPages
? totalPages
: pagination.currentPage);
final canGoPrev = currentPage > 1 && !isLoading;
final canGoNext = currentPage < totalPages && !isLoading;
? totalPages
: pagination.currentPage);
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -316,33 +316,11 @@ class _PaginationFooter extends StatelessWidget {
style: theme.textTheme.small,
),
const SizedBox(width: 12),
ShadButton.ghost(
size: ShadButtonSize.sm,
onPressed: canGoPrev ? () => onPageChange?.call(1) : null,
child: const Icon(lucide.LucideIcons.chevronsLeft, size: 16),
),
const SizedBox(width: 8),
ShadButton.ghost(
size: ShadButtonSize.sm,
onPressed: canGoPrev
? () => onPageChange?.call(currentPage - 1)
: null,
child: const Icon(lucide.LucideIcons.chevronLeft, size: 16),
),
const SizedBox(width: 8),
ShadButton.ghost(
size: ShadButtonSize.sm,
onPressed: canGoNext
? () => onPageChange?.call(currentPage + 1)
: null,
child: const Icon(lucide.LucideIcons.chevronRight, size: 16),
),
const SizedBox(width: 8),
ShadButton.ghost(
size: ShadButtonSize.sm,
onPressed:
canGoNext ? () => onPageChange?.call(totalPages) : null,
child: const Icon(lucide.LucideIcons.chevronsRight, size: 16),
SuperportPaginationControls(
currentPage: currentPage,
totalPages: totalPages,
onPageSelected: onPageChange,
isBusy: isLoading,
),
],
),