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

@@ -6,6 +6,7 @@ import 'package:superport_v2/core/constants/app_sections.dart';
import 'package:superport_v2/widgets/app_layout.dart';
import 'package:superport_v2/widgets/components/filter_bar.dart';
import 'package:superport_v2/widgets/components/superport_dialog.dart';
import 'package:superport_v2/widgets/components/superport_pagination_controls.dart';
import '../../../../../core/config/environment.dart';
import '../../../../../widgets/spec_page.dart';
@@ -152,9 +153,6 @@ class _MenuEnabledPageState extends State<_MenuEnabledPage> {
final totalPages = result == null || result.pageSize == 0
? 1
: (result.total / result.pageSize).ceil().clamp(1, 9999);
final hasNext = result == null
? false
: (result.page * result.pageSize) < result.total;
final showReset =
_searchController.text.isNotEmpty ||
@@ -308,41 +306,11 @@ class _MenuEnabledPageState extends State<_MenuEnabledPage> {
'페이지 $currentPage / $totalPages',
style: theme.textTheme.small,
),
Row(
children: [
ShadButton.outline(
size: ShadButtonSize.sm,
onPressed: _controller.isLoading || currentPage <= 1
? null
: () => _controller.fetch(page: 1),
child: const Text('처음'),
),
const SizedBox(width: 8),
ShadButton.outline(
size: ShadButtonSize.sm,
onPressed: _controller.isLoading || currentPage <= 1
? null
: () => _controller.fetch(page: currentPage - 1),
child: const Text('이전'),
),
const SizedBox(width: 8),
ShadButton.outline(
size: ShadButtonSize.sm,
onPressed: _controller.isLoading || !hasNext
? null
: () => _controller.fetch(page: currentPage + 1),
child: const Text('다음'),
),
const SizedBox(width: 8),
ShadButton.outline(
size: ShadButtonSize.sm,
onPressed:
_controller.isLoading || currentPage >= totalPages
? null
: () => _controller.fetch(page: totalPages),
child: const Text('마지막'),
),
],
SuperportPaginationControls(
currentPage: currentPage,
totalPages: totalPages,
isBusy: _controller.isLoading,
onPageSelected: (page) => _controller.fetch(page: page),
),
],
),
@@ -436,9 +404,9 @@ class _MenuEnabledPageState extends State<_MenuEnabledPage> {
onPressed: isSaving
? null
: () => Navigator.of(
dialogContext,
rootNavigator: true,
).pop(false),
dialogContext,
rootNavigator: true,
).pop(false),
child: const Text('취소'),
);
},
@@ -730,10 +698,8 @@ class _MenuEnabledPageState extends State<_MenuEnabledPage> {
secondaryAction: Builder(
builder: (dialogContext) {
return ShadButton.ghost(
onPressed: () => Navigator.of(
dialogContext,
rootNavigator: true,
).pop(false),
onPressed: () =>
Navigator.of(dialogContext, rootNavigator: true).pop(false),
child: const Text('취소'),
);
},
@@ -741,10 +707,8 @@ class _MenuEnabledPageState extends State<_MenuEnabledPage> {
primaryAction: Builder(
builder: (dialogContext) {
return ShadButton.destructive(
onPressed: () => Navigator.of(
dialogContext,
rootNavigator: true,
).pop(true),
onPressed: () =>
Navigator.of(dialogContext, rootNavigator: true).pop(true),
child: const Text('삭제'),
);
},