-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
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
Refactor plot autosize #635
Conversation
@@ -379,7 +379,9 @@ lib.getPlotDiv = function(el) { | |||
|
|||
lib.isPlotDiv = function(el) { | |||
var el3 = d3.select(el); | |||
return el3.size() && el3.classed('js-plotly-plot'); | |||
return el3.node() instanceof HTMLElement && |
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.
Just for my own understanding: when would this not be an HTMLElement?
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.
if someone calls Plotly.Plots.supplyDefaults({ data: [], layout: {}});
- which should be allowed.
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.
If gd
isn't a HTMLElement
, el3.classed('js-plotly-plot')
throws an exception.
💃 |
dropping this PR from the |
I created some logic that finds the maximum size an element can be sized to without exceeding the boundaries of its parent. It takes into account margins, borders, padding, percentage widths, max-height/width, and sibling nodes. You can find it here: http://stackoverflow.com/a/39782139/122422 I think this is something that would help autosizing work better, since currently using autosizing seems to frequently exceed the boundaries of the graph's parent. |
Dropping from the This will be implemented in |
I'm super interested in this PR. Is there anything I can contribute? I am trying to use Plotly in a Flex layout and Plotly is not playing nicely. The major problem is Plotly's use of explicit width/height in pixels. Doing this makes an implicit size on the chart that will then cause the flex layout to never go less than size. Here's an example pen: http://codepen.io/JonDum/pen/gwEPPA If you resize horizontally you'll notice that it will grow larger, but never smaller. If you look at how Chartist.js handles this, they default to setting the |
... for backward compatibly, in particular https://plot.ly/javascript/responsive-fluid-layout/ - reset patched modebar, and resize test to original.
@n-riesco I (finally) resurrected your PR 🎉 To preserve backward compatibility, I had to add two commits:
I hope you find these two commits compatible with what you had in mind for this PR. |
Looks like github didn't get my email. Here's a copy: On 26/10/16 18:50, Étienne Tétreault-Pinard wrote: I don't understand how this commit works. If I read it correctly, something like Since Would the following work instead? if(['width', 'height'].indexOf(ai) !== -1 && vi === null) {
delete gd._fullLayout._initialAutoSizeIsDone;
} I can look into this tomorrow. I think this behaviour is better (and necessary to fix #537) |
Let me try. Thanks!
By this, you meant behaviour after my last commit (b6c5610) ?
The tests you added to fix #537 are still passing, anything else I should try to confirm that #537 is still fixed? |
Replacing 77971f4 with your suggestion makes the aforementioned relayout test case fail. The reason being:
it('sets null values to their default', function(done) {
var defaultWidth;
Plotly.plot(gd, [{ x: [1, 2, 3], y: [1, 2, 3] }])
.then(function() {
defaultWidth = gd._fullLayout.width;
defaultWidth // => 700
return Plotly.relayout(gd, { width: defaultWidth - 25});
})
.then(function() {
gd._fullLayout.width // => 675
expect(gd._fullLayout.width).toBe(defaultWidth - 25);
return Plotly.relayout(gd, { width: null });
})
.then(function() {
gd._fullLayout.width // => 675 BUT should 700 !!
expect(gd._fullLayout.width).toBe(defaultWidth);
})
.then(done);
}); |
Perhaps a better solution would be to cache the initial graph div width / height computed styles and use them in |
- so that relayout(gd, 'width', null) reset the graph to its initial width
@n-riesco I took your 👍 reaction on #635 (comment) as a sign of approval. Commit 5fb7cd1 implement the cache-initial-autosize solution. |
fixes #537
This PR sets up a base branch for the in-progress autosize refactor starting out by @n-riesco in #577 patched in #629 and then reverted in #633.
Important comments:
Plots.resize
backwards-compatibility #629 (comment)