@@ -3,12 +3,14 @@ import {ActivatedRoute, Params, Router} from '@angular/router';
3
3
import { MatTableDataSource } from '@angular/material/table' ;
4
4
import { MatPaginator } from '@angular/material/paginator' ;
5
5
import { MatSort } from '@angular/material/sort' ;
6
- import { forkJoin as observableForkJoin } from 'rxjs' ;
7
- import { switchMap } from 'rxjs/operators' ;
6
+ import { forkJoin , forkJoin as observableForkJoin } from 'rxjs' ;
7
+ import { of } from 'rxjs/internal/observable/of' ;
8
+ import { catchError , switchMap } from 'rxjs/operators' ;
9
+ import { LanguageService } from '../../services/language/language.service' ;
8
10
import { TermService } from '../../services/term/term.service' ;
9
- import { Disease , Gene , LoincEntry , Term , TermTree } from '../../models/models' ;
11
+ import { Disease , Gene , Language , LoincEntry , Term , TermTree , Translation } from '../../models/models' ;
10
12
import { DialogService } from '../../../shared/dialog-excel-download/dialog.service' ;
11
-
13
+ import { OntologyService } from "../../services/ontology/ontology.service" ;
12
14
13
15
@Component ( {
14
16
selector : 'app-term' ,
@@ -19,10 +21,7 @@ export class TermComponent implements OnInit {
19
21
termTitle : string ;
20
22
query : string ;
21
23
paramId : string ;
22
- term : Term = {
23
- 'id' : '' , 'name' : '' , 'definition' : '' , 'altTermIds' : [ ] , 'comment' : '' , 'synonyms' : [ ] ,
24
- 'isObsolete' : true , 'xrefs' : [ ] , 'pubmedXrefs' : [ ] , 'purl' : ''
25
- } ;
24
+ term : Term ;
26
25
geneColumns = [ 'geneId' , 'dbDiseases' ] ;
27
26
geneSource : MatTableDataSource < Gene > ;
28
27
geneAssocCount : number ;
@@ -48,13 +47,15 @@ export class TermComponent implements OnInit {
48
47
overlay = false ;
49
48
displayAllDiseaseAssc = false ;
50
49
displayAllGeneAssc = false ;
50
+ languages : Language [ ] ;
51
+ selectedLanguage : Language = { language : "en" , language_long : "English" }
51
52
52
53
@ViewChild ( 'diseasePaginator' , { static : true } ) diseasePaginator : MatPaginator ;
53
54
@ViewChild ( 'genePaginator' , { static : true } ) genePaginator : MatPaginator ;
54
55
@ViewChild ( MatSort ) sort : MatSort ;
55
56
56
- constructor ( private route : ActivatedRoute , private termService : TermService , private dialogService : DialogService ,
57
- private router : Router ) {
57
+ constructor ( private route : ActivatedRoute , private termService : TermService , private ontologyService : OntologyService ,
58
+ private dialogService : DialogService , private languageService : LanguageService , private router : Router ) {
58
59
}
59
60
60
61
ngOnInit ( ) {
@@ -100,26 +101,28 @@ export class TermComponent implements OnInit {
100
101
}
101
102
102
103
refreshData ( query : string ) {
103
- this . termService . searchTerm ( query )
104
- . subscribe ( ( data ) => {
105
- this . setDefaults ( data . details ) ;
106
- const maxTermWidth = 100 ;
107
- this . treeData = data . relations ;
108
- this . treeData . maxTermWidth = maxTermWidth ;
109
- const termCount = this . treeData . termCount ;
110
- this . treeData . children . sort ( ( a , b ) => a . childrenCount > b . childrenCount ? ( - 1 ) : 1 ) ;
111
- this . treeData . children . map ( term => {
112
- const percent = term . childrenCount / termCount ;
113
- const newWidth = Math . ceil ( maxTermWidth * percent ) ;
114
- const newMargin = - 115 + ( ( maxTermWidth - newWidth ) - 5 ) ;
115
- term . treeCountWidth = newWidth ;
116
- term . treeMargin = newMargin ;
117
- } ) ;
118
- this . termTitle = this . term . name ;
119
- } , ( error ) => {
120
- // Error bubbles up
121
- console . log ( error ) ;
104
+ forkJoin ( {
105
+ hpo : this . termService . searchTerm ( query ) ,
106
+ term : this . ontologyService . term ( query ) . pipe ( catchError ( e => { console . error ( e ) ; return of ( undefined ) } ) ) ,
107
+ parents : this . ontologyService . parents ( query ) . pipe ( catchError ( e => of ( [ ] ) ) ) ,
108
+ children : this . ontologyService . children ( query ) . pipe ( catchError ( e => of ( [ ] ) ) )
109
+ } ) . subscribe ( ( { hpo , term , parents , children } ) => {
110
+ this . setDefaults ( term ) ;
111
+ const maxTermWidth = 100 ;
112
+ hpo . relations = this . joinTranslation ( hpo . relations , parents , children ) ;
113
+ this . treeData = hpo . relations ;
114
+ this . treeData . maxTermWidth = maxTermWidth ;
115
+ const termCount = this . treeData . termCount ;
116
+ this . treeData . children . sort ( ( a , b ) => a . childrenCount > b . childrenCount ? ( - 1 ) : 1 ) ;
117
+ this . treeData . children . map ( term => {
118
+ const percent = term . childrenCount / termCount ;
119
+ const newWidth = Math . ceil ( maxTermWidth * percent ) ;
120
+ const newMargin = - 115 + ( ( maxTermWidth - newWidth ) - 5 ) ;
121
+ term . treeCountWidth = newWidth ;
122
+ term . treeMargin = newMargin ;
122
123
} ) ;
124
+ this . termTitle = this . term . name ;
125
+ } ) ;
123
126
}
124
127
125
128
reloadDiseaseAssociations ( offset : string , max : string ) {
@@ -158,12 +161,48 @@ export class TermComponent implements OnInit {
158
161
this . term . definition = ( term . definition != null ) ? term . definition : 'Sorry this term has no definition.' ;
159
162
this . term . purl = 'http://purl.obolibrary.org/obo/' + term . id . replace ( ':' , '_' ) ;
160
163
this . term . xrefs = ( term . xrefs != null ) ? term . xrefs : [ ] ;
161
- this . term . pubmedXrefs = ( term . pubmedXrefs != null ) ? term . pubmedXrefs . map ( pmid => {
162
- return { whole : pmid , id : pmid . split ( ':' ) [ 1 ] } ;
163
- } ) : [ ] ;
164
+
165
+ if ( term . translations != undefined && term . translations . length > 0 ) {
166
+ // Get unique set of languages
167
+ this . languages = [ ...new Set ( term . translations . map ( ( t ) => {
168
+ return { language : t . language , language_long : t . language_long }
169
+ } ) ) ] ;
170
+
171
+ // Add english default
172
+ this . languages . unshift ( this . languageService . default ) ;
173
+
174
+ // If the active language is updated set it.
175
+ this . languageService . active$ . subscribe ( ( active ) => {
176
+ const exist = this . languages . some ( li => li . language == active . language ) ;
177
+ if ( exist ) {
178
+ this . selectedLanguage = active ;
179
+ } else {
180
+ this . languageService . change ( this . languageService . default ) ;
181
+ }
182
+ } ) ;
183
+ }
164
184
}
165
185
}
166
186
187
+ joinTranslation ( relations , parents , children ) {
188
+ relations . children . map ( ( child ) => {
189
+ children . map ( ( childT ) => {
190
+ if ( child . ontologyId == childT . id ) {
191
+ child . translations = childT . translations
192
+ }
193
+ } ) ;
194
+ } ) ;
195
+
196
+ relations . parents . map ( ( parent ) => {
197
+ parents . map ( ( parentT ) => {
198
+ if ( parent . ontologyId == parentT . id ) {
199
+ parent . translations = parentT . translations
200
+ }
201
+ } ) ;
202
+ } ) ;
203
+ return relations ;
204
+ }
205
+
167
206
showAllDiseases ( event ) {
168
207
this . assocLoading = true ;
169
208
this . reloadDiseaseAssociations ( '0' , '-1' ) ;
@@ -217,6 +256,10 @@ export class TermComponent implements OnInit {
217
256
setTreeStyles ( child : Term ) : any {
218
257
return { 'width' : child . treeCountWidth + 'px' , 'margin-left' : child . treeMargin + 'px' , 'margin-right' : '20px' } ;
219
258
}
259
+
260
+ changeLanguage ( language ) {
261
+ this . languageService . change ( language ) ;
262
+ }
220
263
}
221
264
222
265
0 commit comments