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:
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;
|
96
frontend/src/components/select-editor/select-editor.js
Normal file
96
frontend/src/components/select-editor/select-editor.js
Normal 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;
|
Reference in New Issue
Block a user