@@ -228,6 +254,8 @@ class RepoListItem extends React.Component {
treeData={this.state.treeData}
onNodeCollapse={this.onNodeCollapse}
onNodeExpanded={this.onNodeExpanded}
+ isBrowsing={this.props.isBrowsing}
+ browsingPath={this.props.browsingPath}
/>
)}
diff --git a/frontend/src/components/file-chooser/repo-list-view.js b/frontend/src/components/file-chooser/repo-list-view.js
index be8bda9f19..a41ea90562 100644
--- a/frontend/src/components/file-chooser/repo-list-view.js
+++ b/frontend/src/components/file-chooser/repo-list-view.js
@@ -15,6 +15,8 @@ const propTypes = {
fileSuffixes: PropTypes.array,
selectedItemInfo: PropTypes.object,
currentPath: PropTypes.string,
+ isBrowsing: PropTypes.bool,
+ browsingPath: PropTypes.string,
};
class RepoListView extends React.Component {
@@ -43,6 +45,8 @@ class RepoListView extends React.Component {
isShowFile={this.props.isShowFile}
fileSuffixes={this.props.fileSuffixes}
selectedItemInfo={this.props.selectedItemInfo}
+ isBrowsing={this.props.isBrowsing}
+ browsingPath={this.props.browsingPath}
/>
);
})}
diff --git a/frontend/src/components/file-chooser/searched-list-view.js b/frontend/src/components/file-chooser/searched-list-view.js
index a04fc88321..754809e3f6 100644
--- a/frontend/src/components/file-chooser/searched-list-view.js
+++ b/frontend/src/components/file-chooser/searched-list-view.js
@@ -13,12 +13,44 @@ class SearchedListView extends React.Component {
constructor(props) {
super(props);
this.state = {
- currentItem: null,
+ currentItem: props.searchResults.length > 0 ? props.searchResults[0] : null,
+ currentIndex: props.searchResults.length > 0 ? 0 : -1,
};
+ this.itemRef = React.createRef();
}
- onItemClick = (item) => {
- this.setState({ currentItem: item });
+ componentDidMount() {
+ document.addEventListener('keydown', this.handleKeyDown);
+ }
+
+ componentWillUnmount() {
+ document.removeEventListener('keydown', this.handleKeyDown);
+ }
+
+ handleKeyDown = (event) => {
+ const { searchResults } = this.props;
+ const { currentIndex } = this.state;
+
+ if (event.key === 'ArrowDown') {
+ const nextIndex = (currentIndex + 1) % searchResults.length;
+ this.setState({
+ currentItem: searchResults[nextIndex],
+ currentIndex: nextIndex,
+ });
+ } else if (event.key === 'ArrowUp') {
+ const prevIndex = (currentIndex - 1 + searchResults.length) % searchResults.length;
+ this.setState({
+ currentItem: searchResults[prevIndex],
+ currentIndex: prevIndex,
+ });
+ } else if (event.key === 'Enter') {
+ this.onItemClick(searchResults[currentIndex], currentIndex);
+ this.props.onSearchedItemDoubleClick(searchResults[currentIndex]);
+ }
+ };
+
+ onItemClick = (item, index) => {
+ this.setState({ currentItem: item, currentIndex: index });
this.props.onItemClick(item);
};
@@ -36,9 +68,10 @@ class SearchedListView extends React.Component {
return (
this.onItemClick(item, index)}
onSearchedItemDoubleClick={this.props.onSearchedItemDoubleClick}
/>
);
diff --git a/frontend/src/components/file-chooser/tree-list-item.js b/frontend/src/components/file-chooser/tree-list-item.js
index 96ea448b4e..9825ced1c2 100644
--- a/frontend/src/components/file-chooser/tree-list-item.js
+++ b/frontend/src/components/file-chooser/tree-list-item.js
@@ -12,6 +12,7 @@ const propTypes = {
filePath: PropTypes.string,
fileSuffixes: PropTypes.array,
level: PropTypes.number,
+ isBrowsing: PropTypes.bool,
};
class TreeViewItem extends React.Component {
@@ -96,7 +97,7 @@ class TreeViewItem extends React.Component {
if (this.props.selectedRepo) {
isCurrentRepo = this.props.selectedRepo.repo_id === this.props.repo.repo_id;
}
- let isCurrentPath = this.props.selectedPath === this.state.filePath;
+ let isCurrentPath = this.props.selectedPath === this.state.filePath || this.props.selectedPath === node.path;
const fileName = node.object.name;
if (this.props.fileSuffixes && fileName && node.object.type === 'file') {
diff --git a/frontend/src/components/file-chooser/tree-list-view.js b/frontend/src/components/file-chooser/tree-list-view.js
index b3e551729a..d23c8f7767 100644
--- a/frontend/src/components/file-chooser/tree-list-view.js
+++ b/frontend/src/components/file-chooser/tree-list-view.js
@@ -1,6 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import TreeListItem from './tree-list-item';
+import treeHelper from '../tree-view/tree-helper';
const propTypes = {
selectedPath: PropTypes.string,
@@ -11,22 +12,42 @@ const propTypes = {
onNodeCollapse: PropTypes.func.isRequired,
onNodeExpanded: PropTypes.func.isRequired,
fileSuffixes: PropTypes.array,
+ isBrowsing: PropTypes.bool,
+ browsingPath: PropTypes.string,
};
class TreeListView extends React.Component {
render() {
+ const {
+ isBrowsing,
+ browsingPath,
+ treeData,
+ selectedPath,
+ onNodeCollapse,
+ onNodeExpanded,
+ repo,
+ onDirentItemClick,
+ selectedRepo,
+ fileSuffixes
+ } = this.props;
+
+ const browsingNode = treeHelper.findNodeByPath(treeData, browsingPath);
+ if (isBrowsing && !browsingNode) return null;
+
+ const node = isBrowsing ? browsingNode : treeData.root;
+
return (