계정 정보 다이얼로그 추가 및 전체 목록 페치 개선

This commit is contained in:
JiWoong Sul
2025-10-22 01:05:47 +09:00
parent 6b58effc83
commit f4dc83d441
44 changed files with 1636 additions and 362 deletions

View File

@@ -41,6 +41,17 @@ class ApprovalTemplateController extends ChangeNotifier {
_errorMessage = null;
notifyListeners();
try {
final previous = _result;
final int resolvedPage;
if (page < 1) {
resolvedPage = 1;
} else if (previous != null && previous.pageSize > 0) {
final calculated = (previous.total / previous.pageSize).ceil();
final maxPage = calculated < 1 ? 1 : calculated;
resolvedPage = page > maxPage ? maxPage : page;
} else {
resolvedPage = page;
}
final sanitizedQuery = _query.trim();
final isActive = switch (_statusFilter) {
ApprovalTemplateStatusFilter.all => null,
@@ -48,7 +59,7 @@ class ApprovalTemplateController extends ChangeNotifier {
ApprovalTemplateStatusFilter.inactiveOnly => false,
};
final response = await _repository.list(
page: page,
page: resolvedPage,
pageSize: _pageSize,
query: sanitizedQuery.isEmpty ? null : sanitizedQuery,
isActive: isActive,

View File

@@ -86,9 +86,10 @@ class _ApprovalTemplateEnabledPageState
final error = _controller.errorMessage;
if (error != null && error != _lastError && mounted) {
_lastError = error;
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(error)));
final messenger = ScaffoldMessenger.maybeOf(context);
if (messenger != null) {
messenger.showSnackBar(SnackBar(content: Text(error)));
}
_controller.clearError();
}
}
@@ -115,7 +116,7 @@ class _ApprovalTemplateEnabledPageState
final currentPage = result?.page ?? 1;
final totalPages = result == null || result.pageSize == 0
? 1
: (result.total / result.pageSize).ceil().clamp(1, 9999);
: (result.total / result.pageSize).ceil().clamp(1, 9999) as int;
final showReset =
_searchController.text.trim().isNotEmpty ||
_controller.statusFilter != ApprovalTemplateStatusFilter.all;
@@ -340,9 +341,10 @@ class _ApprovalTemplateEnabledPageState
}
final success = await _openTemplateForm(template: detail);
if (!mounted || success != true) return;
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('템플릿 "${detail.name}"을(를) 수정했습니다.')));
final messenger = ScaffoldMessenger.maybeOf(context);
messenger?.showSnackBar(
SnackBar(content: Text('템플릿 "${detail.name}"을(를) 수정했습니다.')),
);
}
Future<void> _confirmDelete(ApprovalTemplate template) async {
@@ -354,11 +356,13 @@ class _ApprovalTemplateEnabledPageState
'"${template.name}" 템플릿을 삭제하시겠습니까?\n삭제 시 템플릿은 미사용 상태로 전환됩니다.',
actions: [
ShadButton.ghost(
onPressed: () => Navigator.of(context).pop(false),
onPressed: () =>
Navigator.of(context, rootNavigator: true).pop(false),
child: const Text('취소'),
),
ShadButton(
onPressed: () => Navigator.of(context).pop(true),
onPressed: () =>
Navigator.of(context, rootNavigator: true).pop(true),
child: const Text('삭제'),
),
],
@@ -367,7 +371,8 @@ class _ApprovalTemplateEnabledPageState
if (confirmed != true) return;
final ok = await _controller.delete(template.id);
if (!mounted || !ok) return;
ScaffoldMessenger.of(context).showSnackBar(
final messenger = ScaffoldMessenger.maybeOf(context);
messenger?.showSnackBar(
SnackBar(content: Text('템플릿 "${template.name}"을(를) 삭제했습니다.')),
);
}
@@ -380,11 +385,13 @@ class _ApprovalTemplateEnabledPageState
description: '"${template.name}" 템플릿을 복구하시겠습니까?',
actions: [
ShadButton.ghost(
onPressed: () => Navigator.of(context).pop(false),
onPressed: () =>
Navigator.of(context, rootNavigator: true).pop(false),
child: const Text('취소'),
),
ShadButton(
onPressed: () => Navigator.of(context).pop(true),
onPressed: () =>
Navigator.of(context, rootNavigator: true).pop(true),
child: const Text('복구'),
),
],
@@ -393,7 +400,8 @@ class _ApprovalTemplateEnabledPageState
if (confirmed != true) return;
final restored = await _controller.restore(template.id);
if (!mounted || restored == null) return;
ScaffoldMessenger.of(context).showSnackBar(
final messenger = ScaffoldMessenger.maybeOf(context);
messenger?.showSnackBar(
SnackBar(content: Text('템플릿 "${restored.name}"을(를) 복구했습니다.')),
);
}
@@ -466,7 +474,7 @@ class _ApprovalTemplateEnabledPageState
? await _controller.update(existingTemplate.id, input, stepInputs)
: await _controller.create(input, stepInputs);
if (success != null && mounted) {
Navigator.of(context).pop(true);
Navigator.of(context, rootNavigator: true).pop(true);
} else {
modalSetState?.call(() => isSaving = false);
}
@@ -609,7 +617,7 @@ class _ApprovalTemplateEnabledPageState
ShadButton.ghost(
onPressed: () {
if (isSaving) return;
Navigator.of(context).pop(false);
Navigator.of(context, rootNavigator: true).pop(false);
},
child: const Text('취소'),
),
@@ -632,9 +640,10 @@ class _ApprovalTemplateEnabledPageState
statusNotifier.dispose();
if (result == true && mounted && template == null) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text('템플릿 "$createdName"을 생성했습니다.')));
final messenger = ScaffoldMessenger.maybeOf(context);
messenger?.showSnackBar(
SnackBar(content: Text('템플릿 "$createdName"을 생성했습니다.')),
);
}
return result;
}