1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-02 23:48:47 +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

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

@@ -0,0 +1,96 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Input } from 'reactstrap';
import { gettext } from '../../utils/constants';
const propTypes = {
isTextMode: PropTypes.bool.isRequired, // there will be two mode. first: text and select. second: just select
isEditIconShow: PropTypes.bool.isRequired,
options: PropTypes.array.isRequired,
currentOption: PropTypes.string.isRequired,
translateOption: PropTypes.func.isRequired,
onOptionChangedHandler: PropTypes.func.isRequired,
};
class SelectEditor extends React.Component {
constructor(props) {
super(props);
this.state = {
isEditing: false,
}
}
componentDidMount() {
document.addEventListener('click', this.onHideSelect);
}
componentWillUnmount() {
document.removeEventListener('click', this.onHideSelect);
}
onEidtPermission = (e) => {
e.nativeEvent.stopImmediatePropagation();
this.setState({isEditing: true});
}
onOptionChangedHandler = (e) => {
e.nativeEvent.stopImmediatePropagation();
let permission = e.target.value;
if (permission !== this.props.currentOption) {
this.props.onOptionChangedHandler(permission);
}
this.setState({isEditing: false});
}
onSelectHandler = (e) => {
e.nativeEvent.stopImmediatePropagation();
}
onHideSelect = () => {
this.setState({isEditing: false});
}
render() {
let { currentOption, options, isTextMode } = this.props;
// scence1: isTextMode (text)editor-icon --> select
// scence2: !isTextMode select
let selectStyle = {
height: '1.5rem',
padding: 0
};
if (!isTextMode) {
selectStyle = {};
}
return (
<div className="permission-editor">
{(!isTextMode || this.state.isEditing) &&
<Input style={selectStyle} type="select" onChange={this.onOptionChangedHandler} onClick={this.onSelectHandler} value={currentOption}>
{options.map((item, index) => {
return (
<option key={index} value={item}>{this.props.translateOption(item)}</option>
);
})}
</Input>
}
{(isTextMode && !this.state.isEditing) &&
<div>
{this.props.translateOption(currentOption)}
{this.props.isEditIconShow && (
<span
title={gettext('Edit')}
className="fa fa-pencil attr-action-icon"
onClick={this.onEidtPermission}>
</span>
)}
</div>
}
</div>
);
}
}
SelectEditor.propTypes = propTypes;
export default SelectEditor;