feat(breadcrumb): Add breadcrumb

This commit is contained in:
Khaled Garbaya
2017-10-05 15:25:37 +02:00
committed by Benedikt Rötsch
parent 0deaca4e01
commit 52de0d10f3
6 changed files with 113 additions and 4 deletions

4
app.js
View File

@@ -15,6 +15,7 @@ const about = require('./routes/about')
const settings = require('./routes/settings') const settings = require('./routes/settings')
const sitemap = require('./routes/sitemap') const sitemap = require('./routes/sitemap')
const {initClient} = require('./services/contentful') const {initClient} = require('./services/contentful')
const breadcrumb = require('./lib/breadcrumb')
const app = express() const app = express()
// view engine setup // view engine setup
@@ -28,6 +29,7 @@ app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.urlencoded({ extended: false }))
app.use(cookieParser()) app.use(cookieParser())
app.use(express.static(path.join(__dirname, 'public'))) app.use(express.static(path.join(__dirname, 'public')))
app.use(breadcrumb())
// Pass custom helpers to all our templates // Pass custom helpers to all our templates
app.use(function (req, res, next) { app.use(function (req, res, next) {
@@ -36,8 +38,6 @@ app.use(function (req, res, next) {
res.locals.queryString = qs ? `?${qs}` : '' res.locals.queryString = qs ? `?${qs}` : ''
res.locals.query = req.query res.locals.query = req.query
res.locals.currentPath = req.path res.locals.currentPath = req.path
console.log(req.path)
// Allow setting of credentials via query parameters // Allow setting of credentials via query parameters
const { space_id, preview_access_token, delivery_access_token } = req.query const { space_id, preview_access_token, delivery_access_token } = req.query
if (space_id && preview_access_token && delivery_access_token) { // eslint-disable-line camelcase if (space_id && preview_access_token && delivery_access_token) { // eslint-disable-line camelcase

View File

@@ -0,0 +1,35 @@
@block breadcrumb {
margin-bottom: calc(var(--grid-gutter) / 2);
& ul {
display: flex;
list-style: none;
flex-wrap: wrap;
margin: 0;
padding: 0;
& li {
margin: 0;
& + li {
margin-left: calc(var(--grid-gutter) / 4);
}
&:after{
content: ' >';
}
&:last-child:after{
content: '';
}
& a {
display: inline-block;
text-transform: capitalize;
&:hover {
color: var(--color-link-content-hover);
}
}
}
}
}

View File

@@ -4,6 +4,7 @@
@import './table-of-contents'; @import './table-of-contents';
@import './sidebar-menu'; @import './sidebar-menu';
@import './main-navigation'; @import './main-navigation';
@import './breadcrumb';
body { body {
background-color: var(--color-bg-default); background-color: var(--color-bg-default);

27
lib/breadcrumb.js Normal file
View File

@@ -0,0 +1,27 @@
const url = require('url')
module.exports = (modifier) => {
return (req, res, next) => {
const baseUrl = url.format({ protocol: req.protocol, host: req.get('host') })
const parts = url.parse(req.url).pathname.split('/').filter(Boolean)
let items = []
items.push({ label: 'Home', url: baseUrl })
items = items.concat(parts.map((part, i, array) => {
const path = array.slice(0, i + 1).join('/')
return {
label: part.replace(/-/g, ' '),
url: url.resolve(baseUrl, path),
path: path
}
})
)
if (modifier) {
items = items.map(modifier)
}
// make it global
req.app.locals.breadcrumb = items
// next operation
next()
}
}

View File

@@ -1464,6 +1464,46 @@ display: flex;
color: #536171; color: #536171;
} }
.breadcrumb {
margin-bottom: 11px;
}
.breadcrumb ul {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
list-style: none;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin: 0;
padding: 0;
}
.breadcrumb ul li {
margin: 0;
}
.breadcrumb ul li + li {
margin-left: 5.5px;
}
.breadcrumb ul li:after {
content: ' >';
}
.breadcrumb ul li:last-child:after {
content: '';
}
.breadcrumb ul li a {
display: inline-block;
text-transform: capitalize;
}
.breadcrumb ul li a:hover {
color: #3c80cf;
}
body { body {
background-color: #fff; background-color: #fff;
color: #536171; color: #536171;

View File

@@ -38,7 +38,6 @@ html
.header__logo .header__logo
a.header__logo-link(href='/') a.header__logo-link(href='/')
img(src='/images/logo.svg' alt='Contentful Example App') img(src='/images/logo.svg' alt='Contentful Example App')
nav.header__navigation.main-navigation nav.header__navigation.main-navigation
ul ul
li li
@@ -49,7 +48,14 @@ html
a(href=`/about${queryString}` class=(currentPath.startsWith('/about') ? 'active' : '')) About a(href=`/about${queryString}` class=(currentPath.startsWith('/about') ? 'active' : '')) About
li li
a(href=`/settings${queryString}` class=(currentPath.startsWith('/settings') ? 'active' : '')) Settings a(href=`/settings${queryString}` class=(currentPath.startsWith('/settings') ? 'active' : '')) Settings
if currentPath !== '/'
.main__breadcrumb
.layout-centered
nav.breadcrumb
ul
each item in breadcrumb
li
a(href=`${item.url}${queryString}`) #{item.label}
.main__content .main__content
block content block content