feat: AI flow builder, visibility model, dashboard tabs, fork UI (#88)

- AI flow builder: scaffold → branch detail → assemble → review flow
- Generate All one-click branch generation with stop/cancel
- Regenerate scaffold suggestions button
- 3-action review screen: Start Flow, Open in Editor, Build Another
- Fix Publish button gated behind !isDirty
- Fix visibility column enforcement in tree access filter
- Add ?visibility filter and author_name to GET /trees
- Dashboard tabbed flows: My Flows / My Team / Public / All
- Create button in My Flows tab, window focus reload (stale data fix)
- Fork UI with optional reason modal
- Fix account_id nullability in User type and schema
- Keep is_public and visibility in sync on updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit was merged in pull request #88.
This commit is contained in:
chihlasm
2026-02-24 07:40:44 -05:00
committed by GitHub
parent 97cd297f46
commit ed4ab059bf
41 changed files with 1909 additions and 315 deletions

View File

@@ -11,8 +11,10 @@ import {
ResponsiveContainer,
} from 'recharts'
import { Spinner } from '@/components/common/Spinner'
import { EmptyState } from '@/components/common/EmptyState'
import { analyticsApi } from '@/api'
import { usePermissions } from '@/hooks/usePermissions'
import { toast } from '@/lib/toast'
import type { TeamAnalyticsResponse, AnalyticsPeriod } from '@/types'
const CHART_COLORS = {
@@ -46,6 +48,12 @@ export default function TeamAnalyticsPage() {
.finally(() => setLoading(false))
}, [period, isAccountOwner, isSuperAdmin])
useEffect(() => {
if (!isAccountOwner && !isSuperAdmin) {
toast.info('Viewing your personal analytics', { id: 'analytics-redirect' })
}
}, [isAccountOwner, isSuperAdmin])
if (!isAccountOwner && !isSuperAdmin) {
return <Navigate to="/analytics/me" replace />
}
@@ -60,8 +68,11 @@ export default function TeamAnalyticsPage() {
if (!data) {
return (
<div className="flex items-center justify-center min-h-[60vh]">
<p className="text-muted-foreground">Failed to load analytics data.</p>
<div className="container mx-auto px-4 py-6 sm:px-6 sm:py-8">
<EmptyState
title="Analytics unavailable"
description="Failed to load analytics data. Please try again."
/>
</div>
)
}