From cbb4c7fe0b94459162ad5e998bc05cd293e0ff96 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Mon, 11 Aug 2025 09:02:00 +0000 Subject: (대표님) 입찰, EDP 변경사항 대응, spreadJS 오류 수정, 벤더실사 수정 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/form-data/add-formTag-dialog.tsx | 58 +- components/form-data/delete-form-data-dialog.tsx | 67 +- .../form-data/form-data-report-batch-dialog.tsx | 57 +- components/form-data/form-data-report-dialog.tsx | 26 +- .../form-data-report-temp-upload-dialog.tsx | 116 ++-- .../form-data/form-data-report-temp-upload-tab.tsx | 53 +- .../form-data-report-temp-uploaded-list-tab.tsx | 37 +- components/form-data/form-data-table-columns.tsx | 108 ++- components/form-data/form-data-table.tsx | 33 +- components/form-data/sedp-compare-dialog.tsx | 233 +++---- components/form-data/sedp-components.tsx | 50 +- components/form-data/sedp-excel-download.tsx | 43 +- components/form-data/spreadJS-dialog.tsx | 736 +++++++++++++-------- components/form-data/update-form-sheet.tsx | 55 +- components/form-data/var-list-download-btn.tsx | 28 +- 15 files changed, 1042 insertions(+), 658 deletions(-) (limited to 'components/form-data') diff --git a/components/form-data/add-formTag-dialog.tsx b/components/form-data/add-formTag-dialog.tsx index 2cd336a0..9d80de8c 100644 --- a/components/form-data/add-formTag-dialog.tsx +++ b/components/form-data/add-formTag-dialog.tsx @@ -1,7 +1,7 @@ "use client" import * as React from "react" -import { useRouter } from "next/navigation" +import { useParams, useRouter } from "next/navigation"; import { useForm, useFieldArray } from "react-hook-form" import { toast } from "sonner" import { Loader2, ChevronsUpDown, Check, Plus, Trash2, Copy } from "lucide-react" @@ -57,6 +57,7 @@ import { getTagTypeByDescription, getSubfieldsByTagTypeForForm } from "@/lib/forms/services" +import { useTranslation } from "@/i18n/client"; // Form-specific tag mapping interface interface FormTagMapping { @@ -107,6 +108,9 @@ export function AddFormTagDialog({ onOpenChange: externalOnOpenChange }: AddFormTagDialogProps) { const router = useRouter() + const params = useParams(); + const lng = (params?.lng as string) || "ko"; + const { t } = useTranslation(lng, "engineering"); // Use external control if provided, otherwise use internal state const [internalOpen, setInternalOpen] = React.useState(false); @@ -439,7 +443,7 @@ export function AddFormTagDialog({ // --------------- // Render Class field // --------------- - function renderClassField(field: any) { + function renderClassField(field: any) { const [popoverOpen, setPopoverOpen] = React.useState(false) const buttonId = React.useMemo( @@ -460,7 +464,7 @@ export function AddFormTagDialog({ return ( - Class + {t("labels.class")} @@ -473,13 +477,13 @@ export function AddFormTagDialog({ > {isLoadingClasses ? ( <> - 클래스 로딩 중... + {t("messages.loadingClasses")} ) : ( <> - {field.value || "클래스 선택..."} + {field.value || t("placeholders.selectClass")} @@ -490,10 +494,10 @@ export function AddFormTagDialog({ - 검색 결과가 없습니다. + {t("messages.noSearchResults")} {classOptions.map((className, optIndex) => { if (!classOptionIdsRef.current[className]) { @@ -553,7 +557,7 @@ export function AddFormTagDialog({ return ( - Tag Type + {t("labels.tagType")} {isReadOnly ? (
@@ -569,7 +573,7 @@ export function AddFormTagDialog({ key={`tag-type-placeholder-${inputId}`} {...field} readOnly - placeholder="클래스 선택시 자동으로 결정됩니다" + placeholder={t("placeholders.autoSetByClass")} className="h-9 bg-muted" /> )} @@ -587,7 +591,7 @@ export function AddFormTagDialog({ return (
-
필드 로딩 중...
+
{t("messages.loadingFields")}
) } @@ -595,7 +599,7 @@ export function AddFormTagDialog({ if (subFields.length === 0 && selectedTagTypeCode) { return (
- 이 태그 유형에 대한 필드가 없습니다. + {t("messages.noFieldsForTagType")}
) } @@ -603,7 +607,7 @@ export function AddFormTagDialog({ if (subFields.length === 0) { return (
- 태그 데이터를 입력하려면 먼저 상단에서 클래스를 선택하세요. + {t("messages.selectClassFirst")}
) } @@ -612,10 +616,10 @@ export function AddFormTagDialog({
{/* 헤더 */}
-

태그 항목 ({fields.length}개)

+

{t("sections.tagItems")} ({fields.length}개)

{!areAllTagNosValid && ( - 유효하지 않은 태그 존재 + {t("messages.invalidTagsExist")} )}
@@ -628,10 +632,10 @@ export function AddFormTagDialog({ # -
Tag No
+
{t("labels.tagNo")}
-
Description
+
{t("labels.description")}
{/* Subfields */} @@ -653,7 +657,7 @@ export function AddFormTagDialog({ ))} - Actions + {t("labels.actions")}
@@ -711,7 +715,7 @@ export function AddFormTagDialog({ @@ -793,7 +797,7 @@ export function AddFormTagDialog({ -

행 복제

+

{t("tooltips.duplicateRow")}

@@ -816,7 +820,7 @@ export function AddFormTagDialog({ -

행 삭제

+

{t("tooltips.deleteRow")}

@@ -837,7 +841,7 @@ export function AddFormTagDialog({ disabled={!selectedTagTypeCode || isLoadingSubFields} > - 새 행 추가 + {t("buttons.addRow")}
@@ -877,16 +881,16 @@ export function AddFormTagDialog({ )} - 폼 태그 추가 - {formName || formCode} + {t("dialogs.addFormTag")} - {formName || formCode} - 클래스를 선택하여 태그 유형과 하위 필드를 로드한 다음, 여러 행을 추가하여 여러 태그를 생성하세요. + {t("dialogs.selectClassToLoadFields")} @@ -934,7 +938,7 @@ export function AddFormTagDialog({ }} disabled={isSubmitting} > - 취소 + {t("buttons.cancel")} diff --git a/components/form-data/delete-form-data-dialog.tsx b/components/form-data/delete-form-data-dialog.tsx index ca2f8729..9298b43b 100644 --- a/components/form-data/delete-form-data-dialog.tsx +++ b/components/form-data/delete-form-data-dialog.tsx @@ -3,6 +3,8 @@ import * as React from "react" import { Loader, Trash } from "lucide-react" import { toast } from "sonner" +import { useParams } from "next/navigation" +import { useTranslation } from "@/i18n/client" import { useMediaQuery } from "@/hooks/use-media-query" import { Button } from "@/components/ui/button" @@ -55,22 +57,26 @@ export function DeleteFormDataDialog({ }: DeleteFormDataDialogProps) { const [isDeletePending, startDeleteTransition] = React.useTransition() const isDesktop = useMediaQuery("(min-width: 640px)") + + const params = useParams(); + const lng = (params?.lng as string) || "ko"; + const { t } = useTranslation(lng, "engineering"); // TAG_NO가 있는 항목들만 필터링 - const validItems = formData.filter(item => item.TAG_NO?.trim()) - const tagNos = validItems.map(item => item.TAG_NO).filter(Boolean) as string[] + const validItems = formData.filter(item => item.TAG_IDX?.trim()) + const tagIdxs = validItems.map(item => item.TAG_IDX).filter(Boolean) as string[] function onDelete() { startDeleteTransition(async () => { - if (tagNos.length === 0) { - toast.error("No valid items to delete") + if (tagIdxs.length === 0) { + toast.error(t("delete.noValidItems")) return } const result = await deleteFormDataByTags({ formCode, contractItemId, - tagNos, + tagIdxs, }) if (result.error) { @@ -88,12 +94,15 @@ export function DeleteFormDataDialog({ // 데이터 불일치 경고 console.warn(`Data inconsistency: FormEntries deleted: ${deletedCount}, Tags deleted: ${deletedTagsCount}`) toast.error( - `Deleted ${deletedCount} form entries and ${deletedTagsCount} tags (data inconsistency detected)` + t("delete.dataInconsistency", { deletedCount, deletedTagsCount }) ) } else { // 정상적인 삭제 완료 toast.success( - `Successfully deleted ${deletedCount} item${deletedCount === 1 ? "" : "s"}` + t("delete.successMessage", { + count: deletedCount, + items: deletedCount === 1 ? t("delete.item") : t("delete.items") + }) ) } @@ -101,7 +110,7 @@ export function DeleteFormDataDialog({ }) } - const itemCount = tagNos.length + const itemCount = tagIdxs.length const hasValidItems = itemCount > 0 if (isDesktop) { @@ -115,24 +124,25 @@ export function DeleteFormDataDialog({ disabled={!hasValidItems} >