From 089c70ffbe2303ab5e2611a152ddd3aed0e6e718 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Mon, 1 Sep 2025 09:09:15 +0000 Subject: (최겸) 구매 pq, 기본정보 수정 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/pq-input/pq-input-tabs.tsx | 34 ++++++++++++++++++++++++++----- components/pq-input/pq-review-wrapper.tsx | 23 ++++++++++++++++++++- 2 files changed, 51 insertions(+), 6 deletions(-) (limited to 'components/pq-input') diff --git a/components/pq-input/pq-input-tabs.tsx b/components/pq-input/pq-input-tabs.tsx index 0c3b2276..7ae6d16a 100644 --- a/components/pq-input/pq-input-tabs.tsx +++ b/components/pq-input/pq-input-tabs.tsx @@ -159,6 +159,27 @@ export function PQInputTabs({ const shouldDisableInput = isReadOnly; + // 코드 순서로 정렬하는 함수 (1-1-1, 1-1-2, 1-2-1 순서) + const sortByCode = (items: any[]) => { + return [...items].sort((a, b) => { + const parseCode = (code: string) => { + return code.split('-').map(part => parseInt(part, 10)) + } + + const aCode = parseCode(a.code) + const bCode = parseCode(b.code) + + for (let i = 0; i < Math.max(aCode.length, bCode.length); i++) { + const aPart = aCode[i] || 0 + const bPart = bCode[i] || 0 + if (aPart !== bPart) { + return aPart - bPart + } + } + return 0 + }) + } + // ---------------------------------------------------------------------- // A) Create initial form values // Mark items as "saved" if they have existing answer or attachments @@ -167,7 +188,10 @@ export function PQInputTabs({ const answers: PQFormValues["answers"] = [] data.forEach((group) => { - group.items.forEach((item) => { + // 그룹 내 아이템들을 코드 순서로 정렬 + const sortedItems = sortByCode(group.items) + + sortedItems.forEach((item) => { // Check if the server item is already "complete" const hasExistingAnswer = item.answer && item.answer.trim().length > 0 const hasExistingAttachments = item.attachments && item.attachments.length > 0 @@ -634,7 +658,7 @@ export function PQInputTabs({ disabled={isSaving || !isAnyItemDirty || shouldDisableInput} onClick={handleSaveAll} > - {isSaving ? "Saving..." : "Save All"} + {isSaving ? "Saving..." : "임시 저장"} @@ -644,7 +668,7 @@ export function PQInputTabs({ disabled={!allSaved || isSubmitting || shouldDisableInput} onClick={handleSubmitPQ} > - {isSubmitting ? "Submitting..." : "Submit PQ"} + {isSubmitting ? "Submitting..." : "최종 제출"} @@ -655,7 +679,7 @@ export function PQInputTabs({ {/* 2-column grid */}
- {group.items.map((item) => { + {sortByCode(group.items).map((item) => { const { criteriaId, code, checkPoint, description, contractInfo, additionalRequirement } = item const answerIndex = getAnswerIndex(criteriaId) if (answerIndex === -1) return null @@ -670,7 +694,7 @@ export function PQInputTabs({ return ( - +
diff --git a/components/pq-input/pq-review-wrapper.tsx b/components/pq-input/pq-review-wrapper.tsx index 1056189e..cc0f1b40 100644 --- a/components/pq-input/pq-review-wrapper.tsx +++ b/components/pq-input/pq-review-wrapper.tsx @@ -67,6 +67,27 @@ export function PQReviewWrapper({ const [shiComments, setShiComments] = React.useState>({}) const [isUpdatingComment, setIsUpdatingComment] = React.useState(null) + // 코드 순서로 정렬하는 함수 (1-1-1, 1-1-2, 1-2-1 순서) + const sortByCode = (items: any[]) => { + return [...items].sort((a, b) => { + const parseCode = (code: string) => { + return code.split('-').map(part => parseInt(part, 10)) + } + + const aCode = parseCode(a.code) + const bCode = parseCode(b.code) + + for (let i = 0; i < Math.max(aCode.length, bCode.length); i++) { + const aPart = aCode[i] || 0 + const bPart = bCode[i] || 0 + if (aPart !== bPart) { + return aPart - bPart + } + } + return 0 + }) + } + // 기존 SHI 코멘트를 로컬 상태에 초기화 React.useEffect(() => { const initialComments: Record = {} @@ -344,7 +365,7 @@ export function PQReviewWrapper({

{group.groupName}

- {group.items.map((item) => ( + {sortByCode(group.items).map((item) => (
-- cgit v1.2.3