1
0
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:
杨顺强
2019-01-09 14:39:17 +08:00
committed by Daniel Pan
parent 44af7136bf
commit 9c230cc5db
10 changed files with 123 additions and 49 deletions

View File

@@ -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>

View File

@@ -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

View File

@@ -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

View 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;

View 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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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;
}, },