 |
{this.state.isRenaming && (
diff --git a/frontend/src/pages/my-libs/mylib-repo-list-view.js b/frontend/src/pages/my-libs/mylib-repo-list-view.js
index f6cb36c72b..783fce85e5 100644
--- a/frontend/src/pages/my-libs/mylib-repo-list-view.js
+++ b/frontend/src/pages/my-libs/mylib-repo-list-view.js
@@ -13,8 +13,8 @@ const propTypes = {
onRenameRepo: PropTypes.func.isRequired,
onDeleteRepo: PropTypes.func.isRequired,
onTransferRepo: PropTypes.func.isRequired,
- onRepoClick: PropTypes.func.isRequired,
onMonitorRepo: PropTypes.func.isRequired,
+ theadHidden : PropTypes.bool, // for 'My Libraries' in 'Files' page
};
class MylibRepoListView extends React.Component {
@@ -70,7 +70,6 @@ class MylibRepoListView extends React.Component {
onDeleteRepo={this.props.onDeleteRepo}
onTransferRepo={this.props.onTransferRepo}
onMonitorRepo={this.props.onMonitorRepo}
- onRepoClick={this.props.onRepoClick}
/>
);
})}
@@ -79,10 +78,11 @@ class MylibRepoListView extends React.Component {
};
renderPCUI = () => {
+ const { theadHidden } = this.props;
const showStorageBackend = storages.length > 0;
const sortIcon = this.props.sortOrder === 'asc' ? : ;
return (
-
+
|
diff --git a/frontend/src/pages/shared-libs/shared-libs.js b/frontend/src/pages/shared-libs/shared-libs.js
index 15c09fd746..6961d11a20 100644
--- a/frontend/src/pages/shared-libs/shared-libs.js
+++ b/frontend/src/pages/shared-libs/shared-libs.js
@@ -54,7 +54,7 @@ class Content extends Component {
};
render() {
- const { loading, errorMsg, items, sortBy, sortOrder } = this.props;
+ const { loading, errorMsg, items, sortBy, sortOrder, theadHidden } = this.props;
const emptyTip = (
@@ -90,7 +90,7 @@ class Content extends Component {
const isDesktop = Utils.isDesktop();
const table = (
-
+
{isDesktop ? desktopThead : }
{items.map((item, index) => {
@@ -113,6 +113,7 @@ class Content extends Component {
}
Content.propTypes = {
+ theadHidden: PropTypes.bool.isRequired,
loading: PropTypes.bool.isRequired,
errorMsg: PropTypes.string.isRequired,
items: PropTypes.array.isRequired,
@@ -447,28 +448,55 @@ class SharedLibraries extends Component {
this.setState({items: items});
};
+ renderContent = () => {
+ const { inAllLibs = false } = this.props; // inAllLibs: in 'All Libs'('Files') page
+ return (
+
+ );
+ };
+
+ renderSortIconInMobile = () => {
+ return (
+ <>
+ {(!Utils.isDesktop() && this.state.items.length > 0) && }
+ >
+ );
+ };
+
render() {
+ const { inAllLibs = false } = this.props; // inAllLibs: in 'All Libs'('Files') page
return (
-
-
-
- {gettext('Shared with me')}
- {(!Utils.isDesktop() && this.state.items.length > 0) && }
+ {inAllLibs ? (
+ <>
+
+ {gettext('Shared with me')}
+ {this.renderSortIconInMobile()}
-
-
+ {this.renderContent()}
+ >
+ ) : (
+
+
+
+ {gettext('Shared with me')}
+ {this.renderSortIconInMobile()}
+
+
+ {this.renderContent()}
+
-
+ )}
{this.state.isSortOptionsDialogOpen &&
{
+ 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)
+ });
+ }).catch((error) => {
+ this.setState({
+ isLoading: false,
+ errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403
+ });
+ });
+ }
+
+ 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});
+ let message = gettext('Successfully unshared {name}').replace('{name}', repo.repo_name);
+ toaster.success(message);
+ }).catch(error => {
+ let errMessage = Utils.getErrorMsg(error);
+ if (errMessage === gettext('Error')) {
+ errMessage = gettext('Failed to unshare {name}').replace('{name}', repo.repo_name);
+ }
+ toaster(errMessage);
+ });
+ };
+
+ onItemDelete = () => {
+ // todo need to optimized
+ };
+
+ addRepoItem = (repo) => {
+ let isExist = false;
+ let repoIndex = 0;
+ let repoList = this.state.repoList;
+ for (let i = 0; i < repoList.length; i ++) {
+ if (repo.repo_id === repoList[i].repo_id) {
+ isExist = true;
+ repoIndex = i;
+ break;
+ }
+ }
+ if (isExist) {
+ this.state.repoList.splice(repoIndex, 1);
+ }
+
+ let newRepoList = this.state.repoList.map(item => {return item;});
+ newRepoList.unshift(repo);
+ this.setState({repoList: newRepoList});
+ };
+
+ sortItems = (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)
+ });
+ };
+
+ toggleSortOptionsDialog = () => {
+ this.setState({
+ isSortOptionsDialogOpen: !this.state.isSortOptionsDialogOpen
+ });
+ };
+
+ renderContent = () => {
+ const { errMessage } = this.state;
+ const emptyTip = (
+
+ {gettext('No public libraries')}
+ {gettext('No public libraries have been created yet. A public library is accessible by all users. You can create a public library by clicking the "Add Library" button in the menu bar.')}
+
+ );
+ const { inAllLibs = false } = this.props; // inAllLibs: in 'All Libs'('Files') page
+ return (
+ <>
+ {this.state.isLoading && }
+ {(!this.state.isLoading && errMessage) && errMessage}
+ {(!this.state.isLoading && this.state.repoList.length === 0) && emptyTip}
+ {(!this.state.isLoading && this.state.repoList.length > 0) &&
+
+ }
+ >
+ );
+ };
+
+ renderSortIconInMobile = () => {
+ return (
+ <>
+
+ {(!Utils.isDesktop() && this.state.repoList.length > 0) && }
+ >
+ );
+ };
+
+ render() {
+ const { inAllLibs = false } = this.props; // inAllLibs: in 'All Libs'('Files') page
+
+ if (inAllLibs) {
+ return (
+ <>
+
+ {gettext('Shared with all')}
+ {this.renderSortIconInMobile()}
+
+ {this.renderContent()}
+ >
+ );
+ }
+
+ return (
+
+
+ {canAddPublicRepo && }
+
+
+
+
+
+ {gettext('Shared with all')}
+ {this.renderSortIconInMobile()}
+
+
+ {this.renderContent()}
+
+
+
+ {this.state.isSortOptionsDialogOpen &&
+
+ }
+
+ );
+ }
+}
+
+PublicSharedView.propTypes = propTypes;
+
+export default PublicSharedView;
diff --git a/frontend/src/pages/shared-with-all/public-shared-view.js b/frontend/src/pages/shared-with-all/public-shared-view.js
deleted file mode 100644
index 7ac4368655..0000000000
--- a/frontend/src/pages/shared-with-all/public-shared-view.js
+++ /dev/null
@@ -1,259 +0,0 @@
-import React, { Fragment } from 'react';
-import PropTypes from 'prop-types';
-import cookie from 'react-cookies';
-import MediaQuery from 'react-responsive';
-import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';
-import { seafileAPI } from '../../utils/seafile-api';
-import { gettext, canAddPublicRepo } from '../../utils/constants';
-import { Utils } from '../../utils/utils';
-import Repo from '../../models/repo';
-import toaster from '../../components/toast';
-import Loading from '../../components/loading';
-import EmptyTip from '../../components/empty-tip';
-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';
-import SortOptionsDialog from '../../components/dialog/sort-options';
-
-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: [],
- 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'
- isSortOptionsDialogOpen: false,
- libraryType: 'public',
- isCreateMenuShow: false,
- isCreateRepoDialogShow: false,
- isSelectRepoDialpgShow: false,
- };
- }
-
- 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)
- });
- }).catch((error) => {
- this.setState({
- isLoading: false,
- errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403
- });
- });
- }
-
- 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,
- };
- let repo = new Repo(object);
- let repoList = this.addRepoItem(repo);
- this.setState({repoList: repoList});
- this.onCreateRepoToggle();
- }).catch((error) => {
- let errMessage = Utils.getErrorMsg(error);
- toaster.danger(errMessage);
- });
- };
-
- 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((error) => {
- let errMessage = Utils.getErrorMsg(error);
- toaster.danger(errMessage);
- });
- });
- };
-
- 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});
- let message = gettext('Successfully unshared {name}').replace('{name}', repo.repo_name);
- toaster.success(message);
- }).catch(error => {
- let errMessage = Utils.getErrorMsg(error);
- if (errMessage === gettext('Error')) {
- errMessage = gettext('Failed to unshare {name}').replace('{name}', repo.repo_name);
- }
- toaster(errMessage);
- });
- };
-
- onItemDelete = () => {
- // todo need to optimized
- };
-
- addRepoItem = (repo) => {
- let isExist = false;
- let repoIndex = 0;
- let repoList = this.state.repoList;
- for (let i = 0; i < repoList.length; i ++) {
- if (repo.repo_id === repoList[i].repo_id) {
- isExist = true;
- repoIndex = i;
- break;
- }
- }
- if (isExist) {
- this.state.repoList.splice(repoIndex, 1);
- }
-
- let newRepoList = this.state.repoList.map(item => {return item;});
- newRepoList.unshift(repo);
- 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) => {
- 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)
- });
- };
-
- toggleSortOptionsDialog = () => {
- this.setState({
- isSortOptionsDialogOpen: !this.state.isSortOptionsDialogOpen
- });
- };
-
- render() {
- let errMessage = this.state.errMessage;
- let emptyTip = (
-
- {gettext('No public libraries')}
- {gettext('No public libraries have been created yet. A public library is accessible by all users. You can create a public library by clicking the "Add Library" button in the menu bar.')}
-
- );
- return (
-
-
- {canAddPublicRepo &&
-
-
-
-
-
-
- {gettext('Add Library')}
-
-
-
-
-
-
- {gettext('Share existing libraries')}
- {gettext('New Library')}
-
-
-
-
- }
-
-
-
-
-
- {gettext('Shared with all')}
- {(!Utils.isDesktop() && this.state.repoList.length > 0) && }
-
-
- {this.state.isLoading && }
- {(!this.state.isLoading && errMessage) && errMessage}
- {(!this.state.isLoading && this.state.repoList.length === 0) && emptyTip}
- {(!this.state.isLoading && this.state.repoList.length > 0) &&
-
- }
-
-
-
- {this.state.isSortOptionsDialogOpen &&
-
- }
- {this.state.isCreateRepoDialogShow && (
-
-
-
- )}
- {this.state.isSelectRepoDialpgShow && (
-
-
-
- )}
-
- );
- }
-}
-
-PublicSharedView.propTypes = propTypes;
-
-export default PublicSharedView;
diff --git a/frontend/src/pages/shared-with-all/top-toolbar.js b/frontend/src/pages/shared-with-all/top-toolbar.js
new file mode 100644
index 0000000000..f76ba54e69
--- /dev/null
+++ b/frontend/src/pages/shared-with-all/top-toolbar.js
@@ -0,0 +1,125 @@
+import React, { Fragment } from 'react';
+import PropTypes from 'prop-types';
+import MediaQuery from 'react-responsive';
+import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';
+import { seafileAPI } from '../../utils/seafile-api';
+import { gettext } from '../../utils/constants';
+import { Utils } from '../../utils/utils';
+import Repo from '../../models/repo';
+import toaster from '../../components/toast';
+import ModalPortal from '../../components/modal-portal';
+import CreateRepoDialog from '../../components/dialog/create-repo-dialog';
+import ShareRepoDialog from '../../components/dialog/share-repo-dialog';
+
+const propTypes = {
+ onShowSidePanel: PropTypes.func.isRequired,
+ addRepoItem: PropTypes.func.isRequired
+};
+
+class TopToolbar extends React.Component {
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ libraryType: 'public',
+ isCreateMenuShow: false,
+ isCreateRepoDialogShow: false,
+ isSelectRepoDialpgShow: false,
+ };
+ }
+
+ onCreateRepo = (repo) => {
+ seafileAPI.createPublicRepo(repo).then(res => {
+ let object = {
+ 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,
+ };
+ let repo = new Repo(object);
+ this.props.addRepoItem(repo);
+ this.onCreateRepoToggle();
+ }).catch((error) => {
+ let errMessage = Utils.getErrorMsg(error);
+ toaster.danger(errMessage);
+ });
+ };
+
+ onRepoSelectedHandler = (selectedRepoList) => {
+ selectedRepoList.forEach(repo => {
+ seafileAPI.selectOwnedRepoToPublic(repo.repo_id, {share_type: 'public', permission: repo.sharePermission}).then(() => {
+ this.props.addRepoItem(repo);
+ }).catch((error) => {
+ let errMessage = Utils.getErrorMsg(error);
+ toaster.danger(errMessage);
+ });
+ });
+ };
+
+ onAddRepoToggle = () => {
+ this.setState({isCreateMenuShow: !this.state.isCreateMenuShow});
+ };
+
+ onCreateRepoToggle = () => {
+ this.setState({isCreateRepoDialogShow: !this.state.isCreateRepoDialogShow});
+ };
+
+ onSelectRepoToggle = () => {
+ this.setState({isSelectRepoDialpgShow: !this.state.isSelectRepoDialpgShow});
+ };
+
+ render() {
+ return (
+
+
+
+
+
+
+
+ {gettext('Add Library')}
+
+
+
+
+
+
+ {gettext('Share existing libraries')}
+ {gettext('New Library')}
+
+
+
+
+ {this.state.isCreateRepoDialogShow && (
+
+
+
+ )}
+ {this.state.isSelectRepoDialpgShow && (
+
+
+
+ )}
+
+ );
+ }
+}
+
+TopToolbar.propTypes = propTypes;
+
+export default TopToolbar;
diff --git a/media/css/seahub_react.css b/media/css/seahub_react.css
index f4e3bbeedc..1fed60f7d6 100644
--- a/media/css/seahub_react.css
+++ b/media/css/seahub_react.css
@@ -719,7 +719,13 @@ a, a:hover { color: #ec8000; }
line-height: 1.5rem;
height: auto;
}
+.side-nav-con .sub-nav#files-sub-nav .nav-item .nav-link {
+ padding-left: 3rem;
+}
+.side-nav-con .sub-nav#files-sub-nav .sub-nav .nav-item .nav-link {
+ padding-left: 2rem;
+}
.side-panel-slide {
transition: all .3s ease-in-out;
}
diff --git a/seahub/urls.py b/seahub/urls.py
index 169095cfcb..5c4ff5777c 100644
--- a/seahub/urls.py
+++ b/seahub/urls.py
@@ -287,6 +287,7 @@ urlpatterns = [
path('share-admin-upload-links/', react_fake_view, name="share_admin_upload_links"),
path('shared-libs/', react_fake_view, name="shared_libs"),
path('shared-with-ocm/', react_fake_view, name="shared_with_ocm"),
+ path('libraries/', react_fake_view, name="libs"),
path('my-libs/', react_fake_view, name="my_libs"),
path('groups/', react_fake_view, name="groups"),
path('group//', react_fake_view, name="group"),
|