diff --git a/frontend/scenes/DocumentScene/DocumentScene.js b/frontend/scenes/DocumentScene/DocumentScene.js
index 31ebecc0a..09021b029 100644
--- a/frontend/scenes/DocumentScene/DocumentScene.js
+++ b/frontend/scenes/DocumentScene/DocumentScene.js
@@ -17,6 +17,7 @@ import Document from 'components/Document';
import DropdownMenu, { MenuItem, MoreIcon } from 'components/DropdownMenu';
import { Flex } from 'reflexbox';
import Sidebar from './components/Sidebar';
+import Breadcrumbs from './components/Breadcrumbs';
import styles from './DocumentScene.scss';
@@ -177,13 +178,8 @@ class DocumentScene extends React.Component {
);
- title = (
-
- /
- {doc.collection.name}
- {` / ${doc.title}`}
-
- );
+
+ title = ;
titleText = `${doc.collection.name} - ${doc.title}`;
}
diff --git a/frontend/scenes/DocumentScene/DocumentSceneStore.js b/frontend/scenes/DocumentScene/DocumentSceneStore.js
index d1d6ff64e..40ee36e64 100644
--- a/frontend/scenes/DocumentScene/DocumentSceneStore.js
+++ b/frontend/scenes/DocumentScene/DocumentSceneStore.js
@@ -11,7 +11,11 @@ import {
autorunAsync,
} from 'mobx';
import { client } from 'utils/ApiClient';
-import type { Document as DocumentType, Collection } from 'types';
+import type {
+ Document as DocumentType,
+ Collection,
+ NavigationNode,
+} from 'types';
const DOCUMENT_PREFERENCES = 'DOCUMENT_PREFERENCES';
@@ -54,6 +58,27 @@ class DocumentSceneStore {
}
}
+ @computed get pathToDocument(): ?Array {
+ let path;
+ const traveler = (node, previousPath) => {
+ if (this.document && node.id === this.document.id) {
+ path = previousPath;
+ return;
+ } else {
+ node.children.forEach(childNode => {
+ const newPath = [...previousPath, node];
+ return traveler(childNode, newPath);
+ });
+ }
+ };
+
+ if (this.document && this.collectionTree) {
+ traveler(this.collectionTree, []);
+ invariant(path, 'Path is not available for collection, abort');
+ return path.splice(1);
+ }
+ }
+
/* Actions */
@action fetchDocument = async (
diff --git a/frontend/scenes/DocumentScene/components/Breadcrumbs/Breadcrumbs.js b/frontend/scenes/DocumentScene/components/Breadcrumbs/Breadcrumbs.js
new file mode 100644
index 000000000..adec66f13
--- /dev/null
+++ b/frontend/scenes/DocumentScene/components/Breadcrumbs/Breadcrumbs.js
@@ -0,0 +1,36 @@
+// @flow
+import React from 'react';
+import styled from 'styled-components';
+import { Link } from 'react-router';
+import type { Document, NavigationNode } from 'types';
+import DocumentSceneStore from '../../DocumentSceneStore';
+
+type Props = {
+ store: DocumentSceneStore,
+};
+
+const Breadcrumbs = ({ store }: Props) => {
+ const { document, pathToDocument } = store;
+ if (document && document.collection) {
+ const titleSections = pathToDocument
+ ? pathToDocument.map(node => (
+ {node.title}
+ ))
+ : [];
+ titleSections.unshift(
+
+ {document.collection.name}
+
+ );
+
+ return (
+
+ /
+ {titleSections.reduce((prev, curr) => [prev, ' / ', curr])}
+ {` / ${document.title}`}
+
+ );
+ }
+};
+
+export default Breadcrumbs;
diff --git a/frontend/scenes/DocumentScene/components/Breadcrumbs/index.js b/frontend/scenes/DocumentScene/components/Breadcrumbs/index.js
new file mode 100644
index 000000000..8fe21291d
--- /dev/null
+++ b/frontend/scenes/DocumentScene/components/Breadcrumbs/index.js
@@ -0,0 +1,3 @@
+// @flow
+import Breadcrumbs from './Breadcrumbs';
+export default Breadcrumbs;
diff --git a/frontend/types/index.js b/frontend/types/index.js
index 17eadbbb4..ac6ad6947 100644
--- a/frontend/types/index.js
+++ b/frontend/types/index.js
@@ -11,13 +11,21 @@ export type Team = {
name: string,
};
+export type NavigationNode = {
+ id: string,
+ title: string,
+ url: string,
+ collapsed: boolean,
+ children: Array,
+};
+
export type Collection = {
createdAt: string,
description: ?string,
id: string,
name: string,
type: 'atlas' | 'journal',
- navigationTree: Object, // TODO
+ navigationTree: NavigationNode,
updatedAt: string,
url: string,
};