mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-08-24 08:01:38 +00:00
6ba3fda65d
* dev(frontend) move component options into editor menu * dev(frontend) move component options into editor menu * dev(frontend) add editor menu popovers --------- Co-authored-by: Guilhem Le Mouel <guilhem.le-mouel.ext@altran.com>
150 lines
4.1 KiB
Svelte
150 lines
4.1 KiB
Svelte
<script lang="ts">
|
|
import ButtonDropdown from '$lib/components/common/button/ButtonDropdown.svelte'
|
|
import { classNames } from '$lib/utils'
|
|
import { MenuItem } from '@rgossiaux/svelte-headlessui'
|
|
import { createEventDispatcher, getContext } from 'svelte'
|
|
import type { AppViewerContext } from '../types'
|
|
import type { DecisionTreeNode } from './component'
|
|
import { isDebugging } from './settingsPanel/decisionTree/utils'
|
|
import { X, Bug } from 'lucide-svelte'
|
|
|
|
export let nodes: DecisionTreeNode[] = []
|
|
export let id: string
|
|
export let isSmall = false
|
|
export let componentIsDebugging = false
|
|
|
|
$: componentIsDebugging = isDebugging($debuggingComponents, id)
|
|
|
|
const { componentControl, debuggingComponents, worldStore } =
|
|
getContext<AppViewerContext>('AppViewerContext')
|
|
const dispatch = createEventDispatcher()
|
|
|
|
let currentNodeId: string = $worldStore.outputsById[id]?.currentNodeId?.peak() ?? 'a'
|
|
|
|
function subscribeToCurrentNode(id: string) {
|
|
return $worldStore.outputsById[id]?.currentNodeId?.subscribe(
|
|
{
|
|
id: `id-${id}-${currentNodeId}`,
|
|
next: (value) => {
|
|
currentNodeId = value
|
|
}
|
|
},
|
|
currentNodeId
|
|
)
|
|
}
|
|
|
|
let subscription = subscribeToCurrentNode(id)
|
|
|
|
function onDebugNode(debuggedNodeIndex: number | undefined) {
|
|
if (debuggedNodeIndex === undefined) {
|
|
return
|
|
}
|
|
|
|
if (debuggedNodeIndex !== undefined && nodes[debuggedNodeIndex]?.id === undefined) {
|
|
currentNodeId = nodes[0]?.id ?? ''
|
|
$componentControl?.[id]?.setTab?.(0)
|
|
|
|
$debuggingComponents = Object.fromEntries(
|
|
Object.entries($debuggingComponents).filter(([key]) => key !== id)
|
|
)
|
|
}
|
|
}
|
|
|
|
$: onDebugNode($debuggingComponents[id])
|
|
|
|
let renderCount: number = 0
|
|
let lastNodes: DecisionTreeNode[] = nodes
|
|
|
|
function onNodesChange(newNodes: DecisionTreeNode[]) {
|
|
if (JSON.stringify(newNodes) !== JSON.stringify(lastNodes)) {
|
|
lastNodes = newNodes
|
|
|
|
if (subscription) {
|
|
subscription?.()
|
|
}
|
|
subscription = subscribeToCurrentNode(id)
|
|
|
|
renderCount++
|
|
}
|
|
}
|
|
|
|
$: onNodesChange(nodes)
|
|
</script>
|
|
|
|
{#key renderCount}
|
|
<button
|
|
title={'Debug tabs'}
|
|
class={classNames(
|
|
'px-1 text-2xs font-bold rounded cursor-pointer w-fit h-full',
|
|
componentIsDebugging
|
|
? ' hover:bg-red-300 hover:text-red-800'
|
|
: ' hover:bg-indigo-300 hover:text-indigo-800'
|
|
)}
|
|
on:click={() => dispatch('triggerInlineEditor')}
|
|
on:pointerdown|stopPropagation
|
|
>
|
|
<ButtonDropdown hasPadding={false}>
|
|
<svelte:fragment slot="buttonReplacement">
|
|
<div class="px-1 w-fit">
|
|
{#if componentIsDebugging}
|
|
<div class="flex flex-row items-center gap-2">
|
|
{`${isSmall ? '' : 'Debugging node'} ${nodes[$debuggingComponents[id] ?? 0]?.id}`}
|
|
<button
|
|
on:click={() => {
|
|
$componentControl?.[id]?.setTab?.(0)
|
|
|
|
$debuggingComponents = Object.fromEntries(
|
|
Object.entries($debuggingComponents).filter(([key]) => key !== id)
|
|
)
|
|
}}
|
|
>
|
|
<X size={11} />
|
|
</button>
|
|
</div>
|
|
{:else if isSmall}
|
|
<div class="flex h-full w-fit items-center"><Bug size={11} /></div>
|
|
{:else}<div class="whitespace-nowrap h-full"
|
|
>{`Debug nodes (current node: ${currentNodeId})`}</div
|
|
>{/if}
|
|
</div>
|
|
</svelte:fragment>
|
|
<svelte:fragment slot="items">
|
|
{#each nodes ?? [] as node, index}
|
|
<MenuItem
|
|
on:click={() => {
|
|
$componentControl?.[id]?.setTab?.(index)
|
|
|
|
$debuggingComponents[id] = index
|
|
}}
|
|
>
|
|
<div
|
|
class={classNames(
|
|
'!text-tertiary text-left px-4 py-2 gap-2 cursor-pointer hover:bg-gray-100 !text-xs font-semibold'
|
|
)}
|
|
>
|
|
{`Debug node ${node.label}`}
|
|
</div>
|
|
</MenuItem>
|
|
{/each}
|
|
<MenuItem
|
|
on:click={() => {
|
|
$componentControl?.[id]?.setTab?.(0)
|
|
|
|
$debuggingComponents = Object.fromEntries(
|
|
Object.entries($debuggingComponents).filter(([key]) => key !== id)
|
|
)
|
|
}}
|
|
>
|
|
<div
|
|
class={classNames(
|
|
'!text-red-600 text-left px-4 py-2 gap-2 cursor-pointer hover:bg-gray-100 !text-xs font-semibold'
|
|
)}
|
|
>
|
|
{`Reset debug mode`}
|
|
</div>
|
|
</MenuItem>
|
|
</svelte:fragment>
|
|
</ButtonDropdown>
|
|
</button>
|
|
{/key}
|