From 3771971f3ead1cdd8007df939a3384c9371f919c Mon Sep 17 00:00:00 2001 From: Hyein Date: Thu, 25 Jun 2026 16:19:09 +0900 Subject: [PATCH] Improve search and comparison flow UI --- src/App.jsx | 595 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 436 insertions(+), 159 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 29f7e87..bec0762 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -223,6 +223,7 @@ const defaultContent = { deliverables: cheonjiinDeliverables, format: 'glb', programType: 'internal', + programNote: '', predecessors: [], successors: [], mergeGroup: '' @@ -234,6 +235,7 @@ const defaultContent = { format: '', deliverables: ['기본설계 모델'], programType: 'internal', + programNote: '', predecessors: [], successors: [], mergeGroup: '', @@ -250,6 +252,7 @@ function normalizeStoredContent(parsed) { ...defaultContent.cheonjiin, ...(parsed.cheonjiin ?? {}), programType: getProgramType(parsed.cheonjiin?.programType ?? defaultContent.cheonjiin.programType), + programNote: parsed.cheonjiin?.programNote ?? '', predecessors: parsed.cheonjiin?.predecessors ?? [], successors: parsed.cheonjiin?.successors ?? [], mergeGroup: parsed.cheonjiin?.mergeGroup ?? '', @@ -262,6 +265,7 @@ function normalizeStoredContent(parsed) { ...defaultContent.wayPrimal, ...(parsed.wayPrimal ?? {}), programType: getProgramType(parsed.wayPrimal?.programType ?? defaultContent.wayPrimal.programType), + programNote: parsed.wayPrimal?.programNote ?? '', predecessors: parsed.wayPrimal?.predecessors ?? [], successors: parsed.wayPrimal?.successors ?? [], mergeGroup: parsed.wayPrimal?.mergeGroup ?? '', @@ -278,6 +282,7 @@ function normalizeStoredContent(parsed) { extraPrograms: (parsed.extraPrograms ?? []).map((program, index, programs) => ({ ...program, programType: getProgramType(program.programType), + programNote: program.programNote ?? '', predecessors: program.predecessors ?? [], successors: program.successors ?? [], mergeGroup: program.mergeGroup ?? '', @@ -475,13 +480,15 @@ function splitDeliverableText(item) { .filter(Boolean); } -function FlowCard({ step, index, total, accent, status, isEditing, onChange }) { +function FlowCard({ step, index, total, accent, status, isEditing, onChange, searchMatched = false }) { const Icon = step.icon ?? pickStepIcon(step); return (
- {status === 'active' ? '재진입' : status === 'completed' ? '통과' : `${String(index + 1).padStart(2, '0')} / ${String(total).padStart(2, '0')}`} + {searchMatched ? '검색' : status === 'active' ? '재진입' : status === 'completed' ? '통과' : `${String(index + 1).padStart(2, '0')} / ${String(total).padStart(2, '0')}`}
{isEditing ? ( @@ -550,6 +559,7 @@ function FlowCard({ step, index, total, accent, status, isEditing, onChange }) { function FlowRow({ label, description, + programNote = '', steps, accent, onLabelClick, @@ -562,13 +572,15 @@ function FlowRow({ onDeliverableChange, onLabelChange, onDescriptionChange, + onProgramNoteChange, programType, onProgramTypeChange, onAddStep, onRemoveStep, onMoveStep, onProgramDelete, - rowRef + rowRef, + searchMatchedStepIds = [] }) { const activeIndex = steps.findIndex((step) => step.id === activeStep); @@ -596,6 +608,14 @@ function FlowRow({ setStepWindowStart((current) => Math.min(current, maxWindowStart)); }, [maxWindowStart]); + useEffect(() => { + if (!searchMatchedStepIds.length) return; + const matchedIndex = steps.findIndex((step) => searchMatchedStepIds.includes(step.id)); + if (matchedIndex < 0) return; + if (matchedIndex >= stepWindowStart && matchedIndex < stepWindowStart + maxVisibleSteps) return; + setStepWindowStart(Math.min(maxWindowStart, Math.max(0, matchedIndex - maxVisibleSteps + 1))); + }, [searchMatchedStepIds, steps, stepWindowStart, maxWindowStart]); + const moveStepWindow = (direction) => { setStepWindowStart((current) => Math.min(maxWindowStart, Math.max(0, current + direction))); }; @@ -610,6 +630,7 @@ function FlowRow({ status={getStatus(index)} isEditing={isEditing} onChange={onStepChange} + searchMatched={searchMatchedStepIds.includes(step.id)} /> {isEditing && (onMoveStep || onRemoveStep) && (
@@ -724,6 +745,21 @@ function FlowRow({ ) : (

{description}

)} + {isEditing && onProgramNoteChange ? ( +