2021-12-25 13:43:41 +01:00
|
|
|
import get from 'lodash.get'
|
|
|
|
import orderBy from 'lodash.orderby'
|
|
|
|
import Link from 'next/link'
|
2022-05-30 16:26:19 +02:00
|
|
|
import LeftIcon from 'shared/components/icons/left.js'
|
|
|
|
import RightIcon from 'shared/components/icons/right.js'
|
2021-12-25 13:43:41 +01:00
|
|
|
|
|
|
|
// helper method to order nav entries
|
|
|
|
const order = obj => orderBy(obj, ['__order', '__title'], ['asc', 'asc'])
|
|
|
|
|
|
|
|
// Helper method to filter out the real children
|
|
|
|
const currentChildren = current => Object.values(order(current))
|
|
|
|
.filter(entry => (typeof entry === 'object'))
|
|
|
|
|
|
|
|
// Helper method to get the siblings
|
|
|
|
const currentSiblings = app => currentChildren(get(app.navigation, app.slug.split('/').slice(0, -1)))
|
|
|
|
|
|
|
|
// Helper method to get the parents
|
|
|
|
const currentParents = app => currentChildren(get(app.navigation, app.slug.split('/').slice(0, -2)))
|
|
|
|
|
|
|
|
// Helper method to get current node
|
|
|
|
const current = app => get(app.navigation, app.slug.split('/'))
|
|
|
|
|
|
|
|
|
|
|
|
const previous = app => {
|
|
|
|
|
|
|
|
// Previous sibling (aside)
|
|
|
|
const aside = currentSiblings(app)
|
|
|
|
if (aside.length > 0) {
|
|
|
|
let next = false
|
|
|
|
for (const node of aside.reverse()) {
|
|
|
|
if (next) return node
|
2022-06-01 19:57:39 +02:00
|
|
|
if (node?.__slug && node.__slug === app.slug) next = true
|
2021-12-25 13:43:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Previous parent (up)
|
|
|
|
const up = currentParents(app)
|
|
|
|
if (up.length > 0) {
|
|
|
|
let next = false
|
|
|
|
for (const node of up.reverse()) {
|
|
|
|
if (next) return node
|
2022-06-01 19:57:39 +02:00
|
|
|
if (node?.__slug && node.__slug === app.slug.slice(0, node.__slug.length)) next = true
|
2021-12-25 13:43:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
const next = app => {
|
|
|
|
// Next child (down)
|
|
|
|
const down = currentChildren(current(app))
|
|
|
|
if (down.length > 0) return down[0]
|
|
|
|
|
|
|
|
// Next sibling (aside)
|
|
|
|
const aside = currentSiblings(app)
|
|
|
|
if (aside.length > 0) {
|
|
|
|
let next = false
|
|
|
|
for (const node of aside) {
|
|
|
|
if (next) return node
|
2022-06-01 19:57:39 +02:00
|
|
|
if (node?.__slug && node.__slug === app.slug) next = true
|
2021-12-25 13:43:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Next parent (up)
|
|
|
|
const up = currentParents(app)
|
|
|
|
if (up.length > 0) {
|
|
|
|
let next = false
|
|
|
|
for (const node of up) {
|
|
|
|
if (next) return node
|
2022-06-01 19:57:39 +02:00
|
|
|
if (node?.__slug && node.__slug === app.slug.slice(0, node.__slug.length)) next = true
|
2021-12-25 13:43:41 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
const renderPrevious = node => node
|
|
|
|
? (
|
2022-05-30 16:26:19 +02:00
|
|
|
<div className="flex flex-row gap-2 items-center">
|
|
|
|
<LeftIcon className="w-8 h-8"/>
|
2022-06-01 19:57:39 +02:00
|
|
|
<Link href={'/'+node?.__slug}>
|
2021-12-27 14:59:32 +01:00
|
|
|
<a className="text-secondary">{node.__linktitle}</a>
|
|
|
|
</Link>
|
|
|
|
</div>
|
2021-12-27 14:30:10 +01:00
|
|
|
) : <span></span>
|
2021-12-25 13:43:41 +01:00
|
|
|
|
|
|
|
const renderNext = node => node
|
|
|
|
? (
|
2022-05-30 16:26:19 +02:00
|
|
|
<div className="flex flex-row gap-2 items-center">
|
2022-06-01 19:57:39 +02:00
|
|
|
<Link href={'/'+node?.__slug}>
|
2022-05-30 16:26:19 +02:00
|
|
|
<a className="text-right">{node.__linktitle}</a>
|
2021-12-27 14:59:32 +01:00
|
|
|
</Link>
|
2022-05-30 16:26:19 +02:00
|
|
|
<RightIcon className="w-8 h-8"/>
|
2021-12-27 14:59:32 +01:00
|
|
|
</div>
|
2021-12-27 14:30:10 +01:00
|
|
|
) : <span></span>
|
2021-12-25 13:43:41 +01:00
|
|
|
|
|
|
|
const PrevNext = ({ app }) => {
|
|
|
|
|
|
|
|
return (
|
2022-05-30 16:26:19 +02:00
|
|
|
<div className="flex flex-row justify-between border-t mt-12 py-2 gap-8">
|
2021-12-25 13:43:41 +01:00
|
|
|
{renderPrevious(previous(app))}
|
|
|
|
{renderNext(next(app))}
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
export default PrevNext
|