diff --git a/app/package.json b/app/package.json
index 4f6cfe5..ba596ce 100644
--- a/app/package.json
+++ b/app/package.json
@@ -35,6 +35,7 @@
"react-hot-loader": "4.13.0",
"react-router": "^5.2.0",
"react-router-dom": "^5.2.0",
+ "react-ui-tree": "^4.0.0",
"styled-components": "^5.2.1"
},
"devDependencies": {
diff --git a/app/src/react/components/persea/index.jsx b/app/src/react/components/persea/index.jsx
index 72b9e65..2b35e14 100644
--- a/app/src/react/components/persea/index.jsx
+++ b/app/src/react/components/persea/index.jsx
@@ -14,7 +14,6 @@ import {
import Dashboard from 'components/dashboard';
import ProjectRoute from 'components/project/route';
-import ResourceRoute from 'components/resource/route';
const Persea = React.memo(({history}) => {
const isLoggedIn = useSelector(userIdSelector);
@@ -25,7 +24,6 @@ const Persea = React.memo(({history}) => {
{isLoggedIn ? : Login}
-
diff --git a/app/src/react/components/project/index.jsx b/app/src/react/components/project/index.jsx
index 8e31a11..40560d6 100644
--- a/app/src/react/components/project/index.jsx
+++ b/app/src/react/components/project/index.jsx
@@ -3,19 +3,60 @@ import './index.scss';
import {join} from 'path';
import {PropTypes, React} from '@latus/react';
-import {Link} from 'react-router-dom';
+import {
+ Link,
+ Route,
+} from 'react-router-dom';
+import Tree from 'react-ui-tree';
+
+import ResourceRoute from 'components/resource/route';
+
+const renderNode = ({isFile, label, path}) => (
+ isFile
+ ? {label}
+ : {label}
+);
+
+const treeFromResourcePath = (tree, uuid, [isFile, resourcePath]) => {
+ const parts = resourcePath.split('/');
+ parts.shift();
+ let walk = tree;
+ parts.forEach((part) => {
+ let index = walk.children.findIndex(({label}) => label === part);
+ if (-1 === index) {
+ index = walk.children.length;
+ walk.children.push({
+ children: [],
+ isFile,
+ label: part,
+ path: join('/project', uuid, resourcePath),
+ });
+ }
+ walk = walk.children[index];
+ });
+}
+
+const treeFromResourcePaths = (uuid, resourcePaths) => {
+ const tree = {label: uuid, children: []};
+ resourcePaths
+ .forEach((resourcePath) => treeFromResourcePath(tree, uuid, resourcePath));
+ return tree;
+};
const Project = ({project: {label, resourcePaths}, uuid}) => (
-
{label}
-
- {resourcePaths.map(([isFile, resourcePath]) => (
- -
- {isFile ? 'File: ' : 'Directory: '}
- {resourcePath}
-
- ))}
-
+
+
+
+
+
+
);
diff --git a/app/src/react/components/project/index.scss b/app/src/react/components/project/index.scss
index e69de29..53b7f64 100644
--- a/app/src/react/components/project/index.scss
+++ b/app/src/react/components/project/index.scss
@@ -0,0 +1,27 @@
+.project {
+ display: flex;
+ width: 100vw;
+ height: 100vh;
+ .sidebar {
+ padding: 1em;
+ min-width: 25rem;
+ }
+ .m-node {
+ .caret-right::before {
+ content: "\25B8";
+ font-size: 0.7em;
+ padding-right: 0.5em;
+ }
+ .caret-down::before {
+ content: "\25BE";
+ font-size: 0.7em;
+ padding-right: 0.5em;
+ }
+ }
+ .resource-container {
+ background-color: rgba(255, 255, 255, 0.1);
+ flex-grow: 1;
+ padding: 1em;
+ }
+}
+
diff --git a/app/yarn.lock b/app/yarn.lock
index ed9c081..26aaea9 100644
--- a/app/yarn.lock
+++ b/app/yarn.lock
@@ -2553,6 +2553,11 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
+classnames@^2.2.5:
+ version "2.2.6"
+ resolved "http://npm.cha0sdev/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
+ integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
+
clean-css@4.2.x, clean-css@^4.2.3:
version "4.2.3"
resolved "http://npm.cha0sdev/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
@@ -5443,6 +5448,11 @@ js-base64@^2.1.8:
resolved "http://npm.cha0sdev/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+js-tree@^2.0.1:
+ version "2.0.2"
+ resolved "http://npm.cha0sdev/js-tree/-/js-tree-2.0.2.tgz#25cd00c55a236bd3e02578b25d1c6721803c4085"
+ integrity sha512-+pqyPOy8vZXW5v+M16rpSFsUO7rtxxnDAKn70DtSkDYhlMUs7QHhprcq/b4FBCbZMeyFv2Pfg8NWgIle9qLMbw==
+
js-yaml@3.14.0:
version "3.14.0"
resolved "http://npm.cha0sdev/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
@@ -7274,7 +7284,7 @@ promise-inflight@^1.0.1:
resolved "http://npm.cha0sdev/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
-prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
+prop-types@^15.5.10, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "http://npm.cha0sdev/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -7520,6 +7530,15 @@ react-router@5.2.0, react-router@^5.2.0:
tiny-invariant "^1.0.2"
tiny-warning "^1.0.0"
+react-ui-tree@^4.0.0:
+ version "4.0.0"
+ resolved "http://npm.cha0sdev/react-ui-tree/-/react-ui-tree-4.0.0.tgz#99e36a68e274409485614ab1f31f52fdf884907e"
+ integrity sha512-2y649h0psahtYb4NW5KK/zcwnzH0Di4a0PPzsorNyHzLGr5fXGB4MyubMcZ1BGD5nZFIATalvCeSJ/YDvIriVw==
+ dependencies:
+ classnames "^2.2.5"
+ js-tree "^2.0.1"
+ prop-types "^15.5.10"
+
react@^16.14.0:
version "16.14.0"
resolved "http://npm.cha0sdev/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d"