From e660882a3cfdf90d28ec6ffbaadffe6aa5309b5e Mon Sep 17 00:00:00 2001 From: Stefan Peters Date: Mon, 13 Feb 2023 13:54:07 +0100 Subject: [PATCH] Restructure ConceptDetails (#701) --- config/locale.json | 16 ++-- src/components/ConceptDetail.vue | 148 ++++++++++++++++++++----------- 2 files changed, 105 insertions(+), 59 deletions(-) diff --git a/config/locale.json b/config/locale.json index 60d416c9..ed0089ca 100644 --- a/config/locale.json +++ b/config/locale.json @@ -72,12 +72,15 @@ "error": "Error performing the search." }, "conceptDetail": { + "mainTab": "Concept", + "additionalLanguagesTab": "Translations", "showAllAncestors": "show all ancestors", "showLessAncestors": "show fewer ancestors", "created": "Created", "modified": "Modified", "issued": "Issued", - "altLabels": "Alternative Labels", + "altLabel": "Alternative", + "prefLabel": "Preferred", "definition": "Definition", "relevance": "Relevance", "relevanceVeryHigh": "very high", @@ -85,7 +88,7 @@ "relevanceMedium": "medium", "relevanceLow": "low", "relevanceGeneric": "generic", - "info": "Info", + "info": "Meta", "labels": "Labels", "editorial": "Editorial", "scope": "Scope", @@ -550,7 +553,7 @@ "created": "Erstellung", "modified": "Änderung", "issued": "Veröffentlicht", - "altLabels": "Alternative Bezeichnungen", + "altLabels": "Alternativ", "definition": "Definition", "relevance": "Relevanz", "relevanceVeryHigh": "sehr hoch", @@ -558,7 +561,7 @@ "relevanceMedium": "mittel", "relevanceLow": "niedrig", "relevanceGeneric": "generisch", - "info": "Info", + "info": "Meta", "labels": "Bezeichnungen", "editorial": "Editorial", "scope": "Scope", @@ -568,7 +571,10 @@ "searchLinks": "Links", "clearConcept": "Konzept entfernen", "previousConceptTooltip": "vorheriges Konzept", - "nextConceptTooltip": "nächstes Konzept" + "nextConceptTooltip": "nächstes Konzept", + "prefLabel": "Bevorzugt", + "mainTab": "Konzept", + "additionalLanguagesTab": "Übersetzungen" }, "schemeDetail": { "noTopConcepts": "Keine Oberkonzepte", diff --git a/src/components/ConceptDetail.vue b/src/components/ConceptDetail.vue index 32e45e9e..44ff2c15 100644 --- a/src/components/ConceptDetail.vue +++ b/src/components/ConceptDetail.vue @@ -131,6 +131,30 @@ + +
- -
- - {{ label }} - - {{ language }} -
- -
- {{ $t("conceptDetail.altLabels") }}: -
-
- - {{ label }} - - {{ language }} -
-
- - ${this.$t("conceptDetail.relevance")}: ${this.$t(relevance)} - ` + let term = "" let terms = [] for (let { concept } of concepts.filter(c => c.type.RELEVANCE == this.$t(relevance, "en"))) { if (concept && (this.$jskos.prefLabel(concept, { fallbackToUri: false }))) { @@ -448,6 +419,75 @@ export default { } return [this.item].concat(this.item.ancestors || [], this.item.broader || []).filter(concept => concept != null) }, + // Content to be shown under "Concept" and "Translations" tabs + content() { + const content = [ + { + title: this.$t("conceptDetail.prefLabel"), + prop: "prefLabel", + languageMap: this.item.prefLabel, + }, + { + title: this.$t("conceptDetail.altLabel"), + prop: "altLabel", + languageMap: this.item.altLabel, + isArray: true, + }, + { + title: this.$t("conceptDetail.gnd"), + languageMap: this.gndTerms.length ? { de: this.gndTerms } : null, + isArray: true, + }, + { + title: this.$t("conceptDetail.scope"), + prop: "scopeNote", + languageMap: this.item.scopeNote, + isArray: true, + }, + { + title: this.$t("conceptDetail.editorial"), + prop: "editorialNote", + languageMap: this.item.editorialNote, + isArray: true, + }, + ] + return content.filter(part => part.languageMap && Object.keys(part.languageMap).length) + }, + // All available content languages + allLanguages() { + const props = this.content.map(part => part.prop).filter(Boolean) + const languageSet = new Set() + for (let prop of props) { + Object.keys(this.item[prop] ?? {}).forEach(key => languageSet.add(key)) + } + return Array.from(languageSet).filter(language => language !== "-") + }, + // Main languages for content to be shown under Concept tab; usually selected language + English + mainLanguages() { + const props = this.content.map(part => part.prop).filter(Boolean) + let language + for (let prop of props) { + language = this.$jskos.languagePreference.selectLanguage(this.item[prop]) + if (language) { + break + } + } + const languages = [] + if (language) { + languages.push(language) + } + if (language !== "en" && this.allLanguages.includes("en")) { + languages.push("en") + } + if (languages.length === 0) { + languages.push(this.$jskos.languagePreference.getLanguages()?.[0]) + } + return languages + }, + // Additional languages for content to be shown under Translations tab; allLanguages minus mainLanguages + additionalLanguages() { + return this.allLanguages.filter(language => !this.mainLanguages.includes(language)) + }, }, watch: { // TODO: Can we watch `uri` directly?