1- import React from 'react'
1+ import React , { useMemo , useState } from 'react'
22import Icon from 'components/Icon'
33import Utils from 'common/utils/utils'
44import {
@@ -13,6 +13,8 @@ import RuleConditionPropertySelect from './RuleConditionPropertySelect'
1313import RuleConditionValueInput from './RuleConditionValueInput'
1414import { RuleContextValues } from 'common/types/rules.types'
1515import { useRuleOperator , useRuleContext } from 'components/segments/Rule/hooks'
16+ import MultiSelect from 'components/base/select/MultiSelect'
17+ import { useGetEnvironmentsQuery } from 'common/services/useEnvironment'
1618
1719interface RuleConditionRowProps {
1820 rule : SegmentCondition
@@ -47,12 +49,17 @@ const RuleConditionRow: React.FC<RuleConditionRowProps> = ({
4749 setRuleProperty,
4850 showDescription,
4951} ) => {
52+ const [ selectedEnvironments , setSelectedEnvironments ] = useState < string [ ] > ( [ ] )
5053 const lastIndex = rules . reduce ( ( acc , v , i ) => {
5154 if ( ! v . delete ) {
5255 return i
5356 }
5457 return acc
5558 } , 0 )
59+ const { data } = useGetEnvironmentsQuery ( { projectId : projectId ?. toString ( ) } )
60+ const environments = data ?. results
61+
62+ const environmentOptions = useMemo ( ( ) => environments ? environments ?. map ( ( { name } ) => ( { label : name , value : name } ) ) : [ ] , [ environments ] )
5663
5764 const isLastRule = ruleIndex === lastIndex
5865 const hasOr = ruleIndex > 0
@@ -72,6 +79,9 @@ const RuleConditionRow: React.FC<RuleConditionRowProps> = ({
7279 operator === 'PERCENTAGE_SPLIT' &&
7380 rule . property === RuleContextValues . IDENTITY_KEY
7481
82+
83+ console . log ( 'showEnvironmentDropdown' , showEnvironmentDropdown )
84+ console . log ( 'rule' , rule )
7585 return (
7686 < div className = 'rule__row reveal' key = { ruleIndex } >
7787 { hasOr && (
@@ -84,74 +94,90 @@ const RuleConditionRow: React.FC<RuleConditionRowProps> = ({
8494 < Flex className = 'or-divider__line' />
8595 </ Row >
8696 ) }
87- < Row
88- noWrap
89- className = 'rule align-items-center justify-content-between gap-1'
97+ < div
98+ className = 'd-flex flex-row align-items-center gap-1'
9099 >
91- < RuleConditionPropertySelect
92- dataTest = { `${ dataTest } -property-${ ruleIndex } ` }
93- ruleIndex = { ruleIndex }
94- setRuleProperty = { setRuleProperty }
95- propertyValue = { rule . property }
96- operator = { rule . operator }
97- allowedContextValues = { allowedContextValues }
98- isValueFromContext = { isValueFromContext }
99- />
100- { readOnly ? (
101- ! ! find ( operators , { value : operator } ) ?. label
102- ) : (
103- < Select
104- data-test = { `${ dataTest } -operator-${ ruleIndex } ` }
105- value = { operator && find ( operators , { value : operator } ) }
106- onChange = { ( value : { value : string } ) => {
107- setRuleProperty ( ruleIndex , 'operator' , value )
100+ < div
101+ className = 'd-flex flex-1 flex-row rule align-items-center justify-content-between gap-1 col-md-10'
102+ >
103+ < div className = 'col-10 col-md-4' >
104+ < RuleConditionPropertySelect
105+ dataTest = { `${ dataTest } -property-${ ruleIndex } ` }
106+ ruleIndex = { ruleIndex }
107+ setRuleProperty = { setRuleProperty }
108+ propertyValue = { rule . property }
109+ operator = { rule . operator }
110+ allowedContextValues = { allowedContextValues }
111+ isValueFromContext = { isValueFromContext }
112+ />
113+ </ div >
114+ { readOnly ? (
115+ ! ! find ( operators , { value : operator } ) ?. label
116+ ) : (
117+ < Select
118+ data-test = { `${ dataTest } -operator-${ ruleIndex } ` }
119+ value = { operator && find ( operators , { value : operator } ) }
120+ onChange = { ( value : { value : string } ) => {
121+ setRuleProperty ( ruleIndex , 'operator' , value )
122+ } }
123+ options = { operators }
124+ className = "col-10 col-md-3"
125+ />
126+ ) }
127+ { operator === 'IN' && rule . property === RuleContextValues . ENVIRONMENT_NAME ? (
128+ < MultiSelect
129+ selectedValues = { selectedEnvironments }
130+ onSelectionChange = { ( selectedValues : string [ ] ) => setSelectedEnvironments ( selectedValues ) }
131+ options = { environmentOptions }
132+ className = 'col-10 col-md-4'
133+ />
134+ ) : (
135+ < RuleConditionValueInput
136+ readOnly = { readOnly }
137+ data-test = { `${ dataTest } -value-${ ruleIndex } ` }
138+ value = { displayValue || '' }
139+ placeholder = { valuePlaceholder }
140+ disabled = { operatorObj && operatorObj . hideValue }
141+ projectId = { projectId }
142+ showEnvironmentDropdown = { showEnvironmentDropdown }
143+ operator = { operator }
144+ onChange = { ( value : string ) => {
145+ setRuleProperty ( ruleIndex , 'value' , {
146+ value :
147+ operatorObj && operatorObj . append
148+ ? `${ value } ${ operatorObj . append } `
149+ : value ,
150+ } )
108151 } }
109- options = { operators }
110- style = { { width : '190px' } }
152+ isValid = { Utils . validateRule ( rule ) && ! ruleErrors ?. value }
153+ className = 'col-10 col-md-4'
111154 />
112- ) }
113- < RuleConditionValueInput
114- readOnly = { readOnly }
115- data-test = { `${ dataTest } -value-${ ruleIndex } ` }
116- value = { displayValue || '' }
117- placeholder = { valuePlaceholder }
118- disabled = { operatorObj && operatorObj . hideValue }
119- style = { { width : '135px' } }
120- projectId = { projectId }
121- showEnvironmentDropdown = { showEnvironmentDropdown }
122- operator = { operator }
123- onChange = { ( value : string ) => {
124- setRuleProperty ( ruleIndex , 'value' , {
125- value :
126- operatorObj && operatorObj . append
127- ? `${ value } ${ operatorObj . append } `
128- : value ,
129- } )
130- } }
131- isValid = { Utils . validateRule ( rule ) && ! ruleErrors ?. value }
132- />
133- { isLastRule && ! readOnly ? (
134- < Button
135- theme = 'outline'
136- data-test = { `${ dataTest } -or` }
155+ ) }
156+ </ div >
157+ < div className = 'd-flex flex-sm-column flex-md-row gap-2' >
158+ { isLastRule && ! readOnly ? (
159+ < Button
160+ theme = 'outline'
161+ data-test = { `${ dataTest } -or` }
162+ type = 'button'
163+ onClick = { addRule }
164+ >
165+ Or
166+ </ Button >
167+ ) : (
168+ < div style = { { width : 64 } } />
169+ ) }
170+ < button
171+ data-test = { `${ dataTest } -remove` }
137172 type = 'button'
138- onClick = { addRule }
173+ id = 'remove-feature'
174+ onClick = { ( ) => removeRule ( ruleIndex ) }
175+ className = 'btn btn-with-icon'
139176 >
140- Or
141- </ Button >
142- ) : (
143- < div style = { { width : 64 } } />
144- ) }
145- < button
146- data-test = { `${ dataTest } -remove` }
147- type = 'button'
148- id = 'remove-feature'
149- onClick = { ( ) => removeRule ( ruleIndex ) }
150- className = 'btn btn-with-icon'
151- >
152- < Icon name = 'trash-2' width = { 20 } fill = { '#656D7B' } />
153- </ button >
154- </ Row >
177+ < Icon name = 'trash-2' width = { 20 } fill = { '#656D7B' } />
178+ </ button >
179+ </ div >
180+ </ div >
155181 { showDescription && (
156182 < Row noWrap className = 'rule' >
157183 < textarea
0 commit comments