diff --git a/apps/fabro-web/app/layouts/app-shell.tsx b/apps/fabro-web/app/layouts/app-shell.tsx index 86109fa39..d46784581 100644 --- a/apps/fabro-web/app/layouts/app-shell.tsx +++ b/apps/fabro-web/app/layouts/app-shell.tsx @@ -76,7 +76,7 @@ export default function AppShell({ loaderData }: any) {
- + Fabro
diff --git a/apps/fabro-web/app/routes/runs.tsx b/apps/fabro-web/app/routes/runs.tsx index a9f0c2fe3..4113c42c1 100644 --- a/apps/fabro-web/app/routes/runs.tsx +++ b/apps/fabro-web/app/routes/runs.tsx @@ -1,6 +1,6 @@ import { useState, useCallback, useEffect, useRef } from "react"; import { Link, useRevalidator } from "react-router"; -import { ChevronDownIcon, ChevronRightIcon, MagnifyingGlassIcon } from "@heroicons/react/24/outline"; +import { ChevronDownIcon, ChevronRightIcon, CommandLineIcon, MagnifyingGlassIcon } from "@heroicons/react/24/outline"; import { DndContext, closestCenter, @@ -510,6 +510,107 @@ function SortableRunRow({ run }: { run: RunWithStatus }) { ); } +function TerminalLine({ prompt, command }: { prompt: string; command: string }) { + return ( +
+ {prompt} + {command} +
+ ); +} + +const GETTING_STARTED_COMMANDS = "fabro repo init && fabro run hello"; + +function CopyButton({ text }: { text: string }) { + const [copied, setCopied] = useState(false); + + function handleCopy() { + navigator.clipboard.writeText(text); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } + + return ( + + ); +} + +function EmptyState() { + return ( +
+
+

+ Workflow runs will appear here as you run them. +

+ +
+
+ + Quick start +
+
+
+ + +
+ +
+
+ +
+

Resources

+ +
+
+
+ ); +} + export default function Runs({ loaderData }: any) { const initialColumns = loaderData.columns; const allRepos = [ @@ -575,6 +676,8 @@ export default function Runs({ loaderData }: any) { ); }, []); + const totalRuns = columns.reduce((sum, col) => sum + col.items.length, 0); + const filteredColumns = columns.map((col) => ({ ...col, items: col.items.filter( @@ -639,53 +742,63 @@ export default function Runs({ loaderData }: any) {
{view === "columns" ? ( -
- {filteredColumns.map((col) => ( -
- -
- ))} -
- ) : ( -
- {filteredColumns.map((col) => { - const isCollapsed = collapsed.has(col.id); - return ( -
- - {!isCollapsed && (col.items.length > 0 ? ( - item.id)} strategy={verticalListSortingStrategy}> -
- {col.items.map((item) => ( - - ))} -
-
- ) : ( -

No runs

- ))} + <> +
+ {filteredColumns.map((col) => ( +
+
- ); - })} -
+ ))} +
+ {totalRuns === 0 && ( + + )} + + ) : ( + <> +
+ {filteredColumns.map((col) => { + const isCollapsed = collapsed.has(col.id); + return ( +
+ + {!isCollapsed && (col.items.length > 0 ? ( + item.id)} strategy={verticalListSortingStrategy}> +
+ {col.items.map((item) => ( + + ))} +
+
+ ) : ( +

No runs

+ ))} +
+ ); + })} +
+ {totalRuns === 0 && ( + + )} + )}