1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-05 09:10:05 +00:00
seahub/frontend/src/pages/shared-with-all/public-shared-view.js

236 lines
7.9 KiB
JavaScript
Raw Normal View History

2018-12-21 07:40:59 +00:00
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
2019-03-19 02:35:21 +00:00
import cookie from 'react-cookies';
import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem} from 'reactstrap';
2018-12-21 07:40:59 +00:00
import { seafileAPI } from '../../utils/seafile-api';
import { gettext, loginUrl } from '../../utils/constants';
import { Utils } from '../../utils/utils';
2018-12-21 07:40:59 +00:00
import Repo from '../../models/repo';
import toaster from '../../components/toast';
import Loading from '../../components/loading';
import ModalPortal from '../../components/modal-portal';
import CommonToolbar from '../../components/toolbar/common-toolbar';
import CreateRepoDialog from '../../components/dialog/create-repo-dialog';
import ShareRepoDialog from '../../components/dialog/share-repo-dialog';
import SharedRepoListView from '../../components/shared-repo-list-view/shared-repo-list-view';
const propTypes = {
onShowSidePanel: PropTypes.func.isRequired,
onSearchedClick: PropTypes.func.isRequired,
};
class PublicSharedView extends React.Component {
constructor(props) {
super(props);
this.state = {
isLoading: true,
errMessage: '',
emptyTip: '',
repoList: [],
2019-03-19 02:35:21 +00:00
sortBy: cookie.load('seafile-repo-sort-by') || 'name', // 'name' or 'time'
sortOrder: cookie.load('seafile-repo-sort-order') || 'asc', // 'asc' or 'desc'
2018-12-21 07:40:59 +00:00
libraryType: 'public',
isCreateMenuShow: false,
isCreateRepoDialogShow: false,
isSelectRepoDialpgShow: false,
};
2018-12-21 07:40:59 +00:00
}
componentDidMount() {
seafileAPI.listRepos({type: 'public'}).then((res) => {
let repoList = res.data.repos.map(item => {
let repo = new Repo(item);
return repo;
});
this.setState({
isLoading: false,
repoList: Utils.sortRepos(repoList, this.state.sortBy, this.state.sortOrder)
2018-12-21 07:40:59 +00:00
});
}).catch((error) => {
if (error.response) {
if (error.response.status == 403) {
this.setState({
isLoading: false,
errMessage: gettext('Permission denied')
2018-12-21 07:40:59 +00:00
});
location.href = `${loginUrl}?next=${encodeURIComponent(location.href)}`;
} else {
this.setState({
isLoading: false,
errMessage: gettext('Error')
2018-12-21 07:40:59 +00:00
});
}
} else {
this.setState({
isLoading: false,
errMessage: gettext('Please check the network.')
2018-12-21 07:40:59 +00:00
});
}
});
}
onCreateRepo = (repo) => {
seafileAPI.createPublicRepo(repo).then(res => {
let object = { // need modify api return value
repo_id: res.data.id,
repo_name: res.data.name,
permission: res.data.permission,
size: res.data.size,
owner_name: res.data.owner_name,
owner_email: res.data.owner,
mtime: res.data.mtime,
encrypted: res.data.encrypted,
};
2018-12-21 07:40:59 +00:00
let repo = new Repo(object);
let repoList = this.addRepoItem(repo);
this.setState({repoList: repoList});
this.onCreateRepoToggle();
}).catch(() => {
// todo
});
2018-12-21 07:40:59 +00:00
}
onRepoSelectedHandler = (selectedRepoList) => {
selectedRepoList.forEach(repo => {
seafileAPI.selectOwnedRepoToPublic(repo.repo_id, {share_type: 'public', permission: repo.sharePermission}).then(() => {
let repoList = this.addRepoItem(repo);
this.setState({repoList: repoList});
}).catch(() => {
// todo
});
});
2018-12-21 07:40:59 +00:00
}
onItemUnshare = (repo) => {
seafileAPI.unshareRepo(repo.repo_id, {share_type: 'public'}).then(() => {
let repoList = this.state.repoList.filter(item => {
return item.repo_id !== repo.repo_id;
});
this.setState({repoList: repoList});
toaster.success('Successfully unshared 1 item.');
});
}
onItemDelete = () => {
// todo need to optimized
}
addRepoItem = (repo) => {
let isExist = false;
2018-12-22 07:18:53 +00:00
let repoIndex = 0;
2018-12-21 07:40:59 +00:00
let repoList = this.state.repoList;
for (let i = 0; i < repoList.length; i ++) {
if (repo.repo_id === repoList[i].repo_id) {
isExist = true;
2018-12-22 07:18:53 +00:00
repoIndex = i;
2018-12-21 07:40:59 +00:00
break;
}
}
if (isExist) {
2018-12-22 07:18:53 +00:00
this.state.repoList.splice(repoIndex, 1);
2018-12-21 07:40:59 +00:00
}
let newRepoList = this.state.repoList.map(item => {return item;});
2018-12-22 07:18:53 +00:00
newRepoList.unshift(repo);
2018-12-21 07:40:59 +00:00
return newRepoList;
}
onAddRepoToggle = () => {
this.setState({isCreateMenuShow: !this.state.isCreateMenuShow});
}
onCreateRepoToggle = () => {
this.setState({isCreateRepoDialogShow: !this.state.isCreateRepoDialogShow});
}
onSelectRepoToggle = () => {
this.setState({isSelectRepoDialpgShow: !this.state.isSelectRepoDialpgShow});
}
sortItems = (sortBy, sortOrder) => {
2019-03-19 02:35:21 +00:00
cookie.save('seafile-repo-sort-by', sortBy);
cookie.save('seafile-repo-sort-order', sortOrder);
this.setState({
sortBy: sortBy,
sortOrder: sortOrder,
repoList: Utils.sortRepos(this.state.repoList, sortBy, sortOrder)
});
}
2018-12-21 07:40:59 +00:00
render() {
let errMessage = this.state.errMessage;
let emptyTip = (
<div className="empty-tip">
<h2>{gettext('No public libraries')}</h2>
<p>{gettext('You can create a public library by clicking the "New Library" button, others can view and download this library.')}</p>
</div>
);
return (
<Fragment>
2019-02-20 03:54:25 +00:00
<div className="main-panel-north border-left-show">
<div className="cur-view-toolbar">
2018-12-21 07:40:59 +00:00
<span className="sf2-icon-menu side-nav-toggle hidden-md-up d-md-none" title="Side Nav Menu" onClick={this.props.onShowSidePanel}></span>
<div className="operation">
<Dropdown isOpen={this.state.isCreateMenuShow} toggle={this.onAddRepoToggle}>
<DropdownToggle className='btn btn-secondary operation-item'>
2018-12-29 08:16:20 +00:00
<i className="fas fa-plus-square text-secondary mr-1"></i>{gettext('Add Library')}
2018-12-21 07:40:59 +00:00
</DropdownToggle>
<DropdownMenu>
<DropdownItem onClick={this.onSelectRepoToggle}>{gettext('Share existing libraries')}</DropdownItem>
<DropdownItem onClick={this.onCreateRepoToggle}>{gettext('New Library')}</DropdownItem>
</DropdownMenu>
</Dropdown>
</div>
</div>
<CommonToolbar onSearchedClick={this.props.onSearchedClick} />
</div>
<div className="main-panel-center">
<div className="cur-view-container">
<div className="cur-view-path">
<h3 className="sf-heading">{gettext('Shared with all')}</h3>
2018-12-21 07:40:59 +00:00
</div>
<div className="cur-view-content">
{this.state.isLoading && <Loading />}
{(!this.state.isLoading && errMessage) && errMessage}
{(!this.state.isLoading && this.state.repoList.length === 0) && emptyTip}
{(!this.state.isLoading && this.state.repoList.length > 0) &&
<SharedRepoListView
libraryType={this.state.libraryType}
repoList={this.state.repoList}
sortBy={this.state.sortBy}
sortOrder={this.state.sortOrder}
sortItems={this.sortItems}
2018-12-21 07:40:59 +00:00
onItemUnshare={this.onItemUnshare}
onItemDelete={this.onItemDelete}
/>
}
</div>
</div>
</div>
{this.state.isCreateRepoDialogShow && (
<ModalPortal>
<CreateRepoDialog
libraryType={this.state.libraryType}
onCreateToggle={this.onCreateRepoToggle}
onCreateRepo={this.onCreateRepo}
/>
</ModalPortal>
)}
{this.state.isSelectRepoDialpgShow && (
<ModalPortal>
<ShareRepoDialog
onRepoSelectedHandler={this.onRepoSelectedHandler}
onShareRepoDialogClose={this.onSelectRepoToggle}
/>
</ModalPortal>
)}
</Fragment>
);
}
}
PublicSharedView.propTypes = propTypes;
export default PublicSharedView;