Files
sam-react-prod/src/components/hr/EmployeeManagement/EmployeeToolbar.tsx
byeongcheolryu 48dbba0e5f feat: 단가관리 페이지 마이그레이션 및 HR 관리 기능 추가
## 단가관리 (Pricing Management)
- 단가 목록 페이지 (IntegratedListTemplateV2 공통 템플릿 적용)
- 단가 등록/수정 폼 (원가/마진 자동 계산)
- 이력 조회, 수정 이력, 최종 확정 다이얼로그
- 판매관리 > 단가관리 네비게이션 메뉴 추가

## HR 관리 (Human Resources)
- 사원관리 (목록, 등록, 수정, 상세, CSV 업로드)
- 부서관리 (트리 구조)
- 근태관리 (기본 구조)

## 품목관리 개선
- Radix UI Select controlled mode 버그 수정 (key prop 적용)
- DynamicItemForm 파일 업로드 지원
- 수정 페이지 데이터 로딩 개선

## 문서화
- 단가관리 마이그레이션 체크리스트
- HR 관리 구현 체크리스트
- Radix UI Select 버그 수정 가이드

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-06 11:36:38 +09:00

82 lines
2.6 KiB
TypeScript

'use client';
import { Button } from '@/components/ui/button';
import { Card, CardContent } from '@/components/ui/card';
import { Calendar, FileSpreadsheet, UserPlus, Mail, Settings } from 'lucide-react';
interface EmployeeToolbarProps {
dateRange: { from?: Date; to?: Date };
onDateRangeChange: (range: { from?: Date; to?: Date }) => void;
onAddEmployee: () => void;
onCSVUpload: () => void;
onUserInvite: () => void;
onFieldSettings: () => void;
}
export function EmployeeToolbar({
dateRange,
onDateRangeChange,
onAddEmployee,
onCSVUpload,
onUserInvite,
onFieldSettings,
}: EmployeeToolbarProps) {
return (
<Card>
<CardContent className="p-4">
<div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4">
{/* 날짜 필터 */}
<div className="flex items-center gap-2">
<Calendar className="w-4 h-4 text-muted-foreground" />
<span className="text-sm text-muted-foreground">:</span>
<Button variant="outline" size="sm">
{dateRange.from && dateRange.to
? `${dateRange.from.toLocaleDateString('ko-KR')} - ${dateRange.to.toLocaleDateString('ko-KR')}`
: '전체 기간'
}
</Button>
</div>
{/* 액션 버튼들 */}
<div className="flex flex-wrap items-center gap-2">
<Button
variant="outline"
size="sm"
onClick={onFieldSettings}
className="gap-1"
>
<Settings className="w-4 h-4" />
<span className="hidden sm:inline"> </span>
</Button>
<Button
variant="outline"
size="sm"
onClick={onCSVUpload}
className="gap-1"
>
<FileSpreadsheet className="w-4 h-4" />
<span className="hidden sm:inline">CSV </span>
</Button>
<Button
variant="outline"
size="sm"
onClick={onUserInvite}
className="gap-1"
>
<Mail className="w-4 h-4" />
<span className="hidden sm:inline"> </span>
</Button>
<Button
size="sm"
onClick={onAddEmployee}
className="gap-1"
>
<UserPlus className="w-4 h-4" />
<span> </span>
</Button>
</div>
</div>
</CardContent>
</Card>
);
}