Go to settings button in Assets Dropdown on not found

This commit is contained in:
Diego Imbert
2025-12-02 14:11:42 +01:00
parent 01bd5ef620
commit 06aec14333
3 changed files with 54 additions and 12 deletions
@@ -54,6 +54,7 @@
unifiedSize={'md'}
variant={buttonVariant}
wrapperClasses={className}
iconOnly
{btnClasses}
on:click={async () => {
if (asset.kind === 'resource' && isDbType(_resourceMetadata?.resource_type)) {
@@ -1,12 +1,12 @@
<script lang="ts">
import { AlertTriangle, Edit2 } from 'lucide-svelte'
import { Button } from '../common'
import { Tooltip } from '../meltComponents'
import ExploreAssetButton, { assetCanBeExplored } from '../ExploreAssetButton.svelte'
import S3FilePicker from '../S3FilePicker.svelte'
import DbManagerDrawer from '../DBManagerDrawer.svelte'
import ResourceEditorDrawer from '../ResourceEditorDrawer.svelte'
import type { Asset } from '$lib/gen'
import Popover from '../meltComponents/Popover.svelte'
type Props = {
s3FilePicker?: S3FilePicker | undefined
@@ -14,6 +14,8 @@
resourceEditorDrawer?: ResourceEditorDrawer | undefined
resourceDataCache: Record<string, string | undefined>
asset: Asset
ducklakeNotFound?: boolean
datatableNotFound?: boolean
onClick?: () => void
}
let {
@@ -22,6 +24,8 @@
resourceEditorDrawer,
resourceDataCache,
asset,
ducklakeNotFound = false,
datatableNotFound = false,
onClick
}: Props = $props()
</script>
@@ -30,20 +34,39 @@
{#if asset.kind === 'resource' && resourceDataCache[asset.path] !== undefined}
<Button
startIcon={{ icon: Edit2 }}
size="xs"
variant="default"
spacingSize="xs2"
unifiedSize="md"
iconOnly
on:click={() => (resourceEditorDrawer?.initEdit(asset.path), onClick?.())}
/>
{/if}
{#if asset.kind === 'resource' && resourceDataCache[asset.path] === undefined}
<Tooltip class="mr-2.5">
<AlertTriangle size={16} class="text-orange-600 dark:text-orange-500" />
<svelte:fragment slot="text">Could not find resource</svelte:fragment>
</Tooltip>
{/if}
{#if assetCanBeExplored(asset, { resource_type: resourceDataCache[asset.path] })}
{#if (asset.kind === 'resource' && resourceDataCache[asset.path] === undefined) || ducklakeNotFound || datatableNotFound}
<Popover contentClasses="px-3 py-2">
<svelte:fragment slot="trigger">
<Button
startIcon={{ icon: AlertTriangle }}
variant="default"
unifiedSize="md"
btnClasses="text-red-500"
iconOnly
/>
</svelte:fragment>
<svelte:fragment slot="content">
<span class="text-sm">Not found</span>
{#if ducklakeNotFound}
<Button wrapperClasses="mt-1" href="/workspace_settings?tab=windmill_lfs">
Go to Ducklake settings
</Button>
{:else if datatableNotFound}
<Button wrapperClasses="mt-1" href="/workspace_settings?tab=windmill_data_tables">
Go to Data Table settings
</Button>
{:else if asset.kind === 'resource' && resourceDataCache[asset.path] === undefined}
<Button wrapperClasses="mt-1" href="/resources">Go to Resources</Button>
{/if}
</svelte:fragment>
</Popover>
{:else if assetCanBeExplored(asset, { resource_type: resourceDataCache[asset.path] })}
<ExploreAssetButton
{asset}
{s3FilePicker}
@@ -14,7 +14,7 @@
} from './lib'
import DbManagerDrawer from '../DBManagerDrawer.svelte'
import { untrack } from 'svelte'
import { ResourceService } from '$lib/gen'
import { ResourceService, WorkspaceService } from '$lib/gen'
import { workspaceStore } from '$lib/stores'
import Tooltip from '../meltComponents/Tooltip.svelte'
import Tooltip2 from '../Tooltip.svelte'
@@ -23,6 +23,7 @@
import AssetButtons from './AssetButtons.svelte'
import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte'
import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte'
import { resource } from 'runed'
let {
assets,
@@ -61,6 +62,13 @@
}
})
let datatables = resource([], () =>
WorkspaceService.listDataTables({ workspace: $workspaceStore ?? '' })
)
let ducklakes = resource([], () =>
WorkspaceService.listDucklakes({ workspace: $workspaceStore ?? '' })
)
$effect(() => {
assets
untrack(() => {
@@ -97,7 +105,7 @@
class={twMerge(
size === '3xs' ? 'h-[1.6rem]' : 'py-1.5',
'text-xs flex items-center gap-1.5 px-2 rounded-md relative',
'border border-tertiary/30',
'border',
'bg-surface hover:bg-surface-hover active:bg-surface',
'transition-all hover:text-primary cursor-pointer'
)}
@@ -117,6 +125,14 @@
<svelte:fragment slot="content">
<ul class="divide-y rounded-md">
{#each assets as asset}
{@const ducklakeNotFound =
asset.kind === 'ducklake' &&
ducklakes.current &&
!ducklakes.current.find((name) => name === asset.path)}
{@const datatableNotFound =
asset.kind === 'datatable' &&
datatables.current &&
!datatables.current.find((name) => name === asset.path)}
<li
class="text-sm px-3 h-12 flex gap-3 items-center hover:bg-surface-hover/25"
onmouseenter={() => onHoverLi?.(asset, 'enter')}
@@ -187,6 +203,8 @@
{dbManagerDrawer}
{resourceEditorDrawer}
{s3FilePicker}
{ducklakeNotFound}
{datatableNotFound}
/>
</li>
{/each}