Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
c12b542
Fix loading selector with children starting at the same digit
T4rk1n Apr 15, 2025
fe78a05
Update changelog
T4rk1n Apr 15, 2025
a4bdc7d
Merge pull request #3278 from plotly/fix-loading-selector
T4rk1n Apr 15, 2025
e59ffe3
Remove flask typing import.
T4rk1n Apr 16, 2025
6e6def2
Update changelog
T4rk1n Apr 16, 2025
2e92526
Merge pull request #3280 from plotly/fix-flask-typing
T4rk1n Apr 16, 2025
e3c8ca0
alive url uses routes_pathname_prefix
Chiragasourabh Apr 16, 2025
4031d0e
Merge pull request #3281 from Chiragasourabh/dev
T4rk1n Apr 16, 2025
7a38d0b
Fix incorrect cancellation of pattern matched long callbacks
apmorton Apr 16, 2025
3b4c22a
Fix component as props used in the same container getting the same key
T4rk1n Apr 17, 2025
ce66da7
Take id as key first
T4rk1n Apr 17, 2025
9c45ff7
Update changelog
T4rk1n Apr 17, 2025
17fca44
Merge pull request #3284 from plotly/fix-cop-key
T4rk1n Apr 17, 2025
3349174
Fix typing generation & explicitize_args
T4rk1n Apr 22, 2025
a13849b
Add typing compliance tests with mypy & pyright
T4rk1n Apr 22, 2025
d1e614f
only run mypy test compliance on 3.12
T4rk1n Apr 22, 2025
a7569df
fix tuple number type assertion
T4rk1n Apr 22, 2025
1ae86a0
Fix test_generate_class_file
T4rk1n Apr 22, 2025
8a57d3a
try changing path
T4rk1n Apr 23, 2025
207aef9
change dir in fixture with cleanup
T4rk1n Apr 23, 2025
6e08afc
fix number type missing
T4rk1n Apr 23, 2025
49631fa
format
T4rk1n Apr 23, 2025
8b3a96a
update changelog
T4rk1n Apr 23, 2025
38f26fb
Merge pull request #3287 from plotly/fix/typing-component-gen
T4rk1n Apr 23, 2025
275f45a
Merge branch 'dev' into am/fix-long-callback-cancellation
T4rk1n Apr 23, 2025
3f87c9b
format
T4rk1n Apr 23, 2025
d9f9a25
Update changelog
T4rk1n Apr 23, 2025
e33e0ac
build
T4rk1n Apr 24, 2025
e1cc4fe
Merge pull request #3282 from apmorton/am/fix-long-callback-cancellation
T4rk1n Apr 24, 2025
d01938d
audit fix @plotly packages
T4rk1n Apr 24, 2025
e52a875
upgrade dependencies
T4rk1n Apr 24, 2025
b6d1f45
Fix random dash-table ts errors.
T4rk1n Apr 24, 2025
c9a15d4
fixes 3288 with allow_duplicates not working with Loading component t…
BSd3v Apr 24, 2025
a371c9b
Merge remote-tracking branch 'remote/dev' into fix/3288
BSd3v Apr 24, 2025
45b7963
fixes issue with `debugTitle` if there is no `status`
BSd3v Apr 24, 2025
d6fbc0e
updating changelog
BSd3v Apr 24, 2025
ff0be31
build
T4rk1n Apr 24, 2025
c56bb70
adding test
BSd3v Apr 24, 2025
3e2155a
fixing for lint
BSd3v Apr 24, 2025
fc531b7
opting for prop adjustment on callback instead of Loading
BSd3v Apr 24, 2025
4797336
updating for `property` undefined
BSd3v Apr 24, 2025
23528a1
Merge pull request #3289 from BSd3v/fix/3288
T4rk1n Apr 24, 2025
5ce115c
Merge branch 'dev' into update-deps-3.0.4
T4rk1n Apr 24, 2025
1512fb4
version 3.0.4
T4rk1n Apr 24, 2025
9191774
build
T4rk1n Apr 24, 2025
8ee6a46
Merge pull request #3290 from plotly/update-deps-3.0.4
T4rk1n Apr 24, 2025
495ff7c
Merge branch 'dev' into master-3.0.4
T4rk1n Apr 24, 2025
0827c93
3.0.4 build artifacts
T4rk1n Apr 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,524 changes: 801 additions & 723 deletions @plotly/dash-component-plugins/package-lock.json

Large diffs are not rendered by default.

1,463 changes: 837 additions & 626 deletions @plotly/dash-generator-test-component-nested/package-lock.json

Large diffs are not rendered by default.

1,463 changes: 837 additions & 626 deletions @plotly/dash-generator-test-component-standard/package-lock.json

Large diffs are not rendered by default.

1,522 changes: 830 additions & 692 deletions @plotly/dash-generator-test-component-typescript/package-lock.json

Large diffs are not rendered by default.

1,463 changes: 837 additions & 626 deletions @plotly/dash-test-components/package-lock.json

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@
All notable changes to `dash` will be documented in this file.
This project adheres to [Semantic Versioning](https://semver.org/).

## [3.0.4] - 2025-04-24

## Fixed
- [#3278](https://github.com/plotly/dash/pull/3278) Fix loading selector with children starting at the same digit. Fix [#3276](https://github.com/plotly/dash/issues/3276)
- [#3280](https://github.com/plotly/dash/pull/3280) Remove flask typing import not available in earlier versions.
- [#3284](https://github.com/plotly/dash/pull/3284) Fix component as props having the same key when used in the same container.
- [#3287](https://github.com/plotly/dash/pull/3287) Fix typing component generation & explicitize_args.
- [#3282](https://github.com/plotly/dash/pull/3282) Fix incorrect cancellation of pattern matched long callbacks.
- [#3289](https://github.com/plotly/dash/pull/3289) Fixed issue with debugTitle where status doesnt exist and allow_duplicates to ignore the hash for prop loading in the target.
- [#3281](https://github.com/plotly/dash/pull/3281) Use routes_pathname_prefix for internal Alive URL in Dash app. Fix [#3270](https://github.com/plotly/dash/issues/3270)

## [3.0.3] - 2025-04-14

## Fixed
Expand Down
46 changes: 23 additions & 23 deletions components/dash-core-components/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions components/dash-core-components/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dash-core-components",
"version": "3.0.5",
"version": "3.0.6",
"description": "Core component suite for Dash",
"repository": {
"type": "git",
Expand Down Expand Up @@ -63,9 +63,9 @@
"uniqid": "^5.4.0"
},
"devDependencies": {
"@babel/cli": "^7.26.4",
"@babel/cli": "^7.27.0",
"@babel/core": "^7.26.10",
"@babel/eslint-parser": "^7.26.10",
"@babel/eslint-parser": "^7.27.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/preset-env": "^7.26.9",
"@babel/preset-react": "^7.26.3",
Expand All @@ -86,7 +86,7 @@
"rimraf": "^5.0.5",
"style-loader": "^3.3.3",
"styled-jsx": "^3.4.4",
"webpack": "^5.98.0",
"webpack": "^5.99.6",
"webpack-cli": "^5.1.4"
},
"optionalDependencies": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@ const coveringSpinner = {

const loadingSelector = (componentPath, targetComponents) => state => {
let stringPath = JSON.stringify(componentPath);
// Remove the last ] for easy match
stringPath = stringPath.substring(0, stringPath.length - 1);
// Remove the last ] for easy match and add `,` to make sure only children
// trigger the loading. See issue: https://github.com/plotly/dash/issues/3276
stringPath = stringPath.substring(0, stringPath.length - 1) + ',';
const loadingChildren = toPairs(state.loading).reduce(
(acc, [path, load]) => {
if (path.startsWith(stringPath) && load.length) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const CircleSpinner = ({
style,
}) => {
let debugTitle;
if (debug) {
if (debug && status) {
debugTitle = status.map((s) => <DebugTitle {...s} />);
}
let spinnerClass = fullscreen ? 'dash-spinner-container' : '';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import DebugTitle from './DebugTitle.jsx';

const CubeSpinner = ({status, color, fullscreen, debug, className, style}) => {
let debugTitle;
if (debug) {
if (debug && status) {
debugTitle = status.map((s) => <DebugTitle {...s} />);
}
let spinnerClass = fullscreen ? 'dash-spinner-container' : '';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const DefaultSpinner = ({
style,
}) => {
let debugTitle;
if (debug) {
if (debug && status) {
debugTitle = status.map((s) => <DebugTitle {...s} />);
}
let spinnerClass = fullscreen ? 'dash-spinner-container' : '';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import DebugTitle from './DebugTitle.jsx';
*/
const DotSpinner = ({status, color, fullscreen, debug, className, style}) => {
let debugTitle;
if (debug) {
if (debug && status) {
debugTitle = status.map((s) => <DebugTitle {...s} />);
}
let spinnerClass = fullscreen ? 'dash-spinner-container' : '';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import DebugTitle from './DebugTitle.jsx';

const GraphSpinner = ({status, fullscreen, debug, className, style}) => {
let debugTitle;
if (debug) {
if (debug && status) {
debugTitle = status.map((s) => <DebugTitle {...s} />);
}
let spinnerClass = fullscreen ? 'dash-spinner-container' : '';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -689,3 +689,69 @@ def updateDiv(n_clicks):
dash_dcc.wait_for_text_to_equal("#div-1", "changed")

assert dash_dcc.get_logs() == []


# multiple components, only one triggers the spinner
def test_ldcp017_loading_component_target_components_duplicates(dash_dcc):

lock = Lock()

app = Dash(__name__)

app.layout = html.Div(
[
dcc.Loading(
[
html.Button(id="btn-1"),
html.Button(id="btn-2", children="content 2"),
],
className="loading-1",
target_components={"btn-2": "children"},
debug=True,
)
],
id="root",
)

@app.callback(Output("btn-1", "children"), [Input("btn-2", "n_clicks")])
def updateDiv1(n_clicks):
if n_clicks:
with lock:
return "changed 1"

return "content 1"

@app.callback(
Output("btn-2", "children", allow_duplicate=True),
[Input("btn-1", "n_clicks")],
prevent_initial_call=True,
)
def updateDiv2(n_clicks):
if n_clicks:
with lock:
return "changed 2"

return "content 2"

dash_dcc.start_server(app)

dash_dcc.wait_for_text_to_equal("#btn-1", "content 1")
dash_dcc.wait_for_text_to_equal("#btn-2", "content 2")

with lock:
dash_dcc.find_element("#btn-1").click()

dash_dcc.find_element(".loading-1 .dash-spinner")
dash_dcc.wait_for_text_to_equal("#btn-2", "")

dash_dcc.wait_for_text_to_equal("#btn-2", "changed 2")

with lock:
dash_dcc.find_element("#btn-2").click()
spinners = dash_dcc.find_elements(".loading-1 .dash-spinner")
dash_dcc.wait_for_text_to_equal("#btn-1", "")

dash_dcc.wait_for_text_to_equal("#btn-1", "changed 1")
assert spinners == []

assert dash_dcc.get_logs() == []
Loading