fix: TypeScript 타입 오류 수정 및 설정 페이지 추가

- BOMItem Omit 타입 시그니처 통일 (useTemplateManagement, SectionsTab, ItemMasterContext)
- HeadersInit → Record<string, string> 타입 변경
- Zustand useShallow 마이그레이션 (zustand/react/shallow)
- DataTable, ListPageTemplate 제네릭 타입 제약 추가
- 설정 관리 페이지 추가 (직급, 직책, 휴가정책, 근무일정, 권한)
- HR 관리 페이지 추가 (급여, 휴가)
- 단가관리 페이지 리팩토링

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
byeongcheolryu
2025-12-09 18:07:47 +09:00
parent 48dbba0e5f
commit ded0bc2439
98 changed files with 10608 additions and 1204 deletions

View File

@@ -256,23 +256,20 @@ export default function ItemDetailClient({ item }: ItemDetailClientProps) {
</CardHeader>
<CardContent>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
{item.category1 && (
<div>
<Label className="text-muted-foreground"></Label>
<p className="mt-1">
<Badge variant="outline" className="bg-indigo-50 text-indigo-700">
{item.category1 === 'guide_rail' ? '가이드레일' :
item.category1 === 'case' ? '케이스' :
item.category1 === 'bottom_finish' ? '하단마감재' :
item.category1}
</Badge>
</p>
</div>
)}
{item.installationType && (
<div>
<Label className="text-muted-foreground"> </Label>
<p className="mt-1">
{/* 품목명 - itemName 표시 */}
<div>
<Label className="text-muted-foreground"></Label>
<p className="mt-1">
<Badge variant="outline" className="bg-indigo-50 text-indigo-700">
{item.itemName}
</Badge>
</p>
</div>
{/* 설치 유형 */}
<div>
<Label className="text-muted-foreground"> </Label>
<p className="mt-1">
{item.installationType ? (
<Badge variant="outline" className="bg-green-50 text-green-700">
{item.installationType === 'wall' ? '벽면형 (R)' :
item.installationType === 'side' ? '측면형 (S)' :
@@ -280,19 +277,41 @@ export default function ItemDetailClient({ item }: ItemDetailClientProps) {
item.installationType === 'iron' ? '철재 (T)' :
item.installationType}
</Badge>
</p>
</div>
)}
{item.assemblyType && (
<div>
<Label className="text-muted-foreground"></Label>
<p className="mt-1">
) : (
<span className="text-muted-foreground">-</span>
)}
</p>
</div>
{/* 마감 */}
<div>
<Label className="text-muted-foreground"></Label>
<p className="mt-1">
{item.assemblyType ? (
<code className="text-sm bg-gray-100 px-2 py-1 rounded">
{item.assemblyType}
</code>
</p>
</div>
)}
) : (
<span className="text-muted-foreground">-</span>
)}
</p>
</div>
{/* 길이 */}
<div>
<Label className="text-muted-foreground"></Label>
<p className="mt-1 font-medium">
{item.assemblyLength || item.length ? `${item.assemblyLength || item.length}mm` : '-'}
</p>
</div>
{/* 측면 규격 */}
<div>
<Label className="text-muted-foreground"> </Label>
<p className="mt-1">
{item.sideSpecWidth && item.sideSpecHeight
? `${item.sideSpecWidth} × ${item.sideSpecHeight}mm`
: '-'}
</p>
</div>
{/* 재질 (있으면) */}
{item.material && (
<div>
<Label className="text-muted-foreground"></Label>
@@ -303,20 +322,6 @@ export default function ItemDetailClient({ item }: ItemDetailClientProps) {
</p>
</div>
)}
{item.assemblyLength && (
<div>
<Label className="text-muted-foreground"></Label>
<p className="mt-1 font-medium">{item.assemblyLength}mm</p>
</div>
)}
{item.sideSpecWidth && item.sideSpecHeight && (
<div>
<Label className="text-muted-foreground"> </Label>
<p className="mt-1">
{item.sideSpecWidth} × {item.sideSpecHeight}mm
</p>
</div>
)}
</div>
</CardContent>
</Card>
@@ -355,10 +360,9 @@ export default function ItemDetailClient({ item }: ItemDetailClientProps) {
</Card>
)}
{/* 절곡품/조립품 전개도 정보 */}
{/* 절곡품/조립품 전개도 정보 - 조립부품은 항상 표시 */}
{item.itemType === 'PT' &&
(item.partType === 'BENDING' || item.partType === 'ASSEMBLY') &&
(item.bendingDiagram || (item.bendingDetails && item.bendingDetails.length > 0)) && (
(item.partType === 'BENDING' || item.partType === 'ASSEMBLY') && (
<Card>
<CardHeader className="pb-3">
<CardTitle className="flex items-center gap-2 text-base md:text-lg">