summaryrefslogtreecommitdiff
path: root/lib/swp/table/swp-table-toolbar.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/swp/table/swp-table-toolbar.tsx')
-rw-r--r--lib/swp/table/swp-table-toolbar.tsx90
1 files changed, 45 insertions, 45 deletions
diff --git a/lib/swp/table/swp-table-toolbar.tsx b/lib/swp/table/swp-table-toolbar.tsx
index 276eca14..ab01a87d 100644
--- a/lib/swp/table/swp-table-toolbar.tsx
+++ b/lib/swp/table/swp-table-toolbar.tsx
@@ -140,7 +140,7 @@ export function SwpTableToolbar({
const loadDocumentClassInfo = async () => {
try {
- console.log(`[SwpTableToolbar] 프로젝트 ${projNo} 문서 정보 로드 시작`);
+ console.log(`[SwpTableToolbar] Start loading document info for project ${projNo}`);
// 서버 액션 호출
const result = await getDocumentClassInfoByProjectCode(projNo);
@@ -150,32 +150,32 @@ export function SwpTableToolbar({
setVendorDocNumberToDocClassMap(result.vendorDocNumberToDocClassMap);
setDocumentClassStages(result.documentClassStages);
- console.log(`[SwpTableToolbar] 문서 정보 로드 완료:`, {
+ console.log(`[SwpTableToolbar] Document info load complete:`, {
vendorDocNumbers: Object.keys(result.vendorDocNumberToDocClassMap).length,
documentClassStages: result.documentClassStages,
});
} else {
- console.warn(`[SwpTableToolbar] 문서 정보 로드 실패:`, result.error);
+ console.warn(`[SwpTableToolbar] Document info load failed:`, result.error);
setVendorDocNumberToDocClassMap({});
setDocumentClassStages({});
toast({
variant: "destructive",
- title: "문서 정보 로드 실패",
- description: result.error || "문서 정보를 가져올 수 없습니다.",
+ title: "Failed to load document info",
+ description: result.error || "Cannot retrieve document info.",
});
}
}
} catch (error) {
if (!isCancelled) {
- console.error('[SwpTableToolbar] 문서 정보 로드 실패:', error);
+ console.error('[SwpTableToolbar] Failed to load document info:', error);
setVendorDocNumberToDocClassMap({});
setDocumentClassStages({});
toast({
variant: "destructive",
- title: "문서 정보 로드 실패",
- description: "문서 정보를 가져올 수 없습니다. 페이지를 새로고침해주세요.",
+ title: "Failed to load document info",
+ description: "Cannot retrieve document info. Please refresh the page.",
});
}
}
@@ -197,8 +197,8 @@ export function SwpTableToolbar({
if (!projNo) {
toast({
variant: "destructive",
- title: "프로젝트 선택 필요",
- description: "파일을 업로드할 프로젝트를 먼저 선택해주세요.",
+ title: "Project selection required",
+ description: "Please select a project to upload files to first.",
});
onFilesProcessed?.();
return;
@@ -207,8 +207,8 @@ export function SwpTableToolbar({
if (!vendorCode) {
toast({
variant: "destructive",
- title: "업체 코드 오류",
- description: "벤더 정보를 가져올 수 없습니다.",
+ title: "Vendor code error",
+ description: "Cannot retrieve vendor info.",
});
onFilesProcessed?.();
return;
@@ -244,8 +244,8 @@ export function SwpTableToolbar({
if (!projNo) {
toast({
variant: "destructive",
- title: "프로젝트 선택 필요",
- description: "파일을 업로드할 프로젝트를 먼저 선택해주세요.",
+ title: "Project selection required",
+ description: "Please select a project to upload files to first.",
});
return;
}
@@ -253,8 +253,8 @@ export function SwpTableToolbar({
if (!vendorCode) {
toast({
variant: "destructive",
- title: "업체 코드 오류",
- description: "벤더 정보를 가져올 수 없습니다.",
+ title: "Vendor code error",
+ description: "Cannot retrieve vendor info.",
});
return;
}
@@ -304,8 +304,8 @@ export function SwpTableToolbar({
startUpload(async () => {
try {
toast({
- title: "파일 업로드 시작",
- description: `${validFiles.length}개 파일을 업로드합니다...`,
+ title: "File upload started",
+ description: `Uploading ${validFiles.length} files...`,
});
const formData = new FormData();
@@ -322,7 +322,7 @@ export function SwpTableToolbar({
});
if (!response.ok) {
- throw new Error(`업로드 실패: ${response.statusText}`);
+ throw new Error(`Upload failed: ${response.statusText}`);
}
const result = await response.json();
@@ -335,7 +335,7 @@ export function SwpTableToolbar({
setShowResultDialog(true);
toast({
- title: result.success ? "업로드 완료" : "일부 업로드 실패",
+ title: result.success ? "Upload complete" : "Some uploads failed",
description: result.message,
});
@@ -345,21 +345,21 @@ export function SwpTableToolbar({
onUploadComplete?.();
toast({
- title: "문서 목록 갱신 중",
- description: "외부 시스템 처리를 기다리는 중입니다...",
+ title: "Refreshing document list",
+ description: "Waiting for external system processing...",
});
// 2초 딜레이 후 새로고침
setTimeout(() => {
onRefresh();
toast({
- title: "갱신 완료",
- description: "업로드된 파일이 문서 목록에 반영되었습니다.",
+ title: "Refresh complete",
+ description: "Uploaded files have been reflected in the document list.",
});
}, 2000);
}
} catch (error) {
- console.error("파일 업로드 실패:", error);
+ console.error("File upload failed:", error);
// 검증 다이얼로그 닫기
setShowValidationDialog(false);
@@ -367,7 +367,7 @@ export function SwpTableToolbar({
const errorResults = validFiles.map((file) => ({
fileName: file.name,
success: false,
- error: error instanceof Error ? error.message : "알 수 없는 오류",
+ error: error instanceof Error ? error.message : "Unknown error",
}));
setUploadResults(errorResults);
@@ -444,7 +444,7 @@ export function SwpTableToolbar({
disabled={isRefreshing || !projNo}
>
<RefreshCw className={`h-4 w-4 mr-2 ${isRefreshing ? "animate-spin" : ""}`} />
- 새로고침
+ Refresh
</Button>
<Button
variant="outline"
@@ -453,7 +453,7 @@ export function SwpTableToolbar({
disabled={isUploading || !projNo}
>
<Upload className={`h-4 w-4 mr-2 ${isUploading ? "animate-pulse" : ""}`} />
- {isUploading ? "업로드 중..." : "파일 업로드"}
+ {isUploading ? "Uploading..." : "Upload File"}
</Button>
{/* 별도 탭으로 분리하고 메인 테이블로 변경하였음. */}
@@ -472,7 +472,7 @@ export function SwpTableToolbar({
{/* 검색 필터 */}
<div className="rounded-lg border p-4 space-y-4">
<div className="flex items-center justify-between">
- <h3 className="text-sm font-semibold">검색 필터</h3>
+ <h3 className="text-sm font-semibold">Search Filter</h3>
<Button
variant="ghost"
size="sm"
@@ -481,14 +481,14 @@ export function SwpTableToolbar({
disabled={isRefreshing}
>
<X className="h-4 w-4 mr-1" />
- 초기화
+ Reset
</Button>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{/* 프로젝트 번호 */}
<div className="space-y-2">
- <Label htmlFor="projNo">프로젝트 번호</Label>
+ <Label htmlFor="projNo">Project Number</Label>
{projects.length > 0 ? (
<Popover open={projectSearchOpen} onOpenChange={setProjectSearchOpen}>
<PopoverTrigger asChild>
@@ -507,7 +507,7 @@ export function SwpTableToolbar({
{"]"}
</span>
) : (
- <span className="text-muted-foreground">프로젝트 선택</span>
+ <span className="text-muted-foreground">Select Project</span>
)}
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
</Button>
@@ -517,7 +517,7 @@ export function SwpTableToolbar({
<div className="flex items-center border rounded-md px-3">
<Search className="h-4 w-4 mr-2 opacity-50" />
<Input
- placeholder="프로젝트 번호 또는 이름으로 검색..."
+ placeholder="Search by project number or name..."
value={projectSearch}
onChange={(e) => setProjectSearch(e.target.value)}
className="border-0 focus-visible:ring-0 focus-visible:ring-offset-0"
@@ -548,7 +548,7 @@ export function SwpTableToolbar({
))}
{filteredProjects.length === 0 && (
<div className="py-6 text-center text-sm text-muted-foreground">
- 검색 결과가 없습니다.
+ No search results.
</div>
)}
</div>
@@ -558,7 +558,7 @@ export function SwpTableToolbar({
) : (
<Input
id="projNo"
- placeholder="계약된 프로젝트가 없습니다"
+ placeholder="No contracted projects"
value={projNo}
disabled
className="bg-muted"
@@ -568,10 +568,10 @@ export function SwpTableToolbar({
{/* 문서 번호 */}
<div className="space-y-2">
- <Label htmlFor="docNo">문서 번호</Label>
+ <Label htmlFor="docNo">Document Number</Label>
<Input
id="docNo"
- placeholder="문서 번호 검색"
+ placeholder="Search Document Number"
value={localFilters.docNo || ""}
onChange={(e) =>
setLocalFilters({ ...localFilters, docNo: e.target.value })
@@ -582,10 +582,10 @@ export function SwpTableToolbar({
{/* 문서 제목 */}
<div className="space-y-2">
- <Label htmlFor="docTitle">문서 제목</Label>
+ <Label htmlFor="docTitle">Document Title</Label>
<Input
id="docTitle"
- placeholder="제목 검색"
+ placeholder="Search Title"
value={localFilters.docTitle || ""}
onChange={(e) =>
setLocalFilters({ ...localFilters, docTitle: e.target.value })
@@ -596,10 +596,10 @@ export function SwpTableToolbar({
{/* 패키지 번호 */}
<div className="space-y-2">
- <Label htmlFor="pkgNo">패키지</Label>
+ <Label htmlFor="pkgNo">Package</Label>
<Input
id="pkgNo"
- placeholder="패키지 번호"
+ placeholder="Package Number"
value={localFilters.pkgNo || ""}
onChange={(e) =>
setLocalFilters({ ...localFilters, pkgNo: e.target.value })
@@ -610,10 +610,10 @@ export function SwpTableToolbar({
{/* 스테이지 */}
<div className="space-y-2">
- <Label htmlFor="stage">스테이지</Label>
+ <Label htmlFor="stage">Stage</Label>
<Input
id="stage"
- placeholder="스테이지 입력 (예: IFC, IFA)"
+ placeholder="Enter Stage (e.g. IFC, IFA)"
value={localFilters.stage || ""}
onChange={(e) =>
setLocalFilters({ ...localFilters, stage: e.target.value })
@@ -624,7 +624,7 @@ export function SwpTableToolbar({
{/* 상태 */}
<div className="space-y-2">
- <Label htmlFor="status">상태</Label>
+ <Label htmlFor="status">Status</Label>
<Input
id="status"
placeholder="ex. standby.."
@@ -644,7 +644,7 @@ export function SwpTableToolbar({
disabled={isRefreshing}
>
<Search className={`h-4 w-4 mr-2 ${isRefreshing ? "animate-spin" : ""}`} />
- {isRefreshing ? "로딩 중..." : "검색"}
+ {isRefreshing ? "Loading..." : "Search"}
</Button>
</div>
</div>