Skip to content

Commit 4c47a34

Browse files
committed
implement template nav mode for use with default site generator
- add helper to detect nav mode - allow UI preview model to specify nav mode - define nav groups using JSON - reuse existing General catagory for orphaned component names, if present
1 parent 40c6e60 commit 4c47a34

File tree

12 files changed

+102
-134
lines changed

12 files changed

+102
-134
lines changed

gulp.d/tasks/build-preview-pages.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ module.exports = (src, previewSrc, previewDest, sink = () => map()) => (done) =>
131131
}
132132
},
133133
function (done) {
134-
this.push(exportSiteNavigationData(baseUiModel.site.components))
134+
if (baseUiModel.navMode === 'client') this.push(exportSiteNavigationData(baseUiModel.site.components))
135135
vfs
136136
.src('js/vendor/fontawesome-icon-defs.js', { base: src, cwd: src })
137137
.pipe(

preview-src/ui-model.yml

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,16 @@
11
antoraVersion: '2.3.1'
2+
navMode: template # set value to client to generate navigation on the client
23
site:
34
title: Couchbase Docs
45
url: http://localhost:5252
56
homeUrl: &home_url /home.html
67
keys:
78
navGroups: |
8-
- title: Server
9-
startPage: home::server.adoc
10-
components: [server, '*-connector']
11-
url: /index.html
12-
- title: Mobile
13-
startPage: home::mobile.adoc
14-
components: [couchbase-lite, sync-gateway]
15-
url: '#'
16-
- title: Cloud
17-
startPage: home::cloud.adoc
18-
components: [operator]
19-
url: '#'
9+
[
10+
{ "title": "Server", "startPage": "home::server.adoc", "components": ["server", "*-connector"], "url": "/index.html" },
11+
{ "title": "Mobile", "startPage": "home::mobile.adoc", "components": ["couchbase-lite", "sync-gateway"], "url": "#" },
12+
{ "title": "Cloud", "startPage": "home::cloud.adoc", "components": ["operator"], "url": "#" }
13+
]
2014
components:
2115
server:
2216
versions:
@@ -27,6 +21,8 @@ site:
2721
version: '5.5'
2822
title: Couchbase Server
2923
url: /server/5.5/index.html
24+
navigation:
25+
- content: Introduction
3026
- version: '5.1'
3127
url: /index.html
3228
navigation:
@@ -143,14 +139,15 @@ site:
143139
url: /spark-connector/2.4/index.html
144140
navigation:
145141
- content: Spark Connector
146-
url: /spark-connector/2.4/index.html
147142
items:
148143
- content: Getting Started
149144
url: /spark-connector/2.4/getting-started.html
150145
- content: Streaming Integration
151146
url: /spark-connector/2.4/streaming-integration.html
152147
- version: '2.3'
153148
url: /spark-connector/2.3/index.html
149+
navigation:
150+
- content: Spark Connector
154151
latest: *latest_spark_connector
155152
couchbase-lite:
156153
url: /couchbase-lite/2.1/index.html

src/helpers/nav-groups.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
'use strict'
22

3-
const yaml = require('js-yaml')
4-
5-
module.exports = ({ data: { root: { contentCatalog, site } } }) => {
3+
module.exports = ({ data: { root: { contentCatalog = { resolvePage: () => undefined }, site } } }) => {
64
let navGroups = site.keys.navGroups
75
if (!navGroups) return []
86
if (navGroups._compiled) return navGroups
9-
if (!contentCatalog) contentCatalog = { resolvePage: () => undefined }
107
const components = site.components
118
const componentNames = Object.keys(components)
129
const claimed = ['home']
13-
navGroups = yaml.load(navGroups).reduce((accum, navGroup) => {
14-
const componentNamesInGroup = navGroup.components.reduce((matched, componentName) => {
10+
navGroups = JSON.parse(navGroups).reduce((accum, navGroup) => {
11+
const componentNamesInGroup = (navGroup.components || []).reduce((matched, componentName) => {
1512
if (~componentName.indexOf('*')) {
1613
const rx = new RegExp(`^${componentName.replace(/[*]/g, '.*?')}$`)
1714
return matched.concat(componentNames.filter((candidate) => rx.test(candidate)))
@@ -24,7 +21,14 @@ module.exports = ({ data: { root: { contentCatalog, site } } }) => {
2421
return accum.concat(compileNavGroup(navGroup, componentNamesInGroup, contentCatalog, components))
2522
}, [])
2623
const orphaned = componentNames.filter((it) => claimed.indexOf(it) < 0)
27-
if (orphaned.length) navGroups.push(compileNavGroup({ title: 'General' }, orphaned, contentCatalog, components))
24+
if (orphaned.length) {
25+
const generalGroup = navGroups.find((it) => it.title === 'General')
26+
if (generalGroup) {
27+
generalGroup.components.push(...orphaned)
28+
} else {
29+
navGroups.push(compileNavGroup({ title: 'General' }, orphaned, contentCatalog, components))
30+
}
31+
}
2832
navGroups._compiled = true
2933
return (site.keys.navGroups = navGroups)
3034
}

src/helpers/nav-mode.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
'use strict'
2+
3+
module.exports = ({ data: { root: { contentCatalog = { getSiteStartPage () {} }, navMode } } }) => {
4+
if (navMode) return navMode
5+
const siteStartPage = contentCatalog.getSiteStartPage()
6+
if (siteStartPage && siteStartPage.asciidoc.attributes['export-site-navigation-data'] != null) return 'client'
7+
return 'template'
8+
}

src/js/01-nav.js

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
;(function () {
22
'use strict'
33

4-
var pageNavigationGroup = window.pageNavigationGroup
5-
if (!pageNavigationGroup) return
6-
7-
var siteNavigationData = window.siteNavigationData.reduce(function (accum, entry) {
8-
return (accum[entry.name] = entry) && accum
9-
}, {})
10-
114
var navContainer = document.querySelector('.nav-container')
12-
buildNav(navContainer, getPage(), pageNavigationGroup, siteNavigationData)
5+
if (!navContainer.querySelector('.components')) {
6+
var siteNavigationData = window.siteNavigationData.reduce(function (accum, entry) {
7+
return (accum[entry.name] = entry) && accum
8+
}, {})
9+
buildNav(navContainer, getPage(), window.pageNavigationGroup, siteNavigationData)
10+
}
1311
activateNav(navContainer)
1412

1513
function getPage () {
@@ -22,7 +20,7 @@
2220
}
2321

2422
function buildNav (container, page, group, navData) {
25-
var groupEl = createElement('div', 'components')
23+
var groupEl = createElement('div', 'components is-revealed')
2624
var groupNameEl = createElement('div', 'components_group-title')
2725
if (group.url) {
2826
var groupLinkEl = createElement('a')
@@ -57,11 +55,11 @@
5755
componentsListItemsEl.appendChild(componentVersionsEl)
5856
componentNavData.versions.forEach(function (componentVersion) {
5957
var componentVersionNavEl = createElement('div', 'version_items')
58+
componentVersionNavEl.dataset.version = componentVersion.version
6059
// TODO only open manually after building nav tree if current page is not found
6160
if (page.component !== componentName || page.version !== componentVersion.version) {
6261
componentVersionNavEl.classList.add('hide')
6362
}
64-
componentVersionNavEl.dataset.version = componentVersion.version
6563
buildNavTree(componentVersion.sets, componentVersionNavEl, page, [])
6664
componentsListItemsEl.appendChild(componentVersionNavEl)
6765
})
@@ -173,7 +171,19 @@
173171
if (e.detail > 1 && window.getComputedStyle(e.target).cursor === 'pointer') e.preventDefault()
174172
})
175173

176-
scrollItemToMidpoint(container.querySelector('.components'), container.querySelector('a.is-current-page'))
174+
var components = container.querySelector('.components')
175+
176+
scrollItemToMidpoint(components, container.querySelector('a.is-current-page'))
177+
178+
if (!components.classList.contains('is-revealed')) {
179+
find('a.is-current-page', container).forEach(function (currentPage) {
180+
var childNavList = currentPage.parentNode.nextElementSibling
181+
if (childNavList) childNavList.classList.remove('hide')
182+
var ancestor = currentPage
183+
while ((ancestor = ancestor.parentNode) && ancestor !== container) ancestor.classList.remove('hide')
184+
})
185+
components.classList.add('is-revealed')
186+
}
177187

178188
find('.component_list_title', container).forEach(function (componentTitleEl) {
179189
componentTitleEl.style.cursor = 'pointer'

src/partials/footer-scripts.hbs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{{#if page.component}}
1+
{{#if (and page.component (eq (nav-mode) 'client'))}}
22
{{!-- may pass this path to site.js and have it load the navigation data itself --}}
33
<script src="{{siteRootPath}}/site-navigation-data.js"></script>
44
<script>

src/partials/main.hbs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
{{/with}}
2121
{{/unless}}
2222
<div class="article-header">
23-
{{!-- {{> nav-control}} --}}
2423
{{> crumbs}}
2524
</div>
2625
{{> article}}

src/partials/nav-control.hbs

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/partials/nav-menu.hbs

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,32 @@
1-
<div class="left-sidebar-menu">
2-
{{> nav-version-control}}
3-
<div class="nav-menu">
4-
{{> nav-tree navigation=page.navigation level=0 crumbLevel=0 crumbAtLevel=(lookup page.breadcrumbs 0)}}
1+
<div class="components">
2+
{{#with (nav-group-for-page (nav-groups))}}
3+
<div class="components_group-title">
4+
{{#if ./url}}<a href="{{relativize ./url}}">{{{./title}}}</a>{{else}}{{{./title}}}{{/if}}
5+
</div>
6+
<ul class="components_list">
7+
{{#each ./components as |componentName|}}
8+
{{#with (lookup @root.site.components this)}}
9+
<li class="components_list-items">
10+
<div class="component_list-version">
11+
<span class="component_list_title">{{{./title}}}</span>
12+
{{#with (or (and (eq @root.page.component.name componentName) @root.page.version) (lookup ../../latestVersions componentName)) as |activeVersion|}}
13+
{{#unless (eq activeVersion 'master')}}
14+
<select class="version_list">
15+
{{#each ../versions}}
16+
<option value="{{./version}}"{{#if (eq ./version activeVersion)}} selected{{/if}}>{{or ./displayVersion ./version}}</option>
17+
{{/each}}
18+
</select>
19+
{{/unless}}
20+
{{/with}}
21+
</div>
22+
{{#each ./versions}}
23+
<div class="version_items{{#unless (and (eq @root.page.component.name ../componentName) (eq @root.page.version ./version))}} hide{{/unless}}" data-version="{{./version}}">
24+
{{> nav-tree navigation=./navigation level=0}}
25+
</div>
26+
{{/each}}
27+
</li>
28+
{{/with}}
29+
{{/each}}
30+
</ul>
31+
{{/with}}
532
</div>
6-
<a href="#" class="menu-expand-toggle"> <span>Navigation</span> <i class="fas fa-times-circle"></i> <i class="fas fa-chevron-circle-left"></i></a>
7-
</div>

src/partials/nav-tree.hbs

Lines changed: 14 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,16 @@
1-
{{#if navigation}}
2-
{{#each navigation}}
3-
{{#if (eq ../crumbAtLevel this)}}
4-
{{#if ( eq ../crumbLevel 0 or eq ../crumbLevel 1 or eq ../crumbLevel 2 or eq ../crumbLevel 3)}}
5-
{{!-- <div class="main-nav-parent new " data-depth="{{../level}}"><span class="back-to-menu"><i class="fas fa-chevron-left"></i> Main Menu </span>
6-
7-
</div> --}}
8-
{{/if}}
9-
{{/if}}
10-
{{/each}}
11-
<ul class="nav-list">
12-
{{!-- {{log ../crumbAtLevel this 'log output'}} --}}
13-
{{#each navigation}}
14-
<li class="nav-item{{#if (eq ../crumbAtLevel this)}}
15-
{{~#if (eq this (last @root.page.breadcrumbs))}} is-current-page{{~else}} is-current-path{{/if}} is-active
16-
{{~else if (eq ../level 1)}} {{!--is-active--}} is-inactive{{/if}}{{#if (eq ../crumbAtLevel this (and eq ../level 2))}} is-active-depth-2 {{/if}} " data-depth="{{../level}}">
17-
18-
{{#if ./content}}
19-
<span class="nav-line " data-depth="{{../level}}">
20-
{{#if ./items}}
21-
{{#if ./icons}}
22-
<i class="{{./icons}}"></i>
23-
{{/if}}
24-
<span class="in-toggle" data-depth="{{../level}}"></span>
25-
{{!-- <button class="nav-toggle"></button> --}}
26-
{{/if}}
27-
{{#if ./url}}
28-
<a class="nav-link" href="{{#if (eq ./urlType 'internal')}}{{relativize ./url}}{{else}}{{./url}}{{/if}}">{{{./content}}}</a>
29-
{{else}}
30-
<span class="nav-text ">{{{./content}}}</span>
31-
{{/if}}
32-
</span>
33-
{{/if}}
34-
{{> nav-tree navigation=./items level=(add ../level 1) crumbLevel=(add ../crumbLevel (and ./content 1)) crumbAtLevel=(lookup @root.page.breadcrumbs (add ../crumbLevel (and ./content 1)))}}
35-
</li>
36-
{{/each}}
1+
{{#if navigation.length}}
2+
<ul class="menu_row{{#if ./level}} hide{{/if}}">
3+
{{#each navigation}}
4+
<li class="menu_list{{#if (eq ./url @root.page.url)}} is-current-page{{/if}}{{#if ./items.length}} is-parent{{/if}}" data-depth="{{../level}}">
5+
<span class="menu_line">
6+
{{#if ./url}}
7+
<a class="menu_title menu_link{{#if (eq ./url @root.page.url)}} is-current-page{{/if}}" href="{{relativize ./url}}">{{{./content}}}</a>
8+
{{else}}
9+
<span class="menu_title menu_text">{{{./content}}}</span>
10+
{{/if}}
11+
</span>
12+
{{> nav-tree navigation=./items level=(add ../level 1)}}
13+
</li>
14+
{{/each}}
3715
</ul>
3816
{{/if}}

0 commit comments

Comments
 (0)