Skip to content

feat(frontend) : triggers panel polishing #5825

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions frontend/src/lib/components/SchedulePanel.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,7 @@
bind:this={scheduleEditor}
hideTarget
allowDraft
hasDraft={!!selectedTrigger.draftConfig}
isDraftOnly={selectedTrigger.isDraft}
primary={selectedTrigger.isPrimary}
trigger={selectedTrigger}
draftSchema={schema}
{customLabel}
{...restProps}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,8 @@
<div class="mt-4 mb-2">
{#if displayAlert}
<Alert type="warning" title="Trigger deployed" size="xs" class="mb-4">
Capturing will suscribe to the trigger endpoint. Treat carefully.
Capturing on a deployed trigger can cause event loss on the deployed trigger. Treat
carefully.
</Alert>
{/if}
<Description>
Expand Down
53 changes: 53 additions & 0 deletions frontend/src/lib/components/triggers/DeleteTriggerButton.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<script lang="ts">
import { Trash } from 'lucide-svelte'
import Button from '../common/button/Button.svelte'
import ConfirmationModal from '../common/confirmationModal/ConfirmationModal.svelte'
import { triggerIconMap, type Trigger } from './utils'
import TriggerLabel from './TriggerLabel.svelte'
import { twMerge } from 'tailwind-merge'

interface Props {
onDelete: (() => void) | undefined
trigger?: Trigger
small?: boolean
}

let { onDelete, trigger = undefined, small = false }: Props = $props()

let confirmationModalOpen = $state(false)
</script>

<ConfirmationModal
title="Are you sure you want to delete this draft trigger ?"
confirmationText="Delete"
open={confirmationModalOpen}
on:canceled={() => {
confirmationModalOpen = false
}}
on:confirmed={() => {
onDelete?.()
confirmationModalOpen = false
}}
>
{#if trigger !== undefined}
{@const IconComponent = triggerIconMap[trigger.type]}
<div class="flex flex-row gap-2 items-center grow min-w-0 pr-2 rounded-md my-4">
<IconComponent
size={16}
class={twMerge(trigger.isDraft ? 'text-frost-400' : '', 'shrink-0')}
/>
<TriggerLabel {trigger} />
</div>
{/if}
</ConfirmationModal>

<Button
size="xs"
startIcon={{ icon: Trash }}
iconOnly
color={'light'}
on:click={() => {
confirmationModalOpen = true
}}
btnClasses={twMerge(small ? 'px-1 py-1' : '', 'bg-transparent hover:bg-red-500 hover:text-white')}
/>
36 changes: 13 additions & 23 deletions frontend/src/lib/components/triggers/TriggerEditorToolbar.svelte
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<script lang="ts">
import Button from '$lib/components/common/button/Button.svelte'
import { Trash, Save, RotateCcw } from 'lucide-svelte'
import { Save, RotateCcw } from 'lucide-svelte'
import { type Snippet } from 'svelte'
import Toggle from '$lib/components/Toggle.svelte'
import { Tooltip } from '../meltComponents'
import DeleteTriggerButton from './DeleteTriggerButton.svelte'
import type { Trigger } from './utils'

interface Props {
isDraftOnly: any
hasDraft: any
saveDisabled: any
enabled: boolean | undefined
allowDraft: any
Expand All @@ -21,12 +21,10 @@
onToggleEnabled?: (enabled: boolean) => void
onUpdate?: () => void
cloudDisabled?: boolean
triggerType?: string
trigger?: Trigger
}

let {
isDraftOnly,
hasDraft,
saveDisabled,
enabled,
allowDraft,
Expand All @@ -39,7 +37,8 @@
onReset,
onToggleEnabled,
onUpdate,
cloudDisabled = false
cloudDisabled = false,
trigger
}: Props = $props()

const canSave = $derived((permissions === 'write' && edit) || permissions === 'create')
Expand Down Expand Up @@ -73,7 +72,7 @@
{/if}
{:else}
<div class="flex flex-row gap-2 items-center">
{#if !isDraftOnly && !hasDraft && enabled !== undefined}
{#if !trigger?.draftConfig && enabled !== undefined}
<div class="center-center">
<Toggle
size="2sm"
Expand All @@ -86,18 +85,9 @@
/>
</div>
{/if}
{#if isDraftOnly}
<Button
size="xs"
startIcon={{ icon: Trash }}
iconOnly
color={'light'}
on:click={() => {
onDelete?.()
}}
btnClasses="hover:bg-red-500 hover:text-white"
/>
{:else if hasDraft}
{#if trigger?.isDraft}
<DeleteTriggerButton {onDelete} {trigger} />
{:else if !trigger?.isDraft && trigger?.draftConfig}
<Button
size="xs"
startIcon={{ icon: RotateCcw }}
Expand All @@ -109,7 +99,7 @@
Reset changes
</Button>
{/if}
{#if canSave && (isDraftOnly || hasDraft)}
{#if canSave && trigger?.draftConfig}
<Tooltip placement="bottom-end" disablePopup={!saveDisabled && !cloudDisabled && isDeployed}>
<Button
size="xs"
Expand All @@ -120,15 +110,15 @@
}}
loading={isLoading}
>
{isDraftOnly ? 'Deploy' : 'Update'}
{trigger?.isDraft ? 'Deploy' : 'Update'}
</Button>
<span slot="text">
{#if !isDeployed}
Deploy the runnable to enable trigger creation
{:else if cloudDisabled}
This trigger is disabled in the multi-tenant cloud
{:else}
Enter a valid config to {isDraftOnly ? 'deploy' : 'update'} the trigger
Enter a valid config to {trigger?.isDraft ? 'deploy' : 'update'} the trigger
{/if}
</span>
</Tooltip>
Expand Down
12 changes: 3 additions & 9 deletions frontend/src/lib/components/triggers/TriggersTable.svelte
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
<script lang="ts">
import DataTable from '$lib/components/table/DataTable.svelte'
import Button from '$lib/components/common/button/Button.svelte'
import { Plus, Star, Loader2, Trash, RotateCcw } from 'lucide-svelte'
import { Plus, Star, Loader2, RotateCcw } from 'lucide-svelte'
import { twMerge } from 'tailwind-merge'
import { triggerIconMap, type Trigger, type TriggerType } from './utils'
import AddTriggersButton from './AddTriggersButton.svelte'
import TriggerLabel from './TriggerLabel.svelte'
import DeleteTriggerButton from './DeleteTriggerButton.svelte'

interface Props {
// Props
Expand Down Expand Up @@ -94,14 +95,7 @@

{#if !['email', 'webhook', 'cli'].includes(trigger.type)}
{#if trigger.isDraft}
<Button
size="xs"
color="light"
btnClasses="transition-all duration-200 text-transparent hover:bg-surface group-hover:text-primary bg-transparent px-1 py-1"
startIcon={{ icon: Trash }}
iconOnly
on:click={() => onDeleteDraft?.(index)}
/>
<DeleteTriggerButton {trigger} onDelete={() => onDeleteDraft?.(index)} small />
{:else if !!trigger.draftConfig && !trigger.isDraft}
<Button
size="xs"
Expand Down
18 changes: 9 additions & 9 deletions frontend/src/lib/components/triggers/TriggersWrapper.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
{isFlow}
path={initialPath || fakeInitialPath}
defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
customLabel={small ? customLabel : undefined}
{customLabel}
{...props}
/>
{:else if selectedTrigger.type === 'webhook'}
Expand Down Expand Up @@ -86,7 +86,7 @@
{selectedTrigger}
defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
{schema}
customLabel={small ? customLabel : undefined}
{customLabel}
{...props}
/>
{:else if selectedTrigger.type === 'websocket'}
Expand All @@ -95,7 +95,7 @@
path={initialPath || fakeInitialPath}
{selectedTrigger}
defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
customLabel={small ? customLabel : undefined}
{customLabel}
{...props}
/>
{:else if selectedTrigger.type === 'kafka'}
Expand All @@ -104,7 +104,7 @@
path={initialPath || fakeInitialPath}
{selectedTrigger}
defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
customLabel={small ? customLabel : undefined}
{customLabel}
{...props}
/>
{:else if selectedTrigger.type === 'postgres'}
Expand All @@ -113,7 +113,7 @@
path={initialPath || fakeInitialPath}
{selectedTrigger}
defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
customLabel={small ? customLabel : undefined}
{customLabel}
{...props}
/>
{:else if selectedTrigger.type === 'nats'}
Expand All @@ -122,7 +122,7 @@
path={initialPath || fakeInitialPath}
{selectedTrigger}
defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
customLabel={small ? customLabel : undefined}
{customLabel}
{...props}
/>
{:else if selectedTrigger.type === 'mqtt'}
Expand All @@ -131,7 +131,7 @@
path={initialPath || fakeInitialPath}
{selectedTrigger}
defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
customLabel={small ? customLabel : undefined}
{customLabel}
{...props}
/>
{:else if selectedTrigger.type === 'sqs'}
Expand All @@ -140,7 +140,7 @@
path={initialPath || fakeInitialPath}
{selectedTrigger}
defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
customLabel={small ? customLabel : undefined}
{customLabel}
{...props}
/>
{:else if selectedTrigger.type === 'gcp'}
Expand All @@ -149,7 +149,7 @@
path={initialPath || fakeInitialPath}
{selectedTrigger}
defaultValues={selectedTrigger.draftConfig ?? selectedTrigger.captureConfig ?? undefined}
customLabel={small ? customLabel : undefined}
{customLabel}
{...props}
/>
{:else if selectedTrigger.type === 'poll'}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import type { Snippet } from 'svelte'
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
import { saveGcpTriggerFromCfg } from './utils'
import { handleConfigChange } from '../utils'
import { handleConfigChange, type Trigger } from '../utils'

let drawer: Drawer | undefined = $state(undefined)
let is_flow: boolean = $state(false)
Expand Down Expand Up @@ -55,8 +55,7 @@
hideTooltips = false,
isEditor = false,
allowDraft = false,
hasDraft = false,
isDraftOnly = false,
trigger = undefined,
isDeployed = false,
customLabel = undefined,
onConfigChange = undefined,
Expand All @@ -72,8 +71,7 @@
hideTooltips?: boolean
isEditor?: boolean
allowDraft?: boolean
hasDraft?: boolean
isDraftOnly?: boolean
trigger?: Trigger
isDeployed?: boolean
customLabel?: Snippet
onConfigChange?: (cfg: Record<string, any>, saveDisabled: boolean, updated: boolean) => void
Expand Down Expand Up @@ -225,7 +223,7 @@

async function handleToggleEnabled(toggleEnabled: boolean) {
enabled = toggleEnabled
if (!isDraftOnly && !hasDraft) {
if (!trigger?.draftConfig) {
await GcpTriggerService.setGcpTriggerEnabled({
path: initialPath,
workspace: $workspaceStore ?? '',
Expand Down Expand Up @@ -279,8 +277,6 @@
{#snippet actionsButtons()}
{#if !drawerLoading && can_write}
<TriggerEditorToolbar
{isDraftOnly}
{hasDraft}
permissions={drawerLoading || !can_write ? 'none' : 'create'}
{saveDisabled}
{enabled}
Expand All @@ -293,6 +289,7 @@
{onDelete}
onToggleEnabled={handleToggleEnabled}
{cloudDisabled}
{trigger}
/>
{/if}
{/snippet}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@
hideTarget
hideTooltips={!isDeployed || cloudDisabled}
allowDraft={true}
hasDraft={!!selectedTrigger.draftConfig}
isDraftOnly={selectedTrigger.isDraft}
trigger={selectedTrigger}
{customLabel}
{isDeployed}
{cloudDisabled}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,14 @@
description = undefined,
isEditor = false,
customLabel = undefined,
isDraftOnly = false,
allowDraft = false,
hasDraft = false,
isDeployed = false,
onConfigChange = undefined,
onCaptureConfigChange = undefined,
onUpdate = undefined,
onDelete = undefined,
onReset = undefined
onReset = undefined,
trigger = undefined
} = $props()

// Form data state
Expand Down Expand Up @@ -526,7 +525,7 @@
{can_write}
bind:static_asset_config
showTestingBadge={isEditor}
{isDraftOnly}
isDraftOnly={trigger?.isDraft}
/>

{#if !is_static_website}
Expand Down Expand Up @@ -717,8 +716,7 @@
{#snippet saveButton()}
{#if !drawerLoading}
<TriggerEditorToolbar
{isDraftOnly}
{hasDraft}
{trigger}
permissions={drawerLoading || !can_write ? 'none' : can_write && isAdmin ? 'create' : 'write'}
{saveDisabled}
enabled={undefined}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,8 @@
hideTarget
{isEditor}
{customLabel}
isDraftOnly={selectedTrigger.isDraft}
trigger={selectedTrigger}
allowDraft
hasDraft={!!selectedTrigger.draftConfig}
{...restProps}
>
{#snippet description()}
Expand Down
Loading