Skip to content

Commit

Permalink
fix(FOROME-1601): compound request panel error
Browse files Browse the repository at this point in the history
* fix(FOROME-1601): comp req error
  • Loading branch information
Lapk1n authored Sep 5, 2022
1 parent d59b9bc commit 2931d26
Show file tree
Hide file tree
Showing 13 changed files with 144 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export const CompoundRequestScenario = ({
onChangeRequestConditionNumber(requestIndex, value)
}
}}
className="cursor-pointer h-7 w-[60px] mx-2"
className="cursor-pointer h-7 w-[65px] mx-2"
/>

<span>{t('funcCondition.counts')}</span>
Expand All @@ -68,7 +68,7 @@ export const CompoundRequestScenario = ({
onChange={e =>
onChangeScenario(requestIndex, e.target.value, groupIndex)
}
className="pl-2 pr-3 py-1 ml-2 w-[60px] bg-white"
className="pl-2 pr-3 py-1 ml-2 w-[65px] bg-white"
options={selectOptions}
value={value}
/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { ReactElement, useEffect, useMemo, useState } from 'react'
import cn from 'classnames'
import cloneDeep from 'lodash/cloneDeep'
import isEmpty from 'lodash/isEmpty'
import { observer } from 'mobx-react-lite'

Expand Down Expand Up @@ -31,6 +32,7 @@ import {
export const CompoundRequestCondition = observer(
({
problemGroups,
affectedGroup,
initialMode,
initialApprox,
initialRequestCondition,
Expand All @@ -42,7 +44,6 @@ export const CompoundRequestCondition = observer(
}: ICompoundRequestProps): ReactElement => {
const { variants, isFetching, status } = statFuncStore
const variantsValue = variants && variants[0][1]

const [requestCondition, setRequestCondition] = useState<
TRequestCondition[]
>(initialRequestCondition)
Expand All @@ -69,12 +70,13 @@ export const CompoundRequestCondition = observer(
const handleSetPreparedScenario = (preparedScenarioName: string) => {
setPreparedScenarioName(preparedScenarioName)

const preparedScenario = getPreparedScenario(
const preparedScenario = getPreparedScenario({
preparedScenarioName,
problemGroups,
)
affectedGroup,
})

const clonedRequestCondition = [...requestCondition]
const clonedRequestCondition = cloneDeep(requestCondition)
clonedRequestCondition[activeRequestIndex][1] = preparedScenario

setRequestCondition(clonedRequestCondition)
Expand Down Expand Up @@ -114,7 +116,13 @@ export const CompoundRequestCondition = observer(

const currentRequest = requestCondition[requestBlockIndex]

setPreparedScenarioName(getScenarioName(currentRequest[1]) || '')
setPreparedScenarioName(
getScenarioName({
scenario: currentRequest[1],
affectedGroup,
groupsLength: problemGroups.length,
}),
)
onTouch?.()
}

Expand Down Expand Up @@ -150,9 +158,11 @@ export const CompoundRequestCondition = observer(
setActiveRequestIndex(newRequestCondition.length - 1)
setRequestCondition(newRequestCondition)
setPreparedScenarioName(
getScenarioName(
newRequestCondition[newRequestCondition.length - 1][1],
),
getScenarioName({
scenario: newRequestCondition[newRequestCondition.length - 1][1],
affectedGroup,
groupsLength: problemGroups.length,
}),
)
}
}
Expand All @@ -174,9 +184,13 @@ export const CompoundRequestCondition = observer(

useEffect(() => {
setPreparedScenarioName(
getScenarioName(requestCondition[requestCondition.length - 1][1]),
getScenarioName({
scenario: requestCondition[activeRequestIndex][1],
affectedGroup,
groupsLength: problemGroups.length,
}),
)
}, [requestCondition])
}, [activeRequestIndex, affectedGroup, problemGroups, requestCondition])

return (
<>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export interface IControlProps extends ICommonControlProps {
}

export interface ICompoundRequestProps extends ICommonFuncConditionProps {
affectedGroup: string[]
problemGroups: string[]
initialApprox: ApproxNameTypes
initialRequestCondition: TRequestCondition[]
Expand Down
13 changes: 13 additions & 0 deletions src/components/conditions/conditions.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Argument } from 'classnames'
import { ModeTypes } from '@core/enum/mode-types-enum'
import { DtreeStatFuncStore } from '@store/dtree/dtree-stat-func.store'
import { FilterStatFuncStore } from '@store/filter/filter-stat-func.store'
import { IScenario } from '@service-providers/common'

export interface ICommonControlProps {
hasErrors: boolean
Expand All @@ -17,3 +18,15 @@ export interface ICommonFuncConditionProps {
className?: Argument
onTouch?: () => void
}

export interface IGetPreparedScenarioProps {
preparedScenarioName: string
problemGroups: string[]
affectedGroup: string[]
}

export interface IGetScenarioNameProps {
scenario: IScenario
affectedGroup: string[]
groupsLength: number
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { getNewScenario } from './custom-inheritance-mode.utils'

export const CustomInheritanceModeCondition = observer(
({
affectedGroup,
problemGroups,
initialScenario,
initialMode,
Expand Down Expand Up @@ -56,10 +57,11 @@ export const CustomInheritanceModeCondition = observer(
const handleSetPreparedScenario = (preparedScenarioName: string) => {
setPreparedScenarioName(preparedScenarioName)

const preparedScenario = getPreparedScenario(
const preparedScenario = getPreparedScenario({
preparedScenarioName,
problemGroups,
)
affectedGroup,
})

setScenario(preparedScenario)

Expand Down Expand Up @@ -93,8 +95,15 @@ export const CustomInheritanceModeCondition = observer(

useEffect(() => {
setSelectValues(getSelectValues(scenario, problemGroups))
setPreparedScenarioName(getScenarioName(scenario))
}, [problemGroups, scenario])

setPreparedScenarioName(
getScenarioName({
scenario,
affectedGroup,
groupsLength: problemGroups.length,
}),
)
}, [affectedGroup, problemGroups, scenario])

return (
<>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export interface IControlProps extends ICommonControlProps {

export interface ICustomInheritanceModeConditionProps
extends ICommonFuncConditionProps {
affectedGroup: string[]
problemGroups: string[]
initialScenario: IScenario
className?: Argument
Expand Down
111 changes: 75 additions & 36 deletions src/components/conditions/utils/conditions.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import { ApproxNameTypes } from '@core/enum/approxNameTypes'
import { ApproxValueTypes } from '@core/enum/approxValueTypes'
import { InheritanceModeEnum } from '@core/enum/inheritance-mode-enum'
import { IScenario } from '@service-providers/common'
import {
IGetPreparedScenarioProps,
IGetScenarioNameProps,
} from '../conditions.interface'

export const getApproxName = (
approxValue?: ApproxValueTypes | null,
Expand Down Expand Up @@ -29,67 +33,102 @@ export const getApproxValue = (
return null
}

export const getPreparedScenario = (
preparedValue: string,
problemGroups: string[],
): IScenario => {
export const getPreparedScenario = ({
preparedScenarioName,
problemGroups,
affectedGroup,
}: IGetPreparedScenarioProps): IScenario => {
let preparedScenario: IScenario = {}

switch (preparedValue) {
const nonAffectedGroups = problemGroups.filter(
group => group !== affectedGroup?.[0],
)

switch (preparedScenarioName) {
case InheritanceModeEnum.HomozygousRecessive_XLinked:
preparedScenario = {
'2': [problemGroups[0]],
'0-1': [problemGroups[1], problemGroups[2]],
'2': affectedGroup,
}

if (nonAffectedGroups.length) {
Object.assign(preparedScenario, { '0-1': nonAffectedGroups })
}
break

case InheritanceModeEnum.AutosomalDominant:
preparedScenario = {
'1-2': [problemGroups[0]],
'0': [problemGroups[1], problemGroups[2]],
'1-2': affectedGroup,
}

if (nonAffectedGroups.length) {
Object.assign(preparedScenario, { '0': nonAffectedGroups })
}
break

case InheritanceModeEnum.Compensational:
preparedScenario = {
'0': [problemGroups[0]],
'1-2': [problemGroups[1], problemGroups[2]],
'0': affectedGroup,
}

if (nonAffectedGroups.length) {
Object.assign(preparedScenario, { '1-2': nonAffectedGroups })
}
break
}

return preparedScenario
}

export const getScenarioName = (scenario: IScenario) => {
if (Object.keys(scenario).length > 2) return ''

if (Object.keys(scenario)[0] === '0' && Object.keys(scenario)[1] === '1-2') {
if (
Object.values(scenario)[0].length === 1 &&
Object.values(scenario)[1].length === 2
) {
return InheritanceModeEnum.Compensational
}
export const getScenarioName = ({
scenario,
affectedGroup,
groupsLength,
}: IGetScenarioNameProps): string => {
const affected = affectedGroup[0]
let scenarioName = ''
const scenarioLength = Object.keys(scenario).length

if (
Object.values(scenario)[0].length === 2 &&
Object.values(scenario)[1].length === 1
) {
return InheritanceModeEnum.AutosomalDominant
for (const key in scenario) {
if (scenario[key].includes(affected) && scenario[key].length === 1) {
switch (key) {
case '2':
if (scenarioLength === 1) {
scenarioName = InheritanceModeEnum.HomozygousRecessive_XLinked
} else {
for (const key in scenario) {
if (key === '0-1' && scenario[key].length === groupsLength - 1) {
scenarioName = InheritanceModeEnum.HomozygousRecessive_XLinked
}
}
}
break
case '1-2':
if (scenarioLength === 1) {
scenarioName = InheritanceModeEnum.AutosomalDominant
} else {
for (const key in scenario) {
if (key === '0' && scenario[key].length === groupsLength - 1) {
scenarioName = InheritanceModeEnum.AutosomalDominant
}
}
}
break
case '0':
if (scenarioLength === 1) {
scenarioName = InheritanceModeEnum.Compensational
} else {
for (const key in scenario) {
if (key === '1-2' && scenario[key].length === groupsLength - 1) {
scenarioName = InheritanceModeEnum.Compensational
}
}
}
break
}
}
}

if (
Object.keys(scenario)[0] === '2' &&
Object.keys(scenario)[1] === '0-1' &&
Object.values(scenario)[0].length === 1 &&
Object.values(scenario)[1].length === 2
) {
return InheritanceModeEnum.HomozygousRecessive_XLinked
}

return ''
return scenarioName
}

export const getSelectValues = (
Expand Down
6 changes: 6 additions & 0 deletions src/pages/filter/common/attributes/base-functions.store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,10 @@ export class BaseFunctionsStore {
const condition = this.initialCondition?.[4] as IGeneRegionArgs
return condition?.locus
}

public get affectedGroup(): string[] {
const status = this.attributeStatus as IFuncPropertyStatus

return status?.affected || []
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { renderAttributeDialogControls } from '../ui/renderAttributeControls'
export const CompoundRequestDialog = observer(
({ funcStore, onAddFunc, onSaveFunc }: IFuncDialogProps): ReactElement => {
const {
affectedGroup,
problemGroups,
attributeName,
initialApprox,
Expand Down Expand Up @@ -68,6 +69,7 @@ export const CompoundRequestDialog = observer(
isHiddenActions={true}
>
<CompoundRequestCondition
affectedGroup={affectedGroup}
problemGroups={problemGroups}
initialApprox={initialApprox}
initialRequestCondition={initialRequestCondition}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { renderAttributeDialogControls } from '../ui/renderAttributeControls'
export const CustomInheritanceModeDialog = observer(
({ funcStore, onAddFunc, onSaveFunc }: IFuncDialogProps): ReactElement => {
const {
affectedGroup,
attributeName,
problemGroups,
initialScenario,
Expand Down Expand Up @@ -66,6 +67,7 @@ export const CustomInheritanceModeDialog = observer(
isHiddenActions={true}
>
<CustomInheritanceModeCondition
affectedGroup={affectedGroup}
problemGroups={problemGroups}
initialScenario={initialScenario}
initialMode={initialMode}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { savePanelAttribute } from '../../../utils/save-pannel-attribute'
export const CompoundRequest = observer((): ReactElement => {
const {
attributeName,
affectedGroup,
problemGroups,
initialApprox,
initialRequestCondition,
Expand All @@ -37,6 +38,7 @@ export const CompoundRequest = observer((): ReactElement => {

return (
<CompoundRequestCondition
affectedGroup={affectedGroup}
problemGroups={problemGroups}
initialApprox={initialApprox}
initialRequestCondition={initialRequestCondition}
Expand Down
Loading

0 comments on commit 2931d26

Please sign in to comment.