@@ -20,28 +20,50 @@ import { Input, Button, Box, Text, Spacer, HStack } from "@chakra-ui/react";
20
20
import { json } from "@codemirror/lang-json" ;
21
21
import { githubLight , githubDark } from "@uiw/codemirror-themes-all" ;
22
22
import CodeMirror from "@uiw/react-codemirror" ;
23
- import { useEffect , useState } from "react" ;
23
+ import { useEffect , useMemo , useState } from "react" ;
24
24
import { useForm , Controller } from "react-hook-form" ;
25
25
import { FiPlay } from "react-icons/fi" ;
26
26
27
27
import { useColorMode } from "src/context/colorMode" ;
28
+ import { useDagParams } from "src/queries/useDagParams" ;
29
+ import { useTrigger } from "src/queries/useTrigger" ;
28
30
31
+ import { ErrorAlert } from "../ErrorAlert" ;
29
32
import { Accordion } from "../ui" ;
30
- import type { DagParams } from "./TriggerDag" ;
31
33
32
34
type TriggerDAGFormProps = {
33
- dagParams : DagParams ;
35
+ dagId : string ;
34
36
onClose : ( ) => void ;
35
- onTrigger : ( updatedDagParams : DagParams ) => void ;
36
- setDagParams : React . Dispatch < React . SetStateAction < DagParams > > ;
37
+ open : boolean ;
38
+ } ;
39
+
40
+ export type DagRunTriggerParams = {
41
+ conf : string ;
42
+ dagRunId : string ;
43
+ dataIntervalEnd : string ;
44
+ dataIntervalStart : string ;
45
+ note : string ;
37
46
} ;
38
47
39
48
const TriggerDAGForm : React . FC < TriggerDAGFormProps > = ( {
40
- dagParams ,
41
- onTrigger ,
42
- setDagParams ,
49
+ dagId ,
50
+ onClose ,
51
+ open ,
43
52
} ) => {
44
- const [ jsonError , setJsonError ] = useState < string | undefined > ( ) ;
53
+ const [ errors , setErrors ] = useState < { conf ?: string ; date ?: string } > ( { } ) ;
54
+ const conf = useDagParams ( dagId , open ) ;
55
+ const { error : errorTrigger , isPending, triggerDagRun } = useTrigger ( onClose ) ;
56
+
57
+ const dagRunRequestBody : DagRunTriggerParams = useMemo (
58
+ ( ) => ( {
59
+ conf,
60
+ dagRunId : "" ,
61
+ dataIntervalEnd : "" ,
62
+ dataIntervalStart : "" ,
63
+ note : "" ,
64
+ } ) ,
65
+ [ conf ] ,
66
+ ) ;
45
67
46
68
const {
47
69
control,
@@ -50,40 +72,47 @@ const TriggerDAGForm: React.FC<TriggerDAGFormProps> = ({
50
72
reset,
51
73
setValue,
52
74
watch,
53
- } = useForm < DagParams > ( {
54
- defaultValues : dagParams ,
55
- } ) ;
75
+ } = useForm < DagRunTriggerParams > ( { defaultValues : dagRunRequestBody } ) ;
56
76
57
77
const dataIntervalStart = watch ( "dataIntervalStart" ) ;
58
78
const dataIntervalEnd = watch ( "dataIntervalEnd" ) ;
59
79
60
80
useEffect ( ( ) => {
61
- reset ( dagParams ) ;
62
- } , [ dagParams , reset ] ) ;
63
-
64
- const onSubmit = ( data : DagParams ) => {
65
- onTrigger ( data ) ;
66
- setDagParams ( data ) ;
67
- setJsonError ( undefined ) ;
68
- } ;
81
+ reset ( dagRunRequestBody ) ;
82
+ } , [ dagRunRequestBody , reset ] ) ;
69
83
70
84
const validateAndPrettifyJson = ( value : string ) => {
71
85
try {
72
86
const parsedJson = JSON . parse ( value ) as JSON ;
73
87
74
- setJsonError ( undefined ) ;
88
+ setErrors ( ( prev ) => ( { ... prev , conf : undefined } ) ) ;
75
89
76
90
return JSON . stringify ( parsedJson , undefined , 2 ) ;
77
91
} catch ( error ) {
78
92
const errorMessage =
79
93
error instanceof Error ? error . message : "Unknown error occurred." ;
80
94
81
- setJsonError ( `Invalid JSON format: ${ errorMessage } ` ) ;
95
+ setErrors ( ( prev ) => ( {
96
+ ...prev ,
97
+ conf : `Invalid JSON format: ${ errorMessage } ` ,
98
+ } ) ) ;
82
99
83
100
return value ;
84
101
}
85
102
} ;
86
103
104
+ const onSubmit = ( data : DagRunTriggerParams ) => {
105
+ if ( Boolean ( data . dataIntervalStart ) !== Boolean ( data . dataIntervalEnd ) ) {
106
+ setErrors ( ( prev ) => ( {
107
+ ...prev ,
108
+ date : "Either both Data Interval Start and End must be provided, or both must be empty." ,
109
+ } ) ) ;
110
+
111
+ return ;
112
+ }
113
+ triggerDagRun ( dagId , data ) ;
114
+ } ;
115
+
87
116
const validateDates = (
88
117
fieldName : "dataIntervalEnd" | "dataIntervalStart" ,
89
118
) => {
@@ -92,6 +121,8 @@ const TriggerDAGForm: React.FC<TriggerDAGFormProps> = ({
92
121
: undefined ;
93
122
const endDate = dataIntervalEnd ? new Date ( dataIntervalEnd ) : undefined ;
94
123
124
+ setErrors ( ( prev ) => ( { ...prev , date : undefined } ) ) ;
125
+
95
126
if ( startDate && endDate ) {
96
127
if ( fieldName === "dataIntervalStart" && startDate > endDate ) {
97
128
setValue ( "dataIntervalStart" , dataIntervalEnd ) ;
@@ -105,7 +136,8 @@ const TriggerDAGForm: React.FC<TriggerDAGFormProps> = ({
105
136
106
137
return (
107
138
< >
108
- < Accordion . Root collapsible size = "lg" variant = "enclosed" >
139
+ < ErrorAlert error = { errorTrigger } />
140
+ < Accordion . Root collapsible mt = { 4 } size = "lg" variant = "enclosed" >
109
141
< Accordion . Item key = "advancedOptions" value = "advancedOptions" >
110
142
< Accordion . ItemTrigger cursor = "button" >
111
143
Advanced Options
@@ -153,7 +185,7 @@ const TriggerDAGForm: React.FC<TriggerDAGFormProps> = ({
153
185
</ Text >
154
186
< Controller
155
187
control = { control }
156
- name = "runId "
188
+ name = "dagRunId "
157
189
render = { ( { field } ) => (
158
190
< Input
159
191
{ ...field }
@@ -168,7 +200,7 @@ const TriggerDAGForm: React.FC<TriggerDAGFormProps> = ({
168
200
</ Text >
169
201
< Controller
170
202
control = { control }
171
- name = "configJson "
203
+ name = "conf "
172
204
render = { ( { field } ) => (
173
205
< Box mb = { 4 } >
174
206
< CodeMirror
@@ -196,11 +228,11 @@ const TriggerDAGForm: React.FC<TriggerDAGFormProps> = ({
196
228
} }
197
229
theme = { colorMode === "dark" ? githubDark : githubLight }
198
230
/>
199
- { Boolean ( jsonError ) ? (
231
+ { Boolean ( errors . conf ) && (
200
232
< Text color = "red.500" fontSize = "sm" mt = { 2 } >
201
- { jsonError }
233
+ { errors . conf }
202
234
</ Text >
203
- ) : undefined }
235
+ ) }
204
236
</ Box >
205
237
) }
206
238
/>
@@ -210,7 +242,7 @@ const TriggerDAGForm: React.FC<TriggerDAGFormProps> = ({
210
242
</ Text >
211
243
< Controller
212
244
control = { control }
213
- name = "notes "
245
+ name = "note "
214
246
render = { ( { field } ) => (
215
247
< Input { ...field } placeholder = "Optional" size = "sm" />
216
248
) }
@@ -219,7 +251,11 @@ const TriggerDAGForm: React.FC<TriggerDAGFormProps> = ({
219
251
</ Accordion . ItemContent >
220
252
</ Accordion . Item >
221
253
</ Accordion . Root >
222
-
254
+ { Boolean ( errors . date ) && (
255
+ < Text color = "red.500" fontSize = "sm" mt = { 2 } >
256
+ { errors . date }
257
+ </ Text >
258
+ ) }
223
259
< Box as = "footer" display = "flex" justifyContent = "flex-end" mt = { 4 } >
224
260
< HStack w = "full" >
225
261
{ isDirty ? (
@@ -230,7 +266,7 @@ const TriggerDAGForm: React.FC<TriggerDAGFormProps> = ({
230
266
< Spacer />
231
267
< Button
232
268
colorPalette = "blue"
233
- disabled = { Boolean ( jsonError ) }
269
+ disabled = { Boolean ( errors . conf ) || Boolean ( errors . date ) || isPending }
234
270
onClick = { ( ) => void handleSubmit ( onSubmit ) ( ) }
235
271
>
236
272
< FiPlay /> Trigger
0 commit comments