- 공사현장관리: 프로젝트 상세, 공정관리, 칸반보드 구현 - 이슈관리: 현장 이슈 등록/조회 기능 추가 - 근로자현황: 일별 근로자 출역 현황 페이지 추가 - 유틸리티관리: 현장 유틸리티 관리 페이지 추가 - 기성청구: 기성청구 관리 페이지 추가 - CEO 대시보드: 현황판(StatusBoardSection) 추가, 설정 다이얼로그 개선 - 발주관리: 모바일 필터 적용, 리스트 UI 개선 - 공용 컴포넌트: MobileFilter, IntegratedListTemplateV2 개선, CalendarHeader 반응형 개선 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
68 lines
1.9 KiB
TypeScript
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>
|
|
);
|
|
} |