@@ -4,8 +4,12 @@ import {
4
4
ConditionType ,
5
5
DynamicDataTableCellValidationState ,
6
6
DynamicDataTableRowDataType ,
7
+ IO_VARIABLES_VALUE_COLUMN_BOOL_OPTIONS ,
8
+ IO_VARIABLES_VALUE_COLUMN_DATE_OPTIONS ,
9
+ PATTERNS ,
7
10
PluginType ,
8
11
SelectPickerOptionType ,
12
+ VALUE_COLUMN_DROPDOWN_LABEL ,
9
13
VariableType ,
10
14
VariableTypeFormat ,
11
15
} from '@devtron-labs/devtron-fe-common-lib'
@@ -36,16 +40,27 @@ export const getConditionDataTableHeaders = (conditionType: ConditionType): Cond
36
40
37
41
const getConditionDataTableVariableOptions = ( ioVariables : VariableType [ ] ) : SelectPickerOptionType < string > [ ] =>
38
42
( ioVariables || [ ] )
39
- . filter ( ( variable ) => variable . name )
43
+ . filter ( ( variable ) => variable . name && variable . format !== VariableTypeFormat . FILE )
40
44
. map ( ( variable ) => ( { label : variable . name , value : variable . name } ) )
41
45
42
- const getOperatorOptionsBasedOnVariableTypeFormat = (
43
- conditionOnVariable : ConditionDetails [ 'conditionOnVariable' ] ,
44
- ioVariables : VariableType [ ] ,
45
- ) => {
46
- const type = ioVariables . find ( ( { name } ) => name === conditionOnVariable ) ?. format
46
+ const getIOVariableBasedOnConditionOnVariable = ( {
47
+ conditionOnVariable,
48
+ ioVariables,
49
+ } : {
50
+ conditionOnVariable : ConditionDetails [ 'conditionOnVariable' ]
51
+ ioVariables : VariableType [ ]
52
+ } ) => ioVariables . find ( ( { name } ) => name === conditionOnVariable )
53
+
54
+ export const getConditionVariableTypeFormat = ( {
55
+ conditionOnVariable,
56
+ ioVariables,
57
+ } : {
58
+ conditionOnVariable : ConditionDetails [ 'conditionOnVariable' ]
59
+ ioVariables : VariableType [ ]
60
+ } ) => getIOVariableBasedOnConditionOnVariable ( { conditionOnVariable, ioVariables } ) ?. format ?? null
47
61
48
- switch ( type ) {
62
+ const getOperatorOptionsBasedOnVariableTypeFormat = ( variableType : VariableTypeFormat ) => {
63
+ switch ( variableType ) {
49
64
case VariableTypeFormat . STRING :
50
65
case VariableTypeFormat . BOOL :
51
66
case VariableTypeFormat . FILE :
@@ -57,6 +72,81 @@ const getOperatorOptionsBasedOnVariableTypeFormat = (
57
72
}
58
73
}
59
74
75
+ const getConditionDataTableValColumnProps = ( {
76
+ conditionalValue,
77
+ conditionOnVariable,
78
+ ioVariables,
79
+ } : {
80
+ ioVariables : VariableType [ ]
81
+ } & Pick <
82
+ ConditionDetails ,
83
+ 'conditionOnVariable' | 'conditionalValue'
84
+ > ) : ConditionDataTableType [ 'rows' ] [ number ] [ 'data' ] [ 'val' ] => {
85
+ const { valueConstraint, format } =
86
+ getIOVariableBasedOnConditionOnVariable ( { conditionOnVariable, ioVariables } ) ?? { }
87
+
88
+ const choices = ( valueConstraint ?. choices || [ ] ) . map < SelectPickerOptionType < string > > ( ( value ) => ( {
89
+ label : value ,
90
+ value,
91
+ } ) )
92
+
93
+ if ( format === VariableTypeFormat . NUMBER || format === VariableTypeFormat . STRING ) {
94
+ if ( ! choices . length ) {
95
+ return {
96
+ type : DynamicDataTableRowDataType . TEXT ,
97
+ props : { placeholder : 'Enter value' } ,
98
+ value : conditionalValue ,
99
+ }
100
+ }
101
+
102
+ if ( valueConstraint ?. blockCustomValue ) {
103
+ return {
104
+ type : DynamicDataTableRowDataType . DROPDOWN ,
105
+ props : {
106
+ options : [ { label : VALUE_COLUMN_DROPDOWN_LABEL . CHOICES , options : choices } ] ,
107
+ placeholder : 'Select value' ,
108
+ } ,
109
+ value : conditionalValue ,
110
+ }
111
+ }
112
+ }
113
+
114
+ const formatConfig = {
115
+ [ VariableTypeFormat . BOOL ] : {
116
+ type : DynamicDataTableRowDataType . DROPDOWN ,
117
+ props : {
118
+ options : [
119
+ { label : VALUE_COLUMN_DROPDOWN_LABEL . CHOICES , options : IO_VARIABLES_VALUE_COLUMN_BOOL_OPTIONS } ,
120
+ ] ,
121
+ placeholder : 'Select value' ,
122
+ } ,
123
+ } ,
124
+ [ VariableTypeFormat . DATE ] : {
125
+ type : DynamicDataTableRowDataType . SELECT_TEXT ,
126
+ props : {
127
+ options : [
128
+ {
129
+ label : VALUE_COLUMN_DROPDOWN_LABEL . SUPPORTED_DATE_FORMATS ,
130
+ options : IO_VARIABLES_VALUE_COLUMN_DATE_OPTIONS ,
131
+ } ,
132
+ ] ,
133
+ placeholder : 'Enter value' ,
134
+ } ,
135
+ } ,
136
+ }
137
+
138
+ return {
139
+ ...( formatConfig [ format ] || {
140
+ type : DynamicDataTableRowDataType . SELECT_TEXT ,
141
+ props : {
142
+ options : [ { label : VALUE_COLUMN_DROPDOWN_LABEL . CHOICES , options : choices } ] ,
143
+ placeholder : 'Enter value' ,
144
+ } ,
145
+ } ) ,
146
+ value : conditionalValue ,
147
+ }
148
+ }
149
+
60
150
export const getConditionDataTableRows = ( {
61
151
conditionDetails,
62
152
ioVariables,
@@ -69,39 +159,40 @@ export const getConditionDataTableRows = ({
69
159
( conditionDetails || [ ] )
70
160
. filter ( ( { conditionType } ) => conditionType === parentConditionType )
71
161
. map < ConditionDataTableType [ 'rows' ] [ number ] > (
72
- ( { conditionOnVariable, conditionOperator, conditionalValue, conditionType, id } ) => ( {
73
- data : {
74
- variable : {
75
- type : DynamicDataTableRowDataType . DROPDOWN ,
76
- props : {
77
- options : getConditionDataTableVariableOptions ( ioVariables ) ,
78
- placeholder : 'Select variable' ,
79
- isSearchable : false ,
80
- autoFocus : true ,
162
+ ( { conditionOnVariable, conditionOperator, conditionalValue, conditionType, id } ) => {
163
+ const variableType = getConditionVariableTypeFormat ( { conditionOnVariable, ioVariables } )
164
+ return {
165
+ data : {
166
+ variable : {
167
+ type : DynamicDataTableRowDataType . DROPDOWN ,
168
+ props : {
169
+ options : getConditionDataTableVariableOptions ( ioVariables ) ,
170
+ placeholder : 'Select variable' ,
171
+ autoFocus : true ,
172
+ } ,
173
+ value : conditionOnVariable ,
81
174
} ,
82
- value : conditionOnVariable ,
83
- } ,
84
- operator : {
85
- type : DynamicDataTableRowDataType . DROPDOWN ,
86
- props : {
87
- options : getOperatorOptionsBasedOnVariableTypeFormat ( conditionOnVariable , ioVariables ) ,
88
- isSearchable : false ,
175
+ operator : {
176
+ type : DynamicDataTableRowDataType . DROPDOWN ,
177
+ props : {
178
+ options : getOperatorOptionsBasedOnVariableTypeFormat ( variableType ) ,
179
+ isSearchable : false ,
180
+ } ,
181
+ value : conditionOperator ,
89
182
} ,
90
- value : conditionOperator ,
183
+ val : getConditionDataTableValColumnProps ( {
184
+ conditionalValue,
185
+ conditionOnVariable,
186
+ ioVariables,
187
+ } ) ,
91
188
} ,
92
- val : {
93
- type : DynamicDataTableRowDataType . TEXT ,
94
- props : {
95
- placeholder : 'Enter value' ,
96
- } ,
97
- value : conditionalValue ,
189
+ id,
190
+ customState : {
191
+ conditionType,
192
+ variableType,
98
193
} ,
99
- } ,
100
- id,
101
- customState : {
102
- conditionType,
103
- } ,
104
- } ) ,
194
+ }
195
+ } ,
105
196
)
106
197
107
198
export const getConditionDataTableInitialCellError = (
@@ -199,16 +290,38 @@ export const convertConditionDataTableToFormData = ({
199
290
export const validateConditionDataCell = ( {
200
291
key,
201
292
condition : { conditionOnVariable, conditionOperator, conditionalValue } ,
293
+ variableType,
202
294
} : {
203
295
key : ConditionDataTableHeaderKeys
204
296
condition : Pick < ConditionDetails , 'conditionOnVariable' | 'conditionOperator' | 'conditionalValue' >
205
- } ) : DynamicDataTableCellValidationState => {
297
+ } & Pick <
298
+ ConditionDataTableType [ 'rows' ] [ number ] [ 'customState' ] ,
299
+ 'variableType'
300
+ > ) : DynamicDataTableCellValidationState => {
206
301
if ( key === ConditionDataTableHeaderKeys . VARIABLE && ! conditionOnVariable ) {
207
302
return { errorMessages : [ 'Condition on variable is required' ] , isValid : false }
208
303
}
209
304
210
- if ( key === ConditionDataTableHeaderKeys . VALUE && ! conditionalValue ) {
211
- return { errorMessages : [ 'Conditional value is required' ] , isValid : false }
305
+ if ( key === ConditionDataTableHeaderKeys . VALUE ) {
306
+ const numberReg = new RegExp ( PATTERNS . NUMBERS_WITH_SCOPE_VARIABLES )
307
+ const boolReg = new RegExp ( PATTERNS . BOOLEAN_WITH_SCOPE_VARIABLES )
308
+
309
+ if ( ! conditionalValue ) {
310
+ return { errorMessages : [ 'Conditional value is required' ] , isValid : false }
311
+ }
312
+
313
+ if ( variableType === VariableTypeFormat . NUMBER && ! numberReg . test ( conditionalValue ) ) {
314
+ return {
315
+ errorMessages : [ 'Conditional value is not a number' ] ,
316
+ isValid : false ,
317
+ }
318
+ }
319
+ if ( variableType === VariableTypeFormat . BOOL && ! boolReg . test ( conditionalValue ) ) {
320
+ return {
321
+ errorMessages : [ 'Conditional value is not a boolean' ] ,
322
+ isValid : false ,
323
+ }
324
+ }
212
325
}
213
326
214
327
if ( key === ConditionDataTableHeaderKeys . OPERATOR && ! conditionOperator ) {
@@ -219,7 +332,7 @@ export const validateConditionDataCell = ({
219
332
}
220
333
221
334
export const getConditionDataTableCellValidateState = ( {
222
- row : { data } ,
335
+ row : { data, customState } ,
223
336
key,
224
337
value,
225
338
} : {
@@ -234,4 +347,5 @@ export const getConditionDataTableCellValidateState = ({
234
347
conditionOnVariable : key === ConditionDataTableHeaderKeys . VARIABLE ? value : data . variable . value ,
235
348
conditionOperator : key === ConditionDataTableHeaderKeys . OPERATOR ? value : data . operator . value ,
236
349
} ,
350
+ variableType : customState . variableType ,
237
351
} )
0 commit comments