Skip to content
This repository was archived by the owner on Nov 16, 2023. It is now read-only.

Commit b4655f2

Browse files
author
Matt Mazzola
authored
fix: prevent crash when multivalue is removed for condition (#41)
* fix: prevent crash when multivalue is removed for condition * chore: fix paths
1 parent cff301a commit b4655f2

File tree

3 files changed

+38
-23
lines changed

3 files changed

+38
-23
lines changed

packages/ui/src/Utils/actionCondition.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import * as CLM from '@conversationlearner/models'
66
import * as OF from 'office-ui-fabric-react'
77
import produce from 'immer'
8+
import { PreBuilts } from '../types'
89

910
export interface IConditionalTag extends OF.ITag {
1011
condition: CLM.Condition | null
@@ -165,3 +166,24 @@ export const getUpdatedActionsUsingCondition = (actions: CLM.ActionBase[], exist
165166
return actionsUsingCondition
166167
}, [])
167168
}
169+
170+
/**
171+
* Given entity return true if entity can be used in condition false otherwise
172+
*/
173+
export const isEntityAllowedInCondition = (entity: CLM.EntityBase): boolean => {
174+
if (entity.entityType === CLM.EntityType.ENUM) {
175+
return true
176+
}
177+
178+
if (entity.entityType === CLM.EntityType.LUIS
179+
&& entity.resolverType === PreBuilts.Number
180+
&& entity.isResolutionRequired === true) {
181+
return true
182+
}
183+
184+
if (entity.isMultivalue === true) {
185+
return true
186+
}
187+
188+
return false
189+
}

packages/ui/src/components/modals/ConditionModal.tsx

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,9 @@ import * as CLM from '@conversationlearner/models'
99
import { injectIntl, InjectedIntlProps } from 'react-intl'
1010
import { FM } from '../../react-intl-messages'
1111
import { Position } from 'office-ui-fabric-react/lib/utilities/positioning'
12-
import { PreBuilts } from 'src/types'
13-
import { conditionDisplay, convertConditionToConditionalTag, isConditionEqual } from '../../Utils/actionCondition'
12+
import { conditionDisplay, convertConditionToConditionalTag, isConditionEqual, isEntityAllowedInCondition } from '../../Utils/actionCondition'
1413
import './ConditionModal.css'
1514

16-
const entityIsAllowedInCondition = (entity: CLM.EntityBase): boolean => {
17-
if (entity.entityType === CLM.EntityType.ENUM) {
18-
return true
19-
}
20-
21-
if (entity.entityType === CLM.EntityType.LUIS
22-
&& entity.resolverType === PreBuilts.Number
23-
&& entity.isResolutionRequired === true) {
24-
return true
25-
}
26-
27-
if (entity.isMultivalue === true) {
28-
return true
29-
}
30-
31-
return false
32-
}
33-
3415
interface EntityOption extends OF.IDropdownOption {
3516
data: CLM.EntityBase
3617
}
@@ -105,7 +86,7 @@ type Props = InjectedIntlProps
10586
const Component: React.FC<Props> = (props) => {
10687
// Entity Dropdown
10788
const entityOptions = props.entities
108-
.filter(entityIsAllowedInCondition)
89+
.filter(isEntityAllowedInCondition)
10990
.map(e => convertEntityToDropdownOption(e))
11091
.sort((a, b) => a.text.localeCompare(b.text))
11192

packages/ui/src/components/modals/EntityCreatorEditor/EntityCreatorContainer.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { withRouter } from 'react-router-dom'
1616
import { RouteComponentProps } from 'react-router'
1717
import Component, { IEnumValueForDisplay } from './EntityCreatorComponent'
1818
import { autobind } from 'core-decorators'
19-
import { getUniqueConditions, getUpdatedActionsUsingCondition } from 'src/Utils/actionCondition'
19+
import { getUniqueConditions, getUpdatedActionsUsingCondition, isEntityAllowedInCondition } from 'src/Utils/actionCondition'
2020
import { NONE_RESOLVER_KEY } from '../../../types/const'
2121

2222
const entityNameMaxLength = 30
@@ -29,6 +29,7 @@ const initState: ComponentState = {
2929
entityResolverVal: NONE_RESOLVER_KEY,
3030
isPrebuilt: false,
3131
isMultivalueVal: false,
32+
isMultiValueDisabled: false,
3233
isNegatableVal: false,
3334
isResolutionRequired: false,
3435
enumValues: [],
@@ -53,6 +54,7 @@ interface ComponentState {
5354
entityResolverVal: string
5455
isPrebuilt: boolean
5556
isMultivalueVal: boolean
57+
isMultiValueDisabled: boolean
5658
isNegatableVal: boolean
5759
isResolutionRequired: boolean
5860
enumValues: (CLM.EnumValue | null)[]
@@ -172,12 +174,15 @@ class Container extends React.Component<Props, ComponentState> {
172174
? NONE_RESOLVER_KEY
173175
: nextProps.entity.resolverType
174176

177+
const isMultiValueDisabled = this.isMultiValueDisabled(nextProps.entity, this.props.actions)
178+
175179
this.setState({
176180
entityNameVal: nextProps.entity.entityName,
177181
entityTypeVal: entityType,
178182
entityResolverVal: resolverType,
179183
isPrebuilt: isPrebuilt,
180184
isMultivalueVal: nextProps.entity.isMultivalue,
185+
isMultiValueDisabled,
181186
isNegatableVal: nextProps.entity.isNegatible,
182187
isResolutionRequired: nextProps.entity.isResolutionRequired,
183188
title: nextProps.intl.formatMessage({
@@ -325,6 +330,13 @@ class Container extends React.Component<Props, ComponentState> {
325330
return newOrEditedEntity
326331
}
327332

333+
isMultiValueDisabled(entity: CLM.EntityBase, actions: CLM.ActionBase[]) {
334+
// If entity is already used in condition and changing multivalue to false would prevent entity from being valid in condition
335+
const entityWithMultiValueFalse: CLM.EntityBase = { ...entity, isMultivalue: false }
336+
return actions.some(a => a.requiredConditions.some(condition => condition.entityId === entity.entityId)) === true
337+
&& isEntityAllowedInCondition(entityWithMultiValueFalse) === false
338+
}
339+
328340
@autobind
329341
async onClickSaveCreate() {
330342
const newOrEditedEntity = this.convertStateToEntity(this.state, this.props.entity ? this.props.entity : undefined)
@@ -849,7 +861,7 @@ class Container extends React.Component<Props, ComponentState> {
849861
onKeyDownName={this.onKeyDownName}
850862

851863
isMultiValue={this.state.isMultivalueVal}
852-
isMultiValueDisabled={false}
864+
isMultiValueDisabled={this.state.isMultiValueDisabled}
853865
onChangeMultiValue={this.onChangeMultivalue}
854866

855867
isNegatable={this.state.isNegatableVal}

0 commit comments

Comments
 (0)