1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-19 01:44:13 +00:00

share wiki (#6413)

* share wiki

update leave and return

update get group info

* format optimize

* Update wikis.js

* Update wiki2.py

* fix empty group_wikis

* update

* remove-useless-code

* add-owner-nickname

* Update wiki2.py

* Update wiki2.py

* Update wiki2.py

---------

Co-authored-by: 孙永强 <11704063+s-yongqiang@user.noreply.gitee.com>
Co-authored-by: r350178982 <32759763+r350178982@users.noreply.github.com>
This commit is contained in:
awu0403
2024-07-25 17:28:55 +08:00
committed by GitHub
parent aa477190f2
commit 9d227661b3
14 changed files with 597 additions and 122 deletions

View File

@@ -113,6 +113,7 @@ const propTypes = {
itemPath: PropTypes.string.isRequired,
itemType: PropTypes.string.isRequired,
repoID: PropTypes.string.isRequired,
repoType: PropTypes.string.isRequired,
isRepoOwner: PropTypes.bool.isRequired,
onAddCustomPermissionToggle: PropTypes.func,
};
@@ -126,7 +127,8 @@ class ShareToGroup extends React.Component {
selectedOption: null,
errorMsg: [],
permission: 'rw',
sharedItems: []
sharedItems: [],
isWiki: this.props.repoType === 'wiki'
};
this.permissions = [];
let { itemType, isRepoOwner } = props;
@@ -141,6 +143,9 @@ class ShareToGroup extends React.Component {
if (this.props.isGroupOwnedRepo) {
this.permissions = ['rw', 'r', 'cloud-edit', 'preview'];
}
if (this.state.isWiki) {
this.permissions = ['rw', 'r'];
}
}
handleSelectChange = (option) => {
@@ -344,6 +349,7 @@ class ShareToGroup extends React.Component {
permissions={this.permissions}
onPermissionChanged={this.setPermission}
enableAddCustomPermission={isPro}
isWiki={this.state.isWiki}
onAddCustomPermissionToggle={this.props.onAddCustomPermissionToggle}
/>
</td>

View File

@@ -154,6 +154,7 @@ const propTypes = {
itemType: PropTypes.string.isRequired,
repoID: PropTypes.string.isRequired,
isRepoOwner: PropTypes.bool.isRequired,
repoType: PropTypes.string.isRequired,
onAddCustomPermissionToggle: PropTypes.func,
};
@@ -165,7 +166,8 @@ class ShareToUser extends React.Component {
selectedOption: null,
errorMsg: [],
permission: 'rw',
sharedItems: []
sharedItems: [],
isWiki: this.props.repoType === 'wiki'
};
this.options = [];
this.permissions = [];
@@ -181,6 +183,9 @@ class ShareToUser extends React.Component {
if (this.props.isGroupOwnedRepo) {
this.permissions = ['rw', 'r', 'cloud-edit', 'preview'];
}
if (this.state.isWiki) {
this.permissions = ['rw', 'r'];
}
}
handleSelectChange = (option) => {
@@ -370,6 +375,7 @@ class ShareToUser extends React.Component {
permissions={this.permissions}
onPermissionChanged={this.setPermission}
enableAddCustomPermission={isPro}
isWiki={this.state.isWiki}
onAddCustomPermissionToggle={this.props.onAddCustomPermissionToggle}
/>
</td>

View File

@@ -0,0 +1,174 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { Modal, ModalHeader, ModalBody, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';
import { gettext, username, additionalShareDialogNote, canShareRepo } from '../../utils/constants';
import ShareToUser from './share-to-user';
import ShareToGroup from './share-to-group';
import { seafileAPI } from '../../utils/seafile-api';
import { Utils } from '../../utils/utils';
import Loading from '../loading';
import toaster from '../toast';
import '../../css/share-link-dialog.css';
const propTypes = {
isGroupOwnedRepo: PropTypes.bool,
itemType: PropTypes.string.isRequired, // there will be three choose: ['library', 'dir', 'file']
itemName: PropTypes.string.isRequired,
itemPath: PropTypes.string.isRequired,
toggleDialog: PropTypes.func.isRequired,
repoID: PropTypes.string.isRequired,
repoEncrypted: PropTypes.bool,
enableDirPrivateShare: PropTypes.bool,
};
class ShareWikiDialog extends React.Component {
constructor(props) {
super(props);
this.state = {
activeTab: 'shareToUser',
isRepoJudgemented: false,
isRepoOwner: false,
isGroupOwnedRepo: false,
};
}
componentDidMount() {
let repoID = this.props.repoID;
seafileAPI.getRepoInfo(repoID).then(res => {
const isGroupOwnedRepo = res.data.owner_email.indexOf('@seafile_group') > -1;
let isRepoOwner = res.data.owner_email === username;
this.setState({
isRepoJudgemented: true,
isRepoOwner: isRepoOwner,
repoType: res.data.repo_type,
isGroupOwnedRepo: isGroupOwnedRepo,
});
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
});
}
toggle = (tab) => {
if (this.state.activeTab !== tab) {
this.setState({ activeTab: tab });
}
};
onAddCustomPermissionToggle = () => {
this.toggle('customSharePermission');
};
renderDirContent = () => {
if (!this.state.isRepoJudgemented) {
return <Loading />;
}
let activeTab = this.state.activeTab;
let { repoEncrypted, enableDirPrivateShare, itemType } = this.props;
if (repoEncrypted) {
enableDirPrivateShare = itemType == 'library';
}
return (
<Fragment>
<div className="share-dialog-side">
<Nav pills>
{enableDirPrivateShare &&
<Fragment>
{ canShareRepo && (
<NavItem role="tab" aria-selected={activeTab === 'shareToUser'} aria-controls="share-to-user-panel">
<NavLink className={activeTab === 'shareToUser' ? 'active' : ''} onClick={this.toggle.bind(this, 'shareToUser')} tabIndex="0" onKeyDown={this.onTabKeyDown}>
{gettext('Share to user')}
</NavLink>
</NavItem>
)}
{ canShareRepo && (
<NavItem role="tab" aria-selected={activeTab === 'shareToGroup'} aria-controls="share-to-group-panel">
<NavLink className={activeTab === 'shareToGroup' ? 'active' : ''} onClick={this.toggle.bind(this, 'shareToGroup')} tabIndex="0" onKeyDown={this.onTabKeyDown}>
{gettext('Share to group')}
</NavLink>
</NavItem>
)}
</Fragment>
}
</Nav>
</div>
<div className="share-dialog-main">
<TabContent activeTab={this.state.activeTab}>
{enableDirPrivateShare &&
<Fragment>
{(activeTab === 'shareToUser' && canShareRepo) &&
<TabPane tabId="shareToUser" role="tabpanel" id="share-to-user-panel">
<ShareToUser
itemType={this.props.itemType}
isGroupOwnedRepo={this.state.isGroupOwnedRepo}
itemPath={this.props.itemPath}
repoID={this.props.repoID}
isRepoOwner={this.state.isRepoOwner}
repoType={this.state.repoType}
onAddCustomPermissionToggle={this.onAddCustomPermissionToggle}
/>
</TabPane>
}
{(activeTab === 'shareToGroup' && canShareRepo) &&
<TabPane tabId="shareToGroup" role="tabpanel" id="share-to-group-panel">
<ShareToGroup
itemType={this.props.itemType}
isGroupOwnedRepo={this.state.isGroupOwnedRepo}
itemPath={this.props.itemPath}
repoID={this.props.repoID}
isRepoOwner={this.state.isRepoOwner}
repoType={this.state.repoType}
onAddCustomPermissionToggle={this.onAddCustomPermissionToggle}
/>
</TabPane>
}
</Fragment>
}
</TabContent>
</div>
</Fragment>
);
};
onTabKeyDown = (e) => {
if (e.key == 'Enter' || e.key == 'Space') {
e.target.click();
}
};
renderExternalShareMessage = () => {
if (additionalShareDialogNote && (typeof additionalShareDialogNote) === 'object') {
return (
<div className="external-share-message mt-2">
<h6>{additionalShareDialogNote.title}</h6>
<p style={{ fontSize: '14px', color: '#666' }} className="text-wrap m-0">{additionalShareDialogNote.content}</p>
</div>
);
}
return null;
};
render() {
const { itemType, itemName } = this.props;
return (
<div>
<Modal isOpen={true} style={{ maxWidth: '760px' }} className="share-dialog" toggle={this.props.toggleDialog}>
<ModalHeader toggle={this.props.toggleDialog} tag="div">
<h5 className="text-truncate">{gettext('Share')} <span className="op-target" title={itemName}>{itemName}</span></h5>
{this.renderExternalShareMessage()}
</ModalHeader>
<ModalBody className="share-dialog-content" role="tablist">
{(itemType === 'library') && this.renderDirContent()}
</ModalBody>
</Modal>
</div>
);
}
}
ShareWikiDialog.propTypes = propTypes;
export default ShareWikiDialog;