Files
formbricks/apps/web/modules/workflows/loading.tsx
T
Javi Aguilar d3c04876bf Squashed commit of the following:
commit 0ab6c07139dc603749e9d07dc971dac9800c0c75
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 20:36:56 2026 +0200

    fix to stop running pnpm install when dev server stops

commit c5bf0f30b3d2b44607b9be3e79f343463f7302ce
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 20:17:50 2026 +0200

    docs(workbench): emphasize token-efficient context gathering

commit e0bd91b3b8f65ec03e8c29d57fd66163bce01493
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 20:15:57 2026 +0200

    chore(workbench): add review gates, validator, and rename skills

    - Add human review gate lines to milestones, plans, templates, and require completion before downstream work.
    - Add workbench/scripts/validate-workbench.mjs to check structure, required sections, links, review gates, and placeholders.
    - Rename create-milestone, create-plan, document-decision, and generate-changelog skills under a workbench- prefix and symlink skills/ into .claude, .codex, and .cursor.
    - Update AGENTS.md, GUIDE.md, README.md, and checkpoints with review-gate rules, validator usage, and checkpoint proportionality guidance.

commit 370ade8fdaab98778f1ceb499ec604270c0d156d
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 19:48:12 2026 +0200

    chore: improve workflow dir structure and add skills

commit ab1f17004f1d60c91ae9f1618f360864dca36cb4
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 18:38:44 2026 +0200

    feat(workflows): add workspace runs page, create-workflow dialog,  improve loading states

    - Add /workspaces/[id]/workflows/runs page listing runs across all
      workflows, backed by new GET /api/v3/workflows/runs endpoint.
    - Replace inline "new workflow" action with a dialog capturing name and
      optional description; persist description on Workflow model and v3
      API.
    - Add loading skeletons for workflow list, builder, and runs pages, and
      a Beta badge in the main navigation workflows group.

commit c16872f7f59983a8fb04ce8d1704016c8d0d69f2
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 05:35:31 2026 +0200

    fix(a11y): avoid layout shift with loading button state

commit 872c8ecdfbf0ba5db4beea3e383731f791b06520
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 05:35:08 2026 +0200

    feat(workflows): polish builder/list and rename "active" to "enabled"

    - Rename WorkflowStatus enum value from "active" to "enabled" across DB, schema, types, API, and locales.
    - Extract workflow builder editor state to Jotai atoms.
    - Add list row dropdown with delete dialog and unique-name on create.
    - Add snap-to-grid, reorganize, and status pill to the canvas.

commit 4b5d679b0d936cd5b8fc200352288b0c641afd6a
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 04:20:53 2026 +0200

    feat(workflows): implement initial PoC of the MVP

commit a2f8eb4b25bd1a3042bc96a886d7d669b104a9e3
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 02:58:53 2026 +0200

    docs(workbench): complete 001-000 workflows PoC readiness

commit ef78ba5d2e3bc8b40c32b9966556554f430b51e2
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 02:26:23 2026 +0200

    docs(workbench): reframe workflows MVP as PoC and add 001-010 vertical slice plan

commit fa17580ca8c9be31500118b56daf1652bef5e077
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Fri May 22 02:07:39 2026 +0200

    docs(workbench): add workflows MVP blueprint, milestone, plans, and research

commit 8d3163f8fe8af7c8d85a4dec8af0d87ae5e8c460
Author: Javi Aguilar <122741+itsjavi@users.noreply.github.com>
Date:   Thu May 21 22:13:47 2026 +0200

    chore: add workbench blueprint, cowork, and guidelines scaffolding
2026-05-22 20:45:12 +02:00

176 lines
6.9 KiB
TypeScript

import { PageContentWrapper } from "@/modules/ui/components/page-content-wrapper";
const SkeletonBlock = ({ className }: Readonly<{ className: string }>) => (
<div className={`animate-pulse rounded-md bg-slate-200 ${className}`} />
);
const WorkflowLoadingHeader = ({
cta = false,
tabs = false,
}: Readonly<{ cta?: boolean; tabs?: boolean }>) => {
return (
<div className="border-b border-slate-200">
<div className="flex items-center justify-between gap-4 pb-4">
<SkeletonBlock className="h-9 w-56" />
{cta ? <SkeletonBlock className="h-9 w-36" /> : null}
</div>
{tabs ? (
<div className="flex animate-pulse gap-6 pb-3">
<div className="h-4 w-20 rounded bg-slate-200" />
<div className="h-4 w-16 rounded bg-slate-200" />
</div>
) : null}
</div>
);
};
const WorkflowRunsTableSkeleton = ({
showWorkflowColumn = false,
}: Readonly<{ showWorkflowColumn?: boolean }>) => {
const runColumnSpan = showWorkflowColumn ? "col-span-2" : "col-span-3";
return (
<div className="overflow-hidden rounded-lg border border-slate-200 bg-white">
<div className="grid grid-cols-12 gap-4 border-b border-slate-200 bg-slate-50 px-4 py-3">
<SkeletonBlock className={`${runColumnSpan} h-4`} />
{showWorkflowColumn ? <SkeletonBlock className="col-span-2 h-4" /> : null}
<SkeletonBlock className="col-span-2 h-4" />
<SkeletonBlock className="col-span-3 h-4" />
<SkeletonBlock className="col-span-2 h-4" />
<SkeletonBlock className="col-span-1 h-4" />
</div>
{[0, 1, 2, 3].map((row) => (
<div
key={row}
className="grid grid-cols-12 gap-4 border-b border-slate-100 px-4 py-4 last:border-b-0">
<SkeletonBlock className={`${runColumnSpan} h-4`} />
{showWorkflowColumn ? <SkeletonBlock className="col-span-2 h-4" /> : null}
<SkeletonBlock className="col-span-2 h-6 rounded-full" />
<SkeletonBlock className="col-span-3 h-4" />
<SkeletonBlock className="col-span-2 h-4" />
<SkeletonBlock className="col-span-1 h-4" />
</div>
))}
</div>
);
};
export const WorkflowsListLoading = () => {
return (
<PageContentWrapper>
<WorkflowLoadingHeader cta />
<div className="flex-col space-y-3">
<div className="mt-6 grid w-full grid-cols-10 place-items-center gap-3 px-6 pr-8">
<SkeletonBlock className="col-span-3 h-4 place-self-start" />
<SkeletonBlock className="col-span-2 h-4" />
<SkeletonBlock className="col-span-2 h-4" />
<SkeletonBlock className="col-span-1 h-4" />
<SkeletonBlock className="col-span-2 h-4" />
</div>
{[0, 1, 2, 3].map((row) => (
<div
key={row}
className="grid w-full grid-cols-10 place-items-center gap-3 rounded-xl border border-slate-200 bg-white p-4 pr-8 shadow-sm">
<div className="col-span-3 flex w-full flex-col gap-2 justify-self-start">
<SkeletonBlock className="h-4 w-44" />
<SkeletonBlock className="h-3 w-64" />
</div>
<SkeletonBlock className="col-span-2 h-6 w-20 rounded-full" />
<SkeletonBlock className="col-span-2 h-4 w-24" />
<SkeletonBlock className="col-span-1 h-4 w-16" />
<SkeletonBlock className="col-span-2 h-4 w-32" />
</div>
))}
</div>
</PageContentWrapper>
);
};
export const WorkspaceWorkflowRunsLoading = () => {
return (
<PageContentWrapper>
<WorkflowLoadingHeader />
<WorkflowRunsTableSkeleton showWorkflowColumn />
</PageContentWrapper>
);
};
export const WorkflowRunsLoading = () => {
return (
<PageContentWrapper>
<WorkflowLoadingHeader tabs />
<WorkflowRunsTableSkeleton />
</PageContentWrapper>
);
};
export const WorkflowBuilderLoading = () => {
return (
<PageContentWrapper className="space-y-4">
<WorkflowLoadingHeader cta tabs />
<div className="grid max-w-3xl gap-4 md:grid-cols-2">
<div className="space-y-2">
<SkeletonBlock className="h-4 w-28" />
<SkeletonBlock className="h-10 w-full" />
</div>
<div className="space-y-2">
<SkeletonBlock className="h-4 w-40" />
<SkeletonBlock className="h-10 w-full" />
</div>
</div>
<div className="relative h-[680px] overflow-hidden rounded-lg border border-slate-200 bg-slate-50">
<div className="absolute left-4 top-4 z-10 flex items-center gap-2 rounded-lg border border-slate-200 bg-white/95 p-2 shadow-card-sm">
<SkeletonBlock className="h-8 w-36" />
<SkeletonBlock className="h-8 w-28" />
</div>
<div className="absolute left-1/2 top-24 h-32 w-72 -translate-x-1/2 rounded-lg border border-slate-200 bg-white p-3 shadow-card-sm">
<SkeletonBlock className="h-9 w-full" />
<SkeletonBlock className="mt-4 h-4 w-56" />
<SkeletonBlock className="mt-2 h-4 w-48" />
</div>
<div className="absolute left-1/2 top-72 h-32 w-72 -translate-x-1/2 rounded-lg border border-slate-200 bg-white p-3 shadow-card-sm">
<SkeletonBlock className="h-9 w-full" />
<SkeletonBlock className="mt-4 h-4 w-48" />
<SkeletonBlock className="mt-2 h-4 w-40" />
</div>
<div className="absolute bottom-4 right-4 top-4 w-96 rounded-lg border border-slate-200 bg-white p-4 shadow-card-md">
<SkeletonBlock className="h-5 w-40" />
<SkeletonBlock className="mt-6 h-4 w-28" />
<SkeletonBlock className="mt-2 h-10 w-full" />
<SkeletonBlock className="mt-5 h-4 w-32" />
<SkeletonBlock className="mt-2 h-10 w-full" />
</div>
</div>
</PageContentWrapper>
);
};
export const WorkflowRunDetailLoading = () => {
return (
<PageContentWrapper>
<WorkflowLoadingHeader tabs />
<div className="grid grid-cols-12 gap-6">
<section className="col-span-4 space-y-6 rounded-lg border border-slate-200 bg-white p-4">
<SkeletonBlock className="h-4 w-20" />
<SkeletonBlock className="h-6 w-24 rounded-full" />
<SkeletonBlock className="h-4 w-28" />
<SkeletonBlock className="h-4 w-48" />
<SkeletonBlock className="h-4 w-24" />
<SkeletonBlock className="h-4 w-56" />
</section>
<section className="col-span-8 space-y-4">
<div className="rounded-lg border border-slate-200 bg-white p-4">
<SkeletonBlock className="h-5 w-36" />
<SkeletonBlock className="mt-3 h-48 w-full rounded-lg" />
</div>
<div className="rounded-lg border border-slate-200 bg-white p-4">
<SkeletonBlock className="h-5 w-32" />
<SkeletonBlock className="mt-3 h-32 w-full rounded-lg" />
<SkeletonBlock className="mt-3 h-32 w-full rounded-lg" />
</div>
</section>
</div>
</PageContentWrapper>
);
};