fix: workflow editor Phase 5/6 sign-off — save guard, conflict detection, dispatch pre-check

- Save button disabled for non-admins (canSave prop threaded through
  WorkflowEditor → WorkflowCanvas → WorkflowCanvasToolbar); tooltip
  explains why when hovered
- Optimistic concurrency: migration 072 adds updated_at to
  workflow_definitions; PUT /workflows/:id returns 409 when client sends
  a stale updated_at; frontend shows a specific reload-prompt toast
- _legacy_dispatch now routes through dispatch_order_line_render instead
  of calling render_order_line_task directly, so cancelled/rejected
  order lines are skipped before queueing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 11:39:02 +02:00
co-authored by Claude Sonnet 4.6
parent 53b19f2ba1
commit e8b4580608
9 changed files with 71 additions and 10 deletions
@@ -705,7 +705,7 @@ def dispatch_render_with_workflow(order_line_id: str) -> dict:
def _legacy_dispatch(order_line_id: str) -> dict:
"""Queue render_order_line_task (the working Celery render implementation)."""
from app.tasks.step_tasks import render_order_line_task
render_order_line_task.delay(order_line_id)
"""Queue via dispatch_order_line_render so cancelled/rejected pre-checks apply."""
from app.tasks.step_tasks import dispatch_order_line_render
dispatch_order_line_render.delay(order_line_id)
return {"backend": "celery", "queued": True}