mirror of
https://github.com/apache/superset.git
synced 2026-04-09 19:35:21 +00:00
* Fixing PropTypes warning message React recently started warning on the upcoming deprecation of React.PropTypes, the new approach is to use the `prop-types` npm package instead. * Fixing the tests
143 lines
3.2 KiB
JavaScript
143 lines
3.2 KiB
JavaScript
import React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import { Tooltip, OverlayTrigger, MenuItem } from 'react-bootstrap';
|
|
|
|
const propTypes = {
|
|
copyNode: PropTypes.node,
|
|
getText: PropTypes.func,
|
|
onCopyEnd: PropTypes.func,
|
|
shouldShowText: PropTypes.bool,
|
|
text: PropTypes.string,
|
|
inMenu: PropTypes.bool,
|
|
tooltipText: PropTypes.string,
|
|
};
|
|
|
|
const defaultProps = {
|
|
copyNode: <span>Copy</span>,
|
|
onCopyEnd: () => {},
|
|
shouldShowText: true,
|
|
inMenu: false,
|
|
tooltipText: 'Copy to clipboard',
|
|
};
|
|
|
|
export default class CopyToClipboard extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
hasCopied: false,
|
|
};
|
|
|
|
// bindings
|
|
this.copyToClipboard = this.copyToClipboard.bind(this);
|
|
this.resetTooltipText = this.resetTooltipText.bind(this);
|
|
this.onMouseOut = this.onMouseOut.bind(this);
|
|
}
|
|
|
|
onMouseOut() {
|
|
// delay to avoid flash of text change on tooltip
|
|
setTimeout(this.resetTooltipText, 200);
|
|
}
|
|
|
|
onClick() {
|
|
if (this.props.getText) {
|
|
this.props.getText((d) => { this.copyToClipboard(d); });
|
|
} else {
|
|
this.copyToClipboard(this.props.text);
|
|
}
|
|
}
|
|
|
|
resetTooltipText() {
|
|
this.setState({ hasCopied: false });
|
|
}
|
|
|
|
copyToClipboard(textToCopy) {
|
|
const textArea = document.createElement('textarea');
|
|
|
|
textArea.style.position = 'fixed';
|
|
textArea.style.left = '-1000px';
|
|
textArea.value = textToCopy;
|
|
|
|
document.body.appendChild(textArea);
|
|
textArea.select();
|
|
try {
|
|
if (!document.execCommand('copy')) {
|
|
throw new Error('Not successful');
|
|
}
|
|
} catch (err) {
|
|
window.alert('Sorry, your browser does not support copying. Use Ctrl / Cmd + C!'); // eslint-disable-line
|
|
}
|
|
|
|
document.body.removeChild(textArea);
|
|
|
|
this.setState({ hasCopied: true });
|
|
this.props.onCopyEnd();
|
|
}
|
|
|
|
tooltipText() {
|
|
if (this.state.hasCopied) {
|
|
return 'Copied!';
|
|
}
|
|
return this.props.tooltipText;
|
|
}
|
|
|
|
renderLink() {
|
|
return (
|
|
<span>
|
|
{this.props.shouldShowText &&
|
|
<span>
|
|
{this.props.text}
|
|
|
|
</span>
|
|
}
|
|
<OverlayTrigger
|
|
placement="top"
|
|
style={{ cursor: 'pointer' }}
|
|
overlay={this.renderTooltip()}
|
|
trigger={['hover']}
|
|
bsStyle="link"
|
|
onClick={this.onClick.bind(this)}
|
|
onMouseOut={this.onMouseOut}
|
|
>
|
|
{this.props.copyNode}
|
|
</OverlayTrigger>
|
|
</span>
|
|
);
|
|
}
|
|
|
|
renderInMenu() {
|
|
return (
|
|
<OverlayTrigger placement="top" overlay={this.renderTooltip()} trigger={['hover']}>
|
|
<MenuItem>
|
|
<span
|
|
onClick={this.onClick.bind(this)}
|
|
onMouseOut={this.onMouseOut}
|
|
>
|
|
{this.props.copyNode}
|
|
</span>
|
|
</MenuItem>
|
|
</OverlayTrigger>
|
|
);
|
|
}
|
|
|
|
renderTooltip() {
|
|
return (
|
|
<Tooltip id="copy-to-clipboard-tooltip">
|
|
{this.tooltipText()}
|
|
</Tooltip>
|
|
);
|
|
}
|
|
|
|
render() {
|
|
let html;
|
|
if (this.props.inMenu) {
|
|
html = this.renderInMenu();
|
|
} else {
|
|
html = this.renderLink();
|
|
}
|
|
return html;
|
|
}
|
|
}
|
|
|
|
CopyToClipboard.propTypes = propTypes;
|
|
CopyToClipboard.defaultProps = defaultProps;
|