feat: add step count with time estimate header and auto-scroll to new steps
Remove outer card wrapper from StepList (now rendered in scrolling container). Header shows total estimated minutes when steps have time estimates. Auto-scrolls to newly added steps using ref + scrollIntoView. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import { useRef, useEffect } from 'react'
|
||||||
import { Plus, GripVertical, Trash2, ChevronDown, CheckCircle2, AlertTriangle, Info, Zap, Shield, SeparatorHorizontal } from 'lucide-react'
|
import { Plus, GripVertical, Trash2, ChevronDown, CheckCircle2, AlertTriangle, Info, Zap, Shield, SeparatorHorizontal } from 'lucide-react'
|
||||||
import type { StepContentType } from '@/types'
|
import type { StepContentType } from '@/types'
|
||||||
import { StepEditor } from './StepEditor'
|
import { StepEditor } from './StepEditor'
|
||||||
@@ -24,16 +25,35 @@ export function StepList() {
|
|||||||
} = useProceduralEditorStore()
|
} = useProceduralEditorStore()
|
||||||
|
|
||||||
const procedureSteps = steps.filter((s) => s.type === 'procedure_step')
|
const procedureSteps = steps.filter((s) => s.type === 'procedure_step')
|
||||||
|
const totalMinutes = steps
|
||||||
|
.filter(s => s.type === 'procedure_step' && s.estimated_minutes)
|
||||||
|
.reduce((sum, s) => sum + (s.estimated_minutes || 0), 0)
|
||||||
|
|
||||||
|
// Auto-scroll to new steps
|
||||||
|
const scrollTargetRef = useRef<HTMLDivElement>(null)
|
||||||
|
const prevStepCount = useRef(steps.length)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (steps.length > prevStepCount.current) {
|
||||||
|
// Scroll the newly expanded step into view
|
||||||
|
setTimeout(() => {
|
||||||
|
scrollTargetRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' })
|
||||||
|
}, 50)
|
||||||
|
}
|
||||||
|
prevStepCount.current = steps.length
|
||||||
|
}, [steps.length])
|
||||||
|
|
||||||
let stepCounter = 0
|
let stepCounter = 0
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="bg-card border border-border rounded-2xl p-4 sm:p-6">
|
<div>
|
||||||
<div className="mb-4 flex items-center justify-between">
|
<div className="mb-4 flex items-center justify-between">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Shield className="h-5 w-5 text-muted-foreground" />
|
<Shield className="h-5 w-5 text-muted-foreground" />
|
||||||
<h2 className="text-lg font-semibold text-foreground">Steps</h2>
|
<h2 className="text-lg font-semibold text-foreground">Steps</h2>
|
||||||
<span className="text-sm text-muted-foreground">
|
<span className="text-sm text-muted-foreground">
|
||||||
({procedureSteps.length} step{procedureSteps.length !== 1 ? 's' : ''})
|
({procedureSteps.length} step{procedureSteps.length !== 1 ? 's' : ''}
|
||||||
|
{totalMinutes > 0 ? ` \u00b7 ~${totalMinutes} min` : ''})
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
@@ -81,7 +101,7 @@ export function StepList() {
|
|||||||
|
|
||||||
if (isExpanded) {
|
if (isExpanded) {
|
||||||
return (
|
return (
|
||||||
<div key={step.id}>
|
<div key={step.id} ref={expandedStepId === step.id ? scrollTargetRef : undefined}>
|
||||||
<StepEditor
|
<StepEditor
|
||||||
step={step}
|
step={step}
|
||||||
stepNumber={0}
|
stepNumber={0}
|
||||||
@@ -125,7 +145,7 @@ export function StepList() {
|
|||||||
|
|
||||||
if (isExpanded) {
|
if (isExpanded) {
|
||||||
return (
|
return (
|
||||||
<div key={step.id}>
|
<div key={step.id} ref={expandedStepId === step.id ? scrollTargetRef : undefined}>
|
||||||
<StepEditor
|
<StepEditor
|
||||||
step={step}
|
step={step}
|
||||||
stepNumber={stepNumber}
|
stepNumber={stepNumber}
|
||||||
@@ -195,6 +215,8 @@ export function StepList() {
|
|||||||
<Plus className="h-3.5 w-3.5" />
|
<Plus className="h-3.5 w-3.5" />
|
||||||
Add Step
|
Add Step
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
<div ref={scrollTargetRef} />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user