diff --git a/frontend/src/lib/components/assets/AssetGraph/AssetGraphCanvas.svelte b/frontend/src/lib/components/assets/AssetGraph/AssetGraphCanvas.svelte index 97e691da37..e72a9e0bd4 100644 --- a/frontend/src/lib/components/assets/AssetGraph/AssetGraphCanvas.svelte +++ b/frontend/src/lib/components/assets/AssetGraph/AssetGraphCanvas.svelte @@ -236,8 +236,7 @@ pathPrefix, defaultPathSuffix, producers: producersByAsset.get(`${a.kind}:${a.path}`) ?? [], - onRunProducer, - onSelectAsset: () => onselect?.({ kind: 'asset', asset_kind: a.kind, path: a.path }) + onRunProducer } }) } @@ -279,12 +278,6 @@ : undefined, downstreamCount: downstreamByScript.get(r.path) ?? 0, runState, - onSelectSelf: () => - onselect?.({ - kind: 'runnable', - runnable_kind: r.usage_kind, - path: r.path - }), onRequestRemove: onRunnableMenuRemove ? () => onRunnableMenuRemove({ diff --git a/frontend/src/lib/components/assets/AssetGraph/AssetNode.svelte b/frontend/src/lib/components/assets/AssetGraph/AssetNode.svelte index c7a91b1a4e..f6faf420b0 100644 --- a/frontend/src/lib/components/assets/AssetGraph/AssetNode.svelte +++ b/frontend/src/lib/components/assets/AssetGraph/AssetNode.svelte @@ -47,10 +47,6 @@ // cached draft content). Without this callback, the play button // is hidden — runs only make sense in editor contexts. onRunProducer?: (producer: AssetProducer) => Promise - // Forwarded from the canvas. Called when the user runs producers - // from this node so the page can auto-select the asset and open - // the runs panel — matches what clicking the node would do. - onSelectAsset?: () => void } // SvelteFlow injects this on the node component when the user clicks // the node. Combined with our own `hovered` state to drive the @@ -75,11 +71,6 @@ e.stopPropagation() if (!$workspaceStore || running || !data.onRunProducer) return if (scriptProducers.length === 0) return - // Select the asset so the runs panel opens (or refocuses) on this - // node — without this, dispatching a run silently goes off into the - // void with no UI feedback when the panel was closed or pointed at - // a different node. - if (!selected) data.onSelectAsset?.() running = true const handler = data.onRunProducer try { diff --git a/frontend/src/lib/components/assets/AssetGraph/PipelineAlphaAckModal.svelte b/frontend/src/lib/components/assets/AssetGraph/PipelineAlphaAckModal.svelte new file mode 100644 index 0000000000..c7731715b3 --- /dev/null +++ b/frontend/src/lib/components/assets/AssetGraph/PipelineAlphaAckModal.svelte @@ -0,0 +1,38 @@ + + + +
+
+
+ +
+
+

+ Pipelines is an alpha feature preview. + The API, on-disk format, and UI are still evolving and may change without notice. +

+

+ Pipelines built today may need migration as the feature stabilizes. Avoid relying on them + for production workloads until they leave alpha. +

+
+
+
+ +
+
+
diff --git a/frontend/src/lib/components/assets/AssetGraph/PipelinePickerModal.svelte b/frontend/src/lib/components/assets/AssetGraph/PipelinePickerModal.svelte index 81eed45c3a..bf85c8b455 100644 --- a/frontend/src/lib/components/assets/AssetGraph/PipelinePickerModal.svelte +++ b/frontend/src/lib/components/assets/AssetGraph/PipelinePickerModal.svelte @@ -3,13 +3,11 @@ import { base } from '$lib/base' import { goto } from '$app/navigation' import Button from '$lib/components/common/button/Button.svelte' - import TextInput from '$lib/components/text_input/TextInput.svelte' - import Select from '$lib/components/select/Select.svelte' + import FolderPicker from '$lib/components/FolderPicker.svelte' import Modal from '$lib/components/common/modal/Modal.svelte' - import { FolderService, OpenAPI } from '$lib/gen' + import { OpenAPI } from '$lib/gen' import { resource } from 'runed' - import { sendUserToast } from '$lib/utils' - import { ArrowRight, FolderPlus, Loader2 } from 'lucide-svelte' + import { ArrowRight, Loader2 } from 'lucide-svelte' interface PipelineFolder { folder: string @@ -38,53 +36,21 @@ } ) - let allFolders = resource( - () => $workspaceStore, - async (ws) => { - if (!ws) return [] as string[] - return await FolderService.listFolderNames({ workspace: ws }) - } - ) - - let selectedExistingFolder = $state(undefined) - let newFolderName = $state('') - let creatingFolder = $state(false) + let pickedFolder = $state('') let visiblePipelines = $derived( (pipelines.current ?? []).filter((p) => p.folder !== currentFolder) ) - let foldersWithoutPipeline = $derived.by(() => { - const existing = new Set((pipelines.current ?? []).map((p) => p.folder)) - return (allFolders.current ?? []).filter((f) => !existing.has(f) && f !== currentFolder) - }) - async function openExistingPipeline(folder: string) { open = false await goto(`${base}/pipeline/${encodeURIComponent(folder)}`) } - async function startInExistingFolder() { - if (!selectedExistingFolder) return - await openExistingPipeline(selectedExistingFolder) - } - - async function createFolderAndStart() { - const name = newFolderName.trim() - if (!name || !$workspaceStore) return - creatingFolder = true - try { - await FolderService.createFolder({ - workspace: $workspaceStore, - requestBody: { name } - }) - sendUserToast(`Created folder f/${name}`) - await openExistingPipeline(name) - } catch (e: any) { - sendUserToast(`Failed to create folder: ${e?.body ?? e?.message ?? e}`, true) - } finally { - creatingFolder = false - } + async function openPicked() { + const name = pickedFolder.trim() + if (!name) return + await openExistingPipeline(name) } @@ -124,53 +90,22 @@

- Start in an existing folder + Pick or create a folder

-
-