diff --git a/superset/assets/javascripts/SqlLab/components/CopyQueryTabUrl.jsx b/superset/assets/javascripts/SqlLab/components/CopyQueryTabUrl.jsx index 0891d4cd20..6eaa8f23ea 100644 --- a/superset/assets/javascripts/SqlLab/components/CopyQueryTabUrl.jsx +++ b/superset/assets/javascripts/SqlLab/components/CopyQueryTabUrl.jsx @@ -7,14 +7,7 @@ const propTypes = { }; export default class CopyQueryTabUrl extends React.PureComponent { - constructor(props) { - super(props); - this.state = { - shortUrl: '', - }; - } - - componentWillMount() { + getUrl(callback) { const qe = this.props.queryEditor; const params = []; if (qe.dbId) params.push('dbid=' + qe.dbId); @@ -25,20 +18,13 @@ export default class CopyQueryTabUrl extends React.PureComponent { const queryString = params.join('&'); const queryLink = window.location.pathname + '?' + queryString; - getShortUrl(queryLink, this.onShortUrlSuccess.bind(this)); - } - - onShortUrlSuccess(data) { - this.setState({ - shortUrl: data, - }); + getShortUrl(queryLink, callback); } render() { return ( share query @@ -46,6 +32,7 @@ export default class CopyQueryTabUrl extends React.PureComponent { )} tooltipText="copy URL to clipboard" shouldShowText={false} + getText={this.getUrl.bind(this)} /> ); } diff --git a/superset/assets/javascripts/components/CopyToClipboard.jsx b/superset/assets/javascripts/components/CopyToClipboard.jsx index 5badfb6982..92de59ceeb 100644 --- a/superset/assets/javascripts/components/CopyToClipboard.jsx +++ b/superset/assets/javascripts/components/CopyToClipboard.jsx @@ -3,9 +3,10 @@ import { Tooltip, OverlayTrigger, MenuItem } from 'react-bootstrap'; const propTypes = { copyNode: PropTypes.node, + getText: PropTypes.func, onCopyEnd: PropTypes.func, shouldShowText: PropTypes.bool, - text: PropTypes.string.isRequired, + text: PropTypes.string, inMenu: PropTypes.bool, tooltipText: PropTypes.string, }; @@ -36,12 +37,19 @@ export default class CopyToClipboard extends React.Component { 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() { - const textToCopy = this.props.text; + copyToClipboard(textToCopy) { const textArea = document.createElement('textarea'); textArea.style.position = 'fixed'; @@ -50,7 +58,6 @@ export default class CopyToClipboard extends React.Component { document.body.appendChild(textArea); textArea.select(); - try { if (!document.execCommand('copy')) { throw new Error('Not successful'); @@ -87,7 +94,7 @@ export default class CopyToClipboard extends React.Component { overlay={this.renderTooltip()} trigger={['hover']} bsStyle="link" - onClick={this.copyToClipboard} + onClick={this.onClick.bind(this)} onMouseOut={this.onMouseOut} > {this.props.copyNode} @@ -101,7 +108,7 @@ export default class CopyToClipboard extends React.Component { {this.props.copyNode} diff --git a/superset/assets/utils/common.js b/superset/assets/utils/common.js index 5b3a0bb938..adcdab10ab 100644 --- a/superset/assets/utils/common.js +++ b/superset/assets/utils/common.js @@ -55,15 +55,16 @@ export function getParamsFromUrl() { return newParams; } -export function getShortUrl(longUrl, callBack) { +export function getShortUrl(longUrl, callback) { $.ajax({ type: 'POST', url: '/r/shortner/', + async: false, data: { data: '/' + longUrl, }, success: (data) => { - callBack(data); + callback(data); }, error: (error) => { /* eslint no-console: 0 */ @@ -71,6 +72,7 @@ export function getShortUrl(longUrl, callBack) { console.warn('Something went wrong...'); console.warn(error); } + callback(longUrl); }, }); } diff --git a/superset/views.py b/superset/views.py index 454b8ab17b..8369ce3ca9 100755 --- a/superset/views.py +++ b/superset/views.py @@ -1115,7 +1115,7 @@ class R(BaseSupersetView): obj = models.Url(url=url) db.session.add(obj) db.session.commit() - return("{request.headers[Host]}/r/{obj.id}".format( + return("http://{request.headers[Host]}/r/{obj.id}".format( request=request, obj=obj)) @expose("/msg/")