2019-09-24 12:18:53 +08:00
|
|
|
import React, { Component, Fragment } from 'react';
|
2019-11-11 17:56:45 +08:00
|
|
|
import { navigate } from '@reach/router';
|
2019-09-24 12:18:53 +08:00
|
|
|
import { Button } from 'reactstrap';
|
|
|
|
import { Utils } from '../../../utils/utils';
|
|
|
|
import { seafileAPI } from '../../../utils/seafile-api';
|
2019-12-05 15:45:16 +08:00
|
|
|
import { gettext, siteRoot } from '../../../utils/constants';
|
2019-09-24 12:18:53 +08:00
|
|
|
import toaster from '../../../components/toast';
|
|
|
|
import SysAdminCreateRepoDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-create-repo-dialog';
|
|
|
|
import MainPanelTopbar from '../main-panel-topbar';
|
2019-11-11 17:56:45 +08:00
|
|
|
import Search from '../search';
|
2019-09-24 12:18:53 +08:00
|
|
|
import ReposNav from './repos-nav';
|
2019-11-11 17:56:45 +08:00
|
|
|
import Content from './repos';
|
2019-09-24 12:18:53 +08:00
|
|
|
|
|
|
|
class AllRepos extends Component {
|
|
|
|
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
|
|
|
loading: true,
|
|
|
|
errorMsg: '',
|
|
|
|
repos: [],
|
|
|
|
pageInfo: {},
|
2020-01-13 12:07:24 +08:00
|
|
|
perPage: 25,
|
2019-09-24 12:18:53 +08:00
|
|
|
isCreateRepoDialogOpen: false
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidMount () {
|
2020-01-13 12:07:24 +08:00
|
|
|
let urlParams = (new URL(window.location)).searchParams;
|
|
|
|
const { currentPage = 1, perPage } = this.state;
|
|
|
|
this.setState({
|
|
|
|
perPage: parseInt(urlParams.get('per_page') || perPage),
|
|
|
|
currentPage: parseInt(urlParams.get('page') || currentPage)
|
|
|
|
}, () => {
|
|
|
|
this.getReposByPage(this.state.currentPage);
|
|
|
|
});
|
2019-09-24 12:18:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
toggleCreateRepoDialog = () => {
|
|
|
|
this.setState({isCreateRepoDialogOpen: !this.state.isCreateRepoDialogOpen});
|
|
|
|
}
|
|
|
|
|
|
|
|
getReposByPage = (page) => {
|
|
|
|
seafileAPI.sysAdminListAllRepos(page, this.state.perPage).then((res) => {
|
|
|
|
this.setState({
|
|
|
|
loading: false,
|
|
|
|
repos: res.data.repos,
|
|
|
|
pageInfo: res.data.page_info
|
|
|
|
});
|
|
|
|
}).catch((error) => {
|
2019-12-05 15:45:16 +08:00
|
|
|
this.setState({
|
|
|
|
loading: false,
|
|
|
|
errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403
|
|
|
|
});
|
2019-09-24 12:18:53 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-12-31 18:26:02 +08:00
|
|
|
resetPerPage = (perPage) => {
|
|
|
|
this.setState({
|
|
|
|
perPage: perPage
|
|
|
|
}, () => {
|
|
|
|
this.getReposByPage(1);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-09-24 12:18:53 +08:00
|
|
|
createRepo = (repoName, Owner) => {
|
|
|
|
seafileAPI.sysAdminCreateRepo(repoName, Owner).then(res => {
|
|
|
|
this.state.repos.unshift(res.data);
|
|
|
|
this.setState({
|
|
|
|
repos: this.state.repos
|
|
|
|
});
|
|
|
|
}).catch(error => {
|
|
|
|
let errMessage = Utils.getErrorMsg(error);
|
|
|
|
toaster.danger(errMessage);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
onDeleteRepo = (targetRepo) => {
|
|
|
|
let repos = this.state.repos.filter(repo => {
|
|
|
|
return repo.id != targetRepo.id;
|
|
|
|
});
|
|
|
|
this.setState({
|
|
|
|
repos: repos
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
onTransferRepo = (targetRepo) => {
|
|
|
|
let repos = this.state.repos.map((item) => {
|
|
|
|
return item.id == targetRepo.id ? targetRepo : item;
|
|
|
|
});
|
|
|
|
this.setState({
|
|
|
|
repos: repos
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-11-11 17:56:45 +08:00
|
|
|
getSearch = () => {
|
|
|
|
return <Search
|
|
|
|
placeholder={gettext('Search libraries by name')}
|
|
|
|
submit={this.searchRepos}
|
|
|
|
/>;
|
|
|
|
}
|
|
|
|
|
|
|
|
searchRepos = (repoName) => {
|
|
|
|
navigate(`${siteRoot}sys/search-libraries/?name=${encodeURIComponent(repoName)}`);
|
|
|
|
}
|
|
|
|
|
2019-09-24 12:18:53 +08:00
|
|
|
render() {
|
|
|
|
let { isCreateRepoDialogOpen } = this.state;
|
|
|
|
return (
|
|
|
|
<Fragment>
|
2019-11-11 17:56:45 +08:00
|
|
|
<MainPanelTopbar search={this.getSearch()}>
|
2019-09-24 12:18:53 +08:00
|
|
|
<Button className="btn btn-secondary operation-item" onClick={this.toggleCreateRepoDialog}>
|
|
|
|
<i className="fas fa-plus-square text-secondary mr-1"></i>{gettext('New Library')}
|
|
|
|
</Button>
|
|
|
|
</MainPanelTopbar>
|
|
|
|
<div className="main-panel-center flex-row">
|
|
|
|
<div className="cur-view-container">
|
|
|
|
<ReposNav currentItem="all" />
|
|
|
|
<div className="cur-view-content">
|
|
|
|
<Content
|
|
|
|
loading={this.state.loading}
|
|
|
|
errorMsg={this.state.errorMsg}
|
|
|
|
items={this.state.repos}
|
|
|
|
pageInfo={this.state.pageInfo}
|
2019-12-31 18:26:02 +08:00
|
|
|
curPerPage={this.state.perPage}
|
2019-09-24 12:18:53 +08:00
|
|
|
getListByPage={this.getReposByPage}
|
2019-12-31 18:26:02 +08:00
|
|
|
resetPerPage={this.resetPerPage}
|
2019-09-24 12:18:53 +08:00
|
|
|
onDeleteRepo={this.onDeleteRepo}
|
|
|
|
onTransferRepo={this.onTransferRepo}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
{isCreateRepoDialogOpen &&
|
|
|
|
<SysAdminCreateRepoDialog
|
|
|
|
createRepo={this.createRepo}
|
|
|
|
toggleDialog={this.toggleCreateRepoDialog}
|
|
|
|
/>
|
|
|
|
}
|
|
|
|
</Fragment>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default AllRepos;
|