feat: sidebar rendering
This commit is contained in:
		@@ -1,19 +1,6 @@
 | 
				
			|||||||
<template lang="pug">
 | 
					<template lang="pug">
 | 
				
			||||||
  v-list(dense, :class='color', :dark='dark')
 | 
					  v-list.py-2(dense, :class='color', :dark='dark')
 | 
				
			||||||
    v-list-tile.pt-2(href='/')
 | 
					    slot
 | 
				
			||||||
      v-list-tile-avatar: v-icon home
 | 
					 | 
				
			||||||
      v-list-tile-title Home
 | 
					 | 
				
			||||||
    v-divider.my-2
 | 
					 | 
				
			||||||
    v-subheader.pl-4 Navigation
 | 
					 | 
				
			||||||
    v-list-tile
 | 
					 | 
				
			||||||
      v-list-tile-avatar: v-icon stars
 | 
					 | 
				
			||||||
      v-list-tile-title The Universe
 | 
					 | 
				
			||||||
    v-list-tile
 | 
					 | 
				
			||||||
      v-list-tile-avatar: v-icon directions_boat
 | 
					 | 
				
			||||||
      v-list-tile-title Ships
 | 
					 | 
				
			||||||
    v-list-tile
 | 
					 | 
				
			||||||
      v-list-tile-avatar: v-icon local_airport
 | 
					 | 
				
			||||||
      v-list-tile-title Airports
 | 
					 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@
 | 
				
			|||||||
      v-model='navShown'
 | 
					      v-model='navShown'
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
      nav-sidebar
 | 
					      nav-sidebar
 | 
				
			||||||
 | 
					        slot(name='sidebar')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    v-content
 | 
					    v-content
 | 
				
			||||||
      v-toolbar(color='grey lighten-3', flat, dense)
 | 
					      v-toolbar(color='grey lighten-3', flat, dense)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -75,7 +75,8 @@ router.get('/*', async (req, res, next) => {
 | 
				
			|||||||
    isPrivate: false
 | 
					    isPrivate: false
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
  if (page) {
 | 
					  if (page) {
 | 
				
			||||||
    res.render('page', { page })
 | 
					    const sidebar = await WIKI.models.navigation.getTree({ cache: true })
 | 
				
			||||||
 | 
					    res.render('page', { page, sidebar })
 | 
				
			||||||
  } else if (pageArgs.path === 'home') {
 | 
					  } else if (pageArgs.path === 'home') {
 | 
				
			||||||
    res.render('welcome')
 | 
					    res.render('welcome')
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@ module.exports = {
 | 
				
			|||||||
        await WIKI.models.navigation.query().patch({
 | 
					        await WIKI.models.navigation.query().patch({
 | 
				
			||||||
          config: args.tree
 | 
					          config: args.tree
 | 
				
			||||||
        }).where('key', 'site')
 | 
					        }).where('key', 'site')
 | 
				
			||||||
 | 
					        await WIKI.redis.set('nav:sidebar', JSON.stringify(args.tree), 'EX', 300)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
          responseResult: graphHelper.generateSuccess('Navigation updated successfully')
 | 
					          responseResult: graphHelper.generateSuccess('Navigation updated successfully')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,9 +21,18 @@ module.exports = class Navigation extends Model {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static async getTree() {
 | 
					  static async getTree({ cache = false } = {}) {
 | 
				
			||||||
 | 
					    if (cache) {
 | 
				
			||||||
 | 
					      const navTreeCached = await WIKI.redis.get('nav:sidebar')
 | 
				
			||||||
 | 
					      if (navTreeCached) {
 | 
				
			||||||
 | 
					        return JSON.parse(navTreeCached)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    const navTree = await WIKI.models.navigation.query().findOne('key', 'site')
 | 
					    const navTree = await WIKI.models.navigation.query().findOne('key', 'site')
 | 
				
			||||||
    if (navTree) {
 | 
					    if (navTree) {
 | 
				
			||||||
 | 
					      if (cache) {
 | 
				
			||||||
 | 
					        await WIKI.redis.set('nav:sidebar', JSON.stringify(navTree.config), 'EX', 300)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      return navTree.config
 | 
					      return navTree.config
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      WIKI.logger.warn('Site Navigation is missing or corrupted.')
 | 
					      WIKI.logger.warn('Site Navigation is missing or corrupted.')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
const path = require('path')
 | 
					const path = require('path')
 | 
				
			||||||
 | 
					const uuid = require('uuid/v4')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* global WIKI */
 | 
					/* global WIKI */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -209,6 +210,7 @@ module.exports = () => {
 | 
				
			|||||||
        key: 'site',
 | 
					        key: 'site',
 | 
				
			||||||
        config: [
 | 
					        config: [
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
 | 
					            id: uuid(),
 | 
				
			||||||
            icon: 'home',
 | 
					            icon: 'home',
 | 
				
			||||||
            kind: 'link',
 | 
					            kind: 'link',
 | 
				
			||||||
            label: 'Home',
 | 
					            label: 'Home',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,4 +16,17 @@ block body
 | 
				
			|||||||
      :author-id=page.authorId
 | 
					      :author-id=page.authorId
 | 
				
			||||||
      :is-published=page.isPublished
 | 
					      :is-published=page.isPublished
 | 
				
			||||||
      )
 | 
					      )
 | 
				
			||||||
 | 
					      template(slot='sidebar')
 | 
				
			||||||
 | 
					        each navItem in sidebar
 | 
				
			||||||
 | 
					          if navItem.kind === 'link'
 | 
				
			||||||
 | 
					            v-list-tile(
 | 
				
			||||||
 | 
					              href=navItem.target
 | 
				
			||||||
 | 
					              )
 | 
				
			||||||
 | 
					              v-list-tile-avatar
 | 
				
			||||||
 | 
					                v-icon= navItem.icon
 | 
				
			||||||
 | 
					              v-list-tile-title= navItem.label
 | 
				
			||||||
 | 
					          else if navItem.kind === 'divider'
 | 
				
			||||||
 | 
					            v-divider.my-2
 | 
				
			||||||
 | 
					          else if navItem.kind === 'header'
 | 
				
			||||||
 | 
					            v-subheader.pl-4= navItem.label
 | 
				
			||||||
      template(slot='contents')!= page.render
 | 
					      template(slot='contents')!= page.render
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user