1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-10 11:21:29 +00:00
Files
seahub/frontend/src/components/select-editor/select-editor.js

153 lines
4.6 KiB
JavaScript
Raw Normal View History

2018-12-25 16:28:17 +08:00
import React from 'react';
import PropTypes from 'prop-types';
2019-01-09 14:39:17 +08:00
import { gettext } from '../../utils/constants';
2019-01-24 17:15:01 +08:00
import Select from 'react-select';
import { MenuSelectStyle } from '../common/select';
2019-01-24 17:15:01 +08:00
import '../../css/select-editor.css';
2018-12-25 16:28:17 +08:00
const propTypes = {
isTextMode: PropTypes.bool.isRequired, // there will be two mode. first: text and select. second: just select
isEditing: PropTypes.bool,
2018-12-26 16:07:22 +08:00
isEditIconShow: PropTypes.bool.isRequired,
2023-08-24 12:10:05 +08:00
autoFocus: PropTypes.bool,
2019-01-09 14:39:17 +08:00
options: PropTypes.array.isRequired,
currentOption: PropTypes.string.isRequired,
translateOption: PropTypes.func.isRequired,
2019-01-24 17:15:01 +08:00
translateExplanation: PropTypes.func,
2019-01-14 13:33:36 +08:00
onOptionChanged: PropTypes.func.isRequired,
2019-03-05 21:22:29 +08:00
toggleItemFreezed: PropTypes.func,
enableAddCustomPermission: PropTypes.bool,
onAddCustomPermissionToggle: PropTypes.func,
2018-12-25 16:28:17 +08:00
};
2019-01-09 14:39:17 +08:00
class SelectEditor extends React.Component {
2018-12-25 16:28:17 +08:00
static defaultProps = {
enableAddCustomPermission: false,
isEditing: false,
2023-08-24 12:10:05 +08:00
autoFocus: false,
};
2018-12-25 16:28:17 +08:00
constructor(props) {
super(props);
this.state = {
isEditing: props.isEditing,
options: []
};
2019-01-24 17:15:01 +08:00
this.options = [];
2018-12-25 16:28:17 +08:00
}
componentDidMount() {
2019-01-24 17:15:01 +08:00
this.setOptions();
}
setOptions = () => {
this.options = [];
const options = this.props.options;
for (let i = 0, length = options.length; i < length; i++) {
let option = {};
option.value = options[i];
if (!options[i].length) { // it's ''. for example, intitution option in 'system admin - users' page can be ''.
2024-07-18 11:58:42 +08:00
option.label = <div style={{ minHeight: '1em' }}></div>;
} else {
option.label = <div>{this.props.translateOption(options[i])}{ this.props.translateExplanation && <div className="permission-editor-explanation">{this.props.translateExplanation(options[i])}</div>}</div>;
}
2019-01-24 17:15:01 +08:00
this.options.push(option);
}
const { enableAddCustomPermission } = this.props;
if (enableAddCustomPermission) {
const option = {
value: gettext('Add custom permission'),
isDisabled: true,
label: (
2021-12-10 13:39:48 +08:00
<div className="permission-editor-btn-add-custom-permission" onClick={this.props.onAddCustomPermissionToggle}>
<i className="sf3-font sf3-font-enlarge"></i>
<span>{gettext('Add custom permission')}</span>
</div>
)
};
this.options.push(option);
}
this.setState({
options: this.options
2019-05-15 14:56:46 +08:00
});
};
2018-12-25 16:28:17 +08:00
UNSAFE_componentWillReceiveProps() {
this.setOptions();
}
2019-01-24 17:15:01 +08:00
onEditPermission = (e) => {
e.preventDefault();
2018-12-25 16:28:17 +08:00
e.nativeEvent.stopImmediatePropagation();
2024-07-18 11:58:42 +08:00
this.setState({ isEditing: true });
2019-03-05 21:22:29 +08:00
this.props.toggleItemFreezed && this.props.toggleItemFreezed(true);
};
2018-12-25 16:28:17 +08:00
2019-01-14 13:33:36 +08:00
onOptionChanged = (e) => {
2019-01-24 17:15:01 +08:00
let permission = e.value;
2019-01-09 14:39:17 +08:00
if (permission !== this.props.currentOption) {
2019-01-14 13:33:36 +08:00
this.props.onOptionChanged(permission);
2018-12-25 16:28:17 +08:00
}
2024-07-18 11:58:42 +08:00
this.setState({ isEditing: false });
2019-03-05 21:22:29 +08:00
this.props.toggleItemFreezed && this.props.toggleItemFreezed(false);
};
2018-12-25 16:28:17 +08:00
onSelectHandler = (e) => {
e.nativeEvent.stopImmediatePropagation();
};
2018-12-25 16:28:17 +08:00
2023-08-21 16:30:16 +08:00
onMenuClose = () => {
2024-07-18 11:58:42 +08:00
this.setState({ isEditing: false });
2019-03-05 21:22:29 +08:00
this.props.toggleItemFreezed && this.props.toggleItemFreezed(false);
};
2018-12-25 16:28:17 +08:00
render() {
2019-02-15 16:45:51 +08:00
let { currentOption, isTextMode } = this.props;
2018-12-25 16:28:17 +08:00
// scence1: isTextMode (text)editor-icon --> select
// scence2: !isTextMode select
return (
2019-01-24 17:15:01 +08:00
<div className="permission-editor" onClick={this.onSelectHandler}>
2018-12-25 16:28:17 +08:00
{(!isTextMode || this.state.isEditing) &&
2019-01-24 17:15:01 +08:00
<Select
options={this.state.options}
2019-01-24 17:15:01 +08:00
className="permission-editor-select"
2019-01-25 17:18:25 +08:00
classNamePrefix="permission-editor"
placeholder={this.props.translateOption(currentOption)}
value={currentOption}
2019-01-24 17:15:01 +08:00
onChange={this.onOptionChanged}
captureMenuScroll={false}
2021-12-10 13:39:48 +08:00
menuPlacement="auto"
menuPosition={'fixed'}
menuPortalTarget={document.querySelector('#wrapper')}
styles={MenuSelectStyle}
2023-08-21 16:30:16 +08:00
onMenuClose={this.onMenuClose}
2023-08-24 12:10:05 +08:00
autoFocus={this.props.autoFocus}
2021-12-10 13:39:48 +08:00
menuShouldScrollIntoView
2019-01-24 17:15:01 +08:00
/>
2018-12-25 16:28:17 +08:00
}
{(isTextMode && !this.state.isEditing) &&
<div>
2019-01-09 14:39:17 +08:00
{this.props.translateOption(currentOption)}
2018-12-26 16:07:22 +08:00
{this.props.isEditIconShow && (
<a href="#"
role="button"
aria-label={gettext('Edit')}
title={gettext('Edit')}
className="sf3-font sf3-font-rename attr-action-icon"
2019-01-24 17:15:01 +08:00
onClick={this.onEditPermission}>
</a>
2018-12-26 16:07:22 +08:00
)}
2018-12-25 16:28:17 +08:00
</div>
}
</div>
);
}
}
2019-01-09 14:39:17 +08:00
SelectEditor.propTypes = propTypes;
2018-12-25 16:28:17 +08:00
2019-01-09 14:39:17 +08:00
export default SelectEditor;