Skip to content

Commit c62bfa3

Browse files
authored
Merge branch 'v4' into feat/add-folder-upload-support
2 parents 8fabf95 + f86ac93 commit c62bfa3

File tree

15 files changed

+23021
-2677
lines changed

15 files changed

+23021
-2677
lines changed

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ This project adheres to [Semantic Versioning](https://semver.org/).
3939
- [#3398](https://github.com/plotly/dash/pull/3398) Modernize dcc.Input
4040
- [#3414](https://github.com/plotly/dash/pull/3414) Modernize dcc.Slider
4141

42-
## [UNRELEASED]
42+
## [3.3.0] - 2025-11-12
4343

4444
## Added
4545
- [#3464](https://github.com/plotly/dash/issues/3464) Add folder upload functionality to `dcc.Upload` component. When `multiple=True`, users can now select and upload entire folders in addition to individual files. The folder hierarchy is preserved in filenames (e.g., `folder/subfolder/file.txt`). Files within folders are filtered according to the `accept` prop. Folder support is available in Chrome, Edge, and Opera; other browsers gracefully fall back to file-only mode. The uploaded files use the same output API as multiple file uploads.
@@ -54,10 +54,15 @@ This project adheres to [Semantic Versioning](https://semver.org/).
5454
- [#3465](https://github.com/plotly/dash/pull/3465) Plotly cloud integrations, add devtool API, placeholder plotly cloud CLI & publish button, `dash[cloud]` extra dependencies.
5555

5656
## Fixed
57+
- [#3490](https://github.com/plotly/dash/pull/3490) Fix stack overflow when circular callbacks are displayed on the devtool callback
5758
- [#3395](https://github.com/plotly/dash/pull/3395) Fix Components added through set_props() cannot trigger related callback functions. Fix [#3316](https://github.com/plotly/dash/issues/3316)
5859
- [#3415](https://github.com/plotly/dash/pull/3415) Fix the error triggered when only a single no_update is returned for client-side callback functions with multiple Outputs. Fix [#3366](https://github.com/plotly/dash/issues/3366)
5960
- [#3416](https://github.com/plotly/dash/issues/3416) Fix DeprecationWarning in dash/_jupyter.py by migrating from deprecated ipykernel.comm.Comm to comm module
6061
- [#3488](https://github.com/plotly/dash/pull/3488) Fix pkgutil.find_loader removal in Python 3.14
62+
- [#3496](https://github.com/plotly/dash/pull/3496) Fix dcc.Graph infinite resize loop
63+
64+
## Deprecated
65+
- [#3482](https://github.com/plotly/dash/pull/3482) Deprecate dash_table.DataTable with replacement from `dash[ag-grid]` extra requirement.
6166

6267
## Deprecated
6368
- [#3482](https://github.com/plotly/dash/pull/3482) Deprecate dash_table.DataTable with replacement from `dash[ag-grid]` extra requirement.

CONTRIBUTING.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,13 @@ Open a Bash terminal in the `dash` repository, Git Bash terminal for example on
8080

8181
On some Linux/Mac environments, use `.` instead of `source`
8282
```bash
83-
$ python3 -m venv .venv/dev
84-
$ source .venv/dev/bin/activate
83+
$ python3 -m venv venv
84+
$ source venv/bin/activate
8585
```
8686
- Windows:
8787
```bash
88-
$ python -m venv .venv/dev
89-
$ source .venv/dev/scripts/activate
88+
$ python -m venv venv
89+
$ source venv/scripts/activate
9090
```
9191

9292
Install dash and dependencies:

components/dash-core-components/package-lock.json

Lines changed: 11079 additions & 272 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/dash-core-components/package.json

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@
6767
"uniqid": "^5.4.0"
6868
},
6969
"devDependencies": {
70-
"@babel/cli": "^7.28.0",
71-
"@babel/core": "^7.28.0",
72-
"@babel/eslint-parser": "^7.28.0",
70+
"@babel/cli": "^7.28.3",
71+
"@babel/core": "^7.28.5",
72+
"@babel/eslint-parser": "^7.28.5",
7373
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
74-
"@babel/preset-env": "^7.28.0",
75-
"@babel/preset-react": "^7.27.1",
76-
"@babel/preset-typescript": "^7.27.1",
74+
"@babel/preset-env": "^7.28.5",
75+
"@babel/preset-react": "^7.28.5",
76+
"@babel/preset-typescript": "^7.28.5",
7777
"@plotly/dash-component-plugins": "^1.2.3",
7878
"@plotly/webpack-dash-dynamic-import": "^1.3.0",
7979
"@types/d3-format": "^3.0.4",
@@ -106,7 +106,7 @@
106106
"styled-jsx": "^5.1.7",
107107
"ts-jest": "^29.1.0",
108108
"typescript": "^5.8.3",
109-
"webpack": "^5.101.0",
109+
"webpack": "^5.102.1",
110110
"webpack-cli": "^5.1.4"
111111
},
112112
"optionalDependencies": {
@@ -122,6 +122,5 @@
122122
},
123123
"browserslist": [
124124
"last 9 years and not dead"
125-
],
126-
"gitHead": "fdbd6e0b8dc2448175dad301ed9004c918332d34"
125+
]
127126
}

components/dash-core-components/src/fragments/Graph.react.js

Lines changed: 21 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ class PlotlyGraph extends Component {
393393

394394
gd.classList.add('dash-graph--pending');
395395

396+
// Calling resize enables layout.autosize in plotly.js
396397
Plotly.Plots.resize(gd)
397398
.catch(() => {})
398399
.finally(() => gd.classList.remove('dash-graph--pending'));
@@ -457,27 +458,6 @@ class PlotlyGraph extends Component {
457458
});
458459
}
459460

460-
getStyle() {
461-
const {responsive} = this.props;
462-
let {style} = this.props;
463-
464-
// When there is no forced responsive style, return the original style property
465-
if (!responsive) {
466-
return style;
467-
}
468-
469-
// Otherwise, if the height is not set, we make the graph size equal to the parent one
470-
if (!style) {
471-
style = {};
472-
}
473-
474-
if (!style.height) {
475-
return Object.assign({height: '100%'}, style);
476-
}
477-
478-
return style;
479-
}
480-
481461
componentDidMount() {
482462
const p = this.plot(this.props);
483463
this._queue = this.amendTraces(p, {}, this.props);
@@ -536,46 +516,33 @@ class PlotlyGraph extends Component {
536516
}
537517

538518
render() {
539-
const {className, id, loading_state} = this.props;
540-
const style = this.getStyle();
541-
542-
if (window.dash_component_api) {
543-
return (
544-
<LoadingElement
545-
id={id}
546-
key={id}
547-
className={className}
548-
style={style}
549-
ref={this.parentElement}
550-
>
551-
<ResizeDetector
552-
onResize={this.graphResize}
553-
targets={[this.parentElement, this.gd]}
554-
/>
555-
<div
556-
ref={this.gd}
557-
style={{height: '100%', width: '100%'}}
558-
/>
559-
</LoadingElement>
560-
);
519+
const {className, id, loading_state, style = {}} = this.props;
520+
if (this.isResponsive(this.props)) {
521+
style.height ||= '100%';
561522
}
523+
524+
let Container = LoadingElement;
525+
const containerProps = {
526+
className,
527+
id,
528+
key: id,
529+
ref: this.parentElement,
530+
style,
531+
};
532+
if (!window.dash_component_api) {
533+
Container = 'div';
534+
containerProps['data-dash-is-loading'] =
535+
loading_state?.is_loading || undefined;
536+
}
537+
562538
return (
563-
<div
564-
id={id}
565-
key={id}
566-
className={className}
567-
style={style}
568-
ref={this.parentElement}
569-
data-dash-is-loading={
570-
(loading_state && loading_state.is_loading) || undefined
571-
}
572-
>
539+
<Container {...containerProps}>
573540
<ResizeDetector
574541
onResize={this.graphResize}
575542
targets={[this.parentElement, this.gd]}
576543
/>
577544
<div ref={this.gd} style={{height: '100%', width: '100%'}} />
578-
</div>
545+
</Container>
579546
);
580547
}
581548
}

0 commit comments

Comments
 (0)