Nuno23C opened a new issue, #40375:
URL: https://github.com/apache/superset/issues/40375
### Bug description
## How to reproduce the bug
1. Start from a stock Superset 6.1.0 deployment (e.g.
`apache/superset:6.1.0`).
2. Add the following to `superset_config.py` — a minimal partial override of
`THEME_DEFAULT`, matching the pattern shown in PR #35220's own testing
instructions:
```python
THEME_DEFAULT = {
"token": {
"colorPrimary": "#ff0000",
},
"algorithm": "default",
}
```
3. Restart the web container.
4. Open `/login/` in a browser with DevTools → Console open.
### Expected results
The login page renders with the customized `colorPrimary`. Unspecified token
fields fall back to the built-in defaults (consistent with what the official
theming docs promise: *"Superset validates theme JSON… falls back to the
built-in default theme rather than applying a broken configuration."*).
### Actual results
The page is blank. The console shows:
```
Failed to apply theme: TypeError: Cannot read properties of undefined
(reading 'startsWith')
at n (vendors.<hash>.entry.js:8:21553)
at es (8085.<hash>.entry.js:8:735:950)
at ii (vendors.<hash>.entry.js:550:51407)
at iW (vendors.<hash>.entry.js:550:60874)
at c (vendors.<hash>.entry.js:554:22700)
...
```
The React app crashes during boot. Subsequent calls to
`/api/v1/theme/?q=(filters:!((col:is_system_default,opr:eq,value:!t)))` return
`401 Unauthorized` (unauthenticated, because the user is on the login page) but
those are downstream of the crash, not its cause.
### Evidence
In a working pod, the partial-override config produces this
`bootstrapData?.common?.theme` (queryable via
`JSON.parse(document.querySelector('#app').dataset.bootstrap)` in the console):
```js
{
default: {
algorithm: "default",
token: {
colorPrimary: "#ff0000", // ← only the user-supplied field
} // ← ~22 expected fields missing
},
dark: {
algorithm: "dark",
token: {
brandAppName: "Apache Superset",
brandLogoHref: "/",
fontFamily: "Inter, Helvetica, Arial, sans-serif",
// ... 22 more fields, all populated from upstream defaults
}
}
}
```
The active `default.token` has **1 field** (the user override) and
`dark.token` has the full upstream set. Dark mode renders correctly (with
upstream blue colors, not the user override) because its token was constructed
in `config.py` via `{**THEME_DEFAULT, "token": {**THEME_DEFAULT["token"], ...},
"algorithm": "dark"}` *before* the user override took effect, so the snapshot
is complete.
### Environment
- Superset 6.1.0 (apache/superset:6.1.0 official image)
- Reproducible with any partial `THEME_DEFAULT` override in
`superset_config.py`
- Not specific to any browser, OS, database, or deployment topology
---
## Regression analysis
On 6.0.0, `THEME_DEFAULT` in `superset/config.py` was effectively empty
(`{"algorithm": "default"}`) and the same partial-override pattern worked. On
6.1.0, [PR #35220](https://github.com/apache/superset/pull/35220) populated
`THEME_DEFAULT` with ~22 token fields and reframed it as the canonical base
theme for the application. After that PR, a partial override no longer falls
back gracefully — the React app crashes on boot because token fields it expects
to be present are `undefined`. We have not pinpointed which specific frontend
code path calls `.startsWith()` on which missing field.
---
## Suggested fix
A partial override of `THEME_DEFAULT` in `superset_config.py` should
preserve unspecified token fields from the upstream default — matching what
users reasonably expect from a "base theme" customization. Concretely: setting
only `THEME_DEFAULT["token"]["colorPrimary"]` should still leave the other 21
upstream token fields in the effective theme that ships to the frontend.
---
## Workaround (for anyone who lands here via search)
Until this is fixed upstream, extend the default theme rather than replace
it:
```python
from superset.config import THEME_DEFAULT as _UPSTREAM_THEME_DEFAULT
THEME_DEFAULT = {
**_UPSTREAM_THEME_DEFAULT,
"token": {
**_UPSTREAM_THEME_DEFAULT["token"],
# your overrides here:
"colorPrimary": "#ff0000",
},
}
```
This restores the full 22-field token while applying your customizations on
top.
### Screenshots/recordings
_No response_
### Superset version
master / latest-dev
### Python version
3.9
### Node version
16
### Browser
Chrome
### Additional context
_No response_
### Checklist
- [ ] I have searched Superset docs and Slack and didn't find a solution to
my problem.
- [x] I have searched the GitHub issue tracker and didn't find a similar bug
report.
- [ ] I have checked Superset's logs for errors and if I found a relevant
Python stacktrace, I included it here as text in the "additional context"
section.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]