mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-02 15:38:15 +00:00
fix create new folder (#7016)
* optimize code * optimize code --------- Co-authored-by: zhouwenxuan <aries@Mac.local>
This commit is contained in:
@@ -6,11 +6,19 @@ import SelectDirentBody from './select-dirent-body';
|
|||||||
import { gettext, isPro } from '../../utils/constants';
|
import { gettext, isPro } from '../../utils/constants';
|
||||||
import { Utils } from '../../utils/utils';
|
import { Utils } from '../../utils/utils';
|
||||||
import Searcher from '../file-chooser/searcher';
|
import Searcher from '../file-chooser/searcher';
|
||||||
import { MODE_TYPE_MAP } from '../file-chooser/repo-list-wrapper';
|
|
||||||
import { RepoInfo } from '../../models';
|
import { RepoInfo } from '../../models';
|
||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import toaster from '../toast';
|
import toaster from '../toast';
|
||||||
|
|
||||||
|
export const MODE_TYPE_MAP = {
|
||||||
|
CURRENT_AND_OTHER_REPOS: 'current_repo_and_other_repos',
|
||||||
|
ONLY_CURRENT_LIBRARY: 'only_current_library',
|
||||||
|
ONLY_ALL_REPOS: 'only_all_repos',
|
||||||
|
ONLY_OTHER_LIBRARIES: 'only_other_libraries',
|
||||||
|
RECENTLY_USED: 'recently_used',
|
||||||
|
SEARCH_RESULTS: 'search_results',
|
||||||
|
};
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
path: PropTypes.string.isRequired,
|
path: PropTypes.string.isRequired,
|
||||||
repoID: PropTypes.string.isRequired,
|
repoID: PropTypes.string.isRequired,
|
||||||
@@ -29,17 +37,53 @@ class MoveDirent extends React.Component {
|
|||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
mode: MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY,
|
mode: MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY,
|
||||||
repo: { repo_id: this.props.repoID },
|
currentRepo: { repo_id: this.props.repoID },
|
||||||
|
selectedRepo: { repo_id: this.props.repoID },
|
||||||
|
repoList: [],
|
||||||
selectedPath: this.props.path,
|
selectedPath: this.props.path,
|
||||||
selectedSearchedItem: null,
|
|
||||||
selectedSearchedRepo: null,
|
selectedSearchedRepo: null,
|
||||||
|
selectedSearchedItem: { repoID: '', filePath: '' },
|
||||||
searchStatus: '',
|
searchStatus: '',
|
||||||
searchResults: [],
|
searchResults: [],
|
||||||
showSearchBar: false,
|
showSearchBar: false,
|
||||||
errMessage: '',
|
errMessage: '',
|
||||||
|
initToShowChildren: false,
|
||||||
};
|
};
|
||||||
|
this.lastMode = MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
seafileAPI.getRepoInfo(this.props.repoID).then(res => {
|
||||||
|
const repo = new RepoInfo(res.data);
|
||||||
|
this.setState({ currentRepo: repo });
|
||||||
|
this.fetchRepoList();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fetchRepoList = async () => {
|
||||||
|
try {
|
||||||
|
const res = await seafileAPI.listRepos();
|
||||||
|
const repos = res.data.repos;
|
||||||
|
const repoList = [];
|
||||||
|
const uniqueRepoIds = new Set();
|
||||||
|
for (const repo of repos) {
|
||||||
|
if (repo.permission === 'rw' && repo.repo_id !== this.props.repoID && !uniqueRepoIds.has(repo.repo_id)) {
|
||||||
|
uniqueRepoIds.add(repo.repo_id);
|
||||||
|
repoList.push(repo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const sortedRepoList = Utils.sortRepos(repoList, 'name', 'asc');
|
||||||
|
const selectedRepo = sortedRepoList.find((repo) => repo.repo_id === this.props.repoID);
|
||||||
|
this.setState({
|
||||||
|
repoList: sortedRepoList,
|
||||||
|
repo: selectedRepo,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
const errMessage = Utils.getErrorMsg(error);
|
||||||
|
toaster.danger(errMessage);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
handleSubmit = () => {
|
handleSubmit = () => {
|
||||||
if (this.props.isMultipleOperation) {
|
if (this.props.isMultipleOperation) {
|
||||||
this.moveItems();
|
this.moveItems();
|
||||||
@@ -140,7 +184,11 @@ class MoveDirent extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
selectRepo = (repo) => {
|
selectRepo = (repo) => {
|
||||||
this.setState({ repo });
|
this.setState({ selectedRepo: repo });
|
||||||
|
};
|
||||||
|
|
||||||
|
selectSearchedRepo = (repo) => {
|
||||||
|
this.setState({ selectedSearchedRepo: repo });
|
||||||
};
|
};
|
||||||
|
|
||||||
setSelectedPath = (selectedPath) => {
|
setSelectedPath = (selectedPath) => {
|
||||||
@@ -151,30 +199,36 @@ class MoveDirent extends React.Component {
|
|||||||
this.setState({ errMessage: message });
|
this.setState({ errMessage: message });
|
||||||
};
|
};
|
||||||
|
|
||||||
onUpdateMode = (mode) => {
|
updateMode = (mode) => {
|
||||||
if (mode === this.state.mode) return;
|
if (mode === this.state.mode) return;
|
||||||
|
|
||||||
|
if (mode !== MODE_TYPE_MAP.SEARCH_RESULTS) {
|
||||||
|
this.lastMode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
const isShowChildren = mode === MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY || mode === MODE_TYPE_MAP.SEARCH_RESULTS;
|
||||||
|
this.setState({
|
||||||
|
mode,
|
||||||
|
initToShowChildren: isShowChildren,
|
||||||
|
});
|
||||||
|
|
||||||
if (this.state.mode === MODE_TYPE_MAP.SEARCH_RESULTS) {
|
if (this.state.mode === MODE_TYPE_MAP.SEARCH_RESULTS) {
|
||||||
this.setState({
|
this.setState({
|
||||||
selectedSearchedRepo: null,
|
selectedSearchedRepo: null,
|
||||||
selectedSearchedItem: null,
|
|
||||||
searchResults: [],
|
searchResults: [],
|
||||||
showSearchBar: false,
|
showSearchBar: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.state.selectedSearchedRepo) {
|
if (this.state.selectedSearchedRepo && mode !== MODE_TYPE_MAP.SEARCH_RESULTS) {
|
||||||
this.setState({
|
this.setState({
|
||||||
selectedSearchedRepo: null,
|
selectedSearchedRepo: null,
|
||||||
selectedSearchedItem: null,
|
|
||||||
searchResults: [],
|
searchResults: [],
|
||||||
showSearchBar: false,
|
showSearchBar: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setState({
|
this.setState({ selectedSearchedItem: { repoID: '', filePath: '' } });
|
||||||
mode,
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
onUpdateSearchStatus = (status) => {
|
onUpdateSearchStatus = (status) => {
|
||||||
@@ -200,15 +254,14 @@ class MoveDirent extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
onCloseSearchBar = () => {
|
onCloseSearchBar = () => {
|
||||||
const { selectedSearchedRepo } = this.state;
|
const mode = this.lastMode;
|
||||||
const mode = (!selectedSearchedRepo || selectedSearchedRepo.repo_id === this.props.repoID) ? MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY : MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES;
|
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
mode,
|
mode,
|
||||||
searchStatus: '',
|
searchStatus: '',
|
||||||
searchResults: [],
|
searchResults: [],
|
||||||
selectedSearchedRepo: null,
|
selectedSearchedRepo: null,
|
||||||
showSearchBar: false
|
showSearchBar: false,
|
||||||
|
initToShowChildren: mode === MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -221,23 +274,19 @@ class MoveDirent extends React.Component {
|
|||||||
onSearchedItemDoubleClick = (item) => {
|
onSearchedItemDoubleClick = (item) => {
|
||||||
if (item.type !== 'dir') return;
|
if (item.type !== 'dir') return;
|
||||||
|
|
||||||
const selectedItemInfo = {
|
|
||||||
repoID: item.repo_id,
|
|
||||||
filePath: item.path,
|
|
||||||
};
|
|
||||||
|
|
||||||
this.setState({ selectedSearchedItem: selectedItemInfo });
|
|
||||||
|
|
||||||
seafileAPI.getRepoInfo(item.repo_id).then(res => {
|
seafileAPI.getRepoInfo(item.repo_id).then(res => {
|
||||||
const repoInfo = new RepoInfo(res.data);
|
const repoInfo = new RepoInfo(res.data);
|
||||||
const path = item.path.substring(0, item.path.length - 1);
|
const path = item.path.substring(0, item.path.length - 1);
|
||||||
const mode = item.repo_id === this.props.repoID ? MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY : MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES;
|
const mode = item.repo_id === this.props.repoID ? MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY : MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES;
|
||||||
|
this.lastMode = mode;
|
||||||
this.setState({
|
this.setState({
|
||||||
mode,
|
mode,
|
||||||
searchResults: [],
|
selectedRepo: repoInfo,
|
||||||
selectedSearchedRepo: repoInfo,
|
selectedSearchedRepo: repoInfo,
|
||||||
selectedPath: path,
|
selectedPath: path,
|
||||||
|
selectedSearchedItem: { repoID: item.repo_id, filePath: path },
|
||||||
showSearchBar: mode === MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES,
|
showSearchBar: mode === MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES,
|
||||||
|
initToShowChildren: true,
|
||||||
});
|
});
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
const errMessage = Utils.getErrorMsg(err);
|
const errMessage = Utils.getErrorMsg(err);
|
||||||
@@ -245,6 +294,10 @@ class MoveDirent extends React.Component {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
selectSearchedItem = (item) => {
|
||||||
|
this.setState({ selectedSearchedItem: item });
|
||||||
|
};
|
||||||
|
|
||||||
renderTitle = () => {
|
renderTitle = () => {
|
||||||
const { dirent, isMultipleOperation } = this.props;
|
const { dirent, isMultipleOperation } = this.props;
|
||||||
let title = gettext('Move {placeholder} to');
|
let title = gettext('Move {placeholder} to');
|
||||||
@@ -257,8 +310,8 @@ class MoveDirent extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { dirent, selectedDirentList, isMultipleOperation, path, repoID } = this.props;
|
const { dirent, selectedDirentList, isMultipleOperation, path } = this.props;
|
||||||
const { mode, selectedPath, showSearchBar, searchStatus, searchResults, selectedSearchedRepo, errMessage } = this.state;
|
const { mode, currentRepo, selectedRepo, selectedPath, showSearchBar, searchStatus, searchResults, selectedSearchedRepo } = this.state;
|
||||||
const movedDirent = dirent || selectedDirentList[0];
|
const movedDirent = dirent || selectedDirentList[0];
|
||||||
const { permission } = movedDirent;
|
const { permission } = movedDirent;
|
||||||
const { isCustomPermission } = Utils.getUserPermission(permission);
|
const { isCustomPermission } = Utils.getUserPermission(permission);
|
||||||
@@ -274,7 +327,7 @@ class MoveDirent extends React.Component {
|
|||||||
{isPro && (
|
{isPro && (
|
||||||
showSearchBar ? (
|
showSearchBar ? (
|
||||||
<Searcher
|
<Searcher
|
||||||
onUpdateMode={this.onUpdateMode}
|
onUpdateMode={this.updateMode}
|
||||||
onUpdateSearchStatus={this.onUpdateSearchStatus}
|
onUpdateSearchStatus={this.onUpdateSearchStatus}
|
||||||
onUpdateSearchResults={this.onUpdateSearchResults}
|
onUpdateSearchResults={this.onUpdateSearchResults}
|
||||||
onClose={this.onCloseSearchBar}
|
onClose={this.onCloseSearchBar}
|
||||||
@@ -293,24 +346,30 @@ class MoveDirent extends React.Component {
|
|||||||
)}
|
)}
|
||||||
</ModalHeader>
|
</ModalHeader>
|
||||||
<SelectDirentBody
|
<SelectDirentBody
|
||||||
path={path}
|
mode={mode}
|
||||||
|
currentRepo={currentRepo}
|
||||||
|
selectedRepo={selectedRepo}
|
||||||
|
currentPath={path}
|
||||||
|
repoList={this.state.repoList}
|
||||||
selectedPath={selectedPath}
|
selectedPath={selectedPath}
|
||||||
repoID={repoID}
|
|
||||||
isSupportOtherLibraries={!isCustomPermission}
|
isSupportOtherLibraries={!isCustomPermission}
|
||||||
errMessage={errMessage}
|
|
||||||
onCancel={this.toggle}
|
onCancel={this.toggle}
|
||||||
selectRepo={this.selectRepo}
|
selectRepo={this.selectRepo}
|
||||||
setSelectedPath={this.setSelectedPath}
|
setSelectedPath={this.setSelectedPath}
|
||||||
setErrMessage={this.setErrMessage}
|
setErrMessage={this.setErrMessage}
|
||||||
handleSubmit={this.handleSubmit}
|
handleSubmit={this.handleSubmit}
|
||||||
mode={mode}
|
onUpdateMode={this.updateMode}
|
||||||
onUpdateMode={this.onUpdateMode}
|
|
||||||
searchStatus={searchStatus}
|
searchStatus={searchStatus}
|
||||||
searchResults={searchResults}
|
searchResults={searchResults}
|
||||||
|
selectedSearchedItem={this.state.selectedSearchedItem}
|
||||||
|
onSelectedSearchedItem={this.selectSearchedItem}
|
||||||
onSearchedItemClick={this.onSearchedItemClick}
|
onSearchedItemClick={this.onSearchedItemClick}
|
||||||
onSearchedItemDoubleClick={this.onSearchedItemDoubleClick}
|
onSearchedItemDoubleClick={this.onSearchedItemDoubleClick}
|
||||||
selectedSearchedRepo={selectedSearchedRepo}
|
selectedSearchedRepo={selectedSearchedRepo}
|
||||||
|
onSelectSearchedRepo={this.selectSearchedRepo}
|
||||||
onAddFolder={this.props.onAddFolder}
|
onAddFolder={this.props.onAddFolder}
|
||||||
|
initToShowChildren={this.state.initToShowChildren}
|
||||||
|
fetchRepoInfo={this.fetchRepoInfo}
|
||||||
/>
|
/>
|
||||||
</Modal>
|
</Modal>
|
||||||
);
|
);
|
||||||
|
@@ -1,11 +1,10 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Button, ModalFooter, ModalBody, Alert, Row, Col } from 'reactstrap';
|
import { Button, ModalFooter, ModalBody, Alert, Row, Col } from 'reactstrap';
|
||||||
import toaster from '../toast';
|
import RepoListWrapper from '../file-chooser/repo-list-wrapper';
|
||||||
import RepoListWrapper, { MODE_TYPE_MAP } from '../file-chooser/repo-list-wrapper';
|
import { MODE_TYPE_MAP } from '../dialog/move-dirent-dialog';
|
||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import { gettext } from '../../utils/constants';
|
import { gettext } from '../../utils/constants';
|
||||||
import { Utils } from '../../utils/utils';
|
|
||||||
import { RepoInfo } from '../../models';
|
import { RepoInfo } from '../../models';
|
||||||
import { ModalPortal } from '@seafile/sf-metadata-ui-component';
|
import { ModalPortal } from '@seafile/sf-metadata-ui-component';
|
||||||
import CreateFolder from '../dialog/create-folder-dialog';
|
import CreateFolder from '../dialog/create-folder-dialog';
|
||||||
@@ -23,74 +22,19 @@ class SelectDirentBody extends React.Component {
|
|||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
currentRepoInfo: null,
|
|
||||||
repoList: [],
|
|
||||||
selectedRepo: null,
|
|
||||||
errMessage: '',
|
errMessage: '',
|
||||||
showCreateFolderDialog: false,
|
showCreateFolderDialog: false,
|
||||||
|
folderListOfSelectedRepo: [],
|
||||||
};
|
};
|
||||||
this.newFolderName = '';
|
this.newFolderName = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
fetchSelectedRepoInfo = (repoId) => {
|
||||||
this.fetchRepoInfo();
|
seafileAPI.getRepoInfo(repoId).then((res) => {
|
||||||
this.fetchRepoList();
|
|
||||||
}
|
|
||||||
|
|
||||||
fetchRepoInfo = async () => {
|
|
||||||
try {
|
|
||||||
const res = await seafileAPI.getRepoInfo(this.props.repoID);
|
|
||||||
const repoInfo = new RepoInfo(res.data);
|
const repoInfo = new RepoInfo(res.data);
|
||||||
this.setState({
|
this.props.selectRepo(repoInfo);
|
||||||
currentRepoInfo: repoInfo,
|
this.props.onSelectSearchedRepo(repoInfo);
|
||||||
selectedRepo: repoInfo,
|
|
||||||
});
|
});
|
||||||
} catch (err) {
|
|
||||||
const errMessage = Utils.getErrorMsg(err);
|
|
||||||
toaster.danger(errMessage);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
fetchSelectedRepoInfo = async (repoId) => {
|
|
||||||
try {
|
|
||||||
const res = await seafileAPI.getRepoInfo(repoId);
|
|
||||||
const repoInfo = new RepoInfo(res.data);
|
|
||||||
this.setState({
|
|
||||||
selectedRepo: repoInfo,
|
|
||||||
selectedSearchedRepo: repoInfo,
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
const errMessage = Utils.getErrorMsg(err);
|
|
||||||
toaster.danger(errMessage);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
fetchRepoList = async () => {
|
|
||||||
try {
|
|
||||||
const res = await seafileAPI.listRepos();
|
|
||||||
const repos = res.data.repos;
|
|
||||||
const repoList = [];
|
|
||||||
const uniqueRepoIds = new Set();
|
|
||||||
for (const repo of repos) {
|
|
||||||
if (repo.permission === 'rw' && repo.repo_id !== this.props.repoID && !uniqueRepoIds.has(repo.repo_id)) {
|
|
||||||
uniqueRepoIds.add(repo.repo_id);
|
|
||||||
repoList.push(repo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const sortedRepoList = Utils.sortRepos(repoList, 'name', 'asc');
|
|
||||||
const selectedRepo = sortedRepoList.find((repo) => repo.repo_id === this.props.repoID);
|
|
||||||
this.setState({
|
|
||||||
repoList: sortedRepoList,
|
|
||||||
selectedRepo: selectedRepo || this.state.selectedRepo,
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
const errMessage = Utils.getErrorMsg(error);
|
|
||||||
toaster.danger(errMessage);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
onUpdateRepoList = (repoList) => {
|
|
||||||
this.setState({ repoList: repoList });
|
|
||||||
};
|
};
|
||||||
|
|
||||||
handleSubmit = () => {
|
handleSubmit = () => {
|
||||||
@@ -109,35 +53,17 @@ class SelectDirentBody extends React.Component {
|
|||||||
this.props.selectRepo(repo);
|
this.props.selectRepo(repo);
|
||||||
this.props.setSelectedPath(selectedPath);
|
this.props.setSelectedPath(selectedPath);
|
||||||
this.props.setErrMessage('');
|
this.props.setErrMessage('');
|
||||||
this.setState({ selectedRepo: repo });
|
|
||||||
};
|
};
|
||||||
|
|
||||||
onRepoItemClick = (repo) => {
|
onRepoItemClick = (repo) => {
|
||||||
this.props.selectRepo(repo);
|
this.props.selectRepo(repo);
|
||||||
this.props.setSelectedPath('/');
|
this.props.setSelectedPath('/');
|
||||||
this.props.setErrMessage('');
|
this.props.setErrMessage('');
|
||||||
this.setState({ selectedRepo: repo });
|
|
||||||
};
|
};
|
||||||
|
|
||||||
onUpdateMode = (mode) => {
|
loadRepoDirentList = async (repo, path) => {
|
||||||
const { path } = this.props;
|
|
||||||
const { repoList } = this.state;
|
|
||||||
if (mode === MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES) {
|
|
||||||
this.setState({
|
|
||||||
selectedRepo: repoList[0],
|
|
||||||
});
|
|
||||||
this.props.setSelectedPath('/');
|
|
||||||
} else {
|
|
||||||
this.setState({ selectedRepo: this.state.currentRepoInfo });
|
|
||||||
this.props.setSelectedPath(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.props.onUpdateMode(mode);
|
|
||||||
};
|
|
||||||
|
|
||||||
loadRepoDirentList = (repo) => {
|
|
||||||
try {
|
try {
|
||||||
const { data } = seafileAPI.listDir(repo.repo_id, '/');
|
const { data } = await seafileAPI.listDir(repo.repo_id, path);
|
||||||
return data.dirent_list.filter(item => item.type === 'dir');
|
return data.dirent_list.filter(item => item.type === 'dir');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return [];
|
return [];
|
||||||
@@ -145,34 +71,59 @@ class SelectDirentBody extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
createFolder = (fullPath) => {
|
createFolder = (fullPath) => {
|
||||||
|
if (!this.props.selectedRepo) {
|
||||||
|
this.setState({ errMessage: gettext('Please select a library or folder first.') });
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.newFolderName = fullPath.split('/').pop();
|
this.newFolderName = fullPath.split('/').pop();
|
||||||
const selectedRepoId = this.state.selectedRepo.repo_id;
|
const selectedRepoId = this.props.selectedRepo.repo_id;
|
||||||
|
|
||||||
if (selectedRepoId === this.props.repoID) {
|
if (selectedRepoId === this.props.currentRepo.repo_id) {
|
||||||
this.props.onAddFolder(fullPath, { successCallback: this.fetchRepoInfo });
|
this.props.onAddFolder(fullPath, {
|
||||||
|
successCallback: () => {
|
||||||
|
seafileAPI.getRepoInfo(selectedRepoId).then((res) => {
|
||||||
|
const repoInfo = new RepoInfo(res.data);
|
||||||
|
this.props.selectRepo(repoInfo);
|
||||||
|
this.props.setSelectedPath(fullPath);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
seafileAPI.createDir(selectedRepoId, fullPath).then(() => {
|
seafileAPI.createDir(selectedRepoId, fullPath).then(() => {
|
||||||
this.fetchSelectedRepoInfo(selectedRepoId);
|
this.fetchSelectedRepoInfo(selectedRepoId);
|
||||||
}).catch((error) => {
|
|
||||||
let errMessage = Utils.getErrorMsg(error);
|
|
||||||
this.props.setErrMessage(errMessage);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
this.setState({ showCreateFolderDialog: false });
|
this.setState({ showCreateFolderDialog: false });
|
||||||
};
|
};
|
||||||
|
|
||||||
onToggleCreateFolder = () => {
|
onToggleCreateFolder = async () => {
|
||||||
this.setState({ showCreateFolderDialog: !this.state.showCreateFolderDialog });
|
if (!this.state.showCreateFolderDialog) {
|
||||||
|
const folderList = await this.loadRepoDirentList(this.props.selectedRepo, this.props.selectedPath);
|
||||||
|
this.setState({ folderListOfSelectedRepo: folderList });
|
||||||
|
} else {
|
||||||
|
this.setState({ folderListOfSelectedRepo: [] });
|
||||||
|
}
|
||||||
|
this.setState({ showCreateFolderDialog: !this.state.showCreateFolderDialog, errMessage: '' });
|
||||||
};
|
};
|
||||||
|
|
||||||
checkDuplicatedName = (newName) => {
|
checkDuplicatedName = (newName) => {
|
||||||
const folderList = this.loadRepoDirentList(this.state.selectedRepo);
|
return this.state.folderListOfSelectedRepo.some(folder => folder.name === newName);
|
||||||
return folderList.some(folder => folder.name === newName);
|
};
|
||||||
|
|
||||||
|
selectMode = (mode) => {
|
||||||
|
this.props.onUpdateMode(mode);
|
||||||
|
if (mode === MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY) {
|
||||||
|
this.props.selectRepo(this.props.currentRepo);
|
||||||
|
} else if (mode === MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES) {
|
||||||
|
this.props.selectRepo(this.props.repoList[0]);
|
||||||
|
} else if (mode === MODE_TYPE_MAP.RECENTLY_USED) {
|
||||||
|
this.props.selectRepo(null);
|
||||||
|
}
|
||||||
|
this.props.setSelectedPath('/');
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { mode, path, selectedPath, isSupportOtherLibraries, errMessage, searchStatus, searchResults, selectedSearchedRepo } = this.props;
|
const { mode, repoList, currentRepo, selectedRepo, currentPath, selectedPath, isSupportOtherLibraries, errMessage, searchStatus, searchResults, selectedSearchedRepo, selectedSearchedItem } = this.props;
|
||||||
const { selectedSearchedItem, selectedRepo, repoList, currentRepoInfo } = this.state;
|
|
||||||
let repoListWrapperKey = 'repo-list-wrapper';
|
let repoListWrapperKey = 'repo-list-wrapper';
|
||||||
if (selectedSearchedItem && selectedSearchedItem.repoID) {
|
if (selectedSearchedItem && selectedSearchedItem.repoID) {
|
||||||
repoListWrapperKey = `${repoListWrapperKey}-${selectedSearchedItem.repoID}`;
|
repoListWrapperKey = `${repoListWrapperKey}-${selectedSearchedItem.repoID}`;
|
||||||
@@ -185,21 +136,21 @@ class SelectDirentBody extends React.Component {
|
|||||||
mode={MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY}
|
mode={MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY}
|
||||||
label={gettext('Current Library')}
|
label={gettext('Current Library')}
|
||||||
currentMode={mode}
|
currentMode={mode}
|
||||||
onUpdateMode={this.onUpdateMode}
|
onUpdateMode={this.selectMode}
|
||||||
/>
|
/>
|
||||||
{isSupportOtherLibraries && (
|
{isSupportOtherLibraries && (
|
||||||
<LibraryOption
|
<LibraryOption
|
||||||
mode={MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES}
|
mode={MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES}
|
||||||
label={gettext('Other Libraries')}
|
label={gettext('Other Libraries')}
|
||||||
currentMode={mode}
|
currentMode={mode}
|
||||||
onUpdateMode={this.onUpdateMode}
|
onUpdateMode={this.selectMode}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<LibraryOption
|
<LibraryOption
|
||||||
mode={MODE_TYPE_MAP.RECENTLY_USED}
|
mode={MODE_TYPE_MAP.RECENTLY_USED}
|
||||||
label={gettext('Recently Used')}
|
label={gettext('Recently Used')}
|
||||||
currentMode={mode}
|
currentMode={mode}
|
||||||
onUpdateMode={this.onUpdateMode}
|
onUpdateMode={this.selectMode}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
<Col className='file-list-col'>
|
<Col className='file-list-col'>
|
||||||
@@ -207,9 +158,9 @@ class SelectDirentBody extends React.Component {
|
|||||||
<RepoListWrapper
|
<RepoListWrapper
|
||||||
key={repoListWrapperKey}
|
key={repoListWrapperKey}
|
||||||
mode={mode}
|
mode={mode}
|
||||||
currentPath={path}
|
currentPath={currentPath}
|
||||||
selectedItemInfo={selectedSearchedItem}
|
selectedItemInfo={selectedSearchedItem}
|
||||||
currentRepoInfo={currentRepoInfo}
|
currentRepoInfo={currentRepo}
|
||||||
selectedRepo={selectedRepo}
|
selectedRepo={selectedRepo}
|
||||||
selectedPath={selectedPath}
|
selectedPath={selectedPath}
|
||||||
repoList={repoList}
|
repoList={repoList}
|
||||||
@@ -221,6 +172,7 @@ class SelectDirentBody extends React.Component {
|
|||||||
onSearchedItemDoubleClick={this.props.onSearchedItemDoubleClick}
|
onSearchedItemDoubleClick={this.props.onSearchedItemDoubleClick}
|
||||||
selectedSearchedRepo={selectedSearchedRepo}
|
selectedSearchedRepo={selectedSearchedRepo}
|
||||||
newFolderName={this.newFolderName}
|
newFolderName={this.newFolderName}
|
||||||
|
initToShowChildren={this.props.initToShowChildren}
|
||||||
/>
|
/>
|
||||||
{errMessage && <Alert color="danger" className="alert-message">{errMessage}</Alert>}
|
{errMessage && <Alert color="danger" className="alert-message">{errMessage}</Alert>}
|
||||||
</ModalBody>
|
</ModalBody>
|
||||||
@@ -229,7 +181,7 @@ class SelectDirentBody extends React.Component {
|
|||||||
className="footer-left-btn"
|
className="footer-left-btn"
|
||||||
color="secondary"
|
color="secondary"
|
||||||
onClick={this.onToggleCreateFolder}
|
onClick={this.onToggleCreateFolder}
|
||||||
disabled={mode === MODE_TYPE_MAP.SEARCH_RESULTS}
|
disabled={mode === MODE_TYPE_MAP.SEARCH_RESULTS || mode === MODE_TYPE_MAP.RECENTLY_USED}
|
||||||
>
|
>
|
||||||
<i className='sf3-font-new sf3-font mr-2'></i>
|
<i className='sf3-font-new sf3-font mr-2'></i>
|
||||||
<span>{gettext('New folder')}</span>
|
<span>{gettext('New folder')}</span>
|
||||||
@@ -256,13 +208,15 @@ class SelectDirentBody extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SelectDirentBody.propTypes = {
|
SelectDirentBody.propTypes = {
|
||||||
path: PropTypes.string,
|
repoList: PropTypes.array.isRequired,
|
||||||
selectedPath: PropTypes.string,
|
currentRepo: PropTypes.object.isRequired,
|
||||||
repoID: PropTypes.string,
|
selectedRepo: PropTypes.object,
|
||||||
|
currentPath: PropTypes.string.isRequired,
|
||||||
|
selectedPath: PropTypes.string.isRequired,
|
||||||
isSupportOtherLibraries: PropTypes.bool,
|
isSupportOtherLibraries: PropTypes.bool,
|
||||||
onCancel: PropTypes.func,
|
onCancel: PropTypes.func,
|
||||||
handleSubmit: PropTypes.func,
|
handleSubmit: PropTypes.func,
|
||||||
selectRepo: PropTypes.func,
|
selectRepo: PropTypes.func.isRequired,
|
||||||
setSelectedPath: PropTypes.func,
|
setSelectedPath: PropTypes.func,
|
||||||
setErrMessage: PropTypes.func,
|
setErrMessage: PropTypes.func,
|
||||||
mode: PropTypes.string,
|
mode: PropTypes.string,
|
||||||
@@ -272,7 +226,11 @@ SelectDirentBody.propTypes = {
|
|||||||
onSearchedItemClick: PropTypes.func,
|
onSearchedItemClick: PropTypes.func,
|
||||||
onSearchedItemDoubleClick: PropTypes.func,
|
onSearchedItemDoubleClick: PropTypes.func,
|
||||||
selectedSearchedRepo: PropTypes.object,
|
selectedSearchedRepo: PropTypes.object,
|
||||||
|
onSelectSearchedRepo: PropTypes.func,
|
||||||
onAddFolder: PropTypes.func,
|
onAddFolder: PropTypes.func,
|
||||||
|
initToShowChildren: PropTypes.bool,
|
||||||
|
fetchRepoInfo: PropTypes.func,
|
||||||
|
selectedSearchedItem: PropTypes.object,
|
||||||
};
|
};
|
||||||
|
|
||||||
SelectDirentBody.defaultProps = {
|
SelectDirentBody.defaultProps = {
|
||||||
|
@@ -32,13 +32,13 @@ class RepoListItem extends React.Component {
|
|||||||
isShowChildren: this.props.initToShowChildren,
|
isShowChildren: this.props.initToShowChildren,
|
||||||
treeData: treeHelper.buildTree(),
|
treeData: treeHelper.buildTree(),
|
||||||
hasLoaded: false,
|
hasLoaded: false,
|
||||||
isMounted: false,
|
|
||||||
};
|
};
|
||||||
this.loadRepoTimer = null;
|
this.loadRepoTimer = null;
|
||||||
|
this.isComponentMounted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.setState({ isMounted: true });
|
this.isComponentMounted = true;
|
||||||
const { isCurrentRepo, currentPath, repo, selectedItemInfo } = this.props;
|
const { isCurrentRepo, currentPath, repo, selectedItemInfo } = this.props;
|
||||||
|
|
||||||
// render search result
|
// render search result
|
||||||
@@ -46,13 +46,15 @@ class RepoListItem extends React.Component {
|
|||||||
if (repoID && repoID === repo.repo_id) {
|
if (repoID && repoID === repo.repo_id) {
|
||||||
this.loadRepoDirentList(repo);
|
this.loadRepoDirentList(repo);
|
||||||
this.loadRepoTimer = setTimeout(() => {
|
this.loadRepoTimer = setTimeout(() => {
|
||||||
|
if (this.isComponentMounted) {
|
||||||
this.setState({ isShowChildren: true });
|
this.setState({ isShowChildren: true });
|
||||||
this.loadNodeAndParentsByPath(repoID, filePath);
|
this.loadNodeAndParentsByPath(repoID, filePath);
|
||||||
|
}
|
||||||
}, 0);
|
}, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (repo.repo_id === this.props.selectedRepo.repo_id || isCurrentRepo) {
|
if (repo && repo.repo_id === this.props.selectedRepo.repo_id || isCurrentRepo) {
|
||||||
this.loadRepoDirentList(repo);
|
this.loadRepoDirentList(repo);
|
||||||
this.loadRepoTimer = setTimeout(() => {
|
this.loadRepoTimer = setTimeout(() => {
|
||||||
const repoID = repo.repo_id;
|
const repoID = repo.repo_id;
|
||||||
@@ -66,9 +68,10 @@ class RepoListItem extends React.Component {
|
|||||||
|
|
||||||
componentDidUpdate(prevProps) {
|
componentDidUpdate(prevProps) {
|
||||||
const { repo, selectedRepo, selectedPath, newFolderName } = this.props;
|
const { repo, selectedRepo, selectedPath, newFolderName } = this.props;
|
||||||
|
// create new folder in selected repo or folder
|
||||||
if (repo.repo_id === selectedRepo.repo_id && prevProps.selectedRepo !== selectedRepo) {
|
if (repo.repo_id === selectedRepo.repo_id && prevProps.selectedRepo !== selectedRepo) {
|
||||||
seafileAPI.listDir(repo.repo_id, selectedPath).then(res => {
|
seafileAPI.listDir(repo.repo_id, selectedPath).then(res => {
|
||||||
if (!this.state.isMounted) return;
|
if (!this.isComponentMounted) return;
|
||||||
const direntData = res.data.dirent_list.find(item => item.type === 'dir' && item.name === newFolderName);
|
const direntData = res.data.dirent_list.find(item => item.type === 'dir' && item.name === newFolderName);
|
||||||
if (direntData) {
|
if (direntData) {
|
||||||
const object = new Dirent(direntData);
|
const object = new Dirent(direntData);
|
||||||
@@ -77,7 +80,7 @@ class RepoListItem extends React.Component {
|
|||||||
this.setState({ treeData: newTreeData });
|
this.setState({ treeData: newTreeData });
|
||||||
}
|
}
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
if (!this.state.isMounted) return;
|
if (!this.isComponentMounted) return;
|
||||||
const errMessage = Utils.getErrorMsg(error);
|
const errMessage = Utils.getErrorMsg(error);
|
||||||
toaster.danger(errMessage);
|
toaster.danger(errMessage);
|
||||||
});
|
});
|
||||||
@@ -85,8 +88,9 @@ class RepoListItem extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount() {
|
componentWillUnmount() {
|
||||||
|
this.isComponentMounted = false;
|
||||||
this.clearLoadRepoTimer();
|
this.clearLoadRepoTimer();
|
||||||
this.setState({ isMounted: false, hasLoaded: false });
|
this.setState({ hasLoaded: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
clearLoadRepoTimer = () => {
|
clearLoadRepoTimer = () => {
|
||||||
@@ -102,7 +106,7 @@ class RepoListItem extends React.Component {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await seafileAPI.listDir(repoID, '/');
|
const res = await seafileAPI.listDir(repoID, '/');
|
||||||
if (!this.state.isMounted) return;
|
if (!this.isComponentMounted) return;
|
||||||
|
|
||||||
let tree = this.state.treeData.clone();
|
let tree = this.state.treeData.clone();
|
||||||
let direntList = this.props.isShowFile ? res.data.dirent_list : res.data.dirent_list.filter(item => item.type === 'dir');
|
let direntList = this.props.isShowFile ? res.data.dirent_list : res.data.dirent_list.filter(item => item.type === 'dir');
|
||||||
@@ -110,7 +114,7 @@ class RepoListItem extends React.Component {
|
|||||||
this.addResponseListToNode(direntList, tree.root);
|
this.addResponseListToNode(direntList, tree.root);
|
||||||
this.setState({ treeData: tree, hasLoaded: true });
|
this.setState({ treeData: tree, hasLoaded: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (!this.state.isMounted) return;
|
if (!this.isComponentMounted) return;
|
||||||
|
|
||||||
let errMessage = Utils.getErrorMsg(error);
|
let errMessage = Utils.getErrorMsg(error);
|
||||||
toaster.danger(errMessage);
|
toaster.danger(errMessage);
|
||||||
|
@@ -8,7 +8,7 @@ const propTypes = {
|
|||||||
repo: PropTypes.object,
|
repo: PropTypes.object,
|
||||||
repoList: PropTypes.array,
|
repoList: PropTypes.array,
|
||||||
selectedRepo: PropTypes.object,
|
selectedRepo: PropTypes.object,
|
||||||
initToShowChildren: PropTypes.bool.isRequired,
|
initToShowChildren: PropTypes.bool,
|
||||||
selectedPath: PropTypes.string,
|
selectedPath: PropTypes.string,
|
||||||
onDirentItemClick: PropTypes.func.isRequired,
|
onDirentItemClick: PropTypes.func.isRequired,
|
||||||
onRepoItemClick: PropTypes.func.isRequired,
|
onRepoItemClick: PropTypes.func.isRequired,
|
||||||
@@ -34,7 +34,7 @@ const defaultProps = {
|
|||||||
class RepoListView extends React.Component {
|
class RepoListView extends React.Component {
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let { currentRepoInfo, currentPath, repoList, selectedSearchedRepo } = this.props;
|
let { currentRepoInfo, currentPath, repoList, selectedSearchedRepo, initToShowChildren } = this.props;
|
||||||
if (currentRepoInfo) {
|
if (currentRepoInfo) {
|
||||||
repoList = [];
|
repoList = [];
|
||||||
repoList.push(currentRepoInfo);
|
repoList.push(currentRepoInfo);
|
||||||
@@ -54,7 +54,7 @@ class RepoListView extends React.Component {
|
|||||||
isCurrentRepo={currentRepoInfo ? true : false}
|
isCurrentRepo={currentRepoInfo ? true : false}
|
||||||
currentPath={currentPath}
|
currentPath={currentPath}
|
||||||
repo={repoItem}
|
repo={repoItem}
|
||||||
initToShowChildren={this.props.initToShowChildren}
|
initToShowChildren={initToShowChildren}
|
||||||
selectedRepo={this.props.selectedRepo}
|
selectedRepo={this.props.selectedRepo}
|
||||||
selectedPath={this.props.selectedPath}
|
selectedPath={this.props.selectedPath}
|
||||||
onRepoItemClick={this.props.onRepoItemClick}
|
onRepoItemClick={this.props.onRepoItemClick}
|
||||||
|
@@ -5,22 +5,14 @@ import RecentlyUsedListView from './recently-used-list-view';
|
|||||||
import { gettext } from '../../utils/constants';
|
import { gettext } from '../../utils/constants';
|
||||||
import SearchedListView from './searched-list-view';
|
import SearchedListView from './searched-list-view';
|
||||||
import { SearchStatus } from './searcher';
|
import { SearchStatus } from './searcher';
|
||||||
|
import { MODE_TYPE_MAP } from '../dialog/move-dirent-dialog';
|
||||||
import Loading from '../loading';
|
import Loading from '../loading';
|
||||||
|
|
||||||
export const MODE_TYPE_MAP = {
|
|
||||||
CURRENT_AND_OTHER_REPOS: 'current_repo_and_other_repos',
|
|
||||||
ONLY_CURRENT_LIBRARY: 'only_current_library',
|
|
||||||
ONLY_ALL_REPOS: 'only_all_repos',
|
|
||||||
ONLY_OTHER_LIBRARIES: 'only_other_libraries',
|
|
||||||
RECENTLY_USED: 'recently_used',
|
|
||||||
SEARCH_RESULTS: 'search_results',
|
|
||||||
};
|
|
||||||
|
|
||||||
const RepoListWrapper = (props) => {
|
const RepoListWrapper = (props) => {
|
||||||
const {
|
const {
|
||||||
mode, isShowFile, fileSuffixes, currentPath, isCurrentRepoShow, currentRepoInfo, selectedRepo,
|
mode, isShowFile, fileSuffixes, currentPath, isCurrentRepoShow, currentRepoInfo, selectedRepo,
|
||||||
selectedPath, isOtherRepoShow, selectedItemInfo, repoList,
|
selectedPath, isOtherRepoShow, selectedItemInfo, repoList,
|
||||||
searchStatus, searchResults, onSearchedItemClick, onSearchedItemDoubleClick, selectedSearchedRepo, newFolderName
|
searchStatus, searchResults, onSearchedItemClick, onSearchedItemDoubleClick, selectedSearchedRepo, newFolderName, initToShowChildren
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
const onScroll = (event) => {
|
const onScroll = (event) => {
|
||||||
@@ -99,7 +91,7 @@ const RepoListWrapper = (props) => {
|
|||||||
{mode === MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY && (
|
{mode === MODE_TYPE_MAP.ONLY_CURRENT_LIBRARY && (
|
||||||
<div className="list-view">
|
<div className="list-view">
|
||||||
<RepoListView
|
<RepoListView
|
||||||
initToShowChildren
|
initToShowChildren={true}
|
||||||
currentRepoInfo={currentRepoInfo}
|
currentRepoInfo={currentRepoInfo}
|
||||||
currentPath={currentPath}
|
currentPath={currentPath}
|
||||||
selectedRepo={selectedRepo}
|
selectedRepo={selectedRepo}
|
||||||
@@ -138,7 +130,7 @@ const RepoListWrapper = (props) => {
|
|||||||
{mode === MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES && (
|
{mode === MODE_TYPE_MAP.ONLY_OTHER_LIBRARIES && (
|
||||||
<div className="list-view">
|
<div className="list-view">
|
||||||
<RepoListView
|
<RepoListView
|
||||||
initToShowChildren={false}
|
initToShowChildren={initToShowChildren}
|
||||||
repoList={repoList}
|
repoList={repoList}
|
||||||
selectedRepo={selectedRepo}
|
selectedRepo={selectedRepo}
|
||||||
selectedPath={selectedPath}
|
selectedPath={selectedPath}
|
||||||
@@ -193,6 +185,7 @@ RepoListWrapper.propTypes = {
|
|||||||
onSearchedItemDoubleClick: PropTypes.func,
|
onSearchedItemDoubleClick: PropTypes.func,
|
||||||
selectedSearchedRepo: PropTypes.object,
|
selectedSearchedRepo: PropTypes.object,
|
||||||
newFolderName: PropTypes.string,
|
newFolderName: PropTypes.string,
|
||||||
|
initToShowChildren: PropTypes.bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
RepoListWrapper.defaultProps = {
|
RepoListWrapper.defaultProps = {
|
||||||
|
@@ -73,6 +73,7 @@ class SearchedListView extends React.Component {
|
|||||||
currentItem={this.state.currentItem}
|
currentItem={this.state.currentItem}
|
||||||
onItemClick={() => this.onItemClick(item, index)}
|
onItemClick={() => this.onItemClick(item, index)}
|
||||||
onSearchedItemDoubleClick={this.props.onSearchedItemDoubleClick}
|
onSearchedItemDoubleClick={this.props.onSearchedItemDoubleClick}
|
||||||
|
initToShowChildren={false}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
@@ -4,7 +4,7 @@ import { Input } from 'reactstrap';
|
|||||||
import { gettext } from '../../../utils/constants';
|
import { gettext } from '../../../utils/constants';
|
||||||
import { seafileAPI } from '../../../utils/seafile-api';
|
import { seafileAPI } from '../../../utils/seafile-api';
|
||||||
import { SEARCH_CONTAINER } from '../../../constants/zIndexes';
|
import { SEARCH_CONTAINER } from '../../../constants/zIndexes';
|
||||||
import { MODE_TYPE_MAP } from '../repo-list-wrapper';
|
import { MODE_TYPE_MAP } from '../../dialog/move-dirent-dialog';
|
||||||
|
|
||||||
import './index.css';
|
import './index.css';
|
||||||
|
|
||||||
|
@@ -956,7 +956,7 @@ class LibContentView extends React.Component {
|
|||||||
removeFromRecentlyUsed = (repoID, path) => {
|
removeFromRecentlyUsed = (repoID, path) => {
|
||||||
const recentlyUsed = JSON.parse(localStorage.getItem('recently-used-list')) || [];
|
const recentlyUsed = JSON.parse(localStorage.getItem('recently-used-list')) || [];
|
||||||
const updatedRecentlyUsed = recentlyUsed.filter(item =>
|
const updatedRecentlyUsed = recentlyUsed.filter(item =>
|
||||||
!(item.repo.repo_id === repoID && item.path === path)
|
!(item.repo_id === repoID && item.path === path)
|
||||||
);
|
);
|
||||||
localStorage.setItem('recently-used-list', JSON.stringify(updatedRecentlyUsed));
|
localStorage.setItem('recently-used-list', JSON.stringify(updatedRecentlyUsed));
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user