diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-14 11:54:47 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-14 11:54:47 +0000 |
| commit | 969c25b56f6d29d7ffa4bc2ce04c5fb4e5846b34 (patch) | |
| tree | 551d335e850e6163792ded0e7a75fa41d96d612a /lib/vendor-document-list/plant | |
| parent | dd20ba9785cdbd3d61f6b014d003d3bd9646ad13 (diff) | |
(대표님) 정규벤더등록, 벤더문서관리, 벤더데이터입력, 첨부파일관리
Diffstat (limited to 'lib/vendor-document-list/plant')
| -rw-r--r-- | lib/vendor-document-list/plant/document-stages-table.tsx | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/lib/vendor-document-list/plant/document-stages-table.tsx b/lib/vendor-document-list/plant/document-stages-table.tsx index f843862d..ccf35f4b 100644 --- a/lib/vendor-document-list/plant/document-stages-table.tsx +++ b/lib/vendor-document-list/plant/document-stages-table.tsx @@ -22,6 +22,8 @@ import { Plus, FileSpreadsheet } from "lucide-react" +import { useTranslation } from "@/i18n/client" +import { useParams } from "next/navigation" import { getDocumentStagesColumns } from "./document-stages-columns" import { ExpandableDataTable } from "@/components/data-table/expandable-data-table" import { toast } from "sonner" @@ -45,6 +47,11 @@ export function DocumentStagesTable({ projectType, }: DocumentStagesTableProps) { const [{ data, pageCount, total }] = React.use(promises) + + // URL에서 언어 파라미터 가져오기 + const params = useParams() + const lng = (params?.lng as string) || 'ko' + const { t } = useTranslation(lng, 'document') // 상태 관리 @@ -160,13 +167,13 @@ export function DocumentStagesTable({ .filter(Boolean) if (stageIds.length > 0) { - toast.success(`${stageIds.length}개 스테이지가 완료 처리되었습니다.`) + toast.success(t('documentList.messages.stageCompletionSuccess', { count: stageIds.length })) } } else if (action === 'bulk_assign') { - toast.info("일괄 담당자 지정 기능은 준비 중입니다.") + toast.info(t('documentList.messages.bulkAssignPending')) } } catch (error) { - toast.error("일괄 작업 중 오류가 발생했습니다.") + toast.error(t('documentList.messages.bulkActionError')) } } @@ -260,47 +267,47 @@ export function DocumentStagesTable({ <div className="grid grid-cols-2 md:grid-cols-4 gap-4"> <Card className="cursor-pointer hover:shadow-md transition-shadow" onClick={() => setQuickFilter('all')}> <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2"> - <CardTitle className="text-sm font-medium">전체 문서</CardTitle> + <CardTitle className="text-sm font-medium">{t('documentList.dashboard.totalDocuments')}</CardTitle> <TrendingUp className="h-4 w-4 text-muted-foreground" /> </CardHeader> <CardContent> <div className="text-2xl font-bold">{stats.total}</div> <p className="text-xs text-muted-foreground"> - 총 {total}개 문서 + {t('documentList.dashboard.totalDocumentCount', { total })} </p> </CardContent> </Card> <Card className="cursor-pointer hover:shadow-md transition-shadow" onClick={() => setQuickFilter('overdue')}> <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2"> - <CardTitle className="text-sm font-medium">지연 문서</CardTitle> + <CardTitle className="text-sm font-medium">{t('documentList.dashboard.overdueDocuments')}</CardTitle> <AlertTriangle className="h-4 w-4 text-red-500" /> </CardHeader> <CardContent> <div className="text-2xl font-bold text-red-600">{stats.overdue}</div> - <p className="text-xs text-muted-foreground">즉시 확인 필요</p> + <p className="text-xs text-muted-foreground">{t('documentList.dashboard.checkImmediately')}</p> </CardContent> </Card> <Card className="cursor-pointer hover:shadow-md transition-shadow" onClick={() => setQuickFilter('due_soon')}> <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2"> - <CardTitle className="text-sm font-medium">마감 임박</CardTitle> + <CardTitle className="text-sm font-medium">{t('documentList.dashboard.dueSoonDocuments')}</CardTitle> <Clock className="h-4 w-4 text-orange-500" /> </CardHeader> <CardContent> <div className="text-2xl font-bold text-orange-600">{stats.dueSoon}</div> - <p className="text-xs text-muted-foreground">3일 이내 마감</p> + <p className="text-xs text-muted-foreground">{t('documentList.dashboard.dueInDays')}</p> </CardContent> </Card> <Card> <CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2"> - <CardTitle className="text-sm font-medium">평균 진행률</CardTitle> + <CardTitle className="text-sm font-medium">{t('documentList.dashboard.averageProgress')}</CardTitle> <Target className="h-4 w-4 text-green-500" /> </CardHeader> <CardContent> <div className="text-2xl font-bold text-green-600">{stats.avgProgress}%</div> - <p className="text-xs text-muted-foreground">전체 프로젝트 진행도</p> + <p className="text-xs text-muted-foreground">{t('documentList.dashboard.overallProgress')}</p> </CardContent> </Card> </div> @@ -312,7 +319,7 @@ export function DocumentStagesTable({ className="cursor-pointer hover:bg-primary hover:text-primary-foreground whitespace-nowrap" onClick={() => setQuickFilter('all')} > - 전체 ({stats.total}) + {t('documentList.quickFilters.all')} ({stats.total}) </Badge> <Badge variant={quickFilter === 'overdue' ? 'destructive' : 'outline'} @@ -320,7 +327,7 @@ export function DocumentStagesTable({ onClick={() => setQuickFilter('overdue')} > <AlertTriangle className="w-3 h-3 mr-1" /> - 지연 ({stats.overdue}) + {t('documentList.quickFilters.overdue')} ({stats.overdue}) </Badge> <Badge variant={quickFilter === 'due_soon' ? 'default' : 'outline'} @@ -328,7 +335,7 @@ export function DocumentStagesTable({ onClick={() => setQuickFilter('due_soon')} > <Clock className="w-3 h-3 mr-1" /> - 마감임박 ({stats.dueSoon}) + {t('documentList.quickFilters.dueSoon')} ({stats.dueSoon}) </Badge> <Badge variant={quickFilter === 'in_progress' ? 'default' : 'outline'} @@ -336,7 +343,7 @@ export function DocumentStagesTable({ onClick={() => setQuickFilter('in_progress')} > <Users className="w-3 h-3 mr-1" /> - 진행중 ({stats.inProgress}) + {t('documentList.quickFilters.inProgress')} ({stats.inProgress}) </Badge> <Badge variant={quickFilter === 'high_priority' ? 'destructive' : 'outline'} @@ -344,7 +351,7 @@ export function DocumentStagesTable({ onClick={() => setQuickFilter('high_priority')} > <Target className="w-3 h-3 mr-1" /> - 높은우선순위 ({stats.highPriority}) + {t('documentList.quickFilters.highPriority')} ({stats.highPriority}) </Badge> </div> |
