-
-
Notifications
You must be signed in to change notification settings - Fork 2k
Add ability to use custom URL in cloud upload dialog #7896
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: v4.0
Are you sure you want to change the base?
Changes from 14 commits
ea44ed3
9b9c0d1
4fb6bf9
f051fe2
b03fb13
5ced48c
4a66d68
7c6d279
11cc8e1
dd0a79a
f34bc9c
1543deb
28b2af3
5ad9932
f6b3cfb
3aaf531
7bb2805
ce17c4c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| - Add ability to use custom URL for chart upload from the dialog UI [[#7896](https://github.com/plotly/plotly.js/pull/7896)] |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -11,9 +11,15 @@ var _ = require('../../lib')._; | |
| * so it is centered over the plot rather than the whole viewport. It can be | ||
| * dismissed by clicking Cancel, clicking the backdrop, or pressing Escape. | ||
| * | ||
| * By default the chart is uploaded to the configured plotlyServerURL. A | ||
| * "Use a custom server URL" link reveals an editable "Server URL" field | ||
| * pre-filled with that default; whatever the user leaves in the field when they | ||
| * confirm becomes the destination, so a custom URL entered here overrides the | ||
| * plotlyServerURL config for that upload. | ||
| * | ||
| * @param {DOM node} gd - the graph div, used to scope the dialog to the plot | ||
| * @param {string} serverUrl - destination shown in the dialog message | ||
| * @param {function} onConfirm - called when the user confirms the upload | ||
| * @param {string} serverUrl - default destination | ||
| * @param {function} onConfirm - called with the (possibly edited) server URL when confirmed | ||
| */ | ||
| module.exports = function confirmCloudDialog(gd, serverUrl, onConfirm) { | ||
| var container = d3.select(gd._fullLayout._paperdiv.node()); | ||
|
|
@@ -30,11 +36,38 @@ module.exports = function confirmCloudDialog(gd, serverUrl, onConfirm) { | |
|
|
||
| dialog.append('div') | ||
| .classed('plotly-cloud-dialog-title', true) | ||
| .text(_(gd, 'Share with Plotly Cloud')); | ||
| .text(_(gd, 'Share Chart')); | ||
|
|
||
| dialog.append('div') | ||
| .classed('plotly-cloud-dialog-message', true) | ||
| .text(_(gd, 'This chart and its data will be sent to') + ' ' + serverUrl + '.'); | ||
| var serverUrlText = new URL(serverUrl).hostname; | ||
|
|
||
| var description = dialog.append('div'); | ||
| description.classed('plotly-cloud-dialog-message', true); | ||
| description.append('span').text(_(gd, 'This chart and its data will be sent to ')); | ||
| description.append('span').text(serverUrlText).classed('plotly-cloud-dialog-message--hostname', true); | ||
| description.append('span').text('. '); | ||
|
|
||
| // The custom-URL field stays hidden until the user opts in. By default the | ||
| // chart is shared to the configured serverUrl; a button in the button row | ||
| // reveals this input for anyone who wants to override that destination. | ||
| var urlField = dialog.append('div') | ||
| .classed('plotly-cloud-dialog-url-field', true) | ||
| .style('display', 'none'); | ||
|
|
||
| urlField.append('label') | ||
| .classed('plotly-cloud-dialog-label', true) | ||
| .attr('for', 'plotly-cloud-dialog-url') | ||
| .text(_(gd, 'Dash Enterprise URL')); | ||
|
|
||
| var input = urlField.append('input') | ||
| .classed('plotly-cloud-dialog-input', true) | ||
| .attr('id', 'plotly-cloud-dialog-url') | ||
| .attr('type', 'text') | ||
| .attr('spellcheck', false) | ||
| .attr('placeholder', 'https://<your-dash-enterprise-instance>/'); | ||
|
|
||
| var error = dialog.append('div') | ||
| .classed('plotly-cloud-dialog-error', true) | ||
| .style('display', 'none'); | ||
|
|
||
| var buttons = dialog.append('div') | ||
| .classed('plotly-cloud-dialog-buttons', true); | ||
|
|
@@ -54,6 +87,52 @@ module.exports = function confirmCloudDialog(gd, serverUrl, onConfirm) { | |
| if(d3.event.target === overlay.node()) close(); | ||
| }); | ||
|
|
||
| function confirm() { | ||
| var url = (input.property('value') || serverUrl).trim(); | ||
|
|
||
| if(!url) { | ||
| error.text(_(gd, 'Please enter a server URL.')).style('display', ''); | ||
| input.node().focus(); | ||
| return; | ||
| } | ||
|
|
||
| if (!url.startsWith('http://') && !url.startsWith('https://')) { | ||
| url = 'https://' + url; | ||
| } | ||
|
|
||
| try { | ||
| new URL(url); | ||
| } catch(e) { | ||
| error.text(_(gd, 'Please enter a valid server URL.')).style('display', ''); | ||
| input.node().focus(); | ||
| return; | ||
| } | ||
|
|
||
| close(); | ||
| onConfirm(url); | ||
| } | ||
|
|
||
| // Hide the error and allow Enter to confirm from the input. | ||
| input.on('input', function() { | ||
| error.style('display', 'none'); | ||
| }); | ||
| input.on('keydown', function() { | ||
| if(d3.event.key === 'Enter' || d3.event.keyCode === 13) confirm(); | ||
| }); | ||
|
|
||
| var customBtn = buttons.append('button') | ||
| .classed('plotly-cloud-dialog-btn', true) | ||
| .classed('plotly-cloud-dialog-btn--custom', true) | ||
| .attr('type', 'button') | ||
| .text(_(gd, 'Share to Dash Enterprise')); | ||
|
|
||
| customBtn.on('click', function() { | ||
| customBtn.style('display', 'none'); | ||
| urlField.style('display', ''); | ||
| description.text(_(gd, 'If your Dash Enterprise instance supports chart sharing, you can enter its URL below. This chart and its data will be sent to the URL you provide.')); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "Enter the url of your Dash Enterprise chart server below or contact Plotly support to get set up. This chart and its data will be sent to the URL you provide."
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @emilykl Are you good with this wording? |
||
| input.node().focus(); | ||
| }); | ||
|
|
||
| buttons.append('button') | ||
| .classed('plotly-cloud-dialog-btn', true) | ||
| .classed('plotly-cloud-dialog-btn--cancel', true) | ||
|
|
@@ -64,8 +143,5 @@ module.exports = function confirmCloudDialog(gd, serverUrl, onConfirm) { | |
| .classed('plotly-cloud-dialog-btn', true) | ||
| .classed('plotly-cloud-dialog-btn--confirm', true) | ||
| .text(_(gd, 'Share')) | ||
| .on('click', function() { | ||
| close(); | ||
| onConfirm(); | ||
| }); | ||
| .on('click', confirm); | ||
| }; | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Chart Server URL
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@emilykl Are you good with this wording?