From 6052c6d2694c8512119b5dd59f2ea68a1b27d167 Mon Sep 17 00:00:00 2001 From: EnixCoda Date: Sun, 7 Jan 2018 15:31:34 +0800 Subject: [PATCH] feat(FileExplorer): expand & scroll to directly opened file --- src/components/FileExplorer.js | 8 ++++++++ src/utils/URLHelper.js | 10 +++++++++- src/utils/visibleNodesGenerator.js | 11 +++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/components/FileExplorer.js b/src/components/FileExplorer.js index 9521f9e..14f051f 100644 --- a/src/components/FileExplorer.js +++ b/src/components/FileExplorer.js @@ -6,6 +6,7 @@ import Node from './Node' import DOMHelper from '../utils/DOMHelper' import treeParser from '../utils/treeParser' +import URLHelper from '../utils/URLHelper' import VisibleNodesGenerator from '../utils/VisibleNodesGenerator' export default class List extends preact.Component { @@ -26,6 +27,13 @@ export default class List extends preact.Component { const { treeData, metaData } = this.props const { root, nodes } = treeParser.parse(treeData, metaData) this.visibleNodesGenerator.plantTree(root, nodes) + const currentPath = URLHelper.getCurrentPath() + if (currentPath.length) { + const nodeExpandedTo = this.visibleNodesGenerator.expandTo(currentPath) + this.visibleNodesGenerator.focusNode(nodeExpandedTo) + const { nodes } = this.visibleNodesGenerator.visibleNodes + this.tasksAfterRender.push(() => DOMHelper.scrollToNodeElement(nodes.indexOf(nodeExpandedTo))) + } this.updateVisibleNodes() this.tasksAfterRender.push(DOMHelper.focusFileExplorer) this.tasksAfterRender.push(DOMHelper.focusSearchInput) diff --git a/src/utils/URLHelper.js b/src/utils/URLHelper.js index 481737d..7ead705 100644 --- a/src/utils/URLHelper.js +++ b/src/utils/URLHelper.js @@ -6,17 +6,19 @@ function parseRaw() { repoName, type, branchName, + ...path ] = pathname.split('/') return { userName, repoName, type, branchName, + path, } } function parse() { const parsedData = parseRaw() - if (!isInCodePage(parsedData)) { + if (!isInCodePage()) { delete parsedData.type delete parsedData.branchName } @@ -35,7 +37,13 @@ function isInCodePage(metaData = {}) { ) } +function getCurrentPath() { + const { path } = parseRaw() + return path +} + export default { + getCurrentPath, isInCodePage, parse, } diff --git a/src/utils/visibleNodesGenerator.js b/src/utils/visibleNodesGenerator.js index 5ca9ec0..eda22ee 100644 --- a/src/utils/visibleNodesGenerator.js +++ b/src/utils/visibleNodesGenerator.js @@ -91,6 +91,17 @@ export default class VisibleNodesGenerator { this.generateVisibleNodes() } + expandTo(path) { + let rootNode = this.root + let targetPath + for (const step of path) { + targetPath = rootNode.path ? `${rootNode.path}/${step}` : step + rootNode = rootNode.contents.find(node => node.path === targetPath) + this.setExpand(rootNode, true) + } + return rootNode + } + visibleNodes = null generateVisibleNodes() { this.focusedNode = null