16
16
17
17
import { ChangeEvent , useContext , useEffect , useState } from 'react'
18
18
19
- import { ConditionDataTableHeaderKeys , ConditionType , PluginType } from '@devtron-labs/devtron-fe-common-lib'
19
+ import { ConditionType , PluginType } from '@devtron-labs/devtron-fe-common-lib'
20
20
21
21
import { ReactComponent as Dropdown } from '../../assets/icons/ic-chevron-down.svg'
22
22
import { ConditionContainerType } from '../ciPipeline/types'
23
23
import { pipelineContext } from '../workflowEditor/workflowEditor'
24
24
import { ConditionDataTable } from './ConditionDataTable/ConditionDataTable.component'
25
25
import { CONDITION_DATA_TABLE_OPERATOR_OPTIONS } from './ConditionDataTable/constants'
26
+ import { CONTAINER_CONDITION_TYPE_TO_CONDITION_TYPE_MAP } from './Constants'
26
27
27
28
export const ConditionContainer = ( { type } : { type : ConditionContainerType } ) => {
28
- const { formData, setFormData, selectedTaskIndex, activeStageName, formDataErrorObj, setFormDataErrorObj } =
29
- useContext ( pipelineContext )
29
+ const { formData, setFormData, selectedTaskIndex, activeStageName, formDataErrorObj } = useContext ( pipelineContext )
30
30
31
31
const [ collapsedSection , setCollapsedSection ] = useState < boolean > ( true )
32
32
const [ conditionType , setConditionType ] = useState < ConditionType > (
@@ -43,38 +43,46 @@ export const ConditionContainer = ({ type }: { type: ConditionContainerType }) =
43
43
} , [ activeStageName ] )
44
44
45
45
useEffect ( ( ) => {
46
- const { conditionDetails } = formDataErrorObj [ activeStageName ] . steps [ selectedTaskIndex ] [ currentStepTypeVariable ]
47
- if ( conditionDetails ?. length ) {
48
- const errorConditionIndexArr = [ ]
49
- for ( let i = 0 ; i < conditionDetails . length ; i ++ ) {
50
- if ( ! conditionDetails [ i ] . isValid ) {
51
- errorConditionIndexArr . push ( i )
52
- }
53
- }
54
- if ( errorConditionIndexArr ?. length ) {
55
- let derivedConditionType
56
- for ( let index = 0 ; index < errorConditionIndexArr . length ; index ++ ) {
57
- const currentCondition =
58
- formData [ activeStageName ] . steps [ selectedTaskIndex ] [ currentStepTypeVariable ] . conditionDetails [
59
- index
60
- ]
61
- if (
62
- ( type === ConditionContainerType . PASS_FAILURE &&
63
- ( currentCondition . conditionType === ConditionType . PASS ||
64
- currentCondition . conditionType === ConditionType . FAIL ) ) ||
65
- ( type === ConditionContainerType . TRIGGER_SKIP &&
66
- ( currentCondition . conditionType === ConditionType . TRIGGER ||
67
- currentCondition . conditionType === ConditionType . SKIP ) )
68
- ) {
69
- derivedConditionType = currentCondition . conditionType
70
- break
71
- }
46
+ const { isConditionDetailsValid, conditionDetails : conditionDetailsError } =
47
+ formDataErrorObj [ activeStageName ] . steps [ selectedTaskIndex ] [ currentStepTypeVariable ]
48
+
49
+ if ( ! isConditionDetailsValid ) {
50
+ const { conditionDetails } = formData [ activeStageName ] . steps [ selectedTaskIndex ] [ currentStepTypeVariable ]
51
+
52
+ const invalidConditionDetailsIds = Object . keys ( conditionDetailsError ) . reduce ( ( acc , key ) => {
53
+ if (
54
+ Object . keys ( conditionDetailsError [ key ] ) . some (
55
+ ( dataKey ) => ! conditionDetailsError [ key ] [ dataKey ] . isValid ,
56
+ )
57
+ ) {
58
+ acc . push ( key )
72
59
}
73
- if ( derivedConditionType ) {
74
- setConditionType ( derivedConditionType )
75
- if ( collapsedSection ) {
76
- setCollapsedSection ( false ) // expand conditions in case of error
77
- }
60
+
61
+ return acc
62
+ } , [ ] )
63
+
64
+ const filteredConditionDetails = conditionDetails . filter ( ( { conditionType : _conditionType } ) =>
65
+ CONTAINER_CONDITION_TYPE_TO_CONDITION_TYPE_MAP [ type ] . includes ( _conditionType ) ,
66
+ )
67
+
68
+ const derivedConditionType = filteredConditionDetails . length
69
+ ? invalidConditionDetailsIds . reduce ( ( acc , currId ) => {
70
+ const currentCondition = filteredConditionDetails . find ( ( { id } ) =>
71
+ typeof + currId === 'number' ? id === + currId : id === currId ,
72
+ ) ?. conditionType
73
+
74
+ if ( currentCondition ) {
75
+ return currentCondition
76
+ }
77
+
78
+ return acc
79
+ } , null )
80
+ : null
81
+
82
+ if ( derivedConditionType ) {
83
+ setConditionType ( derivedConditionType )
84
+ if ( collapsedSection ) {
85
+ setCollapsedSection ( false ) // expand conditions in case of error
78
86
}
79
87
}
80
88
}
@@ -84,7 +92,6 @@ export const ConditionContainer = ({ type }: { type: ConditionContainerType }) =
84
92
setCollapsedSection ( ! collapsedSection )
85
93
if ( collapsedSection ) {
86
94
const _formData = { ...formData }
87
- const updatedFormDataErrorObj = structuredClone ( formDataErrorObj )
88
95
let _conditionType : ConditionType
89
96
let { conditionDetails } = _formData [ activeStageName ] . steps [ selectedTaskIndex ] [ currentStepTypeVariable ]
90
97
let addNewRow = false
@@ -137,22 +144,6 @@ export const ConditionContainer = ({ type }: { type: ConditionContainerType }) =
137
144
_formData [ activeStageName ] . steps [ selectedTaskIndex ] [ currentStepTypeVariable ] . conditionDetails =
138
145
conditionDetails
139
146
setFormData ( _formData )
140
-
141
- const updatedConditionDetailsCellError =
142
- updatedFormDataErrorObj [ activeStageName ] . steps [ selectedTaskIndex ] [ currentStepTypeVariable ]
143
- . conditionDetails || { }
144
-
145
- updatedConditionDetailsCellError [ newCondition . id ] = {
146
- [ ConditionDataTableHeaderKeys . VARIABLE ] : { isValid : true , errorMessages : [ ] } ,
147
- [ ConditionDataTableHeaderKeys . OPERATOR ] : { isValid : true , errorMessages : [ ] } ,
148
- [ ConditionDataTableHeaderKeys . VALUE ] : { isValid : true , errorMessages : [ ] } ,
149
- }
150
-
151
- updatedFormDataErrorObj [ activeStageName ] . steps [ selectedTaskIndex ] [
152
- currentStepTypeVariable
153
- ] . conditionDetails = updatedConditionDetailsCellError
154
-
155
- setFormDataErrorObj ( updatedFormDataErrorObj )
156
147
}
157
148
}
158
149
}
0 commit comments