Skip to content

Commit dcd13b2

Browse files
feat(FOROME-1417): Adding a rubric select for solution create dialog
* feat(FOROME-1417): Adding a rubric select for solution create dialog Co-authored-by: Vladislav <Lapk1n@yandex.ru>
1 parent 97f486e commit dcd13b2

File tree

17 files changed

+138
-45
lines changed

17 files changed

+138
-45
lines changed

src/components/solution-control/solution-create-dialog/solution-create-dialog.tsx

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import { ReactElement, useEffect, useState } from 'react'
22

3+
import {
4+
ExploreGenomeTypesDictionary,
5+
genomeTypesOptions,
6+
TGenomeOptionsKeys,
7+
} from '@core/enum/explore-genome-types-enum'
38
import { t } from '@i18n'
49
import { Dialog } from '@ui/dialog'
510
import { Input } from '@ui/input'
11+
import { Select } from '@ui/select'
612
import { ISolutionEntryDescription } from '@service-providers/common'
713
import { validatePresetName } from '@utils/validation/validatePresetName'
814

@@ -11,7 +17,7 @@ interface ISolutionCreateDialogProps {
1117
isOpen?: boolean
1218
controlName: string
1319
onClose: () => void
14-
onCreate: (solutionName: string) => void
20+
onCreate: (solutionName: string, rubric?: TGenomeOptionsKeys) => void
1521
}
1622

1723
export const SolutionCreateDialog = ({
@@ -22,6 +28,9 @@ export const SolutionCreateDialog = ({
2228
onCreate,
2329
}: ISolutionCreateDialogProps): ReactElement => {
2430
const [solutionName, setSolutionName] = useState('')
31+
const [rubric, setRubric] =
32+
useState<TGenomeOptionsKeys | undefined>(undefined)
33+
const [selectValue, setSelectValue] = useState<string | undefined>(undefined)
2534
const [isValidationError, setIsValidationError] = useState(false)
2635
const [isSameNameError, setIsSameNameError] = useState(false)
2736

@@ -45,14 +54,30 @@ export const SolutionCreateDialog = ({
4554
)
4655
}, [solutionName, solutions])
4756

57+
const onChangeRubric = (e: React.ChangeEvent<HTMLSelectElement>) => {
58+
const { value } = e.target
59+
setSelectValue(value)
60+
61+
if (value === 'empty') {
62+
setRubric(undefined)
63+
return
64+
}
65+
66+
const rubricKey = Object.entries(ExploreGenomeTypesDictionary).find(
67+
([, val]) => val === value,
68+
)?.[0]
69+
70+
setRubric(rubricKey as TGenomeOptionsKeys)
71+
}
72+
4873
return (
4974
<Dialog
5075
isOpen={isOpen}
5176
onClose={onClose}
5277
title={t('solutionControl.createDialog.title', { controlName })}
5378
applyText={t('general.create')}
5479
isApplyDisabled={hasError || !solutionName}
55-
onApply={() => onCreate(solutionName)}
80+
onApply={() => onCreate(solutionName, rubric)}
5681
>
5782
<Input
5883
value={solutionName}
@@ -62,6 +87,19 @@ export const SolutionCreateDialog = ({
6287
})}
6388
onChange={event => setSolutionName(event.target.value)}
6489
/>
90+
91+
<div className="flex flex-col mt-[16px] text-12">
92+
<label>{t('solutionControl.createDialog.assignSolutionPack')}</label>
93+
<Select
94+
options={genomeTypesOptions}
95+
className="py-[5px] px-[4px]"
96+
value={selectValue}
97+
onChange={onChangeRubric}
98+
reset
99+
resetText="Choose the type"
100+
/>
101+
</div>
102+
65103
{hasError && (
66104
<div className="text-red-secondary text-12">{errorText}</div>
67105
)}

src/core/enum/explore-genome-types-enum.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,21 @@ export const ExploreGenomeTypesDictionary = {
1818
} as const
1919

2020
export type TExploreGenomeKeys = keyof typeof ExploreGenomeKeys
21+
22+
export type TGenomeOptionsKeys = Exclude<
23+
TExploreGenomeKeys,
24+
'BuildInclusionExclusion' | 'ExploreData'
25+
>
26+
27+
export type TGenomeOptionsValues =
28+
typeof ExploreGenomeTypesDictionary[TGenomeOptionsKeys]
29+
30+
export const genomeTypesOptions = Object.entries(ExploreGenomeTypesDictionary)
31+
.filter(([key]) =>
32+
[
33+
ExploreGenomeKeys.ACMGSecondary,
34+
ExploreGenomeKeys.PhenotypeBased,
35+
ExploreGenomeKeys.GeneticFirst,
36+
].includes(key as any),
37+
)
38+
.map(([, value]) => value) as TGenomeOptionsValues[]

src/i18n/locales/en.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ export const en = {
7777
controlNamePlaceholder: 'Enter {controlName} Name',
7878
solutionNameAlreadyExists:
7979
'{controlName} "{solutionName}" already exists',
80+
assignSolutionPack: 'Assign Solution Pack',
8081
},
8182
deleteDialog: {
8283
title: 'Delete {controlName}',
@@ -219,7 +220,7 @@ export const en = {
219220
createDerivedDS: 'Create Derived DS',
220221
datasetCreation: 'Dataset Creation',
221222
addDatasetTitle: 'Add new dataset',
222-
label: 'Dataset Name:',
223+
label: 'Dataset Name',
223224
attention:
224225
'Attention: Zone filters (Gene, Gene List, Sample, Tags) do not participate in dataset creation',
225226
addDataset: 'Add dataset',

src/pages/filter/common/filter-control/create-entry-button/create-entry-button.tsx

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,51 @@
1-
import { ReactElement } from 'react'
1+
import { ReactElement, useCallback } from 'react'
22

3+
import { TGenomeOptionsKeys } from '@core/enum/explore-genome-types-enum'
34
import { useModal } from '@core/hooks/use-modal'
45
import { t } from '@i18n'
6+
import filterStore from '@store/filter'
7+
import filterDtreesStore from '@store/filter-dtrees'
8+
import filterPresetsStore from '@store/filter-presets'
59
import { Button } from '@ui/button'
610
import { SolutionCreateDialog } from '@components/solution-control/solution-create-dialog'
11+
import presetsCardStore from '@pages/main/components/selected-dataset/build-flow/components/cards/presets-card/presets-card.store'
712
import { ISolutionEntryDescription } from '@service-providers/common'
8-
13+
import { FilterControlOptionsNames } from '../filter-control.const'
914
interface ICreateEntryProps {
10-
solutionName: string
15+
pageName: FilterControlOptionsNames
1116
availableSolutionEntries: ISolutionEntryDescription[] | undefined
12-
createSolutionEntry: (entryName: string) => void
1317
}
1418

1519
export const CreateEntryButton = ({
16-
solutionName,
20+
pageName,
1721
availableSolutionEntries,
18-
createSolutionEntry,
1922
}: ICreateEntryProps): ReactElement => {
2023
const [createDialog, openCreateDialog, closeCreateDialog] = useModal()
2124

25+
const solutionName =
26+
pageName === FilterControlOptionsNames.dtree ? pageName : 'Preset'
27+
28+
const onCreateSolution = useCallback(
29+
(entryName: string, rubric?: TGenomeOptionsKeys) => {
30+
closeCreateDialog()
31+
32+
if (pageName === FilterControlOptionsNames.dtree) {
33+
filterDtreesStore.createDtree(entryName, rubric)
34+
} else if (pageName === FilterControlOptionsNames.refiner) {
35+
filterPresetsStore.createPreset(
36+
entryName,
37+
filterStore.conditions,
38+
rubric,
39+
)
40+
}
41+
42+
pageName === FilterControlOptionsNames.dtree
43+
? presetsCardStore.refreshDtrees()
44+
: presetsCardStore.refreshPresets()
45+
},
46+
[closeCreateDialog, pageName],
47+
)
48+
2249
return (
2350
<>
2451
<Button
@@ -32,10 +59,7 @@ export const CreateEntryButton = ({
3259
solutions={availableSolutionEntries}
3360
onClose={closeCreateDialog}
3461
controlName={solutionName}
35-
onCreate={entryName => {
36-
closeCreateDialog()
37-
createSolutionEntry(entryName)
38-
}}
62+
onCreate={onCreateSolution}
3963
/>
4064
</>
4165
)

src/pages/filter/common/filter-control/filter-control.interface.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { FilterControlOptionsNames } from './filter-control.const'
44
export interface IFilterControlProps {
55
SolutionControl: React.ElementType
66
TextEditorButton?: React.ElementType
7-
createSolutionEntry: (entryName: string) => void
87
availableSolutionEntries: ISolutionEntryDescription[] | undefined
98
isForwardAllowed: boolean
109
isBackwardAllowed: boolean

src/pages/filter/common/filter-control/filter-control.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ export const FilterControl = observer(
3030
({
3131
SolutionControl,
3232
TextEditorButton,
33-
createSolutionEntry,
3433
availableSolutionEntries,
3534
className,
3635
isForwardAllowed,
@@ -104,12 +103,7 @@ export const FilterControl = observer(
104103
<Divider orientation="vertical" className="h-[75%]" />
105104

106105
<CreateEntryButton
107-
solutionName={
108-
pageName === FilterControlOptionsNames.dtree
109-
? pageName
110-
: 'Preset'
111-
}
112-
createSolutionEntry={createSolutionEntry}
106+
pageName={pageName}
113107
availableSolutionEntries={availableSolutionEntries}
114108
/>
115109
</>

src/pages/filter/dtree/components/modals/components/create-dataset-dialog.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,10 @@ export const CreateDatasetDialog = observer(
172172
>
173173
<div className="flex flex-col">
174174
<div>
175-
<span className="text-14">{t('dsCreation.label')}</span>
176-
177175
<Input
178176
disabled={!operations.isCreationOver}
179177
value={value}
178+
label={t('dsCreation.label')}
180179
onChange={e => handleChange(e.target.value)}
181180
className="mt-1"
182181
data-testid={DecisionTreesMenuDataCy.datasetNameInput}

src/pages/filter/dtree/dtree.page.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,6 @@ export const DtreePage = observer((): ReactElement => {
4040

4141
const { availableDtrees: availableSolutionEntries } = filterDtreesStore
4242

43-
const createDtree = (treeName: string): void => {
44-
filterDtreesStore.createDtree(treeName)
45-
}
46-
4743
const modifiedDtree = dtreeStore.isDtreeModified
4844
? dtreeStore.currentDtreeName
4945
: undefined
@@ -123,7 +119,6 @@ export const DtreePage = observer((): ReactElement => {
123119
}
124120
pageName={FilterControlOptionsNames[GlbPagesNames.Dtree]}
125121
SolutionControl={SolutionControlDtree}
126-
createSolutionEntry={createDtree}
127122
availableSolutionEntries={availableSolutionEntries}
128123
isEntryCreationAllowed={isEntryCreationAllowed}
129124
isBackwardAllowed={dtreeStore.actionHistory.isBackwardAllowed}

src/pages/filter/refiner/refiner.page.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ export const RefinerPage = observer((): ReactElement => {
4343
const { availablePresets: availableSolutionEntries, activePreset } =
4444
filterPresetsStore
4545

46-
const createPreset = (presetName: string): void => {
47-
filterPresetsStore.createPreset(presetName, filterStore.conditions)
48-
}
49-
5046
const filterCounts = filterStore.stat.filteredCounts
5147

5248
const modifiedPreset = filterStore.isPresetModified
@@ -102,7 +98,6 @@ export const RefinerPage = observer((): ReactElement => {
10298
<FilterControl
10399
pageName={FilterControlOptionsNames[GlbPagesNames.Refiner]}
104100
SolutionControl={SolutionControlRefiner}
105-
createSolutionEntry={createPreset}
106101
availableSolutionEntries={availableSolutionEntries}
107102
isBackwardAllowed={filterStore.actionHistory.isBackwardAllowed}
108103
isForwardAllowed={filterStore.actionHistory.isForwardAllowed}

src/pages/main/components/selected-dataset/build-flow/components/cards/presets-card/presets-card.store.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ class PresetsCardStore {
5151
this.loadDTrees()
5252
}
5353

54+
public refreshDtrees() {
55+
this._dtrees.invalidate()
56+
}
57+
58+
public refreshPresets() {
59+
this._presets.invalidate()
60+
}
61+
5462
public getSolutionsByRubric(rubric?: TExploreGenomeKeys) {
5563
if (rubric) {
5664
return this.solutions.filter(solution => solution.rubric === rubric)

src/service-providers/decision-trees/decision-trees.interface.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
TPropertyStatus,
1010
} from '../common'
1111
import { TGetFullStatUnitsOptions } from '../filtering-regime'
12+
import { TGenomeOptionsKeys } from './../../core/enum/explore-genome-types-enum'
1213

1314
// dtree_set
1415

@@ -28,6 +29,7 @@ export type TDtreeModifyingActions = [
2829
actionType: ActionTypes.DTREE,
2930
actionName: DtreeModifyingActions,
3031
decisionTreeName: string,
32+
rubric?: TGenomeOptionsKeys,
3133
]
3234

3335
export enum InstrModifyingActionNames {

src/service-providers/filtering-regime/filtering-regime.interface.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// ds_stat
2-
32
import {
43
DatasetKinds,
54
IFuncPropertyStatus,
@@ -10,6 +9,8 @@ import {
109
TPropertyStatus,
1110
} from 'service-providers/common'
1211

12+
import { TGenomeOptionsKeys } from '@core/enum/explore-genome-types-enum'
13+
1314
export enum DsStatArgumentsOptions {
1415
UPDATE = 'UPDATE',
1516
DELETE = 'DELETE',
@@ -21,7 +22,11 @@ export interface IDsStatArguments {
2122
tm?: number
2223
filter?: string
2324
conditions?: ReadonlyArray<TCondition>
24-
instr?: [option: DsStatArgumentsOptions, filterName: string]
25+
instr?: [
26+
option: DsStatArgumentsOptions,
27+
filterName: string,
28+
rubric?: TGenomeOptionsKeys,
29+
]
2530
}
2631

2732
export interface IDsStatCondSeq {
@@ -106,6 +111,7 @@ export type TUpdateFilterPresetParams = {
106111
ds: string
107112
presetName: string
108113
conditions?: ReadonlyArray<TCondition>
114+
rubric?: TGenomeOptionsKeys
109115
}
110116

111117
export type TJoinFilterPresetParams = {

src/service-providers/filtering-regime/filtering-regime.provider.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,11 @@ export class FilteringRegimeProvider extends ServiceProviderBase {
5252
{
5353
ds: params.ds,
5454
conditions: params.conditions,
55-
instr: [DsStatArgumentsOptions.UPDATE, params.presetName],
55+
instr: [
56+
DsStatArgumentsOptions.UPDATE,
57+
params.presetName,
58+
params.rubric,
59+
],
5660
},
5761
options,
5862
)

src/store/filter-dtrees/filter-dtrees.store.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { makeAutoObservable, reaction, toJS } from 'mobx'
22

3+
import { TGenomeOptionsKeys } from '@core/enum/explore-genome-types-enum'
34
import { pushQueryParams } from '@core/history'
45
import { t } from '@i18n'
56
import { createHistoryObserver } from '@store/common'
@@ -85,7 +86,10 @@ export class FilterDtreesStore {
8586
this.setActiveDtree('')
8687
}
8788

88-
public createDtree = (dtreeName: string): void => {
89+
public createDtree = (
90+
dtreeName: string,
91+
rubric?: TGenomeOptionsKeys,
92+
): void => {
8993
if (!validatePresetName(dtreeName)) {
9094
showToast(t('filter.notValidName'), 'error')
9195

@@ -95,7 +99,12 @@ export class FilterDtreesStore {
9599
.updateDtree({
96100
ds: datasetStore.datasetName,
97101
code: dtreeStore.dtreeCode,
98-
instr: [ActionTypes.DTREE, DtreeModifyingActions.UPDATE, dtreeName],
102+
instr: [
103+
ActionTypes.DTREE,
104+
DtreeModifyingActions.UPDATE,
105+
dtreeName,
106+
rubric,
107+
],
99108
})
100109
.then(() => {
101110
this.dtrees.invalidate()

0 commit comments

Comments
 (0)