From ac6979f5dd8df32ba501a4352d2dd0f4111a335e Mon Sep 17 00:00:00 2001 From: jamiefeiss Date: Mon, 11 Sep 2023 12:46:18 +1000 Subject: [PATCH] Object page now parses parent type from response instead of from the link --- src/util/helpers.ts | 44 +++++++++++++++++++++++++++- src/views/ObjectView.vue | 63 ++++++++++------------------------------ 2 files changed, 58 insertions(+), 49 deletions(-) diff --git a/src/util/helpers.ts b/src/util/helpers.ts index 5b71a3e..9ced098 100644 --- a/src/util/helpers.ts +++ b/src/util/helpers.ts @@ -51,4 +51,46 @@ export const sortByTitle = (a: T, b: T } else { return a.iri.localeCompare(b.iri); } -}; \ No newline at end of file +}; + +/** + * Get the base class from the URL structure + * + * @param link + * @returns + */ +export function getBaseClassFromLink(link: string): {iri: string; title: string} { + const curieRegex = "[a-zA-Z0-9\\.\\-_]+:[a-zA-Z0-9\\.\\-_]+"; + const profileRegex = new RegExp(`^(\/[csv])?\/profiles\/${curieRegex}\/?$`); + const catalogRegex = new RegExp(`^\/c\/catalogs\/${curieRegex}\/?$`); + const resourceRegex = new RegExp(`^\/c\/catalogs\/${curieRegex}\/${curieRegex}\/?$`); + const datasetRegex = new RegExp(`^\/s\/datasets\/${curieRegex}\/?$`); + const featureCollectionRegex = new RegExp(`^\/s\/datasets\/${curieRegex}\/collections\/${curieRegex}\/?$`); + const featureRegex = new RegExp(`^\/s\/datasets\/${curieRegex}\/collections\/${curieRegex}\/items\/${curieRegex}\/?$`); + const vocabRegex = new RegExp(`^\/v\/vocab\/${curieRegex}\/?$`); + const collectionRegex = new RegExp(`^\/v\/collection\/${curieRegex}\/?$`); + const conceptRegex = new RegExp(`^\/v\/(vocab|collection)\/${curieRegex}\/${curieRegex}\/?$`); + + switch (true) { + case profileRegex.test(link): + return { iri: "http://www.w3.org/ns/dx/prof/Profile", title: "Profile" }; + case catalogRegex.test(link): + return { iri: "http://www.w3.org/ns/dcat#Catalog", title: "Catalog" }; + case resourceRegex.test(link): + return { iri: "http://www.w3.org/ns/dcat#Resource", title: "Resource" }; + case datasetRegex.test(link): + return { iri: "http://www.w3.org/ns/dcat#Dataset", title: "Dataset" }; + case featureCollectionRegex.test(link): + return { iri: "http://www.opengis.net/ont/geosparql#FeatureCollection", title: "Feature Collection" }; + case featureRegex.test(link): + return { iri: "http://www.opengis.net/ont/geosparql#Feature", title: "Feature" }; + case vocabRegex.test(link): + return { iri: "http://www.w3.org/2004/02/skos/core#ConceptScheme", title: "Concept Scheme" }; + case collectionRegex.test(link): + return { iri: "http://www.w3.org/2004/02/skos/core#Collection", title: "Collection" }; + case conceptRegex.test(link): + return { iri: "http://www.w3.org/2004/02/skos/core#Concept", title: "Concept" }; + default: + return { iri: "", title: "" }; + } +} diff --git a/src/views/ObjectView.vue b/src/views/ObjectView.vue index 0f70450..085145f 100644 --- a/src/views/ObjectView.vue +++ b/src/views/ObjectView.vue @@ -10,7 +10,7 @@ import router from "@/router"; import LoadingMessage from "@/components/LoadingMessage.vue"; import ErrorMessage from "@/components/ErrorMessage.vue"; -const { namedNode, literal } = DataFactory; +const { namedNode } = DataFactory; const route = useRoute(); const ui = useUiStore(); @@ -28,15 +28,11 @@ type objectItem = { parentIri: string; parentTitle?: string; parentLink: string; - parentType: { + parentTypes: { iri: string; title?: string; - }; + }[]; link: string; - baseClass: { - iri: string; - title?: string; - }; }[]; types: { iri: string; @@ -48,42 +44,6 @@ const defaultProfile = ref(null); const item = ref({} as objectItem); const links = ref([]); -function getBaseClassFromLink(link: string): {iri: string; title: string} { - const curieRegex = "[a-zA-Z0-9\\.\\-_]+:[a-zA-Z0-9\\.\\-_]+"; - const profileRegex = new RegExp(`^(\/[csv])?\/profiles\/${curieRegex}\/?$`); - const catalogRegex = new RegExp(`^\/c\/catalogs\/${curieRegex}\/?$`); - const resourceRegex = new RegExp(`^\/c\/catalogs\/${curieRegex}\/${curieRegex}\/?$`); - const datasetRegex = new RegExp(`^\/s\/datasets\/${curieRegex}\/?$`); - const featureCollectionRegex = new RegExp(`^\/s\/datasets\/${curieRegex}\/collections\/${curieRegex}\/?$`); - const featureRegex = new RegExp(`^\/s\/datasets\/${curieRegex}\/collections\/${curieRegex}\/items\/${curieRegex}\/?$`); - const vocabRegex = new RegExp(`^\/v\/vocab\/${curieRegex}\/?$`); - const collectionRegex = new RegExp(`^\/v\/collection\/${curieRegex}\/?$`); - const conceptRegex = new RegExp(`^\/v\/(vocab|collection)\/${curieRegex}\/${curieRegex}\/?$`); - - switch (true) { - case profileRegex.test(link): - return { iri: qnameToIri("prof:Profile"), title: "Profile" }; - case catalogRegex.test(link): - return { iri: qnameToIri("dcat:Catalog"), title: "Catalog" }; - case resourceRegex.test(link): - return { iri: qnameToIri("dcat:Resource"), title: "Resource" }; - case datasetRegex.test(link): - return { iri: qnameToIri("dcat:Dataset"), title: "Dataset" }; - case featureCollectionRegex.test(link): - return { iri: qnameToIri("geo:FeatureCollection"), title: "Feature Collection" }; - case featureRegex.test(link): - return { iri: qnameToIri("geo:Feature"), title: "Feature" }; - case vocabRegex.test(link): - return { iri: qnameToIri("skos:ConceptScheme"), title: "Concept Scheme" }; - case collectionRegex.test(link): - return { iri: qnameToIri("skos:Collection"), title: "Collection" }; - case conceptRegex.test(link): - return { iri: qnameToIri("skos:Concept"), title: "Concept" }; - default: - return { iri: "", title: "" }; - } -} - onMounted(async () => { if (route.query && route.query.uri) { const { data, profiles } = await apiGetRequest(route.fullPath); @@ -125,14 +85,21 @@ onMounted(async () => { let parentId = parentIds[0].object.value; let parentLink = q.object.value.split(parentId)[0] + parentId; let titles = store.value.getObjects(namedNode(parentIri), namedNode(qnameToIri("rdfs:label")), null); // API only checks for rdfs:label? + let parentTypes: { iri: string; title?: string; }[] = []; + store.value.getObjects(namedNode(parentIri), namedNode(qnameToIri("a")), null).forEach(t => { + const typeLabel = store.value.getObjects(t, namedNode(qnameToIri("rdfs:label")), null); + parentTypes.push({ + iri: t.value, + title: typeLabel.length > 0 ? typeLabel[0].value : undefined, + }); + }); item.value.links.push({ parentIri: parentIri, parentLink: parentLink, - parentType: getBaseClassFromLink(parentLink), + parentTypes: parentTypes, parentTitle: titles.length > 0 ? titles[0].value : undefined, - link: q.object.value, - baseClass: getBaseClassFromLink(q.object.value) + link: q.object.value }); } } @@ -165,12 +132,12 @@ onMounted(async () => {

{{ link.parentTitle || link.parentIri }}

- {{ link.parentType.title || link.parentType.iri }} + {{ t.title || t.iri }}
>

{{ item.title || item.iri }}

- {{ link.baseClass.title || link.baseClass.iri }} + {{ t.title || t.iri }}