From a3d75ba10ae85e5ecb55351555879be7fe0bfcca Mon Sep 17 00:00:00 2001
From: Diego Imbert <70353967+diegoimbert@users.noreply.github.com>
Date: Wed, 4 Feb 2026 19:48:51 +0100
Subject: [PATCH] feat: favorite datatable and ducklake tables + asset page
nits (#7795)
* update cf worker hostname
* set remote_url cookie from param
* ephemeral backends v1
* nit
* Run queue server
* ntis
* timeout
* better db process management
* commit hash and worktree
* nit use map
* nit
* err handling
* Revert "err handling"
This reverts commit 19de00c0c0b1904f87cc41424db36ae2ab866277.
* nits
* auto cleanup
* Ephemeral backend command action
* remove checkout
* checkout ee repo
* nits
* process.env.GIT_EE_DEPLOY_KEY_FILE
* resumeURLs logic
* nit
* use windmill flow for ephemeral backend action
* fixes
* new token
* worktree pools
* Delete GH secret on cleanup
* linux deploy
* nit
* nit
* unhandled promises
* nit
* fix docker bridge IP on linux
* pass cf_frontend_url to wmill flow
* git fetch
* release worktree when binary started
* send error
* logger
* logging
* logging 2
* delete log files periodically
* redirect to raw app with logs
* CORS
* MANAGER_AUTH_TOKEN
* Check organization membership
* nit
* bwrap
* nit
* return timeoutAt in resumeUrl
* nit
* Change password
* nit remove https
* Settings icon instead of plain text
* doc link
* favorite icon
* Better favorites state logic
* Asset favorites
* nit fixes and better label display
* global db manager drawer
* Favorites menu open db manager
* favorites in assets page + backend refactor
* Delete favorite dropdown
* parseFavoriteAsset
* git fail
* nit
* git fail
* nit
* nits
* git fail
* Table2 instead of pyramid
---
...204152754_add_asset_favorite_kind.down.sql | 1 +
...60204152754_add_asset_favorite_kind.up.sql | 10 ++
backend/windmill-api/openapi.yaml | 28 ++-
backend/windmill-api/src/assets.rs | 27 +++
backend/windmill-api/src/favorite.rs | 1 +
.../lib/components/CompareWorkspaces.svelte | 6 +-
frontend/src/lib/components/DBManager.svelte | 22 ++-
.../lib/components/DBManagerContent.svelte | 5 +
.../src/lib/components/DBManagerDrawer.svelte | 3 +
.../src/lib/components/DucklakePicker.svelte | 7 +-
.../src/lib/components/ResourcePicker.svelte | 7 +-
frontend/src/lib/components/Star.svelte | 34 +---
.../display/table/theme/windmill-theme.css | 15 +-
.../assets/AssetsDropdownButton.svelte | 6 +-
.../components/assets/JobAssetsViewer.svelte | 6 +-
.../lib/components/common/table/AppRow.svelte | 7 -
.../components/common/table/FlowRow.svelte | 7 -
.../components/common/table/RawAppRow.svelte | 7 -
.../lib/components/common/table/Row.svelte | 8 +-
.../components/common/table/ScriptRow.svelte | 7 -
.../components/flows/FlowAssetsHandler.svelte | 3 -
frontend/src/lib/components/flows/types.ts | 2 -
.../graph/renderers/nodes/AssetNode.svelte | 4 +-
frontend/src/lib/components/home/Item.svelte | 4 -
.../components/meltComponents/MenuItem.svelte | 1 +
.../components/sidebar/FavoriteMenu.svelte | 160 ++++++++++++++----
.../components/sidebar/OperatorMenu.svelte | 19 ++-
.../DataTableSettings.svelte | 6 +-
.../workspaceSettings/DucklakeSettings.svelte | 6 +-
frontend/src/lib/stores.ts | 6 +-
frontend/src/lib/utils.ts | 32 +++-
.../src/routes/(root)/(logged)/+layout.svelte | 97 +++++++----
.../(root)/(logged)/assets/+page.svelte | 107 +++++++++---
.../(logged)/flows/get/[...path]/+page.svelte | 13 +-
.../(root)/(logged)/resources/+page.svelte | 12 +-
.../scripts/get/[...hash]/+page.svelte | 14 +-
36 files changed, 457 insertions(+), 243 deletions(-)
create mode 100644 backend/migrations/20260204152754_add_asset_favorite_kind.down.sql
create mode 100644 backend/migrations/20260204152754_add_asset_favorite_kind.up.sql
diff --git a/backend/migrations/20260204152754_add_asset_favorite_kind.down.sql b/backend/migrations/20260204152754_add_asset_favorite_kind.down.sql
new file mode 100644
index 0000000000..d2f607c5b8
--- /dev/null
+++ b/backend/migrations/20260204152754_add_asset_favorite_kind.down.sql
@@ -0,0 +1 @@
+-- Add down migration script here
diff --git a/backend/migrations/20260204152754_add_asset_favorite_kind.up.sql b/backend/migrations/20260204152754_add_asset_favorite_kind.up.sql
new file mode 100644
index 0000000000..fb19331c49
--- /dev/null
+++ b/backend/migrations/20260204152754_add_asset_favorite_kind.up.sql
@@ -0,0 +1,10 @@
+-- Add up migration script here
+
+DO
+$do$
+BEGIN
+ ALTER TYPE FAVORITE_KIND ADD VALUE 'asset';
+EXCEPTION WHEN OTHERS THEN
+ RAISE NOTICE 'Couldn''t create FAVORITE_KIND::asset: %', SQLERRM;
+END
+$do$;
diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml
index 4ca0fc21f4..b951c4aff7 100644
--- a/backend/windmill-api/openapi.yaml
+++ b/backend/windmill-api/openapi.yaml
@@ -15018,7 +15018,7 @@ paths:
type: string
favorite_kind:
type: string
- enum: [flow, app, script, raw_app]
+ enum: [flow, app, script, raw_app, asset]
responses:
"200":
description: star item
@@ -15041,7 +15041,7 @@ paths:
type: string
favorite_kind:
type: string
- enum: [flow, app, script, raw_app]
+ enum: [flow, app, script, raw_app, asset]
responses:
"200":
description: unstar item
@@ -16671,6 +16671,30 @@ paths:
access_type:
$ref: "#/components/schemas/AssetUsageAccessType"
+ /w/{workspace}/assets/list_favorites:
+ get:
+ summary: List all favorite assets for the authenticated user
+ operationId: listFavoriteAssets
+ tags:
+ - asset
+ parameters:
+ - $ref: "#/components/parameters/WorkspaceId"
+ responses:
+ "200":
+ description: list of favorite assets
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ type: object
+ required: [path]
+ properties:
+ path:
+ type: string
+ description: The asset path
+
+
/mcp/w/{workspace}/list_tools:
get:
summary: list available MCP tools
diff --git a/backend/windmill-api/src/assets.rs b/backend/windmill-api/src/assets.rs
index 7afea4038f..6a53c90ebd 100644
--- a/backend/windmill-api/src/assets.rs
+++ b/backend/windmill-api/src/assets.rs
@@ -18,6 +18,7 @@ pub fn workspaced_service() -> Router {
Router::new()
.route("/list", get(list_assets))
.route("/list_by_usages", post(list_assets_by_usages))
+ .route("/list_favorites", get(list_favorites))
}
#[derive(Deserialize)]
@@ -286,3 +287,29 @@ async fn list_assets_by_usages(
}
Ok(Json(assets_vec))
}
+
+async fn list_favorites(
+ authed: ApiAuthed,
+ Path(w_id): Path,
+ Extension(user_db): Extension,
+) -> JsonResult> {
+ let mut tx = user_db.begin(&authed).await?;
+
+ let favorites = sqlx::query_scalar!(
+ r#"SELECT
+ jsonb_strip_nulls(jsonb_build_object(
+ 'path', favorite.path
+ )) as "favorite_asset!: _"
+ FROM favorite
+ WHERE favorite.workspace_id = $1
+ AND favorite.usr = $2
+ AND favorite_kind = 'asset'
+ "#,
+ &w_id,
+ &authed.username
+ )
+ .fetch_all(&mut *tx)
+ .await?;
+
+ Ok(Json(favorites))
+}
diff --git a/backend/windmill-api/src/favorite.rs b/backend/windmill-api/src/favorite.rs
index 75c7b19bb2..d3e3456e0f 100644
--- a/backend/windmill-api/src/favorite.rs
+++ b/backend/windmill-api/src/favorite.rs
@@ -31,6 +31,7 @@ pub enum FavoriteKind {
App,
#[allow(non_camel_case_types)]
Raw_App,
+ Asset,
}
#[derive(Deserialize)]
pub struct Favorite {
diff --git a/frontend/src/lib/components/CompareWorkspaces.svelte b/frontend/src/lib/components/CompareWorkspaces.svelte
index 9e19720a1b..2546868041 100644
--- a/frontend/src/lib/components/CompareWorkspaces.svelte
+++ b/frontend/src/lib/components/CompareWorkspaces.svelte
@@ -112,7 +112,6 @@
} else if (kind === 'folder') {
const folder = await FolderService.getFolder({ workspace, name: path.slice(2) })
return folder.summary
-
}
} catch (error) {
console.error(`Failed to fetch summary for ${kind}:${path}`, error)
@@ -122,7 +121,9 @@
async function fetchSummaries(diffs: WorkspaceItemDiff[]) {
// Only fetch summaries for scripts, flows, and apps
- const itemsToFetch = diffs.filter((diff) => ['script', 'flow', 'app', 'folder'].includes(diff.kind))
+ const itemsToFetch = diffs.filter((diff) =>
+ ['script', 'flow', 'app', 'folder'].includes(diff.kind)
+ )
for (const diff of itemsToFetch) {
const key = getItemKey(diff)
@@ -915,7 +916,6 @@
kind={diff.kind}
canFavorite={false}
workspaceId=""
- starred={false}
>
{#snippet customSummary()}
{#if oldSummary != newSummary && isSelectable && existsInBothWorkspaces}
diff --git a/frontend/src/lib/components/DBManager.svelte b/frontend/src/lib/components/DBManager.svelte
index 482288a62f..3000eb2d5f 100644
--- a/frontend/src/lib/components/DBManager.svelte
+++ b/frontend/src/lib/components/DBManager.svelte
@@ -23,6 +23,8 @@
import { resource } from 'runed'
import { capitalize, onlyAlphaNumAndUnderscore, pluralize } from '$lib/utils'
import type { DbFeatures } from './apps/components/display/dbtable/dbFeatures'
+ import Star from './Star.svelte'
+ import type { Asset } from '$lib/gen'
/** Represents a selected table with its schema */
export interface SelectedTable {
@@ -50,6 +52,7 @@
/** Tables that are already added and should show as disabled */
disabledTables?: SelectedTable[]
features?: DbFeatures
+ asset?: Asset
}
let {
dbType,
@@ -67,7 +70,8 @@
multiSelectMode = false,
selectedTables = $bindable([]),
disabledTables = [],
- features
+ features,
+ asset
}: Props = $props()
// Helper to check if a table is selected in multi-select mode
@@ -442,16 +446,26 @@
{:else}
{#each filteredTableKeys as tableKey}
+
[
{
diff --git a/frontend/src/lib/components/DBManagerContent.svelte b/frontend/src/lib/components/DBManagerContent.svelte
index 27c7b5029c..b49c23b0b5 100644
--- a/frontend/src/lib/components/DBManagerContent.svelte
+++ b/frontend/src/lib/components/DBManagerContent.svelte
@@ -164,6 +164,11 @@
})}
initialTableKey={input.specificTable}
initialSchemaKey={input.type == 'database' ? input.specificSchema : undefined}
+ asset={_input.type == 'ducklake'
+ ? { kind: 'ducklake', path: _input.ducklake }
+ : _input.resourcePath.startsWith('datatable://')
+ ? { kind: 'datatable', path: _input.resourcePath.substring('datatable://'.length) }
+ : undefined}
{dbType}
refresh={() => refresh()}
{dbSelector}
diff --git a/frontend/src/lib/components/DBManagerDrawer.svelte b/frontend/src/lib/components/DBManagerDrawer.svelte
index 272900f934..b899019826 100644
--- a/frontend/src/lib/components/DBManagerDrawer.svelte
+++ b/frontend/src/lib/components/DBManagerDrawer.svelte
@@ -57,6 +57,7 @@
)
export function openDrawer(nInput: DbInput) {
+ console.log('Opening DB Manager with input:', nInput)
input = nInput
if (isDatatableInput) {
datatables.refetch()
@@ -73,6 +74,8 @@
input = undefined
selectedDatatable = undefined
dbManagerContent?.clearReplResult()
+ if (window.location.hash.startsWith('#dbmanager:'))
+ history.replaceState('', document.title, window.location.href.replace(/#dbmanager:.*$/, ''))
}
let windowWidth = $state(window.innerWidth)
diff --git a/frontend/src/lib/components/DucklakePicker.svelte b/frontend/src/lib/components/DucklakePicker.svelte
index 951b29cd39..9260c99bf9 100644
--- a/frontend/src/lib/components/DucklakePicker.svelte
+++ b/frontend/src/lib/components/DucklakePicker.svelte
@@ -1,9 +1,8 @@
@@ -53,6 +52,4 @@
{dbManagerDrawer}
/>
{/if}
-
-
diff --git a/frontend/src/lib/components/ResourcePicker.svelte b/frontend/src/lib/components/ResourcePicker.svelte
index fc035b4216..c85c4b5848 100644
--- a/frontend/src/lib/components/ResourcePicker.svelte
+++ b/frontend/src/lib/components/ResourcePicker.svelte
@@ -1,6 +1,6 @@
@@ -300,5 +299,3 @@
/>
{/if}
-
-
diff --git a/frontend/src/lib/components/Star.svelte b/frontend/src/lib/components/Star.svelte
index 04a67bb388..dd91f671c8 100644
--- a/frontend/src/lib/components/Star.svelte
+++ b/frontend/src/lib/components/Star.svelte
@@ -1,41 +1,25 @@
@@ -43,7 +27,7 @@
onclick={preventDefault(onClick)}
onmouseenter={() => (buttonHover = true)}
onmouseleave={() => (buttonHover = false)}
- class="p-2"
+ class="p-1"
>
{#if starred}
{#if buttonHover}
diff --git a/frontend/src/lib/components/apps/components/display/table/theme/windmill-theme.css b/frontend/src/lib/components/apps/components/display/table/theme/windmill-theme.css
index 577604d290..a86fa2b22f 100644
--- a/frontend/src/lib/components/apps/components/display/table/theme/windmill-theme.css
+++ b/frontend/src/lib/components/apps/components/display/table/theme/windmill-theme.css
@@ -45,7 +45,7 @@
--ag-input-disabled-border-color: rgba(186, 191, 199, 0.3);
--ag-input-disabled-background-color: rgba(186, 191, 199, 0.15);
--ag-borders: solid 1px;
- --ag-border-radius: 8px;
+ --ag-border-radius: 4px;
--ag-borders-side-button: none;
--ag-side-button-selected-background-color: transparent;
--ag-header-column-resize-handle-display: block;
@@ -66,8 +66,9 @@
--ag-widget-vertical-spacing: calc(var(--ag-grid-size) * 1.5);
--ag-toggle-button-height: 18px;
--ag-toggle-button-width: 28px;
- --ag-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu,
- Cantarell, 'Helvetica Neue', sans-serif;
+ --ag-font-family:
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell,
+ 'Helvetica Neue', sans-serif;
--ag-font-size: 0.7rem;
--ag-icon-font-family: agGridalpine;
--ag-selected-tab-underline-color: var(--ag-alpine-active-color);
@@ -92,8 +93,8 @@
--ag-control-panel-background-color: #222628;
--ag-subheader-background-color: #000;
--ag-input-disabled-background-color: #282c2f;
- --ag-input-focus-box-shadow: 0 0 2px 0.5px rgba(255, 255, 255, 0.5),
- 0 0 4px 3px var(--ag-input-focus-border-color);
+ --ag-input-focus-box-shadow:
+ 0 0 2px 0.5px rgba(255, 255, 255, 0.5), 0 0 4px 3px var(--ag-input-focus-border-color);
--ag-card-shadow: 0 1px 20px 1px black;
--ag-disabled-foreground-color: rgba(255, 255, 255, 0.5);
--ag-chip-background-color: rgba(255, 255, 255, 0.07);
@@ -119,8 +120,8 @@
--ag-control-panel-background-color: #222628;
--ag-subheader-background-color: #000;
--ag-input-disabled-background-color: #282c2f;
- --ag-input-focus-box-shadow: 0 0 2px 0.5px rgba(255, 255, 255, 0.5),
- 0 0 4px 3px var(--ag-input-focus-border-color);
+ --ag-input-focus-box-shadow:
+ 0 0 2px 0.5px rgba(255, 255, 255, 0.5), 0 0 4px 3px var(--ag-input-focus-border-color);
--ag-card-shadow: 0 1px 20px 1px black;
--ag-disabled-foreground-color: rgba(255, 255, 255, 0.5);
--ag-chip-background-color: rgba(255, 255, 255, 0.07);
diff --git a/frontend/src/lib/components/assets/AssetsDropdownButton.svelte b/frontend/src/lib/components/assets/AssetsDropdownButton.svelte
index 6c1c160f2e..17d6546d1d 100644
--- a/frontend/src/lib/components/assets/AssetsDropdownButton.svelte
+++ b/frontend/src/lib/components/assets/AssetsDropdownButton.svelte
@@ -12,10 +12,9 @@
type Asset,
type AssetWithAltAccessType
} from './lib'
- import DbManagerDrawer from '../DBManagerDrawer.svelte'
import { untrack } from 'svelte'
import { ResourceService, WorkspaceService } from '$lib/gen'
- import { workspaceStore } from '$lib/stores'
+ import { globalDbManagerDrawer, workspaceStore } from '$lib/stores'
import Tooltip from '../meltComponents/Tooltip.svelte'
import Tooltip2 from '../Tooltip.svelte'
import ResourceEditorDrawer from '../ResourceEditorDrawer.svelte'
@@ -49,7 +48,7 @@
let blueBgDiv: HTMLDivElement | undefined = $state()
let s3FilePicker: S3FilePicker | undefined = $state()
- let dbManagerDrawer: DbManagerDrawer | undefined = $state()
+ let dbManagerDrawer = $derived(globalDbManagerDrawer.val)
let resourceEditorDrawer: ResourceEditorDrawer | undefined = $state()
let isOpen = $state(false)
let resourceDataCache: Record = $state({})
@@ -218,5 +217,4 @@
-
diff --git a/frontend/src/lib/components/assets/JobAssetsViewer.svelte b/frontend/src/lib/components/assets/JobAssetsViewer.svelte
index 060803884b..28e68e1068 100644
--- a/frontend/src/lib/components/assets/JobAssetsViewer.svelte
+++ b/frontend/src/lib/components/assets/JobAssetsViewer.svelte
@@ -1,10 +1,9 @@
@@ -99,5 +98,4 @@
{/if}
-
diff --git a/frontend/src/lib/components/common/table/AppRow.svelte b/frontend/src/lib/components/common/table/AppRow.svelte
index 189abc49b5..e83a8ae694 100644
--- a/frontend/src/lib/components/common/table/AppRow.svelte
+++ b/frontend/src/lib/components/common/table/AppRow.svelte
@@ -36,7 +36,6 @@
interface Props {
app: ListableApp & { has_draft?: boolean; draft_only?: boolean; canWrite: boolean }
marked: string | undefined
- starred: boolean
shareModal: ShareModal
moveDrawer: MoveDrawer
deploymentDrawer: DeployWorkspaceDrawer
@@ -48,7 +47,6 @@
let {
app,
marked,
- starred,
shareModal,
moveDrawer,
deploymentDrawer,
@@ -81,11 +79,6 @@
path={app.path}
summary={app.summary}
workspaceId={app.workspace_id ?? $workspaceStore ?? ''}
- {starred}
- onStarred={(newStarred) => {
- starred = newStarred
- dispatch('change')
- }}
canFavorite={!app.draft_only}
{depth}
>
diff --git a/frontend/src/lib/components/common/table/FlowRow.svelte b/frontend/src/lib/components/common/table/FlowRow.svelte
index 1abc5ae3ac..4e321c9d5b 100644
--- a/frontend/src/lib/components/common/table/FlowRow.svelte
+++ b/frontend/src/lib/components/common/table/FlowRow.svelte
@@ -38,7 +38,6 @@
interface Props {
flow: Flow & { has_draft?: boolean; draft_only?: boolean; canWrite: boolean }
marked: string | undefined
- starred: boolean
shareModal: ShareModal
moveDrawer: MoveDrawer
deleteConfirmedCallback: (() => void) | undefined
@@ -51,7 +50,6 @@
let {
flow,
marked,
- starred,
shareModal,
moveDrawer,
deleteConfirmedCallback = $bindable(),
@@ -106,12 +104,7 @@
{marked}
path={flow.path}
summary={flow.summary}
- {starred}
{errorHandlerMuted}
- onStarred={(newStarred) => {
- starred = newStarred
- dispatch('change')
- }}
canFavorite={!flow.draft_only}
{depth}
>
diff --git a/frontend/src/lib/components/common/table/RawAppRow.svelte b/frontend/src/lib/components/common/table/RawAppRow.svelte
index 791d27e24e..7f27176d5c 100644
--- a/frontend/src/lib/components/common/table/RawAppRow.svelte
+++ b/frontend/src/lib/components/common/table/RawAppRow.svelte
@@ -21,7 +21,6 @@
interface Props {
app: ListableRawApp & { canWrite: boolean }
marked: string | undefined
- starred: boolean
shareModal: ShareModal
moveDrawer: MoveDrawer
deleteConfirmedCallback: (() => void) | undefined
@@ -33,7 +32,6 @@
let {
app,
marked,
- starred,
shareModal,
moveDrawer,
deleteConfirmedCallback = $bindable(),
@@ -75,11 +73,6 @@
path={app.path}
summary={app.summary}
workspaceId={app.workspace_id ?? $workspaceStore ?? ''}
- {starred}
- onStarred={(newStarred) => {
- starred = newStarred
- dispatch('change')
- }}
canFavorite={true}
{depth}
>
diff --git a/frontend/src/lib/components/common/table/Row.svelte b/frontend/src/lib/components/common/table/Row.svelte
index acc7505a44..0aca6de523 100644
--- a/frontend/src/lib/components/common/table/Row.svelte
+++ b/frontend/src/lib/components/common/table/Row.svelte
@@ -8,7 +8,6 @@
interface Props {
marked: string | undefined
- starred: boolean
selected?: boolean
disabled?: boolean
canFavorite?: boolean
@@ -31,12 +30,10 @@
currentTarget: EventTarget & HTMLInputElement
}
) => void
- onStarred?: (starred: boolean) => void
}
let {
marked,
- starred,
selected = false,
disabled = false,
canFavorite = true,
@@ -54,8 +51,7 @@
badges,
actions,
customSummary,
- onSelect = () => {},
- onStarred = (newStarred: boolean) => {}
+ onSelect = () => {}
}: Props = $props()
let displayPath: string = (depth === 0 ? path : path?.split('/')?.slice(-1)?.[0]) ?? ''
@@ -111,7 +107,7 @@
{#if canFavorite && kind !== 'resource' && kind !== 'variable' && kind !== 'resource_type'}
-
+
{:else}
diff --git a/frontend/src/lib/components/common/table/ScriptRow.svelte b/frontend/src/lib/components/common/table/ScriptRow.svelte
index 7b5cc43d30..cd91d8c98c 100644
--- a/frontend/src/lib/components/common/table/ScriptRow.svelte
+++ b/frontend/src/lib/components/common/table/ScriptRow.svelte
@@ -47,7 +47,6 @@
interface Props {
script: Script & { canWrite: boolean; use_codebase: boolean }
marked: string | undefined
- starred: boolean
shareModal: ShareModal
moveDrawer: MoveDrawer
deploymentDrawer: DeployWorkspaceDrawer
@@ -61,7 +60,6 @@
let {
script,
marked,
- starred,
shareModal,
moveDrawer,
deploymentDrawer,
@@ -119,13 +117,8 @@
{marked}
path={script.path}
summary={script.summary}
- {starred}
{errorHandlerMuted}
workspaceId={$workspaceStore ?? ''}
- onStarred={(newStarred) => {
- starred = newStarred
- dispatch('change')
- }}
canFavorite={!script.draft_only}
{depth}
>
diff --git a/frontend/src/lib/components/flows/FlowAssetsHandler.svelte b/frontend/src/lib/components/flows/FlowAssetsHandler.svelte
index 39cf775cac..7d55ed5cfa 100644
--- a/frontend/src/lib/components/flows/FlowAssetsHandler.svelte
+++ b/frontend/src/lib/components/flows/FlowAssetsHandler.svelte
@@ -7,7 +7,6 @@
let s = $state({
val: {
selectedAsset: undefined,
- dbManagerDrawer: undefined,
s3FilePicker: undefined,
resourceEditorDrawer: undefined,
resourceMetadataCache: {},
@@ -45,7 +44,6 @@
import { deepEqual } from 'fast-equals'
import { workspaceStore } from '$lib/stores'
import S3FilePicker from '../S3FilePicker.svelte'
- import DbManagerDrawer from '../DBManagerDrawer.svelte'
import ResourceEditorDrawer from '../ResourceEditorDrawer.svelte'
import { watch } from 'runed'
@@ -176,6 +174,5 @@
{#if flowGraphAssetsCtx}
-
{/if}
diff --git a/frontend/src/lib/components/flows/types.ts b/frontend/src/lib/components/flows/types.ts
index 17c8ef928a..bb2ac57a7c 100644
--- a/frontend/src/lib/components/flows/types.ts
+++ b/frontend/src/lib/components/flows/types.ts
@@ -11,7 +11,6 @@ import type { StateStore } from '$lib/utils'
import type { StepsInputArgs } from './stepsInputArgs.svelte'
import type { Asset, AssetWithAccessType } from '../assets/lib'
import type S3FilePicker from '../S3FilePicker.svelte'
-import type DbManagerDrawer from '../DBManagerDrawer.svelte'
import type ResourceEditorDrawer from '../ResourceEditorDrawer.svelte'
import type { ModulesTestStates } from '../modulesTest.svelte'
import type { ButtonProp } from '$lib/components/DiffEditor.svelte'
@@ -99,7 +98,6 @@ export type FlowEditorContext = {
export type FlowGraphAssetContext = StateStore<{
selectedAsset: Asset | undefined
s3FilePicker: S3FilePicker | undefined
- dbManagerDrawer: DbManagerDrawer | undefined
resourceEditorDrawer: ResourceEditorDrawer | undefined
// Maps resource paths to their metadata. undefined is for error
resourceMetadataCache: Record
diff --git a/frontend/src/lib/components/graph/renderers/nodes/AssetNode.svelte b/frontend/src/lib/components/graph/renderers/nodes/AssetNode.svelte
index 161c6c8dd9..26369b7833 100644
--- a/frontend/src/lib/components/graph/renderers/nodes/AssetNode.svelte
+++ b/frontend/src/lib/components/graph/renderers/nodes/AssetNode.svelte
@@ -234,7 +234,7 @@
import type { Edge, Node } from '@xyflow/svelte'
import { getNodeColorClasses, NODE } from '../../util'
- import { userStore } from '$lib/stores'
+ import { globalDbManagerDrawer, userStore } from '$lib/stores'
import { deepEqual } from 'fast-equals'
import { slide } from 'svelte/transition'
import AssetColumnBadges from '$lib/components/assets/AssetColumnBadges.svelte'
@@ -311,7 +311,7 @@
noText
buttonVariant="accent"
s3FilePicker={flowGraphAssetsCtx?.val.s3FilePicker}
- dbManagerDrawer={flowGraphAssetsCtx?.val.dbManagerDrawer}
+ dbManagerDrawer={globalDbManagerDrawer.val}
_resourceMetadata={cachedResourceMetadata}
/>
diff --git a/frontend/src/lib/components/home/Item.svelte b/frontend/src/lib/components/home/Item.svelte
index 91ef63179d..a470b74e1f 100644
--- a/frontend/src/lib/components/home/Item.svelte
+++ b/frontend/src/lib/components/home/Item.svelte
@@ -28,7 +28,6 @@
{#if item.type == 'script'}
dispatch('scriptChanged')}
script={item}
@@ -46,7 +45,6 @@
{:else if item.type == 'flow'}
dispatch('flowChanged')}
flow={item}
@@ -63,7 +61,6 @@
{:else if item.type == 'app'}
dispatch('appChanged')}
app={item}
@@ -76,7 +73,6 @@
{:else if item.type == 'raw_app'}
dispatch('rawAppChanged')}
app={item}
diff --git a/frontend/src/lib/components/meltComponents/MenuItem.svelte b/frontend/src/lib/components/meltComponents/MenuItem.svelte
index dbbb362cd9..282dc893da 100644
--- a/frontend/src/lib/components/meltComponents/MenuItem.svelte
+++ b/frontend/src/lib/components/meltComponents/MenuItem.svelte
@@ -57,6 +57,7 @@
{target}
onfocusin={onFocusIn}
onfocusout={onFocusOut}
+ onclick={onClick}
>
{@render children?.()}
diff --git a/frontend/src/lib/components/sidebar/FavoriteMenu.svelte b/frontend/src/lib/components/sidebar/FavoriteMenu.svelte
index 9866e95b23..d0a14143ca 100644
--- a/frontend/src/lib/components/sidebar/FavoriteMenu.svelte
+++ b/frontend/src/lib/components/sidebar/FavoriteMenu.svelte
@@ -1,27 +1,100 @@
+
+