diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c5a28f84ff..dfb109233d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10793,9 +10793,9 @@ } }, "seafile-js": { - "version": "0.2.55", - "resolved": "https://registry.npmjs.org/seafile-js/-/seafile-js-0.2.55.tgz", - "integrity": "sha512-Q9qE/RE0rg3wmXlYENO8mcEhu+OHC3emK9/+Fq3k3u38z6iy/Kc/1ntJjNpHYI5VS4oipum/Lc8gIvPL/FZQAQ==", + "version": "0.2.56", + "resolved": "https://registry.npmjs.org/seafile-js/-/seafile-js-0.2.56.tgz", + "integrity": "sha512-Stm5Xa3OmXZ8beNVftS2OPU5nZlGGSIL7JazD2R4KrOtxQElfUWA5XsGsFnfbuAFv25mUxABzteWpYsMPVtOqg==", "requires": { "axios": "^0.18.0", "form-data": "^2.3.2", diff --git a/frontend/package.json b/frontend/package.json index e38f32edae..7728024cf3 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -31,7 +31,7 @@ "react-moment": "^0.7.9", "react-select": "^2.1.1", "reactstrap": "^6.4.0", - "seafile-js": "^0.2.55", + "seafile-js": "^0.2.56", "seafile-ui": "^0.1.10", "socket.io-client": "^2.2.0", "sw-precache-webpack-plugin": "0.11.4", diff --git a/frontend/src/components/dialog/share-to-group.js b/frontend/src/components/dialog/share-to-group.js index 5de11e41be..25a55a6375 100644 --- a/frontend/src/components/dialog/share-to-group.js +++ b/frontend/src/components/dialog/share-to-group.js @@ -5,7 +5,7 @@ import Select from 'react-select'; import makeAnimated from 'react-select/lib/animated'; import { gettext } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api.js'; -import PermissionEditor from '../select-editor/permission-editor'; +import SharePermissionEditor from '../select-editor/share-permission-editor'; class GroupItem extends React.Component { @@ -40,7 +40,7 @@ class GroupItem extends React.Component { {item.group_info.name} - - {item.user_info.nickname} - - { return Utils.sharePerms(permission); @@ -31,6 +31,6 @@ class PermissionEditor extends React.Component { } } -PermissionEditor.propTypes = propTypes; +SharePermissionEditor.propTypes = propTypes; -export default PermissionEditor; +export default SharePermissionEditor; diff --git a/frontend/src/components/select-editor/wiki-permission-editor.js b/frontend/src/components/select-editor/wiki-permission-editor.js new file mode 100644 index 0000000000..28e6594245 --- /dev/null +++ b/frontend/src/components/select-editor/wiki-permission-editor.js @@ -0,0 +1,43 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { gettext } from '../../utils/constants'; +import SelectEditor from './select-editor'; + +const propTypes = { + isTextMode: PropTypes.bool.isRequired, + isEditIconShow: PropTypes.bool.isRequired, + permissions: PropTypes.array.isRequired, + currentPermission: PropTypes.string.isRequired, + onPermissionChangedHandler: PropTypes.func.isRequired +}; + +class WikiPermissionEditor extends React.Component { + + translatePermission = (permission) => { + if (permission === 'private') { + return gettext('Private'); + } + + if (permission === 'public') { + return gettext('Public'); + } + } + + render() { + return ( + + ); + } + +} + +WikiPermissionEditor.propTypes = propTypes; + +export default WikiPermissionEditor; diff --git a/frontend/src/components/wiki-list-view/wiki-list-item.js b/frontend/src/components/wiki-list-view/wiki-list-item.js index 4783dae8e3..b679ca2654 100644 --- a/frontend/src/components/wiki-list-view/wiki-list-item.js +++ b/frontend/src/components/wiki-list-view/wiki-list-item.js @@ -3,6 +3,8 @@ import PropTypes from 'prop-types'; import moment from 'moment'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { gettext, siteRoot } from '../../utils/constants'; +import { seafileAPI } from '../../utils/seafile-api'; +import WikiPermissionEditor from '../select-editor/wiki-permission-editor.js'; import Toast from '../toast'; import ModalPortal from '../modal-portal'; import WikiDeleteDialog from '../dialog/wiki-delete-dialog'; @@ -26,7 +28,10 @@ class WikiListItem extends Component { isShowMenuControl: false, isRenameing: false, highlight: false, + permission: this.props.wiki.permission, + showOpIcon: false, }; + this.permissions = ['private', 'public']; } clickMenuToggle = (e) => { @@ -58,6 +63,7 @@ class WikiListItem extends Component { this.setState({ isShowMenuControl: true, highlight: true, + showOpIcon: true, }); } } @@ -67,10 +73,23 @@ class WikiListItem extends Component { this.setState({ isShowMenuControl: false, highlight: false, + showOpIcon: false, }); } } + changePerm = (permission) => { + let wiki = this.props.wiki; + seafileAPI.updateWikiPermission(wiki.slug, permission).then(() => { + this.setState({permission: permission}); + }).catch((error) => { + if(error.response) { + let errorMsg = error.response.data.error_msg; + Toast.danger(errorMsg); + } + }); + } + onRenameToggle = (e) => { this.props.onFreezedItem(); this.setState({ @@ -150,6 +169,15 @@ class WikiListItem extends Component { {gettext(wiki.owner_nickname)} {moment(wiki.updated_at).fromNow()} + + + {this.state.isShowMenuControl && ( diff --git a/frontend/src/components/wiki-list-view/wiki-list-view.js b/frontend/src/components/wiki-list-view/wiki-list-view.js index a355e12384..6102249cfd 100644 --- a/frontend/src/components/wiki-list-view/wiki-list-view.js +++ b/frontend/src/components/wiki-list-view/wiki-list-view.js @@ -38,9 +38,10 @@ class WikiListView extends Component { - + + diff --git a/frontend/src/pages/share-admin/folders.js b/frontend/src/pages/share-admin/folders.js index 8c39399fd6..f7452edeea 100644 --- a/frontend/src/pages/share-admin/folders.js +++ b/frontend/src/pages/share-admin/folders.js @@ -3,7 +3,7 @@ import { Link } from '@reach/router'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants'; -import PermissionEditor from '../../components/select-editor/permission-editor'; +import SharePermissionEditor from '../../components/select-editor/share-permission-editor'; import SharedFolderInfo from '../../models/shared-folder-info'; class Content extends Component { @@ -153,7 +153,7 @@ class Item extends Component { {shareTo} {shareTo}
{gettext('Name')}{gettext('Name')} {gettext('Owner')} {gettext('Last Update')}{gettext('Permission')} {/* operation */}
{item.folder_name} - {item.repo_name} - {gettext('Edit Page')} } - + {loginUser && + + }
diff --git a/seahub/api2/endpoints/wiki_pages.py b/seahub/api2/endpoints/wiki_pages.py index 9eb727bbed..cc95468bf5 100644 --- a/seahub/api2/endpoints/wiki_pages.py +++ b/seahub/api2/endpoints/wiki_pages.py @@ -225,7 +225,7 @@ class WikiPagesDirView(APIView): return api_error(status.HTTP_404_NOT_FOUND, error_msg) # perm check - if not wiki.check_access_wiki(request): + if not wiki.has_read_perm(request.user): error_msg = "Permission denied" return api_error(status.HTTP_403_FORBIDDEN, error_msg) @@ -266,7 +266,7 @@ class WikiPageContentView(APIView): return api_error(status.HTTP_404_NOT_FOUND, error_msg) # perm check - if not wiki.check_access_wiki(request): + if not wiki.has_read_perm(request.user): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) diff --git a/seahub/wiki/views.py b/seahub/wiki/views.py index 2ae81f0792..183b08bc39 100644 --- a/seahub/wiki/views.py +++ b/seahub/wiki/views.py @@ -54,11 +54,11 @@ def slug(request, slug, file_path="home.md"): # perm check req_user = request.user.username - if not req_user: + if not req_user and not wiki.has_read_perm(request.user): return redirect('auth_login') - - if not wiki.check_access_wiki(request): - return render_permission_error(request, _(u'Permission denied.')) + else: + if not wiki.has_read_perm(request.user): + return render_permission_error(request, _(u'Unable to view Wiki')) file_type, ext = get_file_type_and_ext(posixpath.basename(file_path)) if file_type == IMAGE: