Skip to content

Commit b85e4c1

Browse files
authored
Merge pull request #796 from EBISPOT/fix-exact-synonym-issue
Update exact synonym display on frontend
2 parents 3783d98 + 7d22f87 commit b85e4c1

File tree

2 files changed

+95
-28
lines changed

2 files changed

+95
-28
lines changed

frontend/src/model/Entity.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,26 @@ export default abstract class Entity extends Thing {
6868
return Reified.fromJson<any>(this.properties["synonym"]);
6969
}
7070

71+
getExactSynonyms(): Reified<any>[] {
72+
const exactSynonymTypes = [
73+
"http://www.geneontology.org/formats/oboInOwl#hasExactSynonym",
74+
"http://www.geneontology.org/formats/oboInOwl#hasSynonym",
75+
];
76+
return Reified.fromJson<any>(this.extractSynonyms(exactSynonymTypes)) || [];
77+
}
78+
79+
getRelatedSynonyms(): Reified<any>[] {
80+
return Reified.fromJson<any>(this.extractSynonyms("http://www.geneontology.org/formats/oboInOwl#hasRelatedSynonym")) || [];
81+
}
82+
83+
getBroadSynonyms(): Reified<any>[] {
84+
return Reified.fromJson<any>(this.extractSynonyms("http://www.geneontology.org/formats/oboInOwl#hasBroadSynonym")) || [];
85+
}
86+
87+
getNarrowSynonyms(): Reified<any>[] {
88+
return Reified.fromJson<any>(this.extractSynonyms("http://www.geneontology.org/formats/oboInOwl#hasNarrowSynonym")) || [];
89+
}
90+
7191
getAppearsIn(): string[] {
7292
return (this.properties["appearsIn"] || []) as string[];
7393
}
@@ -189,4 +209,33 @@ export default abstract class Entity extends Thing {
189209
}
190210
}
191211
}
212+
213+
extractSynonyms(synonymTypes: string | string[]): string[] {
214+
const result : string[] = [];
215+
// Check if 'synonymProperty' exists in 'this.properties'
216+
if (!this.properties || !this.properties.hasOwnProperty("synonymProperty")) {
217+
return result; // Return empty array if 'synonymProperty' doesn't exist
218+
}
219+
const synonymProperties = this.properties["synonymProperty"];
220+
const synonymPropsArray = Array.isArray(synonymProperties)
221+
? synonymProperties
222+
: [synonymProperties];
223+
224+
const synonymTypesArray = Array.isArray(synonymTypes)
225+
? synonymTypes
226+
: [synonymTypes];
227+
228+
synonymPropsArray.forEach((synonymProperty: string) => {
229+
if (synonymTypesArray.includes(synonymProperty)) {
230+
if (this.properties.hasOwnProperty(synonymProperty)) {
231+
const synonyms = this.properties[synonymProperty];
232+
if (synonyms) {
233+
result.push(...(Array.isArray(synonyms) ? synonyms : [synonyms]));
234+
}
235+
}
236+
}
237+
});
238+
239+
return result;
240+
}
192241
}

frontend/src/pages/ontologies/entities/entityPageSections/EntitySynonymsSection.tsx

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,52 @@ export default function EntitySynonymsSection({
1212
entity: Entity;
1313
linkedEntities: LinkedEntities;
1414
}) {
15-
let synonyms = entity.getSynonyms();
15+
const synonymsData = [
16+
{label: "Exact Synonyms", synonyms: entity.getExactSynonyms()},
17+
{label: "Related Synonyms", synonyms: entity.getRelatedSynonyms()},
18+
{label: "Narrow Synonyms", synonyms: entity.getNarrowSynonyms()},
19+
{label: "Broad Synonyms", synonyms: entity.getBroadSynonyms()},
20+
];
1621

17-
if (!synonyms || synonyms.length === 0) {
18-
return <Fragment />;
19-
}
22+
if (synonymsData.every(({synonyms}) => !synonyms || synonyms.length === 0)) {
23+
return <Fragment/>;
24+
}
2025

21-
return (
22-
<div className="flex flex-row flex-wrap items-center mb-2">
23-
<div className="font-bold mr-2">Synonym</div>
24-
{synonyms
25-
.map((synonym: Reified<any>) => {
26-
const hasMetadata = synonym.hasMetadata();
27-
return (
28-
<div
29-
key={synonym.value.toString().toUpperCase() + randomString()}
30-
className="bg-grey-default rounded-sm font-mono py-1 px-3 mr-2 my-1 text-sm"
31-
>
32-
{synonym.value}
33-
{hasMetadata && (
34-
<MetadataTooltip
35-
metadata={synonym.getMetadata()}
36-
linkedEntities={linkedEntities}
37-
/>
38-
)}
39-
</div>
40-
);
41-
})
42-
.sort((a, b) => sortByKeys(a, b))}
43-
</div>
44-
);
26+
return (
27+
<div className="flex flex-col mb-2">
28+
{synonymsData.map(
29+
({label, synonyms}) =>
30+
synonyms &&
31+
synonyms.length > 0 && (
32+
<div
33+
key={label}
34+
className="flex flex-row flex-wrap items-center mb-2"
35+
>
36+
<div className="font-bold mr-2">{label}</div>
37+
{synonyms
38+
.map((synonym: Reified<any>) => {
39+
const hasMetadata = synonym.hasMetadata();
40+
return (
41+
<div
42+
key={
43+
synonym.value.toString().toUpperCase() + randomString()
44+
}
45+
className="bg-grey-default rounded-sm font-mono py-1 px-3 mr-2 my-1 text-sm"
46+
>
47+
{synonym.value}
48+
{hasMetadata && (
49+
<MetadataTooltip
50+
metadata={synonym.getMetadata()}
51+
linkedEntities={linkedEntities}
52+
/>
53+
)}
54+
</div>
55+
);
56+
})
57+
.sort((a, b) => sortByKeys(a, b))}
58+
</div>
59+
)
60+
)}
61+
</div>
62+
);
4563
}

0 commit comments

Comments
 (0)