(dispatch('focus'), (focused = true))}
- on:blur={() => (dispatch('blur'), (focused = false))}
+ on:focus={() => ((dispatch('focus'), onfocus?.()), (focused = true))}
+ on:blur={() => ((dispatch('blur'), onblur?.()), (focused = false))}
bind:this={editor}
on:change
autoHeight
diff --git a/frontend/src/lib/components/JsonInputs.svelte b/frontend/src/lib/components/JsonInputs.svelte
index d336ad2d46..49769e189f 100644
--- a/frontend/src/lib/components/JsonInputs.svelte
+++ b/frontend/src/lib/components/JsonInputs.svelte
@@ -8,12 +8,18 @@
updateOnBlur?: boolean
placeholder?: string
selected?: boolean
+ onselect?: (...args: any[]) => any
+ onfocus?: (...args: any[]) => any
+ onblur?: (...args: any[]) => any
}
let {
updateOnBlur = true,
placeholder = 'Write a JSON payload. The input schema will be inferred.
Example:
{
"foo": "12"
}',
- selected = false
+ selected = false,
+ onselect = undefined,
+ onfocus = undefined,
+ onblur = undefined
}: Props = $props()
let pendingJson = $state('')
@@ -23,13 +29,16 @@
function updatePayloadFromJson(jsonInput: string) {
if (jsonInput === undefined || jsonInput === null || jsonInput.trim() === '') {
dispatch('select', undefined)
+ onselect?.(undefined)
return
}
try {
const parsed = JSON.parse(jsonInput)
dispatch('select', parsed)
+ onselect?.(parsed)
} catch (error) {
dispatch('select', undefined)
+ onselect?.(undefined)
}
}
@@ -40,6 +49,7 @@
export function resetSelected(dispatchEvent?: boolean) {
if (dispatchEvent) {
dispatch('select', undefined)
+ onselect?.(undefined)
}
}
@@ -62,12 +72,14 @@
on:focus={() => {
if (updateOnBlur) {
dispatch('focus')
+ onfocus?.()
updatePayloadFromJson(pendingJson)
}
}}
on:blur={async () => {
if (updateOnBlur) {
dispatch('blur')
+ onblur?.()
}
}}
on:change={(e) => {
diff --git a/frontend/src/lib/components/Path.svelte b/frontend/src/lib/components/Path.svelte
index 85ca9c4271..9a2990c018 100644
--- a/frontend/src/lib/components/Path.svelte
+++ b/frontend/src/lib/components/Path.svelte
@@ -72,6 +72,7 @@
hideFullPath?: boolean
size?: 'sm' | 'md'
drawerOffset?: number
+ onenter?: (...args: any[]) => any
}
let {
@@ -89,7 +90,8 @@
disableEditing = false,
hideFullPath = false,
size = 'md',
- drawerOffset = 0
+ drawerOffset = 0,
+ onenter = undefined
}: Props = $props()
$effect.pre(() => {
@@ -133,6 +135,7 @@
if (key === 'Enter') {
event.preventDefault()
dispatch('enter')
+ onenter?.()
}
}
diff --git a/frontend/src/lib/components/RadioButton.svelte b/frontend/src/lib/components/RadioButton.svelte
index c7e5dc8dce..7025f80343 100644
--- a/frontend/src/lib/components/RadioButton.svelte
+++ b/frontend/src/lib/components/RadioButton.svelte
@@ -1,14 +1,14 @@
@@ -39,7 +40,7 @@
class="sr-only"
bind:group={value}
aria-labelledby="memory-option-0-label"
- onclick={() => dispatch('change', val)}
+ onclick={() => (dispatch('change', val), onchange?.(val))}
/>
{#if typeof label !== 'string'}
diff --git a/frontend/src/lib/components/ResourceEditor.svelte b/frontend/src/lib/components/ResourceEditor.svelte
index 8ca1ecd85e..0517f24e66 100644
--- a/frontend/src/lib/components/ResourceEditor.svelte
+++ b/frontend/src/lib/components/ResourceEditor.svelte
@@ -1,5 +1,4 @@
diff --git a/frontend/src/lib/components/SavedInputsPicker.svelte b/frontend/src/lib/components/SavedInputsPicker.svelte
index 057a405ac4..bba06fef67 100644
--- a/frontend/src/lib/components/SavedInputsPicker.svelte
+++ b/frontend/src/lib/components/SavedInputsPicker.svelte
@@ -21,6 +21,8 @@
noButton?: boolean
jsonView?: boolean
limitPayloadSize?: boolean
+ onselect?: (...args: any[]) => any
+ onisEditing?: (...args: any[]) => any
}
let {
@@ -30,7 +32,9 @@
isValid = false,
noButton = false,
jsonView = false,
- limitPayloadSize = false
+ limitPayloadSize = false,
+ onselect = undefined,
+ onisEditing = undefined
}: Props = $props()
interface EditableInput extends Input {
@@ -136,9 +140,11 @@
if (input.payloadData === 'WINDMILL_TOO_BIG') {
const fullPayload = await input.getFullPayload?.()
dispatch('select', fullPayload)
+ onselect?.(fullPayload)
} else {
selectedArgs = structuredClone($state.snapshot(input.payloadData) ?? {})
dispatch('select', selectedArgs)
+ onselect?.(selectedArgs)
}
}
}
@@ -170,6 +176,7 @@
function setEditing(input: EditableInput | null) {
isEditing = input
dispatch('isEditing', !!input)
+ onisEditing?.(!!input)
}
function handleError(error: { type: string; error: any }) {
@@ -189,6 +196,7 @@
selectedArgs = undefined
if (dispatchEvent) {
dispatch('select', undefined)
+ onselect?.(undefined)
}
}
diff --git a/frontend/src/lib/components/SavedInputsV2.svelte b/frontend/src/lib/components/SavedInputsV2.svelte
index 7823a7caaf..525365af38 100644
--- a/frontend/src/lib/components/SavedInputsV2.svelte
+++ b/frontend/src/lib/components/SavedInputsV2.svelte
@@ -24,6 +24,7 @@
// Are the current Inputs valid and able to be saved?
isValid: boolean
args: object
+ onselected_args?: (...args: any[]) => any
}
let {
@@ -34,7 +35,8 @@
jsonView = false,
schema,
isValid,
- args
+ args,
+ onselected_args = undefined
}: Props = $props()
export function resetSelected() {
@@ -59,9 +61,11 @@
}
inputSelected = type
dispatch('selected_args', selected_args)
+ onselected_args?.(selected_args)
} else if (savedArgs) {
inputSelected = type
dispatch('selected_args', savedArgs)
+ onselected_args?.(savedArgs)
}
}
diff --git a/frontend/src/lib/components/SchemaForm.svelte b/frontend/src/lib/components/SchemaForm.svelte
index cb8828286c..9894bfa61e 100644
--- a/frontend/src/lib/components/SchemaForm.svelte
+++ b/frontend/src/lib/components/SchemaForm.svelte
@@ -72,6 +72,12 @@
workspace?: string | undefined
chatInputEnabled?: boolean
actions?: import('svelte').Snippet<[{ item: { id: string; value: string } }]> | undefined
+ onchange?: (...args: any[]) => any
+ onclick?: (...args: any[]) => any
+ onnestedChange?: (...args: any[]) => any
+ onacceptChange?: (...args: any[]) => any
+ onrejectChange?: (...args: any[]) => any
+ onkeydownCmdEnter?: (...args: any[]) => any
}
let {
@@ -114,7 +120,13 @@
computeS3ForceViewerPolicies = undefined,
workspace = undefined,
chatInputEnabled = false,
- actions: actions_render = undefined
+ actions: actions_render = undefined,
+ onchange = undefined,
+ onclick = undefined,
+ onnestedChange = undefined,
+ onacceptChange = undefined,
+ onrejectChange = undefined,
+ onkeydownCmdEnter = undefined
}: Props = $props()
const dispatch = createEventDispatcher()
@@ -188,6 +200,7 @@
if (!deepEqual(keys, nkeys)) {
keys = nkeys
dispatch('change')
+ onchange?.()
}
}
// let missingKeys = keys.filter((x) => args && !(x in args))
@@ -360,6 +373,7 @@
class="flex flex-row items-center {largeGap ? 'pb-4' : 'pb-2'} "
onclick={() => {
dispatch('click', argName)
+ onclick?.(argName)
}}
>
{#if args && typeof args == 'object' && prop}
@@ -371,13 +385,21 @@
{lightHeaderFont}
on:change={() => {
dispatch('change')
+ onchange?.()
}}
on:nestedChange={() => {
dispatch('nestedChange')
+ onnestedChange?.()
}}
- on:acceptChange={(e) => dispatch('acceptChange', e.detail)}
- on:rejectChange={(e) => dispatch('rejectChange', e.detail)}
- on:keydownCmdEnter={() => dispatch('keydownCmdEnter')}
+ on:acceptChange={(e) => (
+ dispatch('acceptChange', e.detail),
+ onacceptChange?.(e.detail)
+ )}
+ on:rejectChange={(e) => (
+ dispatch('rejectChange', e.detail),
+ onrejectChange?.(e.detail)
+ )}
+ on:keydownCmdEnter={() => (dispatch('keydownCmdEnter'), onkeydownCmdEnter?.())}
{disablePortal}
{resourceTypes}
{prettifyHeader}
@@ -398,17 +420,19 @@
customErrorMessage={prop?.customErrorMessage}
bind:properties={
() => prop?.properties,
- (v) => { if (prop) prop.properties = v }
+ (v) => {
+ if (prop) prop.properties = v
+ }
}
bind:order={
() => prop?.order,
- (v) => { if (prop) prop.order = v }
+ (v) => {
+ if (prop) prop.order = v
+ }
}
nestedRequired={prop?.required}
itemsType={prop?.items}
- disabled={disabledArgs.includes(argName) ||
- disabled ||
- prop?.disabled}
+ disabled={disabledArgs.includes(argName) || disabled || prop?.disabled}
{compact}
{variableEditor}
{itemPicker}
diff --git a/frontend/src/lib/components/SchemaFormWithArgPicker.svelte b/frontend/src/lib/components/SchemaFormWithArgPicker.svelte
index f1f7bae6e9..28363afe4e 100644
--- a/frontend/src/lib/components/SchemaFormWithArgPicker.svelte
+++ b/frontend/src/lib/components/SchemaFormWithArgPicker.svelte
@@ -19,6 +19,7 @@
isValid?: boolean
jsonView?: boolean
children?: import('svelte').Snippet
+ onselect?: (...args: any[]) => any
}
let {
@@ -28,7 +29,8 @@
previewArgs,
isValid = true,
jsonView = false,
- children
+ children,
+ onselect = undefined
}: Props = $props()
const dispatch = createEventDispatcher()
@@ -142,6 +144,7 @@
{runnableType}
on:select={(e) => {
dispatch('select', { payload: e.detail?.args, type: 'history' })
+ onselect?.({ payload: e.detail?.args, type: 'history' })
}}
/>
@@ -155,6 +158,7 @@
bind:this={savedInputsPicker}
on:select={(e) => {
dispatch('select', { payload: e.detail, type: 'saved' })
+ onselect?.({ payload: e.detail, type: 'saved' })
}}
{jsonView}
/>
@@ -173,6 +177,7 @@
path={stablePathForCaptures}
on:select={(e) => {
dispatch('select', { payload: e.detail, type: 'captures' })
+ onselect?.({ payload: e.detail, type: 'captures' })
}}
bind:this={captureTable}
isFlow={true}
diff --git a/frontend/src/lib/components/ScriptEditor.svelte b/frontend/src/lib/components/ScriptEditor.svelte
index 4659abc0ac..391365b2c9 100644
--- a/frontend/src/lib/components/ScriptEditor.svelte
+++ b/frontend/src/lib/components/ScriptEditor.svelte
@@ -119,6 +119,8 @@
assets?: AssetWithAltAccessType[]
editor_bar_right?: import('svelte').Snippet
enablePreprocessorSnippet?: boolean
+ onchange?: (...args: any[]) => any
+ onformat?: (...args: any[]) => any
}
let {
@@ -150,7 +152,9 @@
disableAi = false,
assets = $bindable(),
editor_bar_right,
- enablePreprocessorSnippet = false
+ enablePreprocessorSnippet = false,
+ onchange = undefined,
+ onformat = undefined
}: Props = $props()
let initialArgs = structuredClone($state.snapshot(args))
@@ -187,6 +191,7 @@
watchChanges &&
(code != undefined || schema != undefined) &&
dispatch('change', { code, schema })
+ onchange?.({ code, schema })
})
watch(
@@ -1407,6 +1412,7 @@
console.error('Could not save last_save to local storage', e)
}
dispatch('format')
+ onformat?.()
}}
class="flex flex-1 h-full !overflow-visible"
scriptLang={lang}
diff --git a/frontend/src/lib/components/ScriptPicker.svelte b/frontend/src/lib/components/ScriptPicker.svelte
index 5fa0618edd..d04f4b2cd7 100644
--- a/frontend/src/lib/components/ScriptPicker.svelte
+++ b/frontend/src/lib/components/ScriptPicker.svelte
@@ -30,6 +30,7 @@
allowEdit?: boolean
allowView?: boolean
clearable?: boolean
+ onselect?: (...args: any[]) => any
}
let {
@@ -42,7 +43,8 @@
allowRefresh = false,
allowEdit = true,
allowView = true,
- clearable = false
+ clearable = false,
+ onselect = undefined
}: Props = $props()
let items: { value: string; label: string }[] = $state([])
@@ -130,6 +132,7 @@
(path) => {
scriptPath = path
dispatch('select', { path, itemKind })
+ onselect?.({ path, itemKind })
}
}
class="grow shrink max-w-full"
diff --git a/frontend/src/lib/components/ScriptVersionHistory.svelte b/frontend/src/lib/components/ScriptVersionHistory.svelte
index 4d053fc433..eaafb2fe2f 100644
--- a/frontend/src/lib/components/ScriptVersionHistory.svelte
+++ b/frontend/src/lib/components/ScriptVersionHistory.svelte
@@ -13,7 +13,15 @@
const dispatch = createEventDispatcher()
- let { openDetails = false, scriptPath }: { openDetails?: boolean; scriptPath: string } = $props()
+ let {
+ openDetails = false,
+ scriptPath,
+ onopenDetails = undefined
+ }: {
+ openDetails?: boolean
+ scriptPath: string
+ onopenDetails?: (...args: any[]) => any
+ } = $props()
let deploymentMsgUpdateMode = $state(false)
let deploymentMsgUpdate: string | undefined = $state()
@@ -102,6 +110,7 @@
dispatch('delete')}
+ on:click={() => (dispatch('delete'), ondelete?.())}
size="xs"
color="red"
variant="border"
@@ -216,6 +221,7 @@ return state.foo`,
schema: undefined
}
dispatch('new', newInlineScript)
+ onnew?.(newInlineScript)
}}
/>