feat(menu-permissions): 메뉴 API 연동으로 사이드바 권한 정비
- .env.development.example과 lib/core/config/environment.dart, lib/core/permissions/permission_manager.dart에서 PERMISSION__ 폴백을 view 전용으로 좁히고 기본 정책을 명시적으로 거부하도록 재정비했다 - lib/core/navigation/*, lib/core/routing/app_router.dart, lib/widgets/app_shell.dart, lib/main.dart에서 메뉴 매니페스트·카탈로그를 도입해 /menus 응답을 캐싱하고 라우터·사이드바·Breadcrumb가 동일 menu_code/route_path를 쓰도록 리팩터링했다 - lib/core/permissions/permission_resources.dart와 그룹 권한/메뉴 마스터 모듈을 menu_code 기반 CRUD 및 Catalog 경로 정합성 검사로 전환하고 PermissionSynchronizer·PermissionBootstrapper를 확장했다 - test/helpers/test_permissions.dart, test/widgets/app_shell_test.dart 등 신규 구조를 반영하는 테스트·골든과 doc/frontend_menu_permission_tasks.md 문서를 보강했다
This commit is contained in:
@@ -366,7 +366,7 @@ class _GroupPermissionForm extends StatefulWidget {
|
||||
|
||||
class _GroupPermissionFormState extends State<_GroupPermissionForm> {
|
||||
int? _selectedGroup;
|
||||
int? _selectedMenu;
|
||||
String? _selectedMenu;
|
||||
late bool _canCreate;
|
||||
late bool _canRead;
|
||||
late bool _canUpdate;
|
||||
@@ -385,7 +385,7 @@ class _GroupPermissionFormState extends State<_GroupPermissionForm> {
|
||||
super.initState();
|
||||
final permission = widget.permission;
|
||||
_selectedGroup = permission?.group.id;
|
||||
_selectedMenu = permission?.menu.id;
|
||||
_selectedMenu = permission?.menu.menuCode;
|
||||
_canCreate = permission?.canCreate ?? false;
|
||||
_canRead = permission?.canRead ?? true;
|
||||
_canUpdate = permission?.canUpdate ?? false;
|
||||
@@ -457,7 +457,7 @@ class _GroupPermissionFormState extends State<_GroupPermissionForm> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
ShadSelect<int>(
|
||||
ShadSelect<String>(
|
||||
initialValue: _selectedMenu,
|
||||
placeholder: Text(
|
||||
widget.isLoadingMenus ? '메뉴 로딩중...' : '메뉴 선택',
|
||||
@@ -475,9 +475,10 @@ class _GroupPermissionFormState extends State<_GroupPermissionForm> {
|
||||
});
|
||||
},
|
||||
options: widget.menus
|
||||
.where((menu) => menu.menuCode.isNotEmpty)
|
||||
.map(
|
||||
(menu) => ShadOption<int>(
|
||||
value: menu.id!,
|
||||
(menu) => ShadOption<String>(
|
||||
value: menu.menuCode,
|
||||
child: Text(menu.menuName),
|
||||
),
|
||||
)
|
||||
@@ -612,7 +613,7 @@ class _GroupPermissionFormState extends State<_GroupPermissionForm> {
|
||||
final note = _noteController.text.trim();
|
||||
final input = GroupPermissionInput(
|
||||
groupId: _selectedGroup!,
|
||||
menuId: _selectedMenu!,
|
||||
menuCode: _selectedMenu!,
|
||||
canCreate: _canCreate,
|
||||
canRead: _canRead,
|
||||
canUpdate: _canUpdate,
|
||||
@@ -648,13 +649,13 @@ class _GroupPermissionFormState extends State<_GroupPermissionForm> {
|
||||
return group.groupName;
|
||||
}
|
||||
|
||||
String _resolveMenuLabel(int? id) {
|
||||
if (id == null) {
|
||||
String _resolveMenuLabel(String? code) {
|
||||
if (code == null) {
|
||||
return widget.isLoadingMenus ? '메뉴 로딩중...' : '메뉴 선택';
|
||||
}
|
||||
final menu = widget.menus.firstWhere(
|
||||
(item) => item.id == id,
|
||||
orElse: () => MenuItem(id: id, menuCode: '', menuName: '알 수 없음'),
|
||||
(item) => item.menuCode == code,
|
||||
orElse: () => MenuItem(menuCode: code, menuName: '알 수 없음'),
|
||||
);
|
||||
return menu.menuName;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user