From c57f96a79eb3e97cb1c435034d288f56726f8c19 Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Thu, 26 Jun 2025 16:57:30 +0200 Subject: [PATCH] improve DbManagerButton + asset dropdown button --- ...erButton.svelte => DBManagerDrawer.svelte} | 86 ++++++++---------- .../src/lib/components/ResourcePicker.svelte | 12 ++- .../src/lib/components/ScriptEditor.svelte | 6 +- .../assets/AssetsDetectedBadge.svelte | 37 -------- .../assets/AssetsDropdownButton.svelte | 91 +++++++++++++++++++ frontend/src/lib/components/assets/lib.ts | 8 +- .../(root)/(logged)/assets/+page.svelte | 43 ++++++--- .../(logged)/assets/ExploreAssetButton.svelte | 61 +++++++++++++ .../(root)/(logged)/resources/+page.svelte | 15 ++- frontend/tailwind.config.cjs | 11 ++- 10 files changed, 254 insertions(+), 116 deletions(-) rename frontend/src/lib/components/{DBManagerDrawerButton.svelte => DBManagerDrawer.svelte} (79%) delete mode 100644 frontend/src/lib/components/assets/AssetsDetectedBadge.svelte create mode 100644 frontend/src/lib/components/assets/AssetsDropdownButton.svelte create mode 100644 frontend/src/routes/(root)/(logged)/assets/ExploreAssetButton.svelte diff --git a/frontend/src/lib/components/DBManagerDrawerButton.svelte b/frontend/src/lib/components/DBManagerDrawer.svelte similarity index 79% rename from frontend/src/lib/components/DBManagerDrawerButton.svelte rename to frontend/src/lib/components/DBManagerDrawer.svelte index 583d5a71ac..b0da47c4ac 100644 --- a/frontend/src/lib/components/DBManagerDrawerButton.svelte +++ b/frontend/src/lib/components/DBManagerDrawer.svelte @@ -4,7 +4,7 @@ import Drawer from './common/drawer/Drawer.svelte' import DrawerContent from './common/drawer/DrawerContent.svelte' import { sendUserToast, sortArray } from '$lib/utils' - import { ArrowLeft, Database, Expand, Loader2, Minimize, RefreshCcw } from 'lucide-svelte' + import { ArrowLeft, Expand, Loader2, Minimize, RefreshCcw } from 'lucide-svelte' import { dbSupportsSchemas, getDbSchemas, @@ -15,7 +15,6 @@ type TableMetadata } from './apps/components/display/dbtable/utils' import DbManager from './DBManager.svelte' - import { Alert } from './common' import { dbDeleteTableActionWithPreviewScript, dbTableOpsWithPreviewScripts } from './dbOps' import { makeCreateTableQuery } from './apps/components/display/dbtable/queries/createTable' import { runScriptAndPollResult } from './jobs/utils' @@ -24,22 +23,24 @@ import SimpleAgTable from './SimpleAgTable.svelte' import { untrack } from 'svelte' - type Props = { - resourceType: DbType - resourcePath: string - class?: string + let resourceType: DbType | undefined = $state(undefined) + let resourcePath: string | undefined = $state(undefined) + let open = $derived(resourcePath && resourceType) + + export function openDrawer(_resourceType: DbType, _resourcePath: string) { + resourceType = _resourceType + resourcePath = _resourcePath + getSchema() + } + export function closeDrawer() { + resourceType = undefined + resourcePath = undefined + refreshCount = 0 + refreshing = false } - let { resourceType, resourcePath }: Props = $props() - let dbSchema: DBSchema | undefined = $derived( - resourcePath in $dbSchemas ? $dbSchemas[resourcePath] : undefined - ) - - let isDrawerOpen: boolean = $state(false) - - let shouldDisplayError = $derived( - resourcePath && resourcePath in $dbSchemas && !$dbSchemas[resourcePath] + resourcePath && resourcePath in $dbSchemas ? $dbSchemas[resourcePath] : undefined ) // `refreshCount` is a derived state. `refreshing` is the source of truth @@ -56,11 +57,11 @@ let expand = $state(false) $effect(() => { - if (!isDrawerOpen) expand = false + if (!open) expand = false }) async function getSchema() { - if ($dbSchemas[resourcePath] && !refreshing) return + if (!resourcePath || !resourceType || ($dbSchemas[resourcePath] && !refreshing)) return try { const oldDbSchema = $dbSchemas[resourcePath] await getDbSchemas( @@ -69,9 +70,7 @@ $workspaceStore, $dbSchemas, (message: string) => { - if (isDrawerOpen) { - sendUserToast(message, true) - } + if (open) sendUserToast(message, true) } ) // avoid infinite loop on error due to the way getDbSchemas is implemented @@ -95,6 +94,8 @@ let cachedLastRefreshCount = 0 async function getColDefs(tableKey: string) { + if (!resourcePath || !resourceType) return [] + if (cachedLastRefreshCount !== refreshCount) cachedColDefs = {} cachedLastRefreshCount = refreshCount if (cachedColDefs[tableKey]) { @@ -130,37 +131,26 @@ }} /> -{#if shouldDisplayError} - - Schema could not be loaded. Please check the permissions of the resource. - -{:else} - - + + {#key [resourceType, resourcePath, dbSchema]} { if (replResultData) { replResultData = undefined } else { - isDrawerOpen = false + closeDrawer() } }} CloseIcon={replResultData ? ArrowLeft : undefined} noPadding > - {#if dbSchema && $workspaceStore} + {#if dbSchema && $workspaceStore && resourceType && resourcePath} @@ -191,8 +181,8 @@ dbTableOpsWithPreviewScripts({ colDefs, tableKey, - resourcePath, - resourceType, + resourcePath: resourcePath!, + resourceType: resourceType!, workspace: $workspaceStore })} dbTableActionsFactory={[ @@ -204,16 +194,16 @@ ]} {refresh} dbTableEditorPropsFactory={({ selectedSchemaKey }) => ({ - resourceType, + resourceType: resourceType!, previewSql: (values) => - makeCreateTableQuery(values, resourceType, selectedSchemaKey), + makeCreateTableQuery(values, resourceType!, selectedSchemaKey), async onConfirm(values) { await runScriptAndPollResult({ workspace: $workspaceStore, requestBody: { args: { database: '$res:' + resourcePath }, - content: makeCreateTableQuery(values, resourceType, selectedSchemaKey), - language: getLanguageByResourceType(resourceType) + content: makeCreateTableQuery(values, resourceType!, selectedSchemaKey), + language: getLanguageByResourceType(resourceType!) } }) refresh() @@ -268,5 +258,5 @@ /> {/snippet} - -{/if} + {/key} + diff --git a/frontend/src/lib/components/ResourcePicker.svelte b/frontend/src/lib/components/ResourcePicker.svelte index 1aa7c4bd33..c51b93a5b0 100644 --- a/frontend/src/lib/components/ResourcePicker.svelte +++ b/frontend/src/lib/components/ResourcePicker.svelte @@ -6,12 +6,13 @@ import ResourceEditorDrawer from './ResourceEditorDrawer.svelte' import { Button } from './common' - import DBManagerDrawerButton from './DBManagerDrawerButton.svelte' import { Pen, Plus, RotateCw } from 'lucide-svelte' import { sendUserToast } from '$lib/toast' import { isDbType } from './apps/components/display/dbtable/utils' import Select from './select/Select.svelte' import { createDispatcherIfMounted } from '$lib/createDispatcherIfMounted' + import DbManagerDrawer from './DBManagerDrawer.svelte' + import ExploreAssetButton from '../../routes/(root)/(logged)/assets/ExploreAssetButton.svelte' const dispatch = createEventDispatcher() const dispatchIfMounted = createDispatcherIfMounted(dispatch) @@ -146,6 +147,7 @@ let appConnect: AppConnect | undefined = $state() let resourceEditor: ResourceEditorDrawer | undefined = $state() + let dbManagerDrawer: DbManagerDrawer | undefined = $state() {#if showSchemaExplorer && isDbType(resourceType) && value} - + {/if} + + diff --git a/frontend/src/lib/components/ScriptEditor.svelte b/frontend/src/lib/components/ScriptEditor.svelte index 7d8bb4bc44..3d6d4a4eff 100644 --- a/frontend/src/lib/components/ScriptEditor.svelte +++ b/frontend/src/lib/components/ScriptEditor.svelte @@ -46,7 +46,7 @@ import type { ScriptOptions } from './copilot/chat/ContextManager.svelte' import { aiChatManager, AIMode } from './copilot/chat/AIChatManager.svelte' import { triggerableByAI } from '$lib/actions/triggerableByAI' - import AssetsDetectedBadge from './assets/AssetsDetectedBadge.svelte' + import AssetsDetectedBadge from './assets/AssetsDropdownButton.svelte' interface Props { // Exported @@ -510,7 +510,9 @@
- + {#if assets.length} + + {/if} {#if testPanelSize === 0}