Skip to content

Commit 7ea4d5c

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

File tree

9 files changed

+98
-12
lines changed

9 files changed

+98
-12
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: 58 additions & 3 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,12 +83,14 @@
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

9092
<page-query>
91-
query($id: ID!) {
93+
query($id: ID!, $page: Int) {
9294
language(id: $id) {
9395
id
9496
path
@@ -111,6 +113,34 @@ query($id: ID!) {
111113
url
112114
}
113115
}
116+
117+
belongsTo(perPage: 4, page: $page, sortBy: "title", order: ASC) @paginate {
118+
totalCount
119+
120+
pageInfo {
121+
totalPages
122+
currentPage
123+
}
124+
125+
edges {
126+
node {
127+
... on MarkdownPage {
128+
title
129+
excerpt
130+
path
131+
category {
132+
id
133+
name
134+
}
135+
tags {
136+
id
137+
name
138+
path
139+
}
140+
}
141+
}
142+
}
143+
}
114144
}
115145

116146
allLanguage {
@@ -124,7 +154,12 @@ query($id: ID!) {
124154
</page-query>
125155

126156
<script>
157+
import NextPrevLinks from "@/components/NextPrevLinks";
158+
127159
export default {
160+
components: {
161+
NextPrevLinks,
162+
},
128163
computed: {
129164
language() {
130165
return this.$page.language;
@@ -138,6 +173,26 @@ export default {
138173
anyPackages() {
139174
return this.versionsWithPackages.length > 0;
140175
},
176+
pages() {
177+
return this.language.belongsTo.edges.map((e) => e.node);
178+
},
179+
// Sidebar of language page lists all pages referencing the language grouped by category
180+
sidebarSections() {
181+
const pages = this.pages;
182+
if (pages.length === 0) return "docs";
183+
184+
const groups = {};
185+
for (const p of pages) {
186+
const key = p.category.name;
187+
if (!groups[key]) groups[key] = [];
188+
groups[key].push(p);
189+
}
190+
const sections = [];
191+
for (const name of Object.keys(groups)) {
192+
sections.push({ title: name, items: groups[name] });
193+
}
194+
return sections;
195+
},
141196
},
142197
143198
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)