Skip to content

Commit eac80d1

Browse files
committed
Add reference to languages
Sidebar on `/languages/:language` lists pages referencing the language grouped by category.
1 parent 3d18ba8 commit eac80d1

File tree

9 files changed

+92
-11
lines changed

9 files changed

+92
-11
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
category: guides
3+
tags:
4+
- testing
5+
languages:
6+
- javascript
7+
---
8+
9+
# Testing JavaScript

content/refs/javascript-ref.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
category: references
3+
languages: [javascript]
4+
---
5+
6+
# Sample JavaScript Reference
7+
8+
> TODO Remove this file
9+
10+
This file exists to show how the sidebar on language pages are automatically populated and grouped by `category`.

data/categories.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,9 @@
22
- id: docs
33
name: Docs
44
description: Docs
5+
6+
- id: guides
7+
name: Guides
8+
- id: references
9+
name: References
10+
description: Reference Manuals

data/tags.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,6 @@
99
name: Content
1010
- id: codewars
1111
name: Codewars
12+
13+
- id: testing
14+
name: Testing

gridsome.config.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ module.exports = {
6161
typeName: "Tag",
6262
},
6363
// Can reference multiple languages to be listed on the language page.
64-
// languages: {
65-
// typeName: "Language",
66-
// },
64+
languages: {
65+
typeName: "Language",
66+
},
6767
},
6868
},
6969
},

src/layouts/Default.vue

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ export default {
8484
currentPath: {
8585
type: String,
8686
},
87-
sidebarName: {
88-
type: String,
87+
sidebar: {
88+
// Name of the sidebar defined in settings or array of sections.
89+
type: [String, Array],
8990
},
9091
},
9192
components: {
@@ -125,13 +126,15 @@ export default {
125126
hasSidebar() {
126127
return (
127128
this.$page &&
128-
(this.$page.markdownPage || this.sidebarName) &&
129+
(this.$page.markdownPage || this.sidebar) &&
129130
this.headerHeight > 0
130131
);
131132
},
132133
sidebarSections() {
134+
if (Array.isArray(this.sidebar)) return this.sidebar;
135+
133136
const def = this.$static.metadata.settings.sidebar.find(
134-
(sidebar) => sidebar.name === this.sidebarName
137+
(sidebar) => sidebar.name === this.sidebar
135138
);
136139
if (!def) return null;
137140

src/pages/Languages.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<Layout currentPath="/languages/" sidebarName="docs">
2+
<Layout currentPath="/languages/" sidebar="docs">
33
<div class="w-full md:w-2/3">
44
<div class="content">
55
<h1 id="supported-languages">

src/templates/Language.vue

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<Layout :currentPath="language.path" sidebarName="docs">
2+
<Layout :currentPath="language.path" :sidebar="sidebarSections">
33
<h1
44
class="mt-4 text-4xl font-black text-ui-typo leading-snug tracking-tighter text-center"
55
>
@@ -83,7 +83,9 @@
8383
</template>
8484
</div>
8585

86-
<!-- TODO List documents related to this language. Let MarkdownPage refernce by `language` frontmatter -->
86+
<div class="mt-8 pt-8 lg:mt-12 lg:pt-12 border-t border-ui-border">
87+
<NextPrevLinks :prev="{ title: 'Languages', path: '/languages/' }" />
88+
</div>
8789
</Layout>
8890
</template>
8991

@@ -111,6 +113,29 @@ query($id: ID!) {
111113
url
112114
}
113115
}
116+
117+
belongsTo(sortBy: "title", order: ASC) {
118+
totalCount
119+
120+
edges {
121+
node {
122+
... on MarkdownPage {
123+
title
124+
excerpt
125+
path
126+
category {
127+
id
128+
name
129+
}
130+
tags {
131+
id
132+
name
133+
path
134+
}
135+
}
136+
}
137+
}
138+
}
114139
}
115140

116141
allLanguage {
@@ -124,7 +149,12 @@ query($id: ID!) {
124149
</page-query>
125150

126151
<script>
152+
import NextPrevLinks from "@/components/NextPrevLinks";
153+
127154
export default {
155+
components: {
156+
NextPrevLinks,
157+
},
128158
computed: {
129159
language() {
130160
return this.$page.language;
@@ -138,6 +168,26 @@ export default {
138168
anyPackages() {
139169
return this.versionsWithPackages.length > 0;
140170
},
171+
pages() {
172+
return this.language.belongsTo.edges.map((e) => e.node);
173+
},
174+
// Sidebar of language page lists all pages referencing the language grouped by category
175+
sidebarSections() {
176+
const pages = this.pages;
177+
if (pages.length === 0) return "docs";
178+
179+
const groups = {};
180+
for (const p of pages) {
181+
const key = p.category.name;
182+
if (!groups[key]) groups[key] = [];
183+
groups[key].push(p);
184+
}
185+
const sections = [];
186+
for (const name of Object.keys(groups)) {
187+
sections.push({ title: name, items: groups[name] });
188+
}
189+
return sections;
190+
},
141191
},
142192
143193
methods: {

src/templates/MarkdownPage.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<Layout :sidebarName="page.sidebar" :currentPath="page.path">
2+
<Layout :sidebar="page.sidebar" :currentPath="page.path">
33
<div class="flex flex-wrap items-start justify-start">
44
<div
55
class="order-2 w-full md:w-1/3 sm:pl-4 md:pl-6 lg:pl-8 sticky top-0 pt-16"

0 commit comments

Comments
 (0)