1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-26 18:51:03 +00:00
seahub/frontend/src/components/customize-popover.js

92 lines
2.7 KiB
JavaScript
Raw Normal View History

import React from 'react';
import { Popover } from 'reactstrap';
import PropTypes from 'prop-types';
import { KeyCodes } from '../constants';
import { getEventClassName } from '../utils/dom';
const propTypes = {
target: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired,
boundariesElement: PropTypes.object,
innerClassName: PropTypes.string,
popoverClassName: PropTypes.string,
children: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
hidePopover: PropTypes.func.isRequired,
hidePopoverWithEsc: PropTypes.func,
hideArrow: PropTypes.bool,
canHidePopover: PropTypes.bool,
placement: PropTypes.string,
modifiers: PropTypes.object
};
class CustomizePopover extends React.Component {
popoverRef = null;
isSelectOpen = false;
componentDidMount() {
2023-12-19 04:13:49 +00:00
document.addEventListener('mousedown', this.onMouseDown);
document.addEventListener('keydown', this.onKeyDown);
}
componentWillUnmount() {
2023-12-19 04:13:49 +00:00
document.removeEventListener('mousedown', this.onMouseDown);
document.removeEventListener('keydown', this.onKeyDown);
}
onKeyDown = (e) => {
2025-03-10 06:27:08 +00:00
const { canHidePopover = true, hidePopoverWithEsc } = this.props;
if (e.keyCode === KeyCodes.Escape && typeof hidePopoverWithEsc === 'function' && !this.isSelectOpen) {
e.preventDefault();
hidePopoverWithEsc();
} else if (e.keyCode === KeyCodes.Enter) {
// Resolve the default behavior of the enter key when entering formulas is blocked
if (canHidePopover) return;
e.stopImmediatePropagation();
}
};
onMouseDown = (e) => {
2025-03-10 06:27:08 +00:00
const { canHidePopover = true } = this.props;
if (!canHidePopover) return;
if (this.popoverRef && e && getEventClassName(e).indexOf('popover') === -1 && !this.popoverRef.contains(e.target)) {
this.props.hidePopover(e);
}
};
onPopoverInsideClick = (e) => {
e.stopPropagation();
};
render() {
const {
2025-03-10 06:27:08 +00:00
target, boundariesElement, innerClassName, popoverClassName, hideArrow = true, modifiers,
placement = 'bottom-start',
} = this.props;
let additionalProps = {};
if (boundariesElement) {
additionalProps.boundariesElement = boundariesElement;
}
return (
<Popover
placement={placement}
isOpen={true}
target={target}
fade={false}
hideArrow={hideArrow}
innerClassName={innerClassName}
className={popoverClassName}
modifiers={modifiers}
{...additionalProps}
>
<div ref={ref => this.popoverRef = ref} onClick={this.onPopoverInsideClick}>
{this.props.children}
</div>
</Popover>
);
}
}
CustomizePopover.propTypes = propTypes;
export default CustomizePopover;