From c2180c6eb34e14fe2292ff40aa6a99c627698d5e Mon Sep 17 00:00:00 2001 From: Guilhem Date: Mon, 7 Apr 2025 13:43:00 +0100 Subject: [PATCH] fix(frontend): prevent deploy popover to show if deploy dropdown is open (#5542) * prevent deploy popover to show if deploy dropdown is open * wip * Revert "wip" This reverts commit 85434654afa9cea7643e77cdc3c76f243d9d29f1. * Revert "prevent deploy popover to show if deploy dropdown is open" This reverts commit edd9eda15631b72c14d50b6f02c4ce6fcf47c4b7. * add prop to hide popup fro dropdown * feat: button can have tooltip * improve deploy tooltip and dropdown behavior * rename tooltip to tooltipPopover * nit * add deploy button component * use svelte 5 runes * use new deploy button for script builder * add delay to deploy popover when dropdown is open * add delay to deploy popover when dropdown is open # Conflicts: # frontend/src/lib/components/DeployButton.svelte # frontend/src/lib/components/common/button/Button.svelte * Update frontend/src/lib/components/common/button/Button.svelte Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> * remove unsused field * nit --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- .../src/lib/components/DeployButton.svelte | 80 +++++++++++++++++++ frontend/src/lib/components/DropdownV2.svelte | 5 +- .../src/lib/components/FlowBuilder.svelte | 63 +++------------ .../src/lib/components/ScriptBuilder.svelte | 49 +++--------- .../components/common/button/Button.svelte | 50 +++++++++++- 5 files changed, 152 insertions(+), 95 deletions(-) create mode 100644 frontend/src/lib/components/DeployButton.svelte diff --git a/frontend/src/lib/components/DeployButton.svelte b/frontend/src/lib/components/DeployButton.svelte new file mode 100644 index 0000000000..22d0ef473f --- /dev/null +++ b/frontend/src/lib/components/DeployButton.svelte @@ -0,0 +1,80 @@ + + + + + + diff --git a/frontend/src/lib/components/DropdownV2.svelte b/frontend/src/lib/components/DropdownV2.svelte index 9e535dc55c..7a7f6a3beb 100644 --- a/frontend/src/lib/components/DropdownV2.svelte +++ b/frontend/src/lib/components/DropdownV2.svelte @@ -23,6 +23,8 @@ export let usePointerDownOutside = false export let closeOnOtherDropdownOpen = true export let fixedHeight = true + export let hidePopup = false + export let open = false const { elements: { menu, item, trigger }, @@ -50,7 +52,6 @@ } }) - let open = false const sync = createSync(states) $: sync.open(open, (v) => (open = Boolean(v))) @@ -104,7 +105,7 @@ {/if} -{#if open} +{#if open && !hidePopup}
@@ -1303,7 +1291,8 @@ class="justify-between flex flex-row items-center pl-2.5 pr-6 space-x-4 scrollbar-hidden overflow-x-auto max-h-12 h-full relative" > {#if $copilotCurrentStepStore !== undefined} -
+
{/if}
- - - -
- { - if (e.key === 'Enter') { - await handleSaveFlow(deploymentMsg) - } - }} - bind:this={msgInput} - /> - -
-
-
+ await handleSaveFlow(detail)} + {loading} + {loadingSave} + {newFlow} + {dropdownItems} + />
diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte index b21819e2ed..31f3400ee3 100644 --- a/frontend/src/lib/components/ScriptBuilder.svelte +++ b/frontend/src/lib/components/ScriptBuilder.svelte @@ -39,7 +39,6 @@ Calendar, CheckCircle, Code, - CornerDownLeft, Pen, Plus, Rocket, @@ -65,7 +64,6 @@ import { defaultScriptLanguages, processLangs } from '$lib/scripts' import DefaultScripts from './DefaultScripts.svelte' import { createEventDispatcher, onMount, setContext } from 'svelte' - import CustomPopover from './CustomPopover.svelte' import Summary from './Summary.svelte' import type { ScriptBuilderWhitelabelCustomUi } from './custom_ui' import DeployOverrideConfirmationModal from '$lib/components/common/confirmationModal/DeployOverrideConfirmationModal.svelte' @@ -80,6 +78,8 @@ import CaptureTable from './triggers/CaptureTable.svelte' import type { SavedAndModifiedValue } from './common/confirmationModal/unsavedTypes' import type { ScriptBuilderFunctionExports } from './scriptBuilder' + import DeployButton from './DeployButton.svelte' + export let script: NewScript export let fullyLoaded: boolean = true export let initialPath: string = '' @@ -757,9 +757,6 @@ setContext('disableTooltips', customUi?.disableTooltips === true) - let deploymentMsg = '' - let msgInput: HTMLInputElement | undefined = undefined - function langToLanguage(lang: SupportedLanguage | 'docker' | 'bunnative'): SupportedLanguage { if (lang == 'docker') { return 'bash' @@ -1575,41 +1572,13 @@ - - - -
- { - if (e.key === 'Enter') { - handleEditScript(false, deploymentMsg) - } - }} - /> - -
-
-
+ handleEditScript(false, detail)} + />
diff --git a/frontend/src/lib/components/common/button/Button.svelte b/frontend/src/lib/components/common/button/Button.svelte index 0554e168ba..a59428d662 100644 --- a/frontend/src/lib/components/common/button/Button.svelte +++ b/frontend/src/lib/components/common/button/Button.svelte @@ -5,6 +5,9 @@ import Dropdown from '$lib/components/DropdownV2.svelte' import { getModifierKey, type Item } from '$lib/utils' import { Loader2, ChevronDown } from 'lucide-svelte' + import { createTooltip } from '@melt-ui/svelte' + import type { Placement } from '@floating-ui/core' + import { conditionalMelt } from '$lib/utils' export let size: ButtonType.Size = 'md' export let spacingSize: ButtonType.Size = size @@ -34,6 +37,14 @@ export let shortCut: | { key?: string; hide?: boolean; Icon?: any; withoutModifier?: boolean } | undefined = undefined + export let tooltipPopover: + | { + placement?: Placement + openDelay?: number + closeDelay?: number + portal?: string + } + | undefined = undefined type MenuItem = { label: string @@ -43,6 +54,7 @@ disabled?: boolean } export let dropdownItems: MenuItem[] | (() => MenuItem[]) | undefined = undefined + export let hideDropdown: boolean = false function computeDropdowns(menuItems: MenuItem[] | (() => MenuItem[])): Item[] { const items = typeof menuItems === 'function' ? menuItems() : menuItems @@ -117,6 +129,28 @@ } $: lucideIconSize = (iconMap[size] ?? 12) * 1 + + const { + elements: { trigger, content }, + states: { open }, + options: { openDelay } + } = tooltipPopover + ? createTooltip({ + positioning: { + placement: tooltipPopover?.placement + }, + closeDelay: tooltipPopover?.closeDelay, + group: true, + portal: tooltipPopover?.portal + }) + : { + elements: { trigger: undefined, content: undefined }, + states: { open: undefined }, + options: { openDelay: undefined } + } + $: tooltipPopover && openDelay !== undefined && ($openDelay = tooltipPopover?.openDelay) //This option is reactive + + $: $open !== undefined && dispatch('tooltipOpen', $open)
{#if loading} @@ -230,10 +266,22 @@
{/if} + {#if tooltipPopover && $open} +
+ +
+ {/if} {/if} {#if dropdownItems && dropdownItems.length > 0} - + dispatch('dropdownOpen', true)} + on:close={() => dispatch('dropdownOpen', false)} + >