Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80635 views
1
/**
2
* @providesModule DocsSidebar
3
* @jsx React.DOM
4
*/
5
6
var Metadata = require('Metadata');
7
8
var DocsSidebar = React.createClass({
9
getCategories: function() {
10
var metadatas = Metadata.files.filter(function(metadata) {
11
return metadata.layout === 'docs';
12
});
13
14
// Build a hashmap of article_id -> metadata
15
var articles = {}
16
for (var i = 0; i < metadatas.length; ++i) {
17
var metadata = metadatas[i];
18
articles[metadata.id] = metadata;
19
}
20
21
// Build a hashmap of article_id -> previous_id
22
var previous = {};
23
for (var i = 0; i < metadatas.length; ++i) {
24
var metadata = metadatas[i];
25
if (metadata.next) {
26
if (!articles[metadata.next]) {
27
throw '`next: ' + metadata.next + '` in ' + metadata.id + ' doesn\'t exist';
28
}
29
previous[articles[metadata.next].id] = metadata.id;
30
}
31
}
32
33
// Find the first element which doesn't have any previous
34
var first = null;
35
for (var i = 0; i < metadatas.length; ++i) {
36
var metadata = metadatas[i];
37
if (!previous[metadata.id]) {
38
first = metadata;
39
break;
40
}
41
}
42
43
var categories = [];
44
var currentCategory = null;
45
46
var metadata = first;
47
var i = 0;
48
while (metadata && i++ < 1000) {
49
if (!currentCategory || metadata.category !== currentCategory.name) {
50
currentCategory && categories.push(currentCategory);
51
currentCategory = {
52
name: metadata.category,
53
links: []
54
}
55
}
56
currentCategory.links.push(metadata);
57
metadata = articles[metadata.next];
58
}
59
categories.push(currentCategory);
60
61
return categories;
62
},
63
64
getLink: function(metadata) {
65
if (metadata.permalink.match(/^https?:/)) {
66
return metadata.permalink;
67
}
68
return '/flux/' + metadata.permalink + '#content';
69
},
70
71
render: function() {
72
return <div className="nav-docs">
73
{this.getCategories().map((category) =>
74
<div className="nav-docs-section" key={category.name}>
75
<h3>{category.name}</h3>
76
<ul>
77
{category.links.map((metadata) =>
78
<li key={metadata.id}>
79
<a
80
target={metadata.permalink.match(/^https?:/) && '_blank'}
81
style={{marginLeft: metadata.indent ? 20 : 0}}
82
className={metadata.id === this.props.metadata.id ? 'active' : ''}
83
href={this.getLink(metadata)}>
84
{metadata.title}
85
</a>
86
</li>
87
)}
88
</ul>
89
</div>
90
)}
91
</div>;
92
}
93
});
94
95
module.exports = DocsSidebar;
96
97