From 91407e271047edcee8f6d1a2b831731b49b37275 Mon Sep 17 00:00:00 2001 From: Maksym Mishchanchuk Date: Mon, 24 Apr 2023 14:40:23 +0300 Subject: [PATCH] Add rendering bradcumbs from page title --- client/themes/splynx/components/page.vue | 19 +++------- server/controllers/common.js | 47 ++++++++++++++++++++++++ server/views/page.pug | 1 + 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/client/themes/splynx/components/page.vue b/client/themes/splynx/components/page.vue index 81743089..718cd421 100644 --- a/client/themes/splynx/components/page.vue +++ b/client/themes/splynx/components/page.vue @@ -419,6 +419,10 @@ export default { type: Array, default: () => ([]) }, + breadcrumbsItems: { + type: Array, + default: () => ([]) + }, authorName: { type: String, default: 'Unknown' @@ -514,20 +518,7 @@ export default { } }, breadcrumbs() { - return [{ path: '/', name: 'Home' }].concat(_.reduce(this.path.split('/'), (result, value, key) => { - if (value.match(/[\d+]\_[\d+]/)) { - value = value.replace('_', '.') - } else { - value = value.replaceAll('_', ' ') - value = value.charAt(0).toUpperCase() + value.slice(1); - } - - result.push({ - path: _.get(_.last(result), 'path', `/${this.locale}`) + `/${value}`, - name: value - }) - return result - }, [])) + return [{ path: '/', name: 'Home' }].concat(this.breadcrumbsItems) }, pageUrl () { return window.location.href }, upBtnPosition () { diff --git a/server/controllers/common.js b/server/controllers/common.js index 3bcfcd94..d262aa44 100644 --- a/server/controllers/common.js +++ b/server/controllers/common.js @@ -458,6 +458,53 @@ router.get('/*', async (req, res, next) => { _.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl') if (page) { + // -> Set Page breadcrumbs items + page.breadcrumbsItems = []; + const splitPath = pageArgs.path.split('/'); + for (const index in splitPath) { + const item = splitPath[index]; + + let title = item + if (item.match(/[\d+]\_[\d+]/)) { + title = item.replace('_', '.') + } else { + title = title.replace('_', ' ') + title = title.charAt(0).toUpperCase() + title.slice(1); + } + + let pathForBreadcrumbsPage = ''; + if (index === '0') { + pathForBreadcrumbsPage = `/${pageArgs.locale}/${item}`; + } else { + if (page.breadcrumbsItems[index - 1]) { + pathForBreadcrumbsPage = `${page.breadcrumbsItems[index - 1].path}/${item}`; + } + } + + const breadcrumbsPageArgs = pageHelper.parsePath(pathForBreadcrumbsPage, { stripExt }) + + let pageForBreadcrumbsTitle = title; + try { + const pageForBreadcrumbs = await WIKI.models.pages.getPage({ + path: breadcrumbsPageArgs.path, + locale: breadcrumbsPageArgs.locale, + userId: req.user.id, + isPrivate: false + }); + if (pageForBreadcrumbs !== undefined) { + pageForBreadcrumbsTitle = pageForBreadcrumbs.title; + } + } catch (err) { + WIKI.logger.error(err) + next(err) + } + + page.breadcrumbsItems.push({ + name: pageForBreadcrumbsTitle, + path: pathForBreadcrumbsPage + }) + } + _.set(res.locals, 'pageMeta.title', page.title) _.set(res.locals, 'pageMeta.description', page.description) diff --git a/server/views/page.pug b/server/views/page.pug index 32649fbe..e4930662 100644 --- a/server/views/page.pug +++ b/server/views/page.pug @@ -16,6 +16,7 @@ block body title=page.title description=page.description :tags=page.tags + :breadcrumbs-items=page.breadcrumbsItems created-at=page.createdAt updated-at=page.updatedAt author-name=page.authorName