Files
resolutionflow/docs/plans/2026-02-19-procedural-editor-redesign-design.md
chihlasm 9462d8b15a feat: procedural editor redesign with collapsible sections and DnD (#84)
* docs: add procedural/maintenance editor redesign design

Collapsible sections, fixed-height layout, drag-to-reorder steps,
maintenance schedule section, and step list UX improvements.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: add procedural editor redesign implementation plan

7 tasks across 7 phases: collapsible sections, fixed-height layout,
step list improvements, drag-to-reorder, maintenance schedule section.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: restructure procedural editor with collapsible sections and fixed-height layout

Convert scrolling document layout to fixed-height editor with accordion-mode
collapsible sections for Details and Intake Form. Step list now gets all
remaining height with independent scrolling. Add CollapsibleEditorSection
component with ARIA attributes (aria-expanded, aria-controls).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* 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>

* feat: add drag-to-reorder steps with @dnd-kit

Wrap step list in DndContext + SortableContext. Each step/section header
gets a SortableStepWrapper with useSortable. Drag handles have accessible
labels and keyboard support. procedure_end stays non-draggable and always
last. Expanded steps are disabled for dragging. Array-index reorder only.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add MaintenanceScheduleSection with schedule builder and summary

Schedule draft state is local UI only (not in store). Hydrates form from
existing schedule on load. Includes getScheduleSummary helper for collapsed
section display. Two-stage save: tree first, schedule second. Schedule
failure shows actionable error without rolling back tree save.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: wire maintenance schedule section into procedural editor

Add collapsible Schedule section for maintenance flows with accordion
integration. Schedule summary shows frequency, time, and target count
when collapsed. New maintenance flows default to schedule section expanded.
Two-stage save preserved: tree saved first, schedule managed independently.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: resolve lint issues in maintenance schedule and editor page

Move getScheduleSummary to scheduleUtils.ts to satisfy react-refresh
only-export-components rule. Add onScheduleLoaded to useEffect deps.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: add design and implementation revision documents

Revision docs correct original plans: schedule persistence via API
endpoints (not tree_structure), array-index reorder (no display_order),
store minimum-one-step invariant, accordion mode, ARIA requirements,
and two-stage save orchestration with failure handling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: auto-seed PR environments with SEED_ON_DEPLOY flag

Release command now runs migrations + seeds test users when
SEED_ON_DEPLOY=true. Tree seeding runs as a background task
on startup via HTTP API. Everything is idempotent and non-fatal.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: add httpx to requirements for PR environment seeding

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: seed all flow types (v2, procedural, maintenance) on deploy

Runs seed_trees, seed_trees_v2, seed_procedural_flows, and
seed_maintenance_flows sequentially as background tasks when
SEED_ON_DEPLOY=true. Each script failure is non-fatal.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: trigger redeploy for full seed

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 08:39:25 -05:00

12 KiB

Procedural & Maintenance Editor Redesign — Design

Date: 2026-02-19 Scope: Restructure the procedural/maintenance flow editor for better space utilization, collapsible sections, drag-to-reorder steps, and maintenance-specific schedule management

Overview

The current procedural editor (ProceduralEditorPage.tsx) uses a scrolling document layout where Details, Intake Form, and Steps stack vertically. The Details and Intake Form sections consume significant screen space, pushing the step list — the core editing surface — to the bottom. This redesign converts the page to a fixed-height editor with collapsible sections and drag-to-reorder steps.

Problems Solved

  1. Steps buried at the bottom — Details and Intake Form sections are "screen space goblins" that push the step list down, especially on smaller screens
  2. No drag reorder — grip handles are visible but non-functional; reordering requires deleting and re-creating steps
  3. Adding steps is tedious — new steps append at the bottom but don't auto-expand, requiring an extra click
  4. No overview at a glance — collapsed sections don't show useful summaries; users expand just to check what's there
  5. Maintenance flows lack inline schedule management — schedule/targets are only configurable on the detail page, not during initial creation

Layout Architecture

Current Layout (Scrolling Document)

┌─────────────────────────────────────┐
│ Header (back, title, save, publish) │  ← scrolls with page
├─────────────────────────────────────┤
│ Details Card (~200px)               │  ← always expanded
│   Name, Description, Tags, Public   │
├─────────────────────────────────────┤
│ Intake Form Card (~150-400px)       │  ← always expanded
│   Field editors...                  │
├─────────────────────────────────────┤
│ Steps Card (whatever's left)        │  ← pushed to bottom
│   Step list...                      │
└─────────────────────────────────────┘
         ↕ entire page scrolls

New Layout (Fixed-Height Editor)

┌─────────────────────────────────────┐
│ Toolbar (sticky)                    │  ← fixed, never scrolls
├─────────────────────────────────────┤
│ ▶ Details: "DC Build" · 3 tags · … │  ← collapsed one-liner
│ ▶ Intake Form: 3 fields: Host, …   │  ← collapsed one-liner
│ ▶ Schedule: Mon 2:00 AM · 5 targets│  ← maintenance only
├─────────────────────────────────────┤
│                                     │
│  Steps (flex-1, scrolls alone)      │  ← gets all remaining height
│  ┌─ 1. Check prerequisites ───────┐│
│  ├─ 2. Install AD DS role ────────┤│
│  ├─ 3. Promote to DC ────────────┤│
│  ├─ 4. Verify replication ───────┤│
│  └─ + Add Step ───────────────────┘│
│                                     │
└─────────────────────────────────────┘

Key Layout Changes

  • Page: container mx-auto scrolling → flex flex-col h-full overflow-hidden
  • Toolbar: Scrolls with page → sticky at top (matches troubleshooting editor pattern)
  • Sections: Always-expanded cards → collapsible one-liners with rich summaries
  • Step list: Stacked in scroll flow → flex-1 overflow-y-auto (independent scrolling)

Collapsible Sections

Shared Wrapper: CollapsibleEditorSection

A reusable component used by Details, Intake Form, and Maintenance Schedule.

Props:

  • title — section label ("Details", "Intake Form", "Schedule")
  • icon — Lucide icon component
  • summary — rich one-line summary string shown when collapsed
  • defaultExpanded — whether to start expanded (default: false)
  • children — expanded content
  • onEdit — optional callback for the Edit button (alternative to expanding)

Collapsed state: Single row with icon, title, summary text, and expand chevron. Entire row is clickable.

Expanded state: Full content slides down with a subtle animation. Collapse chevron rotates.

Accordion mode: Single-open by default — expanding one section collapses others. Controlled by parent page component.

Accessibility:

  • Toggle button has aria-expanded and aria-controls pointing to section content id
  • Content region has matching id
  • Keyboard operable (Enter/Space to toggle)
  • Focus remains stable after toggle

Details Section — Collapsed Summary

Format: "Flow Name" · N tags · Public/Private

Examples:

  • "Domain Controller Build" · 3 tags · Public
  • "New Procedure" · No tags · Private (new flow, default expanded)

New flow behavior: Details section starts expanded when creating a new flow (name is required), collapses after the user provides a name and clicks away or expands another section.

Intake Form Section — Collapsed Summary

Format: N fields: Field1, Field2, Field3 (field names truncated if many)

Examples:

  • 3 fields: Hostname, Domain Name, IP Address
  • 6 fields: Hostname, Domain, IP, DNS, Gateway, … (truncated with ellipsis)
  • No fields defined (empty state)

Maintenance Schedule Section

Only renders when treeType === 'maintenance'.

New flow (no schedule): Section starts expanded with:

  • Cron expression builder (frequency picker: daily/weekly/monthly + time + timezone)
  • Target list selector (dropdown of saved target lists, or create new inline)
  • These fields write to local UI draft state (NOT tree_structure)
  • On save: tree saved first, then schedule created via maintenanceSchedulesApi.create with resulting tree_id
  • If schedule create fails: tree save remains successful, show actionable error, preserve draft

Existing flow (has schedule): Collapsed summary:

  • Format: "Every Monday at 2:00 AM UTC · 5 targets"
  • Expand to modify schedule and targets

Existing flow (no schedule yet): Shows collapsed with summary "No schedule configured" + "Set Up" button that expands the section.

Step List Improvements

Empty State

When the step list has 0 steps, show a centered empty state instead of a blank area:

        ┌──────────────────────────┐
        │     📋                    │
        │  Add your first step     │
        │                          │
        │  Steps define the actions │
        │  engineers follow during  │
        │  this procedure.          │
        │                          │
        │  [+ Add Step]  [+ Section]│
        └──────────────────────────┘

When 1-2 steps exist, the list renders normally — no special treatment needed since the steps themselves fill the space adequately.

Step Count + Time in Header

The Steps section header shows aggregate info:

  • Steps (4 steps · ~25 min estimated) — when steps have time estimates
  • Steps (4 steps) — when no time estimates set
  • Steps (0 steps) — empty state (note: store currently enforces minimum one procedure_step, so 0-step state only appears if invariant is intentionally changed)

Auto-Expand New Steps

When addStep() is called, the new step is automatically expanded (setExpandedStepId(newStep.id)) and the step list scrolls to the bottom to show it. This eliminates the extra click to start editing.

Same for addSectionHeader() — auto-expand for immediate title editing.

Drag-to-Reorder

Library: @dnd-kit/core + @dnd-kit/sortable

Behavior:

  • Drag via the GripVertical handle on each step card
  • Dragged card lifts with shadow-lg and slight scale
  • Drop target: blue insertion line between steps
  • Section headers are draggable — moving a section header moves it independently (steps below stay in place)
  • On drop: update the store's step array order (array-index based only, no display_order recalculation)
  • Keyboard accessible: focus grip handle, Enter/Space to pick up, arrow keys to move, Enter to drop, Escape to cancel

Implementation:

  • Wrap step list in <DndContext> + <SortableContext>
  • Each step card wrapped in useSortable() hook
  • Drag overlay shows a simplified card (just step number + title)
  • onDragEnd handler reorders the steps array in the procedural editor store

Collapsed Step Cards

Current cards are already compact. Minor tightening:

  • Step number badge + content type icon + title + time estimate + chevron + delete (on hover)
  • No changes to the collapsed card layout — it's already well-designed

Toolbar

Matches the troubleshooting editor's toolbar pattern:

┌─────────────────────────────────────────────────────────────┐
│ ← Back   Edit Procedure — DC Build   [Unsaved]  │ Save │ Publish │
└─────────────────────────────────────────────────────────────┘
  • Left: Back button (→ /my-trees), flow type icon, title with flow name
  • Right: Unsaved indicator, Save Draft button, Publish button (gradient)
  • Sticky: sticky top-0 z-10 within the editor area (not the app shell)

Maintenance flows show Wrench icon + "Edit Maintenance Flow" title.

File Changes

Modified Files

File Changes
ProceduralEditorPage.tsx Layout restructure: scrolling → fixed-height, collapsible sections, toolbar refactor
StepList.tsx Drag reorder with @dnd-kit, auto-expand on add, empty state, step count header
IntakeFormBuilder.tsx Wrap in collapsible section with field-name summary
proceduralEditorStore.ts reorderSteps(fromIndex, toIndex) action, auto-expand on add

New Files

File Purpose
components/procedural-editor/CollapsibleEditorSection.tsx Shared collapsible wrapper with summary display
components/procedural-editor/MaintenanceScheduleSection.tsx Schedule builder + collapsed summary for maintenance flows

Existing Dependencies Used

  • @dnd-kit/core — drag-and-drop framework (already installed)
  • @dnd-kit/sortable — sortable preset for ordered lists (already installed)
  • @dnd-kit/utilities — CSS utilities for transforms (already installed)

Existing APIs Used

  • frontend/src/api/maintenanceSchedules.ts — schedule CRUD via separate endpoints (NOT tree_structure)
  • frontend/src/api/targetLists.ts — target list selection for schedules

Unchanged

  • StepEditor.tsx — inline step editing form, no changes
  • IntakeFieldEditor.tsx — field editor, no changes
  • proceduralEditorStore.ts steps/intakeForm data model — no schema changes
  • Backend — no API changes needed
  • Troubleshooting tree editor — completely separate, unaffected

Not Included (YAGNI)

  • No drag-to-reorder intake form fields (low value, fields rarely reordered)
  • No inline cron expression text input (use friendly frequency picker instead)
  • No step templates or presets
  • No bulk step operations (select multiple, delete, move)
  • No step preview/dry-run from the editor
  • No undo/redo for the procedural editor (separate effort)