mirror of
https://github.com/formbricks/formbricks.git
synced 2026-05-23 19:49:08 -05:00
d3c04876bf
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
176 lines
6.9 KiB
TypeScript
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>
|
|
);
|
|
};
|