mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-09 10:50:24 +00:00
multi share dtable
change permission
This commit is contained in:
@@ -74,7 +74,7 @@ class CreateTableDialog extends React.Component {
|
|||||||
let email;
|
let email;
|
||||||
if (space) {
|
if (space) {
|
||||||
for (let i = 0; i < options.length; i++) {
|
for (let i = 0; i < options.length; i++) {
|
||||||
if ((space.owner_type === "Personal" && options[i].value === 'Personal') || (space.owner_type === "Group" && options[i].value === space.owner_name)) {
|
if ((space.owner_type === 'Personal' && options[i].value === 'Personal') || (space.owner_type === 'Group' && options[i].value === space.owner_name)) {
|
||||||
email = options[i].email;
|
email = options[i].email;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -1,17 +1,16 @@
|
|||||||
import React, { Fragment } from 'react';
|
import React, { Fragment } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import {gettext, isPro, canInvitePeople, siteRoot, username} from '../../utils/constants';
|
import { gettext, canInvitePeople, siteRoot } from '../../utils/constants';
|
||||||
import { Button } from 'reactstrap';
|
import { Button } from 'reactstrap';
|
||||||
import { seafileAPI } from '../../utils/seafile-api.js';
|
import { seafileAPI } from '../../utils/seafile-api.js';
|
||||||
import UserSelect from '../user-select';
|
import UserSelect from '../user-select';
|
||||||
import SharePermissionEditor from '../select-editor/share-permission-editor';
|
import DtableSharePermissionEditor from '../select-editor/dtable-share-permission-editor';
|
||||||
import toaster from '../toast';
|
import toaster from '../toast';
|
||||||
|
|
||||||
import '../../css/invitations.css';
|
import '../../css/invitations.css';
|
||||||
|
|
||||||
const userItemPropTypes = {
|
const userItemPropTypes = {
|
||||||
item: PropTypes.object.isRequired,
|
item: PropTypes.object.isRequired,
|
||||||
permissions: PropTypes.array.isRequired,
|
|
||||||
deleteTableShare: PropTypes.func.isRequired,
|
deleteTableShare: PropTypes.func.isRequired,
|
||||||
updateTableShare: PropTypes.func.isRequired,
|
updateTableShare: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
@@ -48,11 +47,10 @@ class UserItem extends React.Component {
|
|||||||
<tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>
|
<tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>
|
||||||
<td className="name">{item.name}</td>
|
<td className="name">{item.name}</td>
|
||||||
<td>
|
<td>
|
||||||
<SharePermissionEditor
|
<DtableSharePermissionEditor
|
||||||
isTextMode={true}
|
isTextMode={true}
|
||||||
isEditIconShow={this.state.isOperationShow}
|
isEditIconShow={this.state.isOperationShow}
|
||||||
currentPermission={currentPermission}
|
currentPermission={currentPermission}
|
||||||
permissions={this.props.permissions}
|
|
||||||
onPermissionChanged={this.updateTableShare}
|
onPermissionChanged={this.updateTableShare}
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
@@ -80,11 +78,10 @@ class ShareTableToUser extends React.Component {
|
|||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
selectedOption: null,
|
selectedOptions: null,
|
||||||
permission: 'rw',
|
permission: 'rw',
|
||||||
userList: []
|
userList: []
|
||||||
};
|
};
|
||||||
this.permissions = ['rw', 'r', 'admin', 'cloud-edit', 'preview'];
|
|
||||||
this.workspaceID = this.props.currentTable.workspace_id;
|
this.workspaceID = this.props.currentTable.workspace_id;
|
||||||
this.tableName = this.props.currentTable.name;
|
this.tableName = this.props.currentTable.name;
|
||||||
}
|
}
|
||||||
@@ -95,8 +92,8 @@ class ShareTableToUser extends React.Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSelectChange = (option) => {
|
handleSelectChange = (options) => {
|
||||||
this.setState({selectedOption: option});
|
this.setState({ selectedOptions: options });
|
||||||
};
|
};
|
||||||
|
|
||||||
setPermission = (permission) => {
|
setPermission = (permission) => {
|
||||||
@@ -112,30 +109,25 @@ class ShareTableToUser extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
addTableShare = () => {
|
addTableShare = () => {
|
||||||
if (!this.state.selectedOption || this.state.selectedOption.length === 0) {
|
const { selectedOptions, permission, userList } = this.state;
|
||||||
return;
|
if (!selectedOptions || selectedOptions.length === 0) return;
|
||||||
}
|
for (let i = 0; i < selectedOptions.length; i++) {
|
||||||
let name = this.state.selectedOption.value;
|
let name = selectedOptions[i].value;
|
||||||
let email = this.state.selectedOption.email;
|
let email = selectedOptions[i].email;
|
||||||
let permission = this.state.permission;
|
|
||||||
seafileAPI.addTableShare(this.workspaceID, this.tableName, email, permission).then((res) => {
|
seafileAPI.addTableShare(this.workspaceID, this.tableName, email, permission).then((res) => {
|
||||||
let userList = this.state.userList;
|
|
||||||
let userInfo = {
|
let userInfo = {
|
||||||
name: name,
|
name: name,
|
||||||
email: email,
|
email: email,
|
||||||
permission: permission,
|
permission: permission,
|
||||||
};
|
};
|
||||||
userList.push(userInfo);
|
userList.push(userInfo);
|
||||||
this.setState({
|
this.setState({ userList: userList });
|
||||||
userList: userList,
|
|
||||||
selectedOption: null,
|
|
||||||
});
|
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
this.handleError(error);
|
this.handleError(error);
|
||||||
this.setState({
|
|
||||||
selectedOption: null,
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
this.setState({ selectedOption: null });
|
||||||
|
this.refs.userSelect.clearSelect();
|
||||||
};
|
};
|
||||||
|
|
||||||
deleteTableShare = (email) => {
|
deleteTableShare = (email) => {
|
||||||
@@ -173,7 +165,7 @@ class ShareTableToUser extends React.Component {
|
|||||||
<UserItem
|
<UserItem
|
||||||
key={index}
|
key={index}
|
||||||
item={item}
|
item={item}
|
||||||
permissions={this.permissions}
|
permissions={['rw', 'r']}
|
||||||
deleteTableShare={this.deleteTableShare}
|
deleteTableShare={this.deleteTableShare}
|
||||||
updateTableShare={this.updateTableShare}
|
updateTableShare={this.updateTableShare}
|
||||||
/>
|
/>
|
||||||
@@ -195,18 +187,17 @@ class ShareTableToUser extends React.Component {
|
|||||||
<td>
|
<td>
|
||||||
<UserSelect
|
<UserSelect
|
||||||
ref="userSelect"
|
ref="userSelect"
|
||||||
isMulti={false}
|
isMulti={true}
|
||||||
className="reviewer-select"
|
className="reviewer-select"
|
||||||
placeholder={gettext('Select users...')}
|
placeholder={gettext('Select users...')}
|
||||||
onSelectChange={this.handleSelectChange}
|
onSelectChange={this.handleSelectChange}
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<SharePermissionEditor
|
<DtableSharePermissionEditor
|
||||||
isTextMode={false}
|
isTextMode={false}
|
||||||
isEditIconShow={false}
|
isEditIconShow={false}
|
||||||
currentPermission={this.state.permission}
|
currentOption={this.state.permission}
|
||||||
permissions={this.permissions}
|
|
||||||
onPermissionChanged={this.setPermission}
|
onPermissionChanged={this.setPermission}
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
|
@@ -0,0 +1,81 @@
|
|||||||
|
import React, { Fragment } from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import Select from 'react-select';
|
||||||
|
import { gettext } from '../../utils/constants';
|
||||||
|
|
||||||
|
const propTypes = {
|
||||||
|
isTextMode: PropTypes.bool.isRequired,
|
||||||
|
isEditIconShow: PropTypes.bool.isRequired,
|
||||||
|
currentPermission: PropTypes.string.isRequired,
|
||||||
|
onPermissionChanged: PropTypes.func.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
class DtableSharePermissionEditor extends React.Component {
|
||||||
|
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.state = {
|
||||||
|
isEditing: false,
|
||||||
|
};
|
||||||
|
this.options = [
|
||||||
|
{ value: 'rw', label: <div>{gettext('Read-Write')}</div> },
|
||||||
|
{ value: 'r', label: <div>{gettext('Read-Only')}</div> }
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
document.addEventListener('click', this.onHideSelect);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
document.removeEventListener('click', this.onHideSelect);
|
||||||
|
}
|
||||||
|
|
||||||
|
onHideSelect = () => {
|
||||||
|
this.setState({ isEditing: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
onEditPermission = (e) => {
|
||||||
|
e.nativeEvent.stopImmediatePropagation();
|
||||||
|
this.setState({ isEditing: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
onPermissionChanged = (e) => {
|
||||||
|
if (e.value !== this.props.currentPermission) {
|
||||||
|
this.props.onPermissionChanged(e.value);
|
||||||
|
}
|
||||||
|
this.setState({ isEditing: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
onSelectHandler = (e) => {
|
||||||
|
e.nativeEvent.stopImmediatePropagation();
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const { currentPermission, isTextMode } = this.props;
|
||||||
|
let optionTranslation = currentPermission === 'r' ? gettext('Read-Only') : gettext('Read-Write');
|
||||||
|
return (
|
||||||
|
<div onClick={this.onSelectHandler}>
|
||||||
|
{(isTextMode && !this.state.isEditing) ?
|
||||||
|
<Fragment>
|
||||||
|
<span>{optionTranslation}</span>
|
||||||
|
{this.props.isEditIconShow &&
|
||||||
|
<span title={gettext('Edit')} className="fa fa-pencil-alt attr-action-icon" onClick={this.onEditPermission}></span>
|
||||||
|
}
|
||||||
|
</Fragment>
|
||||||
|
:
|
||||||
|
<Select
|
||||||
|
options={this.options}
|
||||||
|
placeholder={optionTranslation}
|
||||||
|
onChange={this.onPermissionChanged}
|
||||||
|
captureMenuScroll={false}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DtableSharePermissionEditor.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default DtableSharePermissionEditor;
|
@@ -165,6 +165,8 @@ Table.propTypes = tablePropTypes;
|
|||||||
|
|
||||||
const workspacePropTypes = {
|
const workspacePropTypes = {
|
||||||
workspace: PropTypes.object.isRequired,
|
workspace: PropTypes.object.isRequired,
|
||||||
|
setCurrentWorkspace: PropTypes.func.isRequired,
|
||||||
|
onAddDTable: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class Workspace extends Component {
|
class Workspace extends Component {
|
||||||
@@ -260,7 +262,7 @@ class Workspace extends Component {
|
|||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
<tr className={isItemFreezed ? "" : "add-table-range"}>
|
<tr className={isItemFreezed ? '' : 'add-table-range'}>
|
||||||
<td><span className="sf3-font sf3-font-add"></span></td>
|
<td><span className="sf3-font sf3-font-add"></span></td>
|
||||||
<td><a href="#" onClick={this.addTable}>{gettext('Add a table')}</a></td>
|
<td><a href="#" onClick={this.addTable}>{gettext('Add a table')}</a></td>
|
||||||
<td></td><td></td><td></td>
|
<td></td><td></td><td></td>
|
||||||
|
Reference in New Issue
Block a user