Files
sam-react-prod/src/components/business/construction/management/DetailCard.tsx
byeongcheolryu db47a15544 feat(WEB): 공사관리 시스템 및 CEO 대시보드 기능 확장
- 공사현장관리: 프로젝트 상세, 공정관리, 칸반보드 구현
- 이슈관리: 현장 이슈 등록/조회 기능 추가
- 근로자현황: 일별 근로자 출역 현황 페이지 추가
- 유틸리티관리: 현장 유틸리티 관리 페이지 추가
- 기성청구: 기성청구 관리 페이지 추가
- CEO 대시보드: 현황판(StatusBoardSection) 추가, 설정 다이얼로그 개선
- 발주관리: 모바일 필터 적용, 리스트 UI 개선
- 공용 컴포넌트: MobileFilter, IntegratedListTemplateV2 개선, CalendarHeader 반응형 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 17:18:29 +09:00

68 lines
1.9 KiB
TypeScript

'use client';
import { Badge } from '@/components/ui/badge';
import { cn } from '@/lib/utils';
import type { StageDetail, StageCardStatus } from './types';
import { DETAIL_CONFIG } from './types';
interface DetailCardProps {
detail: StageDetail;
onClick?: () => void;
}
export default function DetailCard({ detail, onClick }: DetailCardProps) {
const config = DETAIL_CONFIG[detail.type];
// 상태 뱃지 색상
const getStatusBadge = (status?: StageCardStatus) => {
if (!status) return null;
switch (status) {
case 'completed':
return <Badge variant="secondary" className="text-xs"></Badge>;
case 'in_progress':
return <Badge className="text-xs bg-yellow-500"></Badge>;
case 'waiting':
return <Badge variant="outline" className="text-xs"></Badge>;
default:
return null;
}
};
return (
<div
className={cn(
'p-3 bg-card rounded-lg border cursor-pointer transition-all hover:shadow-md'
)}
onClick={onClick}
>
{/* 헤더: 상세 타입 + 상태 뱃지 */}
<div className="flex items-center justify-between gap-2 mb-2">
<span className="text-xs font-medium text-muted-foreground">
{config.label}
</span>
{getStatusBadge(detail.status)}
</div>
{/* 제목 */}
<h4 className="text-sm font-medium text-foreground mb-2 line-clamp-1">
{detail.title}
</h4>
{/* 날짜 또는 담당자 */}
<div className="text-xs text-muted-foreground">
{detail.date && (
<div className="flex justify-between">
<span>{config.dateLabel}</span>
<span>{detail.date.replace(/-/g, '.')}</span>
</div>
)}
{detail.pm && (
<div className="flex justify-between">
<span>{config.dateLabel}</span>
<span>{detail.pm}</span>
</div>
)}
</div>
</div>
);
}