-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdisease-selector.component.ts
More file actions
61 lines (59 loc) · 1.89 KB
/
disease-selector.component.ts
File metadata and controls
61 lines (59 loc) · 1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import {
Component,
computed,
effect,
input,
linkedSignal,
OnDestroy,
output,
} from '@angular/core';
import { Dataset } from '../../interfaces';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSelectModule } from '@angular/material/select';
import { capitalize } from 'lodash';
import { SUBTYPE_DEFAULT } from '../../constants';
@Component({
selector: 'app-disease-selector',
imports: [MatFormFieldModule, MatSelectModule],
templateUrl: './disease-selector.component.html',
styleUrl: './disease-selector.component.scss',
})
export class DiseaseSelectorComponent implements OnDestroy {
readonly diseases$ = input.required<Dataset[]>();
selected = output<Dataset>();
readonly activeDisease$ = linkedSignal(
() =>
this.diseaseNames$().filter((d) => d === 'breast invasive carcinoma')[0]
);
readonly activeSubtype = linkedSignal(
() =>
this.possibleSubtypes$().find(
(subtype) => subtype.disease_subtype == null
) ?? this.possibleSubtypes$()[0]
);
protected readonly capitalize = capitalize;
protected readonly SUBTYPE_DEFAULT = SUBTYPE_DEFAULT;
private readonly _diseaseSubtypeMap$ = computed(() => {
const diseaseSubtypes = new Map<string, Dataset[]>();
(this.diseases$() || []).forEach((disease) => {
const diseaseName = disease.disease_name;
if (!diseaseSubtypes.has(diseaseName)) {
diseaseSubtypes.set(diseaseName, []);
}
diseaseSubtypes.get(diseaseName)?.push(disease);
});
return diseaseSubtypes;
});
readonly diseaseNames$ = computed(() =>
Array.from(this._diseaseSubtypeMap$().keys()).sort()
);
readonly possibleSubtypes$ = computed(
() => this._diseaseSubtypeMap$().get(this.activeDisease$()) ?? []
);
private readonly _updateOutput = effect(() =>
this.selected.emit(this.activeSubtype())
);
ngOnDestroy() {
this._updateOutput.destroy();
}
}