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';
|
2023-09-18 10:01:30 +08:00
|
|
|
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
|
2023-08-17 23:19:19 +08:00
|
|
|
isEditing: PropTypes.bool,
|
2018-12-26 16:07:22 +08:00
|
|
|
isEditIconShow: PropTypes.bool.isRequired,
|
2024-07-25 17:28:55 +08:00
|
|
|
isWiki: PropTypes.bool,
|
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,
|
2021-09-13 10:37:07 +08:00
|
|
|
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
|
|
|
|
2021-09-13 10:37:07 +08:00
|
|
|
static defaultProps = {
|
|
|
|
enableAddCustomPermission: false,
|
2023-08-17 23:19:19 +08:00
|
|
|
isEditing: false,
|
2023-08-24 12:10:05 +08:00
|
|
|
autoFocus: false,
|
2023-09-13 08:40:50 +08:00
|
|
|
};
|
2021-09-13 10:37:07 +08:00
|
|
|
|
2018-12-25 16:28:17 +08:00
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
2023-08-17 23:19:19 +08:00
|
|
|
isEditing: props.isEditing,
|
2019-05-15 08:01:48 +08:00
|
|
|
options: []
|
2019-01-31 17:37:02 +08:00
|
|
|
};
|
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];
|
2019-11-02 17:02:26 +08:00
|
|
|
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>;
|
2019-11-02 17:02:26 +08:00
|
|
|
} 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);
|
|
|
|
}
|
2019-05-15 08:01:48 +08:00
|
|
|
|
2021-09-13 10:37:07 +08:00
|
|
|
const { enableAddCustomPermission } = this.props;
|
2024-07-25 17:28:55 +08:00
|
|
|
if (enableAddCustomPermission && !this.props.isWiki) {
|
2021-09-13 10:37:07 +08:00
|
|
|
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}>
|
2024-06-28 08:39:44 +08:00
|
|
|
<i className="sf3-font sf3-font-enlarge"></i>
|
2021-09-13 10:37:07 +08:00
|
|
|
<span>{gettext('Add custom permission')}</span>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
};
|
|
|
|
this.options.push(option);
|
|
|
|
}
|
|
|
|
|
2019-05-15 08:01:48 +08:00
|
|
|
this.setState({
|
|
|
|
options: this.options
|
2019-05-15 14:56:46 +08:00
|
|
|
});
|
2023-09-13 08:40:50 +08:00
|
|
|
};
|
2018-12-25 16:28:17 +08:00
|
|
|
|
2023-12-06 17:24:05 +08:00
|
|
|
UNSAFE_componentWillReceiveProps() {
|
2019-10-12 14:54:25 +08:00
|
|
|
this.setOptions();
|
|
|
|
}
|
|
|
|
|
2019-01-24 17:15:01 +08:00
|
|
|
onEditPermission = (e) => {
|
2021-09-24 17:11:14 +08:00
|
|
|
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);
|
2023-09-13 08:40:50 +08:00
|
|
|
};
|
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);
|
2023-09-13 08:40:50 +08:00
|
|
|
};
|
2018-12-25 16:28:17 +08:00
|
|
|
|
|
|
|
onSelectHandler = (e) => {
|
|
|
|
e.nativeEvent.stopImmediatePropagation();
|
2023-09-13 08:40:50 +08:00
|
|
|
};
|
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);
|
2023-09-13 08:40:50 +08:00
|
|
|
};
|
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
|
|
|
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
|
2019-05-15 08:01:48 +08:00
|
|
|
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"
|
2024-08-01 20:47:46 +08:00
|
|
|
value={this.state.options.filter(item => item.value == currentOption)[0]}
|
2019-01-24 17:15:01 +08:00
|
|
|
onChange={this.onOptionChanged}
|
2019-03-07 12:23:44 +08:00
|
|
|
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 && (
|
2021-09-24 17:11:14 +08:00
|
|
|
<a href="#"
|
|
|
|
role="button"
|
|
|
|
aria-label={gettext('Edit')}
|
2020-11-02 13:56:35 +08:00
|
|
|
title={gettext('Edit')}
|
2024-06-28 08:39:44 +08:00
|
|
|
className="sf3-font sf3-font-rename attr-action-icon"
|
2019-01-24 17:15:01 +08:00
|
|
|
onClick={this.onEditPermission}>
|
2021-09-24 17:11:14 +08:00
|
|
|
</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;
|