feat(WEB): 리스트 페이지 권한 시스템 통합 및 중복 권한 로직 제거

- PermissionContext 기능 확장 (권한 조회 액션 추가)
- usePermission 훅 개선
- 회계 모듈 권한 통합: 매입/매출/입금/지출/채권/거래처/어음/일보/부실채권
- 인사 모듈 권한 통합: 근태/카드/급여 관리
- 전자결재 권한 통합: 기안함/결재함
- 게시판/품목/단가/팝업/구독 리스트 권한 적용
- UniversalListPage 권한 연동
- 각 컴포넌트 중복 권한 체크 코드 제거 (-828줄)
- 권한 검증 QA 체크리스트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-02-03 16:46:48 +09:00
parent e111f7b362
commit 17c16028b1
31 changed files with 1016 additions and 828 deletions

View File

@@ -13,9 +13,6 @@ import {
Package,
AlertCircle,
CheckCircle2,
Plus,
Edit,
History,
RefreshCw,
} from 'lucide-react';
import { Button } from '@/components/ui/button';
@@ -213,7 +210,6 @@ export function PricingListClient({
{ key: 'marginRate', label: '마진율', className: 'min-w-[80px] text-right', hideOnMobile: true },
{ key: 'effectiveDate', label: '적용일', className: 'min-w-[100px]', hideOnMobile: true },
{ key: 'status', label: '상태', className: 'min-w-[80px]' },
{ key: 'actions', label: '작업', className: 'w-[120px] text-right' },
];
// 테이블 행 렌더링
@@ -284,41 +280,6 @@ export function PricingListClient({
: '-'}
</TableCell>
<TableCell>{renderStatusBadge(item)}</TableCell>
<TableCell className="text-right">
<div className="flex items-center justify-end gap-1">
{item.status === 'not_registered' ? (
<Button
variant="ghost"
size="sm"
onClick={(e) => { e.stopPropagation(); handleRegister(item); }}
title="단가 등록"
>
<Plus className="w-4 h-4" />
</Button>
) : (
<>
<Button
variant="ghost"
size="sm"
onClick={(e) => { e.stopPropagation(); handleEdit(item); }}
title="수정"
>
<Edit className="w-4 h-4" />
</Button>
{item.currentRevision > 0 && (
<Button
variant="ghost"
size="sm"
onClick={(e) => { e.stopPropagation(); handleHistory(item); }}
title="이력"
>
<History className="w-4 h-4" />
</Button>
)}
</>
)}
</div>
</TableCell>
</TableRow>
);
};
@@ -363,46 +324,6 @@ export function PricingListClient({
/>
</div>
}
actions={
isSelected ? (
<div className="flex gap-2 flex-wrap">
{item.status === 'not_registered' ? (
<Button
variant="default"
size="default"
className="flex-1 min-w-[100px] h-11"
onClick={(e) => { e.stopPropagation(); handleRegister(item); }}
>
<Plus className="h-4 w-4 mr-2" />
</Button>
) : (
<>
<Button
variant="default"
size="default"
className="flex-1 min-w-[100px] h-11"
onClick={(e) => { e.stopPropagation(); handleEdit(item); }}
>
<Edit className="h-4 w-4 mr-2" />
</Button>
{item.currentRevision > 0 && (
<Button
variant="outline"
size="default"
className="flex-1 min-w-[100px] h-11"
onClick={(e) => { e.stopPropagation(); handleHistory(item); }}
>
<History className="h-4 w-4 mr-2" />
</Button>
)}
</>
)}
</div>
) : undefined
}
/>
);
};