Skip to content

Commit febd6ec

Browse files
committed
Add confirmation modal for deleting triggers
1 parent 67327ec commit febd6ec

21 files changed

+124
-121
lines changed

frontend/src/lib/components/SchedulePanel.svelte

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@
3333
bind:this={scheduleEditor}
3434
hideTarget
3535
allowDraft
36-
hasDraft={!!selectedTrigger.draftConfig}
37-
isDraftOnly={selectedTrigger.isDraft}
38-
primary={selectedTrigger.isPrimary}
36+
trigger={selectedTrigger}
3937
draftSchema={schema}
4038
{customLabel}
4139
{...restProps}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<script lang="ts">
2+
import { Trash } from 'lucide-svelte'
3+
import Button from '../common/button/Button.svelte'
4+
import ConfirmationModal from '../common/confirmationModal/ConfirmationModal.svelte'
5+
import { triggerIconMap, type Trigger } from './utils'
6+
import TriggerLabel from './TriggerLabel.svelte'
7+
import { twMerge } from 'tailwind-merge'
8+
9+
interface Props {
10+
onDelete: (() => void) | undefined
11+
trigger?: Trigger
12+
small?: boolean
13+
}
14+
15+
let { onDelete, trigger = undefined, small = false }: Props = $props()
16+
17+
let confirmationModalOpen = $state(false)
18+
</script>
19+
20+
<ConfirmationModal
21+
title="Are you sure you want to delete this draft trigger ?"
22+
confirmationText="Delete"
23+
open={confirmationModalOpen}
24+
on:canceled={() => {
25+
confirmationModalOpen = false
26+
}}
27+
on:confirmed={() => {
28+
onDelete?.()
29+
confirmationModalOpen = false
30+
}}
31+
>
32+
{#if trigger !== undefined}
33+
{@const IconComponent = triggerIconMap[trigger.type]}
34+
<div class="flex flex-row gap-2 items-center grow min-w-0 pr-2 rounded-md my-4">
35+
<IconComponent
36+
size={16}
37+
class={twMerge(trigger.isDraft ? 'text-frost-400' : '', 'shrink-0')}
38+
/>
39+
<TriggerLabel {trigger} />
40+
</div>
41+
{/if}
42+
</ConfirmationModal>
43+
44+
<Button
45+
size="xs"
46+
startIcon={{ icon: Trash }}
47+
iconOnly
48+
color={'light'}
49+
on:click={() => {
50+
confirmationModalOpen = true
51+
}}
52+
btnClasses={twMerge(small ? 'px-1 py-1' : '', 'bg-transparent hover:bg-red-500 hover:text-white')}
53+
/>

frontend/src/lib/components/triggers/TriggerEditorToolbar.svelte

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<script lang="ts">
22
import Button from '$lib/components/common/button/Button.svelte'
3-
import { Trash, Save, RotateCcw } from 'lucide-svelte'
3+
import { Save, RotateCcw } from 'lucide-svelte'
44
import { type Snippet } from 'svelte'
55
import Toggle from '$lib/components/Toggle.svelte'
66
import { Tooltip } from '../meltComponents'
7+
import DeleteTriggerButton from './DeleteTriggerButton.svelte'
8+
import type { Trigger } from './utils'
79
810
interface Props {
9-
isDraftOnly: any
10-
hasDraft: any
1111
saveDisabled: any
1212
enabled: boolean | undefined
1313
allowDraft: any
@@ -21,12 +21,10 @@
2121
onToggleEnabled?: (enabled: boolean) => void
2222
onUpdate?: () => void
2323
cloudDisabled?: boolean
24-
triggerType?: string
24+
trigger?: Trigger
2525
}
2626
2727
let {
28-
isDraftOnly,
29-
hasDraft,
3028
saveDisabled,
3129
enabled,
3230
allowDraft,
@@ -39,7 +37,8 @@
3937
onReset,
4038
onToggleEnabled,
4139
onUpdate,
42-
cloudDisabled = false
40+
cloudDisabled = false,
41+
trigger
4342
}: Props = $props()
4443
4544
const canSave = $derived((permissions === 'write' && edit) || permissions === 'create')
@@ -73,7 +72,7 @@
7372
{/if}
7473
{:else}
7574
<div class="flex flex-row gap-2 items-center">
76-
{#if !isDraftOnly && !hasDraft && enabled !== undefined}
75+
{#if !trigger?.draftConfig && enabled !== undefined}
7776
<div class="center-center">
7877
<Toggle
7978
size="2sm"
@@ -86,18 +85,9 @@
8685
/>
8786
</div>
8887
{/if}
89-
{#if isDraftOnly}
90-
<Button
91-
size="xs"
92-
startIcon={{ icon: Trash }}
93-
iconOnly
94-
color={'light'}
95-
on:click={() => {
96-
onDelete?.()
97-
}}
98-
btnClasses="hover:bg-red-500 hover:text-white"
99-
/>
100-
{:else if hasDraft}
88+
{#if trigger?.isDraft}
89+
<DeleteTriggerButton {onDelete} {trigger} />
90+
{:else if !trigger?.isDraft && trigger?.draftConfig}
10191
<Button
10292
size="xs"
10393
startIcon={{ icon: RotateCcw }}
@@ -109,7 +99,7 @@
10999
Reset changes
110100
</Button>
111101
{/if}
112-
{#if canSave && (isDraftOnly || hasDraft)}
102+
{#if canSave && trigger?.draftConfig}
113103
<Tooltip placement="bottom-end" disablePopup={!saveDisabled && !cloudDisabled && isDeployed}>
114104
<Button
115105
size="xs"
@@ -120,15 +110,15 @@
120110
}}
121111
loading={isLoading}
122112
>
123-
{isDraftOnly ? 'Deploy' : 'Update'}
113+
{trigger?.isDraft ? 'Deploy' : 'Update'}
124114
</Button>
125115
<span slot="text">
126116
{#if !isDeployed}
127117
Deploy the runnable to enable trigger creation
128118
{:else if cloudDisabled}
129119
This trigger is disabled in the multi-tenant cloud
130120
{:else}
131-
Enter a valid config to {isDraftOnly ? 'deploy' : 'update'} the trigger
121+
Enter a valid config to {trigger?.isDraft ? 'deploy' : 'update'} the trigger
132122
{/if}
133123
</span>
134124
</Tooltip>

frontend/src/lib/components/triggers/TriggersTable.svelte

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<script lang="ts">
22
import DataTable from '$lib/components/table/DataTable.svelte'
33
import Button from '$lib/components/common/button/Button.svelte'
4-
import { Plus, Star, Loader2, Trash, RotateCcw } from 'lucide-svelte'
4+
import { Plus, Star, Loader2, RotateCcw } from 'lucide-svelte'
55
import { twMerge } from 'tailwind-merge'
66
import { triggerIconMap, type Trigger, type TriggerType } from './utils'
77
import AddTriggersButton from './AddTriggersButton.svelte'
88
import TriggerLabel from './TriggerLabel.svelte'
9+
import DeleteTriggerButton from './DeleteTriggerButton.svelte'
910
1011
interface Props {
1112
// Props
@@ -94,14 +95,7 @@
9495

9596
{#if !['email', 'webhook', 'cli'].includes(trigger.type)}
9697
{#if trigger.isDraft}
97-
<Button
98-
size="xs"
99-
color="light"
100-
btnClasses="transition-all duration-200 text-transparent hover:bg-surface group-hover:text-primary bg-transparent px-1 py-1"
101-
startIcon={{ icon: Trash }}
102-
iconOnly
103-
on:click={() => onDeleteDraft?.(index)}
104-
/>
98+
<DeleteTriggerButton {trigger} onDelete={() => onDeleteDraft?.(index)} small />
10599
{:else if !!trigger.draftConfig && !trigger.isDraft}
106100
<Button
107101
size="xs"

frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import type { Snippet } from 'svelte'
2222
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
2323
import { saveGcpTriggerFromCfg } from './utils'
24-
import { handleConfigChange } from '../utils'
24+
import { handleConfigChange, type Trigger } from '../utils'
2525
2626
let drawer: Drawer | undefined = $state(undefined)
2727
let is_flow: boolean = $state(false)
@@ -55,8 +55,7 @@
5555
hideTooltips = false,
5656
isEditor = false,
5757
allowDraft = false,
58-
hasDraft = false,
59-
isDraftOnly = false,
58+
trigger = undefined,
6059
isDeployed = false,
6160
customLabel = undefined,
6261
onConfigChange = undefined,
@@ -72,8 +71,7 @@
7271
hideTooltips?: boolean
7372
isEditor?: boolean
7473
allowDraft?: boolean
75-
hasDraft?: boolean
76-
isDraftOnly?: boolean
74+
trigger?: Trigger
7775
isDeployed?: boolean
7876
customLabel?: Snippet
7977
onConfigChange?: (cfg: Record<string, any>, saveDisabled: boolean, updated: boolean) => void
@@ -225,7 +223,7 @@
225223
226224
async function handleToggleEnabled(toggleEnabled: boolean) {
227225
enabled = toggleEnabled
228-
if (!isDraftOnly && !hasDraft) {
226+
if (!trigger?.draftConfig) {
229227
await GcpTriggerService.setGcpTriggerEnabled({
230228
path: initialPath,
231229
workspace: $workspaceStore ?? '',
@@ -279,8 +277,6 @@
279277
{#snippet actionsButtons()}
280278
{#if !drawerLoading && can_write}
281279
<TriggerEditorToolbar
282-
{isDraftOnly}
283-
{hasDraft}
284280
permissions={drawerLoading || !can_write ? 'none' : 'create'}
285281
{saveDisabled}
286282
{enabled}
@@ -293,6 +289,7 @@
293289
{onDelete}
294290
onToggleEnabled={handleToggleEnabled}
295291
{cloudDisabled}
292+
{trigger}
296293
/>
297294
{/if}
298295
{/snippet}

frontend/src/lib/components/triggers/gcp/GcpTriggerPanel.svelte

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@
4444
hideTarget
4545
hideTooltips={!isDeployed || cloudDisabled}
4646
allowDraft={true}
47-
hasDraft={!!selectedTrigger.draftConfig}
48-
isDraftOnly={selectedTrigger.isDraft}
47+
trigger={selectedTrigger}
4948
{customLabel}
5049
{isDeployed}
5150
{cloudDisabled}

frontend/src/lib/components/triggers/http/RouteEditorInner.svelte

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,14 @@
3939
description = undefined,
4040
isEditor = false,
4141
customLabel = undefined,
42-
isDraftOnly = false,
4342
allowDraft = false,
44-
hasDraft = false,
4543
isDeployed = false,
4644
onConfigChange = undefined,
4745
onCaptureConfigChange = undefined,
4846
onUpdate = undefined,
4947
onDelete = undefined,
50-
onReset = undefined
48+
onReset = undefined,
49+
trigger = undefined
5150
} = $props()
5251
5352
// Form data state
@@ -526,7 +525,7 @@
526525
{can_write}
527526
bind:static_asset_config
528527
showTestingBadge={isEditor}
529-
{isDraftOnly}
528+
isDraftOnly={trigger?.isDraft}
530529
/>
531530

532531
{#if !is_static_website}
@@ -717,8 +716,7 @@
717716
{#snippet saveButton()}
718717
{#if !drawerLoading}
719718
<TriggerEditorToolbar
720-
{isDraftOnly}
721-
{hasDraft}
719+
{trigger}
722720
permissions={drawerLoading || !can_write ? 'none' : can_write && isAdmin ? 'create' : 'write'}
723721
{saveDisabled}
724722
enabled={undefined}

frontend/src/lib/components/triggers/http/RoutesPanel.svelte

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,8 @@
3737
hideTarget
3838
{isEditor}
3939
{customLabel}
40-
isDraftOnly={selectedTrigger.isDraft}
40+
trigger={selectedTrigger}
4141
allowDraft
42-
hasDraft={!!selectedTrigger.draftConfig}
4342
{...restProps}
4443
>
4544
{#snippet description()}

frontend/src/lib/components/triggers/kafka/KafkaTriggerEditorInner.svelte

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import type { Snippet } from 'svelte'
1616
import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte'
1717
import { saveKafkaTriggerFromCfg } from './utils'
18-
import { handleConfigChange } from '../utils'
18+
import { handleConfigChange, type Trigger } from '../utils'
1919
2020
interface Props {
2121
useDrawer?: boolean
@@ -24,8 +24,7 @@
2424
hideTooltips?: boolean
2525
isEditor?: boolean
2626
allowDraft?: boolean
27-
hasDraft?: boolean
28-
isDraftOnly?: boolean
27+
trigger?: Trigger
2928
customLabel?: Snippet
3029
isDeployed?: boolean
3130
cloudDisabled?: boolean
@@ -43,8 +42,7 @@
4342
hideTooltips = false,
4443
isEditor = false,
4544
allowDraft = false,
46-
hasDraft = false,
47-
isDraftOnly = false,
45+
trigger = undefined,
4846
customLabel,
4947
isDeployed = false,
5048
cloudDisabled = false,
@@ -281,8 +279,7 @@
281279
{#snippet actionsButtons(size: 'xs' | 'sm' = 'sm')}
282280
{#if !drawerLoading}
283281
<TriggerEditorToolbar
284-
{isDraftOnly}
285-
{hasDraft}
282+
{trigger}
286283
permissions={drawerLoading || !can_write ? 'none' : 'create'}
287284
{enabled}
288285
{allowDraft}

frontend/src/lib/components/triggers/kafka/KafkaTriggersPanel.svelte

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@
4545
hideTarget
4646
hideTooltips={!isDeployed || cloudDisabled}
4747
allowDraft={true}
48-
hasDraft={!!selectedTrigger.draftConfig}
49-
isDraftOnly={selectedTrigger.isDraft}
48+
trigger={selectedTrigger}
5049
{customLabel}
5150
{isDeployed}
5251
{cloudDisabled}

0 commit comments

Comments
 (0)