1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-10 11:21:29 +00:00
Files
seahub/frontend/src/pages/my-libs/my-libs.js

221 lines
7.6 KiB
JavaScript
Raw Normal View History

2018-11-30 17:18:41 +08:00
import React, { Component, Fragment } from 'react';
2019-03-19 10:35:21 +08:00
import cookie from 'react-cookies';
import { navigate } from '@gatsbyjs/reach-router';
import { DropdownToggle, Dropdown, DropdownMenu, DropdownItem } from 'reactstrap';
2018-11-30 17:18:41 +08:00
import { seafileAPI } from '../../utils/seafile-api';
import { gettext, siteRoot } from '../../utils/constants';
import { Utils } from '../../utils/utils';
import toaster from '../../components/toast';
import Repo from '../../models/repo';
import Loading from '../../components/loading';
2019-06-10 17:30:10 +08:00
import EmptyTip from '../../components/empty-tip';
import MylibRepoListView from './mylib-repo-list-view';
import SortOptionsDialog from '../../components/dialog/sort-options';
import SingleDropdownToolbar from '../../components/toolbar/single-dropdown-toolbar';
import ModalPortal from '../../components/modal-portal';
import CreateRepoDialog from '../../components/dialog/create-repo-dialog';
2018-11-30 17:18:41 +08:00
class MyLibraries extends Component {
constructor(props) {
super(props);
this.state = {
errorMsg: '',
isLoading: true,
repoList: [],
isCreateRepoDialogOpen: false,
isDropdownMenuOpen: false,
isSortOptionsDialogOpen: false,
2019-05-29 14:43:22 +08:00
sortBy: cookie.load('seafile-repo-dir-sort-by') || 'name', // 'name' or 'time' or 'size'
sortOrder: cookie.load('seafile-repo-dir-sort-order') || 'asc', // 'asc' or 'desc'
2018-11-30 17:18:41 +08:00
};
2020-01-03 16:50:17 +08:00
this.emptyTip = (
2019-06-10 17:30:10 +08:00
<EmptyTip>
2020-01-03 16:50:17 +08:00
<h2>{gettext('No libraries')}</h2>
<p>{gettext('You have not created any libraries yet. A library is a container to organize your files and folders. A library can also be shared with others and synced to your connected devices. You can create a library by clicking the "New Library" button in the menu bar.')}</p>
2019-06-10 17:30:10 +08:00
</EmptyTip>
);
2018-11-30 17:18:41 +08:00
}
componentDidMount() {
2018-12-12 17:51:12 +08:00
seafileAPI.listRepos({type: 'mine'}).then((res) => {
let repoList = res.data.repos.map((item) => {
return new Repo(item);
});
2018-11-30 17:18:41 +08:00
this.setState({
isLoading: false,
repoList: Utils.sortRepos(repoList, this.state.sortBy, this.state.sortOrder)
2018-11-30 17:18:41 +08:00
});
}).catch((error) => {
this.setState({
isLoading: false,
errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403
});
2018-11-30 17:18:41 +08:00
});
}
toggleSortOptionsDialog = () => {
this.setState({
isSortOptionsDialogOpen: !this.state.isSortOptionsDialogOpen
});
};
2018-12-07 10:36:59 +08:00
onCreateRepo = (repo) => {
this.toggleCreateRepoDialog();
2018-12-07 10:36:59 +08:00
seafileAPI.createMineRepo(repo).then((res) => {
const newRepo = new Repo({
2018-12-17 15:12:10 +08:00
repo_id: res.data.repo_id,
repo_name: res.data.repo_name,
size: res.data.repo_size,
mtime: res.data.mtime,
owner_email: res.data.email,
encrypted: res.data.encrypted,
permission: res.data.permission,
storage_name: res.data.storage_name
});
this.state.repoList.unshift(newRepo);
this.setState({repoList: this.state.repoList});
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
2018-12-07 10:36:59 +08:00
});
};
2018-12-07 10:36:59 +08:00
sortRepoList = (sortBy, sortOrder) => {
cookie.save('seafile-repo-dir-sort-by', sortBy);
cookie.save('seafile-repo-dir-sort-order', sortOrder);
this.setState({
sortBy: sortBy,
sortOrder: sortOrder,
repoList: Utils.sortRepos(this.state.repoList, sortBy, sortOrder)
});
};
2018-12-12 15:34:54 +08:00
onTransferRepo = (repoID) => {
let repoList = this.state.repoList.filter(item => {
2018-12-12 15:34:54 +08:00
return item.repo_id !== repoID;
});
this.setState({repoList: repoList});
};
2018-12-07 02:46:47 +00:00
2018-12-12 15:34:54 +08:00
onRenameRepo = (repo, newName) => {
let repoList = this.state.repoList.map(item => {
2018-12-12 15:34:54 +08:00
if (item.repo_id === repo.repo_id) {
item.repo_name = newName;
2018-12-07 02:46:47 +00:00
}
2018-12-12 15:34:54 +08:00
return item;
});
this.setState({repoList: repoList});
};
onMonitorRepo = (repo, monitored) => {
let repoList = this.state.repoList.map(item => {
if (item.repo_id === repo.repo_id) {
item.monitored = monitored;
}
return item;
});
this.setState({repoList: repoList});
};
2018-12-12 15:34:54 +08:00
onDeleteRepo = (repo) => {
let repoList = this.state.repoList.filter(item => {
2018-12-12 15:34:54 +08:00
return item.repo_id !== repo.repo_id;
});
this.setState({repoList: repoList});
};
2018-12-12 15:34:54 +08:00
toggleCreateRepoDialog = () => {
this.setState({isCreateRepoDialogOpen: !this.state.isCreateRepoDialogOpen});
};
toggleDropdownMenu = () => {
this.setState({
isDropdownMenuOpen: !this.state.isDropdownMenuOpen
});
};
visitDeleted = () => {
navigate(`${siteRoot}my-libs/deleted/`);
};
visitDeletedviaKey = (e) => {
if (e.key == 'Enter' || e.key == 'Space') {
this.visiteDeleted();
}
};
2018-11-30 17:18:41 +08:00
render() {
const { isDropdownMenuOpen } = this.state;
2018-11-30 17:18:41 +08:00
return (
<Fragment>
2018-12-12 15:34:54 +08:00
<div className="main-panel-center flex-row">
2018-11-30 17:18:41 +08:00
<div className="cur-view-container">
<div className="cur-view-path">
<h3 className="sf-heading m-0">
{gettext('My Libraries')}
<SingleDropdownToolbar
opList={[{'text': gettext('New Library'), 'onClick': this.toggleCreateRepoDialog}]}
/>
</h3>
<div>
{(!Utils.isDesktop() && this.state.repoList.length > 0) && <span className="sf3-font sf3-font-sort action-icon" onClick={this.toggleSortOptionsDialog}></span>}
<Dropdown isOpen={isDropdownMenuOpen} toggle={this.toggleDropdownMenu}>
<DropdownToggle
tag="i"
className={'cur-view-path-btn sf3-font-more sf3-font ml-2'}
data-toggle="dropdown"
title={gettext('More operations')}
aria-label={gettext('More operations')}
aria-expanded={isDropdownMenuOpen}
>
</DropdownToggle>
<DropdownMenu right={true}>
<DropdownItem onClick={this.visitDeleted} onKeyDown={this.visitDeletedviaKey}>{gettext('Deleted Libraries')}</DropdownItem>
</DropdownMenu>
</Dropdown>
</div>
2018-11-30 17:18:41 +08:00
</div>
<div className="cur-view-content">
{this.state.isLoading && <Loading />}
2019-06-11 11:07:24 +08:00
{!this.state.isLoading && this.state.errorMsg && <p className="error text-center mt-8">{this.state.errorMsg}</p>}
2020-01-03 16:50:17 +08:00
{!this.state.isLoading && !this.state.errorMsg && this.state.repoList.length === 0 && this.emptyTip}
2019-06-11 11:07:24 +08:00
{!this.state.isLoading && !this.state.errorMsg && this.state.repoList.length > 0 &&
<MylibRepoListView
sortBy={this.state.sortBy}
sortOrder={this.state.sortOrder}
repoList={this.state.repoList}
onRenameRepo={this.onRenameRepo}
onDeleteRepo={this.onDeleteRepo}
onTransferRepo={this.onTransferRepo}
onMonitorRepo={this.onMonitorRepo}
sortRepoList={this.sortRepoList}
/>
}
2018-11-30 17:18:41 +08:00
</div>
</div>
{this.state.isSortOptionsDialogOpen &&
<SortOptionsDialog
toggleDialog={this.toggleSortOptionsDialog}
sortBy={this.state.sortBy}
sortOrder={this.state.sortOrder}
sortItems={this.sortRepoList}
/>
}
{this.state.isCreateRepoDialogOpen && (
<ModalPortal>
<CreateRepoDialog
libraryType='mine'
onCreateRepo={this.onCreateRepo}
onCreateToggle={this.toggleCreateRepoDialog}
/>
</ModalPortal>
)}
2018-11-30 17:18:41 +08:00
</div>
</Fragment>
);
}
}
export default MyLibraries;