diff --git a/src/components/Tab/TabItem.global.vue b/src/components/Tab/TabItem.global.vue
index dcfc3f5..e317062 100644
--- a/src/components/Tab/TabItem.global.vue
+++ b/src/components/Tab/TabItem.global.vue
@@ -1,8 +1,8 @@
@@ -11,12 +11,10 @@
diff --git a/src/modules/otus/composables/useChildrenRoutes.js b/src/modules/otus/composables/useChildrenRoutes.js
index b486313..841a99a 100644
--- a/src/modules/otus/composables/useChildrenRoutes.js
+++ b/src/modules/otus/composables/useChildrenRoutes.js
@@ -1,15 +1,16 @@
import { useRouter } from 'vue-router'
import { humanize } from '@/utils/strings'
-export default function useChildrenRoutes () {
+export default function useChildrenRoutes() {
const router = useRouter()
- const { children } = router.getRoutes().find(route => route.name === 'otus-id')
+ const { children } = router
+ .getRoutes()
+ .find((route) => route.name === 'otus-id')
- return children.map(({ path, name }) =>
- ({
- label: path && humanize(path),
- path,
- name
- })
- )
-}
\ No newline at end of file
+ return children.map(({ path, name, meta }) => ({
+ label: path && humanize(path),
+ path,
+ name,
+ meta
+ }))
+}
diff --git a/src/modules/otus/constants/overviewLayout.js b/src/modules/otus/constants/layouts.js
similarity index 57%
rename from src/modules/otus/constants/overviewLayout.js
rename to src/modules/otus/constants/layouts.js
index 95a0399..dab70e1 100644
--- a/src/modules/otus/constants/overviewLayout.js
+++ b/src/modules/otus/constants/layouts.js
@@ -1,3 +1,5 @@
+import { DEFAULT_OVERVIEW_LAYOUT } from './layouts/index.js'
+
const panelEntries = Object.values(
import.meta.glob(['../components/Panel/*/main.js', '#/panels/*/main.js'], {
eager: true,
@@ -5,21 +7,12 @@ const panelEntries = Object.values(
})
)
-const { taxa_page_overview } = __APP_ENV__
-
-const DEFAULT_LAYOUT = [
- [
- [
- 'panel:gallery',
- 'panel:type',
- 'panel:type',
- 'panel:type-specimen',
- 'panel:nomenclature',
- 'panel:nomenclature-references'
- ],
- ['panel:map', 'panel:descendants', 'panel:content', 'panel:statistics']
- ]
-]
+const { taxa_page } = __APP_ENV__
+
+const tabsLayout = Object.assign({
+ ...DEFAULT_OVERVIEW_LAYOUT,
+ ...taxa_page
+})
function parsePanelConfiguraion(panelLayout) {
return panelLayout.map((row) =>
@@ -38,6 +31,13 @@ function parsePanelConfiguraion(panelLayout) {
)
}
-export const overviewLayout = parsePanelConfiguraion(
- taxa_page_overview?.panels || DEFAULT_LAYOUT
-)
+const layouts = {}
+
+for (const key in tabsLayout) {
+ layouts[key] = {
+ panels: parsePanelConfiguraion(tabsLayout[key]?.panels || {}),
+ rankGroup: tabsLayout[key].rank_group || []
+ }
+}
+
+export default layouts
diff --git a/src/modules/otus/constants/layouts/index.js b/src/modules/otus/constants/layouts/index.js
new file mode 100644
index 0000000..78492c0
--- /dev/null
+++ b/src/modules/otus/constants/layouts/index.js
@@ -0,0 +1 @@
+export * from './overview'
diff --git a/src/modules/otus/constants/layouts/overview.js b/src/modules/otus/constants/layouts/overview.js
new file mode 100644
index 0000000..fac4b9a
--- /dev/null
+++ b/src/modules/otus/constants/layouts/overview.js
@@ -0,0 +1,22 @@
+export const DEFAULT_OVERVIEW_LAYOUT = {
+ overview: {
+ panels: [
+ [
+ [
+ 'panel:gallery',
+ 'panel:type',
+ 'panel:type',
+ 'panel:type-specimen',
+ 'panel:nomenclature',
+ 'panel:nomenclature-references'
+ ],
+ [
+ 'panel:map',
+ 'panel:descendants',
+ 'panel:content',
+ 'panel:statistics'
+ ]
+ ]
+ ]
+ }
+}
diff --git a/src/modules/otus/router/index.js b/src/modules/otus/router/index.js
index eda7dc0..64fdca4 100644
--- a/src/modules/otus/router/index.js
+++ b/src/modules/otus/router/index.js
@@ -1,60 +1,29 @@
import OtuIndex from '@/modules/otus/views/Index.vue'
-import OtuOverview from '@/modules/otus/views/Overview.vue'
-import OtuDistribution from '@/modules/otus/views/Distribution.vue'
-import OtuTimeline from '@/modules/otus/views/Timeline.vue'
+import PageLayout from '@/modules/otus/views/PageLayout.vue'
+import layouts from '../constants/layouts'
-export default [{
- name: 'otus-id',
- path: '/otus/:id',
- component: OtuIndex,
- redirect: {
- name: 'otus-id-overview'
- },
- children: [
- {
- path: 'overview',
- name: 'otus-id-overview',
- component: OtuOverview,
- },
-/* {
- path: 'timeline',
- name: 'otus-id-timeline',
- component: OtuTimeline
- },
- {
- path: 'descendants',
- name: 'otus-id-descendants',
- component: OtuDistribution
- },
- {
- path: 'images',
- name: 'otus-id-images',
- component: OtuDistribution
- },
- {
- path: 'type_specimens',
- name: 'otus-id-type_specimens',
- component: OtuDistribution
- },
- {
- path: 'specimen_records',
- name: 'otus-id-specimen_records',
- component: OtuDistribution
- },
- {
- path: 'content',
- name: 'otus-id-content',
- component: OtuDistribution
- },
- {
- path: 'annotations',
- name: 'otus-id-annotations',
- component: OtuDistribution
- },
- {
- path: 'distribution',
- name: 'otus-id-distribution',
- component: OtuDistribution
- }, */
- ]
-}]
+function makeChildrenRoutes() {
+ const tabKeys = Object.keys(layouts || {})
+
+ return tabKeys.map((tab) => ({
+ path: tab,
+ name: `otus-id-${tab}`,
+ component: PageLayout,
+ meta: {
+ tab,
+ rankGroup: layouts[tab].rankGroup
+ }
+ }))
+}
+
+export default [
+ {
+ name: 'otus-id',
+ path: '/otus/:id',
+ component: OtuIndex,
+ redirect: {
+ name: 'otus-id-overview'
+ },
+ children: makeChildrenRoutes()
+ }
+]
diff --git a/src/modules/otus/utils/index.js b/src/modules/otus/utils/index.js
index 1094c15..1a97887 100644
--- a/src/modules/otus/utils/index.js
+++ b/src/modules/otus/utils/index.js
@@ -1,3 +1,4 @@
+export * from './isAvailableForRank'
export * from './isRankGroup'
export * from './makeGeoJSONFeature'
export * from './removeDuplicateShapes'
diff --git a/src/modules/otus/utils/isAvailableForRank.js b/src/modules/otus/utils/isAvailableForRank.js
new file mode 100644
index 0000000..e467c4f
--- /dev/null
+++ b/src/modules/otus/utils/isAvailableForRank.js
@@ -0,0 +1,6 @@
+export function isAvailableForRank(available, rankString) {
+ return (
+ !available.length ||
+ available.some((rankGroup) => rankString?.includes(rankGroup))
+ )
+}
diff --git a/src/modules/otus/views/Annotations.vue b/src/modules/otus/views/Annotations.vue
deleted file mode 100644
index e69de29..0000000
diff --git a/src/modules/otus/views/Content.vue b/src/modules/otus/views/Content.vue
deleted file mode 100644
index e69de29..0000000
diff --git a/src/modules/otus/views/Descendants.vue b/src/modules/otus/views/Descendants.vue
deleted file mode 100644
index 3faec9e..0000000
--- a/src/modules/otus/views/Descendants.vue
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/modules/otus/views/Distribution.vue b/src/modules/otus/views/Distribution.vue
deleted file mode 100644
index b9e3415..0000000
--- a/src/modules/otus/views/Distribution.vue
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/modules/otus/views/Images.vue b/src/modules/otus/views/Images.vue
deleted file mode 100644
index b9e3415..0000000
--- a/src/modules/otus/views/Images.vue
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/modules/otus/views/Index.vue b/src/modules/otus/views/Index.vue
index 10925f1..59e549c 100644
--- a/src/modules/otus/views/Index.vue
+++ b/src/modules/otus/views/Index.vue
@@ -1,49 +1,50 @@
-
-
-
-
-
+
-
{
const otu = computed(() => store.otu)
const taxon = computed(() => store.taxon)
const isReady = computed(() => otu.value?.id && taxon.value?.id)
+const tabs = computed(() =>
+ childrenRoutes.filter((item) =>
+ isAvailableForRank(item.meta.rankGroup, taxon.value.rank_string)
+ )
+)
onServerPrefetch(async () => {
await loadInitialData()
})
watch(
- () => route.fullPath,
+ () => route.params.id,
async () => {
controller.abort()
controller = new AbortController()
diff --git a/src/modules/otus/views/Overview.vue b/src/modules/otus/views/PageLayout.vue
similarity index 67%
rename from src/modules/otus/views/Overview.vue
rename to src/modules/otus/views/PageLayout.vue
index 7544b04..c5d6416 100644
--- a/src/modules/otus/views/Overview.vue
+++ b/src/modules/otus/views/PageLayout.vue
@@ -1,7 +1,7 @@
@@ -16,7 +16,7 @@
>
diff --git a/src/modules/otus/views/SpecimenRecords.vue b/src/modules/otus/views/SpecimenRecords.vue
deleted file mode 100644
index e69de29..0000000
diff --git a/src/modules/otus/views/Timeline.vue b/src/modules/otus/views/Timeline.vue
deleted file mode 100644
index 24b4cac..0000000
--- a/src/modules/otus/views/Timeline.vue
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- Timeline
-
-
\ No newline at end of file
diff --git a/src/modules/otus/views/TypeSpecimens.vue b/src/modules/otus/views/TypeSpecimens.vue
deleted file mode 100644
index bc25b72..0000000
--- a/src/modules/otus/views/TypeSpecimens.vue
+++ /dev/null
@@ -1,3 +0,0 @@
-
- Timeline
-
\ No newline at end of file
diff --git a/src/plugins/markdown/relativeToRouter.js b/src/plugins/markdown/relativeToRouter.js
index 8fa9ebb..92ee120 100644
--- a/src/plugins/markdown/relativeToRouter.js
+++ b/src/plugins/markdown/relativeToRouter.js
@@ -1,4 +1,22 @@
-export function relativeToRouterPlugin(md) {
+export function relativeToRouterPlugin(md, configuration) {
+ const isStaticAsset = (url) => {
+ const regex = /\.\w+$/
+
+ return regex.test(url)
+ }
+
+ const makeUrlToStaticAsset = (url) => {
+ const baseUrl = configuration.base_url || ''
+
+ return (baseUrl + url).replaceAll('//', '/')
+
+ if (!url.startsWith('/')) {
+ return (baseUrl + url).replaceAll('//', '/')
+ } else {
+ return url
+ }
+ }
+
const scan = (state) => {
state.tokens.forEach((tokens) => {
if (tokens.type !== 'inline') {
@@ -13,14 +31,23 @@ export function relativeToRouterPlugin(md) {
} else if (inlineTokens[i].type === 'link_open') {
const attrs = inlineTokens[i].attrs
const href = attrs?.find((v) => v[0] === 'href')
+
if (
href &&
!href[1].startsWith('http') &&
!href[1].startsWith('mailto')
) {
- inlineTokens[i].tag = 'router-link'
- inlineTokens[i].attrs = [['to', href[1]]]
- isRT = true
+ if (isStaticAsset(href[1])) {
+ inlineTokens[i].attrs.push([
+ 'href',
+ makeUrlToStaticAsset(href[1])
+ ])
+ inlineTokens[i].attrs.push(['target', '_blank'])
+ } else {
+ inlineTokens[i].tag = 'router-link'
+ inlineTokens[i].attrs = [['to', href[1]]]
+ isRT = true
+ }
} else {
inlineTokens[i].attrs.push(['rel', 'noopener noreferrer'])
inlineTokens[i].attrs.push(['target', '_blank'])
diff --git a/vite.config.js b/vite.config.js
index e734819..cca6049 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -38,8 +38,8 @@ export default () => {
md.use(variableReplacementPlugin, {
variables: { ...configuration }
})
- },
- markdownItUses: [relativeToRouterPlugin]
+ md.use(relativeToRouterPlugin, configuration)
+ }
}),
Pages({