mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-01 07:01:12 +00:00
Select editor encapsulate (#2794)
This commit is contained in:
@@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
|
|||||||
import { gettext } from '../../utils/constants';
|
import { gettext } from '../../utils/constants';
|
||||||
import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Table } from 'reactstrap';
|
import { Button, Modal, ModalHeader, ModalBody, ModalFooter, Table } from 'reactstrap';
|
||||||
import { seafileAPI } from '../../utils/seafile-api.js';
|
import { seafileAPI } from '../../utils/seafile-api.js';
|
||||||
import PermissionEditor from '../permission-editor';
|
import RoleEditor from '../select-editor/role-eidtor';
|
||||||
import UserSelect from '../../models/user-select';
|
import UserSelect from '../../models/user-select';
|
||||||
import '../../css/manage-members-dialog.css';
|
import '../../css/manage-members-dialog.css';
|
||||||
|
|
||||||
@@ -152,10 +152,11 @@ class Member extends React.PureComponent {
|
|||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
this.roles = ['Admin', 'Member'];
|
||||||
}
|
}
|
||||||
|
|
||||||
onChangeUserPermission = (permission) => {
|
onChangeUserRole = (role) => {
|
||||||
let isAdmin = permission === 'Admin' ? 'True' : 'False';
|
let isAdmin = role === 'Admin' ? 'True' : 'False';
|
||||||
seafileAPI.setGroupAdmin(this.props.groupID, this.props.item.email, isAdmin).then((res) => {
|
seafileAPI.setGroupAdmin(this.props.groupID, this.props.item.email, isAdmin).then((res) => {
|
||||||
this.props.onGroupMembersChange();
|
this.props.onGroupMembersChange();
|
||||||
});
|
});
|
||||||
@@ -169,7 +170,6 @@ class Member extends React.PureComponent {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { item, isOwner } = this.props;
|
const { item, isOwner } = this.props;
|
||||||
const permissions = ['Admin', 'Member'];
|
|
||||||
return(
|
return(
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><img className="avatar" src={item.avatar_url} alt=""/></th>
|
<th scope="row"><img className="avatar" src={item.avatar_url} alt=""/></th>
|
||||||
@@ -179,12 +179,12 @@ class Member extends React.PureComponent {
|
|||||||
<span className="group-admin">{item.role}</span>
|
<span className="group-admin">{item.role}</span>
|
||||||
}
|
}
|
||||||
{(isOwner === true && item.role !== 'Owner') &&
|
{(isOwner === true && item.role !== 'Owner') &&
|
||||||
<PermissionEditor
|
<RoleEditor
|
||||||
isTextMode={true}
|
isTextMode={true}
|
||||||
isEditIconShow={true}
|
isEditIconShow={true}
|
||||||
currentPermission={this.props.item.role}
|
currentRole={this.props.item.role}
|
||||||
permissions={permissions}
|
roles={this.roles}
|
||||||
onPermissionChangedHandler={this.onChangeUserPermission}
|
onRoleChangedHandler={this.onChangeUserRole}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
</td>
|
</td>
|
||||||
|
@@ -5,7 +5,7 @@ import Select from 'react-select';
|
|||||||
import makeAnimated from 'react-select/lib/animated';
|
import makeAnimated from 'react-select/lib/animated';
|
||||||
import { gettext } from '../../utils/constants';
|
import { gettext } from '../../utils/constants';
|
||||||
import { seafileAPI } from '../../utils/seafile-api.js';
|
import { seafileAPI } from '../../utils/seafile-api.js';
|
||||||
import PermissionEditor from '../permission-editor';
|
import PermissionEditor from '../select-editor/permission-editor';
|
||||||
|
|
||||||
class GroupItem extends React.Component {
|
class GroupItem extends React.Component {
|
||||||
|
|
||||||
@@ -250,9 +250,9 @@ class ShareToGroup extends React.Component {
|
|||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th width="40%">{gettext('Group')}</th>
|
<th width="50%">{gettext('Group')}</th>
|
||||||
<th width="40%">{gettext('Permission')}</th>
|
<th width="35%">{gettext('Permission')}</th>
|
||||||
<th width="20%"></th>
|
<th width="15%"></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -298,9 +298,9 @@ class ShareToGroup extends React.Component {
|
|||||||
<table className="table-thead-hidden">
|
<table className="table-thead-hidden">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th width="40%">{gettext('Group')}</th>
|
<th width="50%">{gettext('Group')}</th>
|
||||||
<th width="40%">{gettext('Permission')}</th>
|
<th width="35%">{gettext('Permission')}</th>
|
||||||
<th width="20%"></th>
|
<th width="15%"></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<GroupList
|
<GroupList
|
||||||
|
@@ -4,7 +4,7 @@ import AsyncSelect from 'react-select/lib/Async';
|
|||||||
import { gettext } from '../../utils/constants';
|
import { gettext } 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 PermissionEditor from '../permission-editor';
|
import PermissionEditor from '../select-editor/permission-editor';
|
||||||
|
|
||||||
class UserItem extends React.Component {
|
class UserItem extends React.Component {
|
||||||
|
|
||||||
@@ -35,6 +35,7 @@ class UserItem extends React.Component {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
let item = this.props.item;
|
let item = this.props.item;
|
||||||
|
let currentPermission = item.is_admin ? 'admin' : item.permission;
|
||||||
return (
|
return (
|
||||||
<tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>
|
<tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>
|
||||||
<td className="name">{item.user_info.nickname}</td>
|
<td className="name">{item.user_info.nickname}</td>
|
||||||
@@ -42,7 +43,7 @@ class UserItem extends React.Component {
|
|||||||
<PermissionEditor
|
<PermissionEditor
|
||||||
isTextMode={true}
|
isTextMode={true}
|
||||||
isEditIconShow={this.state.isOperationShow}
|
isEditIconShow={this.state.isOperationShow}
|
||||||
currentPermission={item.permission}
|
currentPermission={currentPermission}
|
||||||
permissions={this.props.permissions}
|
permissions={this.props.permissions}
|
||||||
onPermissionChangedHandler={this.onChangeUserPermission}
|
onPermissionChangedHandler={this.onChangeUserPermission}
|
||||||
/>
|
/>
|
||||||
@@ -255,6 +256,7 @@ class ShareToUser extends React.Component {
|
|||||||
if (username === sharedItemUsername) {
|
if (username === sharedItemUsername) {
|
||||||
sharedItem.permission = permission;
|
sharedItem.permission = permission;
|
||||||
}
|
}
|
||||||
|
sharedItem.is_admin = permission === 'admin' ? true : false;
|
||||||
return sharedItem;
|
return sharedItem;
|
||||||
});
|
});
|
||||||
this.setState({sharedItems: sharedItems});
|
this.setState({sharedItems: sharedItems});
|
||||||
@@ -267,9 +269,9 @@ class ShareToUser extends React.Component {
|
|||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th width="40%">{gettext('User')}</th>
|
<th width="50%">{gettext('User')}</th>
|
||||||
<th width="40%">{gettext('Permission')}</th>
|
<th width="35%">{gettext('Permission')}</th>
|
||||||
<th width="20%"></th>
|
<th width="15%"></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -323,9 +325,9 @@ class ShareToUser extends React.Component {
|
|||||||
<table className="table-thead-hidden">
|
<table className="table-thead-hidden">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th width="40%">{gettext('User')}</th>
|
<th width="50%">{gettext('User')}</th>
|
||||||
<th width="40%">{gettext('Permission')}</th>
|
<th width="35%">{gettext('Permission')}</th>
|
||||||
<th width="20%"></th>
|
<th width="15%"></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<UserList
|
<UserList
|
||||||
|
36
frontend/src/components/select-editor/permission-editor.js
Normal file
36
frontend/src/components/select-editor/permission-editor.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { Utils } from '../../utils/utils';
|
||||||
|
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 PermissionEditor extends React.Component {
|
||||||
|
|
||||||
|
translatePermission = (permission) => {
|
||||||
|
return Utils.sharePerms(permission);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<SelectEditor
|
||||||
|
isTextMode={this.props.isTextMode}
|
||||||
|
isEditIconShow={this.props.isEditIconShow}
|
||||||
|
options={this.props.permissions}
|
||||||
|
currentOption={this.props.currentPermission}
|
||||||
|
onOptionChangedHandler={this.props.onPermissionChangedHandler}
|
||||||
|
translateOption={this.translatePermission}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PermissionEditor.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default PermissionEditor;
|
42
frontend/src/components/select-editor/role-eidtor.js
Normal file
42
frontend/src/components/select-editor/role-eidtor.js
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
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,
|
||||||
|
roles: PropTypes.array.isRequired,
|
||||||
|
currentRole: PropTypes.string.isRequired,
|
||||||
|
onRoleChangedHandler: PropTypes.func.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
class RoleEditor extends React.Component {
|
||||||
|
|
||||||
|
translateRole = (role) => {
|
||||||
|
if (role === 'Admin') {
|
||||||
|
return gettext('Admin');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (role === 'Member') {
|
||||||
|
return gettext('Member');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<SelectEditor
|
||||||
|
isTextMode={this.props.isTextMode}
|
||||||
|
isEditIconShow={this.props.isEditIconShow}
|
||||||
|
options={this.props.roles}
|
||||||
|
currentOption={this.props.currentRole}
|
||||||
|
onOptionChangedHandler={this.props.onRoleChangedHandler}
|
||||||
|
translateOption={this.translateRole}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RoleEditor.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default RoleEditor;
|
@@ -1,18 +1,18 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { Input } from 'reactstrap';
|
import { Input } from 'reactstrap';
|
||||||
import { Utils } from '../utils/utils';
|
import { gettext } from '../../utils/constants';
|
||||||
import { gettext } from '../utils/constants';
|
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
isTextMode: PropTypes.bool.isRequired, // there will be two mode. first: text and select. second: just select
|
isTextMode: PropTypes.bool.isRequired, // there will be two mode. first: text and select. second: just select
|
||||||
isEditIconShow: PropTypes.bool.isRequired,
|
isEditIconShow: PropTypes.bool.isRequired,
|
||||||
currentPermission: PropTypes.string.isRequired,
|
options: PropTypes.array.isRequired,
|
||||||
permissions: PropTypes.array.isRequired,
|
currentOption: PropTypes.string.isRequired,
|
||||||
onPermissionChangedHandler: PropTypes.func.isRequired,
|
translateOption: PropTypes.func.isRequired,
|
||||||
|
onOptionChangedHandler: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class PermissionEditor extends React.Component {
|
class SelectEditor extends React.Component {
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
@@ -34,11 +34,11 @@ class PermissionEditor extends React.Component {
|
|||||||
this.setState({isEditing: true});
|
this.setState({isEditing: true});
|
||||||
}
|
}
|
||||||
|
|
||||||
onPermissionChangedHandler = (e) => {
|
onOptionChangedHandler = (e) => {
|
||||||
e.nativeEvent.stopImmediatePropagation();
|
e.nativeEvent.stopImmediatePropagation();
|
||||||
let permission = e.target.value;
|
let permission = e.target.value;
|
||||||
if (permission !== this.props.currentPermission) {
|
if (permission !== this.props.currentOption) {
|
||||||
this.props.onPermissionChangedHandler(permission);
|
this.props.onOptionChangedHandler(permission);
|
||||||
}
|
}
|
||||||
this.setState({isEditing: false});
|
this.setState({isEditing: false});
|
||||||
}
|
}
|
||||||
@@ -52,7 +52,7 @@ class PermissionEditor extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let { currentPermission, permissions, isTextMode } = this.props;
|
let { currentOption, options, isTextMode } = this.props;
|
||||||
|
|
||||||
// scence1: isTextMode (text)editor-icon --> select
|
// scence1: isTextMode (text)editor-icon --> select
|
||||||
// scence2: !isTextMode select
|
// scence2: !isTextMode select
|
||||||
@@ -66,17 +66,17 @@ class PermissionEditor extends React.Component {
|
|||||||
return (
|
return (
|
||||||
<div className="permission-editor">
|
<div className="permission-editor">
|
||||||
{(!isTextMode || this.state.isEditing) &&
|
{(!isTextMode || this.state.isEditing) &&
|
||||||
<Input style={selectStyle} type="select" onChange={this.onPermissionChangedHandler} onClick={this.onSelectHandler} value={currentPermission}>
|
<Input style={selectStyle} type="select" onChange={this.onOptionChangedHandler} onClick={this.onSelectHandler} value={currentOption}>
|
||||||
{permissions.map((item, index) => {
|
{options.map((item, index) => {
|
||||||
return (
|
return (
|
||||||
<option key={index} value={item}>{Utils.sharePerms(item)}</option>
|
<option key={index} value={item}>{this.props.translateOption(item)}</option>
|
||||||
)
|
);
|
||||||
})}
|
})}
|
||||||
</Input>
|
</Input>
|
||||||
}
|
}
|
||||||
{(isTextMode && !this.state.isEditing) &&
|
{(isTextMode && !this.state.isEditing) &&
|
||||||
<div>
|
<div>
|
||||||
{Utils.sharePerms(currentPermission)}
|
{this.props.translateOption(currentOption)}
|
||||||
{this.props.isEditIconShow && (
|
{this.props.isEditIconShow && (
|
||||||
<span
|
<span
|
||||||
title={gettext('Edit')}
|
title={gettext('Edit')}
|
||||||
@@ -91,6 +91,6 @@ class PermissionEditor extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PermissionEditor.propTypes = propTypes;
|
SelectEditor.propTypes = propTypes;
|
||||||
|
|
||||||
export default PermissionEditor;
|
export default SelectEditor;
|
@@ -15,7 +15,7 @@ class Dirent {
|
|||||||
this.size = Utils.bytesToSize(json.size);
|
this.size = Utils.bytesToSize(json.size);
|
||||||
this.starred = json.starred || false;
|
this.starred = json.starred || false;
|
||||||
this.is_locked = json.is_locked || false;
|
this.is_locked = json.is_locked || false;
|
||||||
this.lock_time = moment.unix(json.lock_time).fromNow();
|
this.lock_time = json.lock_time;
|
||||||
this.lock_owner= json.lock_owner;
|
this.lock_owner= json.lock_owner;
|
||||||
this.locked_by_me = json.locked_by_me;
|
this.locked_by_me = json.locked_by_me;
|
||||||
this.modifier_name = json.modifier_name;
|
this.modifier_name = json.modifier_name;
|
||||||
|
@@ -3,7 +3,7 @@ import { Link } from '@reach/router';
|
|||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import { Utils } from '../../utils/utils';
|
import { Utils } from '../../utils/utils';
|
||||||
import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants';
|
import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants';
|
||||||
import PermissionEditor from '../../components/permission-editor';
|
import PermissionEditor from '../../components/select-editor/permission-editor';
|
||||||
import SharedFolderInfo from '../../models/shared-folder-info';
|
import SharedFolderInfo from '../../models/shared-folder-info';
|
||||||
|
|
||||||
class Content extends Component {
|
class Content extends Component {
|
||||||
|
@@ -3,7 +3,7 @@ import { Link } from '@reach/router';
|
|||||||
import { seafileAPI } from '../../utils/seafile-api';
|
import { seafileAPI } from '../../utils/seafile-api';
|
||||||
import { Utils } from '../../utils/utils';
|
import { Utils } from '../../utils/utils';
|
||||||
import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants';
|
import { gettext, siteRoot, loginUrl, isPro } from '../../utils/constants';
|
||||||
import PermissionEditor from '../../components/permission-editor';
|
import PermissionEditor from '../../components/select-editor/permission-editor';
|
||||||
import SharedRepoInfo from '../../models/shared-repo-info';
|
import SharedRepoInfo from '../../models/shared-repo-info';
|
||||||
|
|
||||||
class Content extends Component {
|
class Content extends Component {
|
||||||
|
@@ -321,12 +321,6 @@ export const Utils = {
|
|||||||
case 'preview':
|
case 'preview':
|
||||||
title = gettext("Preview-on-Cloud");
|
title = gettext("Preview-on-Cloud");
|
||||||
break;
|
break;
|
||||||
case 'Member':
|
|
||||||
title = gettext("Member");
|
|
||||||
break;
|
|
||||||
case 'Admin':
|
|
||||||
title = gettext("Admin");
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return title;
|
return title;
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user