From da64385123bfc93470ca34169efbb4f333694b5c Mon Sep 17 00:00:00 2001 From: centdix Date: Tue, 27 May 2025 11:09:07 +0200 Subject: [PATCH] make drawer triggerable --- frontend/src/lib/components/DropdownV2.svelte | 73 ++++---- .../src/lib/components/DropdownV2Inner.svelte | 70 +++++--- .../src/lib/components/ScriptBuilder.svelte | 158 ++++++++++-------- .../src/lib/components/TriggerableByAI.svelte | 82 ++++++++- .../components/TriggerableByAIExample.svelte | 40 ----- .../components/common/button/Button.svelte | 4 + .../common/drawer/DrawerContent.svelte | 16 +- .../components/common/table/ScriptRow.svelte | 3 + .../lib/components/globalchat/Input.svelte | 51 +++--- .../src/lib/components/globalchat/core.ts | 66 +++----- .../scripts/CreateActionsScript.svelte | 15 ++ .../src/routes/(root)/(logged)/+layout.svelte | 3 - .../src/routes/(root)/(logged)/+page.svelte | 15 +- 13 files changed, 356 insertions(+), 240 deletions(-) delete mode 100644 frontend/src/lib/components/TriggerableByAIExample.svelte diff --git a/frontend/src/lib/components/DropdownV2.svelte b/frontend/src/lib/components/DropdownV2.svelte index 6843c12927..b7d25666a6 100644 --- a/frontend/src/lib/components/DropdownV2.svelte +++ b/frontend/src/lib/components/DropdownV2.svelte @@ -16,7 +16,9 @@ import ResolveOpen from '$lib/components/common/menu/ResolveOpen.svelte' import Button from '$lib/components/common/button/Button.svelte' import { twMerge } from 'tailwind-merge' + import TriggerableByAI from './TriggerableByAI.svelte' + export let id: string = 'dropdown-v2' export let items: Item[] | (() => Item[]) | (() => Promise) = [] export let disabled = false export let placement: Placement = 'bottom-end' @@ -27,6 +29,9 @@ export let open = false export let customWidth: number | undefined = undefined export let customMenu = false + export let enableTriggerableByAI = false + + let buttonEl = { click: () => {} } const { elements: { menu, item, trigger }, @@ -76,36 +81,44 @@ - + + {#if open && !hidePopup}
@@ -116,7 +129,7 @@ class="bg-surface border w-56 origin-top-right rounded-md shadow-md focus:outline-none overflow-y-auto py-1 max-h-[50vh]" style={customWidth ? `width: ${customWidth}px` : ''} > - +
{/if} diff --git a/frontend/src/lib/components/DropdownV2Inner.svelte b/frontend/src/lib/components/DropdownV2Inner.svelte index 3c657d7678..5a3a18e181 100644 --- a/frontend/src/lib/components/DropdownV2Inner.svelte +++ b/frontend/src/lib/components/DropdownV2Inner.svelte @@ -4,13 +4,22 @@ import { twMerge } from 'tailwind-merge' import type { MenubarMenuElements } from '@melt-ui/svelte' import type { Item } from '$lib/utils' + import TriggerableByAI from './TriggerableByAI.svelte' + import { goto } from '$app/navigation' interface Props { + id?: string items?: Item[] | (() => Item[]) | (() => Promise) meltItem: MenubarMenuElements['item'] + enableTriggerableByAI?: boolean } - let { items = [], meltItem }: Props = $props() + let { + id = 'dropdown-v2-inner', + items = [], + meltItem, + enableTriggerableByAI = false + }: Props = $props() let computedItems: Item[] | undefined = $state(undefined) async function computeItems() { @@ -27,29 +36,44 @@ {#if computedItems}
{#each computedItems ?? [] as item} - item?.action?.(e)} - href={item?.href} - disabled={item?.disabled} - class={twMerge( - 'px-4 py-2 text-primary font-semibold hover:bg-surface-hover cursor-pointer text-xs transition-all', - 'data-[highlighted]:bg-surface-hover', - 'flex flex-row gap-2 items-center', - item?.disabled && 'text-gray-400 cursor-not-allowed', - item?.type === 'delete' && - !item?.disabled && - 'text-red-500 hover:bg-red-100 hover:text-red-500 data-[highlighted]:text-red-500 data-[highlighted]:bg-red-100' - )} - item={meltItem} + { + console.log('triggering', item) + if (item.action) { + item.action({} as MouseEvent) + } + if (item.href) { + goto(item.href) + } + }} + disabled={!enableTriggerableByAI} > - {#if item.icon} - - {/if} -

- {item.displayName} -

- {@render item.extra?.()} -
+ item?.action?.(e)} + href={item?.href} + disabled={item?.disabled} + class={twMerge( + 'px-4 py-2 text-primary font-semibold hover:bg-surface-hover cursor-pointer text-xs transition-all', + 'data-[highlighted]:bg-surface-hover', + 'flex flex-row gap-2 items-center', + item?.disabled && 'text-gray-400 cursor-not-allowed', + item?.type === 'delete' && + !item?.disabled && + 'text-red-500 hover:bg-red-100 hover:text-red-500 data-[highlighted]:text-red-500 data-[highlighted]:bg-red-100' + )} + item={meltItem} + > + {#if item.icon} + + {/if} +

+ {item.displayName} +

+ {@render item.extra?.()} +
+ {/each}
{:else} diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte index 5fa096f06e..837add5c33 100644 --- a/frontend/src/lib/components/ScriptBuilder.svelte +++ b/frontend/src/lib/components/ScriptBuilder.svelte @@ -7,7 +7,8 @@ type Script, type TriggersCount, PostgresTriggerService, - CaptureService + CaptureService, + type ScriptLang } from '$lib/gen' import { inferArgs } from '$lib/infer' import { initialCode } from '$lib/script_helpers' @@ -92,6 +93,7 @@ } from './triggers/utils' import DraftTriggersConfirmationModal from './common/confirmationModal/DraftTriggersConfirmationModal.svelte' import { Triggers } from './triggers/triggers.svelte' + import TriggerableByAI from './TriggerableByAI.svelte' export let script: NewScript & { draft_triggers?: Trigger[] } export let fullyLoaded: boolean = true @@ -869,6 +871,47 @@ newSavedDraftTrigers.length > 0 ? newSavedDraftTrigers : undefined } } + + function onScriptLanguageTrigger(lang: 'docker' | 'bunnative' | ScriptLang) { + if (lang == 'docker') { + if (isCloudHosted()) { + sendUserToast( + 'You cannot use Docker scripts on the multi-tenant platform. Use a dedicated instance or self-host windmill instead.', + true, + [ + { + label: 'Learn more', + callback: () => { + window.open('https://www.windmill.dev/docs/advanced/docker', '_blank') + } + } + ] + ) + return + } + template = 'docker' + } else if (lang == 'bunnative') { + template = 'bunnative' + } else { + template = 'script' + } + let language = langToLanguage(lang) + // + initContent(language, script.kind, template) + script.language = language + } + + function onSummaryChange(value: string) { + if (initialPath == '' && value?.length > 0 && !dirtyPath) { + path?.setName( + value + .toLowerCase() + .replace(/[^a-z0-9_]/g, '_') + .replace(/-+/g, '_') + .replace(/^-|-$/g, '') + ) + } + } @@ -947,29 +990,31 @@