diff --git a/frontend/bun.lockb b/frontend/bun.lockb
old mode 100644
new mode 100755
index 5c4eeb181..efa3345af
Binary files a/frontend/bun.lockb and b/frontend/bun.lockb differ
diff --git a/frontend/package.json b/frontend/package.json
index ca44c14ac..dde577442 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -12,6 +12,7 @@
"test:e2e": "playwright test"
},
"dependencies": {
+ "@biopragmatics/curies": "^0.1.1",
"@floating-ui/dom": "^1.6.3",
"@fortawesome/fontawesome-svg-core": "^6.5.1",
"@fortawesome/free-brands-svg-icons": "^6.5.1",
diff --git a/frontend/src/main.ts b/frontend/src/main.ts
index 90f4a84d8..29b2bfbbf 100644
--- a/frontend/src/main.ts
+++ b/frontend/src/main.ts
@@ -12,7 +12,8 @@ import "wicg-inert";
import "@/global/icons";
import "@/global/meta";
import "normalize.css";
-import "@/global/styles.scss"; /** keep these last so they take priority */
+import "@/global/styles.scss";
+import { initCurieConverter } from "@/util/url";
groupLog("Env variables", import.meta.env);
@@ -48,6 +49,7 @@ if (new URL(window.location.href).hostname.endsWith("monarchinitiative.org")) {
app.use(VueGtag, { config: { id: "G-TWM5ED4QJB" } }, router);
}
+
(async () => {
/** mock api */
if (
@@ -62,6 +64,8 @@ if (new URL(window.location.href).hostname.endsWith("monarchinitiative.org")) {
await setupWorker(...handlers).start();
}
+ await initCurieConverter();
+
/** start app */
app.mount("#app");
})();
diff --git a/frontend/src/pages/node/AssociationsTable.vue b/frontend/src/pages/node/AssociationsTable.vue
index 60f6f4267..ff84f8277 100644
--- a/frontend/src/pages/node/AssociationsTable.vue
+++ b/frontend/src/pages/node/AssociationsTable.vue
@@ -71,6 +71,12 @@
No info
+
+
+ {{ row.original_subject }}
+
+
+
=> {
sortable: true,
},
{
+ slot: "original_subject",
key: "original_subject",
heading: "Original Subject",
sortable: true,
diff --git a/frontend/src/util/url.ts b/frontend/src/util/url.ts
index cea3a3535..4e1cb1909 100644
--- a/frontend/src/util/url.ts
+++ b/frontend/src/util/url.ts
@@ -1,3 +1,5 @@
+import init, {Converter, getOboConverter, getBioregistryConverter} from "@biopragmatics/curies";
+
/** is url absolute (as opposed to relative) */
export const isAbsolute = (url = ""): boolean =>
["http:", "https:", "ftp:", "mailto:"].some((prefix) =>
@@ -24,3 +26,43 @@ export const getUrl = (
type KeysMatching = {
[K in keyof T]-?: T[K] extends V ? K : never;
}[keyof T];
+
+const curieMap: Record = {
+ "MONDO": "http://purl.obolibrary.org/obo/MONDO_",
+ "HP": "http://purl.obolibrary.org/obo/HP_",
+ "GO": "http://purl.obolibrary.org/obo/GO_",
+ "CL": "http://purl.obolibrary.org/obo/CL_",
+ "OMIM": "http://purl.obolibrary.org/obo/OMIM_",
+ "NCIT": "http://purl.obolibrary.org/obo/NCIT_",
+ "DOID": "http://purl.obolibrary.org/obo/DOID_",
+ "Orphanet": "http://purl.obolibrary.org/obo/Orphanet_",
+}
+
+//@ts-expect-error
+let curieConverter;
+
+export async function initCurieConverter() {
+ //@ts-ignore
+ await init();
+ curieConverter = await Converter.fromExtendedPrefixMap("https://raw.githubusercontent.com/biopragmatics/bioregistry/main/exports/contexts/bioregistry.epm.json")
+}
+
+export function expandCurie(curie: string | undefined): string {
+ if (!curie) {
+ return "";
+ }
+
+ //@ts-expect-error
+ return curieConverter.expand(curie);
+}
+
+export const expand = (curie: string): string => {
+ if (!curie.includes(":")) {
+ return curie;
+ }
+ const [prefix, id] = curie.split(":");
+ if (!curieMap[prefix]) {
+ return curie;
+ }
+ return curieMap[prefix] + id;
+}