From 140cfde885d3af8ea29dc36dc79e7714a63be8e4 Mon Sep 17 00:00:00 2001 From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com> Date: Wed, 29 Oct 2025 22:02:09 +0100 Subject: [PATCH] Show Assets toggle (#6985) * Show Assets toggle * Fix flow graph not updating when manuallly changing ambiguous asset R/W --- .../lib/components/graph/FlowGraphV2.svelte | 51 ++++++++++--------- .../graph/renderers/edges/BaseEdge.svelte | 7 ++- .../graph/renderers/nodes/AssetNode.svelte | 4 +- frontend/src/lib/utils.ts | 2 +- 4 files changed, 36 insertions(+), 28 deletions(-) diff --git a/frontend/src/lib/components/graph/FlowGraphV2.svelte b/frontend/src/lib/components/graph/FlowGraphV2.svelte index 9a29ba41f5..951afeed81 100644 --- a/frontend/src/lib/components/graph/FlowGraphV2.svelte +++ b/frontend/src/lib/components/graph/FlowGraphV2.svelte @@ -61,6 +61,7 @@ import type { AssetWithAltAccessType } from '../assets/lib' let useDataflow: Writable = writable(false) + let showAssets: Writable = writable(true) const triggerContext = getContext('TriggerContext') @@ -188,7 +189,8 @@ setContext<{ selectedId: Writable useDataflow: Writable - }>('FlowGraphContext', { selectedId, useDataflow }) + showAssets: Writable + }>('FlowGraphContext', { selectedId, useDataflow, showAssets }) if (triggerContext && allowSimplifiedPoll) { if (isSimplifiable(modules)) { @@ -396,24 +398,32 @@ ) let newNodes: (Node & NodeLayout)[] = layoutedNodes.map((n) => ({ ...n, ...graph.nodes[n.id] })) - let assetNodesResult = computeAssetNodes( - newNodes.map((n) => ({ - data: { assets: n.data?.assets as AssetWithAltAccessType[] }, - id: n.id, - position: n.position + let assetNodesResult = $showAssets + ? computeAssetNodes( + newNodes.map((n) => ({ + data: { assets: n.data?.assets as AssetWithAltAccessType[] }, + id: n.id, + position: n.position + })) + ) + : undefined + if (assetNodesResult) { + newNodes = newNodes.map((n) => ({ + ...n, + position: assetNodesResult.newNodePositions[n.id] })) - ) - newNodes = newNodes.map((n) => ({ - ...n, - position: assetNodesResult.newNodePositions[n.id] - })) + } let aiToolNodesResult = computeAIToolNodes(newNodes, eventHandler, insertable, flowModuleStates) nodes = [ ...newNodes.map((n) => ({ ...n, position: aiToolNodesResult.newNodePositions[n.id] })), - ...assetNodesResult.newAssetNodes, + ...(assetNodesResult?.newAssetNodes ?? []), ...aiToolNodesResult.toolNodes ] - edges = [...assetNodesResult.newAssetEdges, ...aiToolNodesResult.toolEdges, ...graph.edges] + edges = [ + ...(assetNodesResult?.newAssetEdges ?? []), + ...aiToolNodesResult.toolEdges, + ...graph.edges + ] await tick() height = Math.max(...nodes.map((n) => n.position.y + NODE.height + 100), minHeight) @@ -503,7 +513,7 @@ }) $effect(() => { - ;[graph, allowSimplifiedPoll] + ;[graph, allowSimplifiedPoll, $showAssets] untrack(() => updateStores()) }) @@ -611,20 +621,15 @@ + {#if showDataflow} - + {/if} diff --git a/frontend/src/lib/components/graph/renderers/edges/BaseEdge.svelte b/frontend/src/lib/components/graph/renderers/edges/BaseEdge.svelte index 8f86b6f572..5c5858e36d 100644 --- a/frontend/src/lib/components/graph/renderers/edges/BaseEdge.svelte +++ b/frontend/src/lib/components/graph/renderers/edges/BaseEdge.svelte @@ -14,8 +14,9 @@ import type { GraphModuleState } from '../../model' import InsertModuleButton from '$lib/components/flows/map/InsertModuleButton.svelte' - const { useDataflow } = getContext<{ + const { useDataflow, showAssets } = getContext<{ useDataflow: Writable + showAssets?: Writable }>('FlowGraphContext') let { @@ -81,7 +82,9 @@ diff --git a/frontend/src/lib/components/graph/renderers/nodes/AssetNode.svelte b/frontend/src/lib/components/graph/renderers/nodes/AssetNode.svelte index 5ecb61bd41..3d82c81367 100644 --- a/frontend/src/lib/components/graph/renderers/nodes/AssetNode.svelte +++ b/frontend/src/lib/components/graph/renderers/nodes/AssetNode.svelte @@ -206,7 +206,7 @@ newAssetEdges: allAssetEdges, newNodePositions: Object.fromEntries(sortedNewNodes.map((n) => [n.id, n.position])) } - computeAssetNodesCache = [nodes, ret] + computeAssetNodesCache = [clone(nodes), ret] return ret } @@ -226,7 +226,7 @@ import { getContext } from 'svelte' import ExploreAssetButton, { assetCanBeExplored } from '../../../ExploreAssetButton.svelte' import { Tooltip } from '$lib/components/meltComponents' - import { pluralize } from '$lib/utils' + import { clone, pluralize } from '$lib/utils' import AssetGenericIcon from '$lib/components/icons/AssetGenericIcon.svelte' import type { Edge, Node } from '@xyflow/svelte' diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index 26f87888c4..b19e8f2eca 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -1522,7 +1522,7 @@ export function scroll_into_view_if_needed_polyfill(elem: Element, centerIfNeede return observer // return for testing } -// Structured clone raises an error on $state values +// Structured clone raises an error on $state values and some stuff like Window // $state.snapshot clones everything but prints warnings for some values (e.g. functions) import _clone from 'clone' export function clone(t: T): T {