Skip to content

Commit e604f0c

Browse files
committed
Lazy load css for legacy themes
1 parent edee45d commit e604f0c

11 files changed

Lines changed: 162 additions & 42 deletions

File tree

dash_ag_grid/__init__.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,66 @@
6767
'external_url': f'{_unpkg}async-enterprise.js.map',
6868
'dynamic': True
6969
},
70+
{
71+
'relative_package_path': 'async-ag-grid-css.js',
72+
'namespace': package_name,
73+
'external_url': f'{_unpkg}async-ag-grid-css.js',
74+
'async': True
75+
},
76+
{
77+
'relative_package_path': 'async-ag-grid-css.js.map',
78+
'namespace': package_name,
79+
'external_url': f'{_unpkg}async-ag-grid-css.js.map',
80+
'dynamic': True
81+
},
82+
{
83+
'relative_package_path': 'async-ag-theme-alpine-css.js',
84+
'namespace': package_name,
85+
'external_url': f'{_unpkg}async-ag-theme-alpine-css.js',
86+
'async': True
87+
},
88+
{
89+
'relative_package_path': 'async-ag-theme-alpine-css.js.map',
90+
'namespace': package_name,
91+
'external_url': f'{_unpkg}async-ag-theme-alpine-css.js.map',
92+
'dynamic': True
93+
},
94+
{
95+
'relative_package_path': 'async-ag-theme-balham-css.js',
96+
'namespace': package_name,
97+
'external_url': f'{_unpkg}async-ag-theme-balham-css.js',
98+
'async': True
99+
},
100+
{
101+
'relative_package_path': 'async-ag-theme-balham-css.js.map',
102+
'namespace': package_name,
103+
'external_url': f'{_unpkg}async-ag-theme-balham-css.js.map',
104+
'dynamic': True
105+
},
106+
{
107+
'relative_package_path': 'async-ag-theme-material-css.js',
108+
'namespace': package_name,
109+
'external_url': f'{_unpkg}async-ag-theme-material-css.js',
110+
'async': True
111+
},
112+
{
113+
'relative_package_path': 'async-ag-theme-material-css.js.map',
114+
'namespace': package_name,
115+
'external_url': f'{_unpkg}async-ag-theme-material-css.js.map',
116+
'dynamic': True
117+
},
118+
{
119+
'relative_package_path': 'async-ag-theme-quartz-css.js',
120+
'namespace': package_name,
121+
'external_url': f'{_unpkg}async-ag-theme-quartz-css.js',
122+
'async': True
123+
},
124+
{
125+
'relative_package_path': 'async-ag-theme-quartz-css.js.map',
126+
'namespace': package_name,
127+
'external_url': f'{_unpkg}async-ag-theme-quartz-css.js.map',
128+
'dynamic': True
129+
},
70130
]
71131

72132
_css_dist = []

src/lib/components/AgGrid.react.js

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import PropTypes from 'prop-types';
22
import LazyLoader from '../LazyLoader';
3-
import React, {lazy, Suspense, useState, useCallback, useEffect} from 'react';
3+
import React, {
4+
lazy,
5+
Suspense,
6+
useState,
7+
useCallback,
8+
useEffect,
9+
useMemo,
10+
} from 'react';
411
import {AllCommunityModule, ModuleRegistry} from 'ag-grid-community';
512

613
// Register all community features
@@ -13,6 +20,46 @@ function getGrid(enable) {
1320
return enable ? RealAgGridEnterprise : RealAgGrid;
1421
}
1522

23+
// Base CSS loader - loads ag-grid.css
24+
const LegacyThemeBaseCSS = lazy(() =>
25+
import(
26+
/* webpackChunkName: "ag-grid-css" */ 'ag-grid-community/styles/ag-grid.css'
27+
).then(() => ({default: () => null}))
28+
);
29+
30+
// Theme-specific CSS loaders
31+
const LegacyThemeAlpineCSS = lazy(() =>
32+
import(
33+
/* webpackChunkName: "ag-theme-alpine-css" */ 'ag-grid-community/styles/ag-theme-alpine.css'
34+
).then(() => ({default: () => null}))
35+
);
36+
37+
const LegacyThemeBalhamCSS = lazy(() =>
38+
import(
39+
/* webpackChunkName: "ag-theme-balham-css" */ 'ag-grid-community/styles/ag-theme-balham.css'
40+
).then(() => ({default: () => null}))
41+
);
42+
43+
const LegacyThemeMaterialCSS = lazy(() =>
44+
import(
45+
/* webpackChunkName: "ag-theme-material-css" */ 'ag-grid-community/styles/ag-theme-material.css'
46+
).then(() => ({default: () => null}))
47+
);
48+
49+
const LegacyThemeQuartzCSS = lazy(() =>
50+
import(
51+
/* webpackChunkName: "ag-theme-quartz-css" */ 'ag-grid-community/styles/ag-theme-quartz.css'
52+
).then(() => ({default: () => null}))
53+
);
54+
55+
// Map themes to their CSS loaders
56+
const legacyThemeLoaderMap = {
57+
alpine: LegacyThemeAlpineCSS,
58+
balham: LegacyThemeBalhamCSS,
59+
material: LegacyThemeMaterialCSS,
60+
quartz: LegacyThemeQuartzCSS,
61+
};
62+
1663
/**
1764
* Dash interface to AG Grid, a powerful tabular data component.
1865
*/
@@ -47,6 +94,52 @@ function DashAgGrid(props) {
4794
const {enableEnterpriseModules} = props;
4895
const RealComponent = getGrid(enableEnterpriseModules);
4996

97+
const themeName = useMemo(() => {
98+
const themeMatch = props.className.match(
99+
/\bag-theme-([a-zA-Z0-9-]+)\b/
100+
);
101+
return themeMatch ? themeMatch[1] : null;
102+
}, [props.className]);
103+
104+
const shouldLoadLegacyCSS = useMemo(() => {
105+
// Only load legacy CSS if theme is 'legacy' or unset
106+
return (
107+
!('theme' in props.dashGridOptions) ||
108+
props.dashGridOptions.theme === 'legacy'
109+
);
110+
}, [props.dashGridOptions.theme]);
111+
112+
const LegacyThemeLoader = useMemo(() => {
113+
if (
114+
themeName &&
115+
shouldLoadLegacyCSS &&
116+
legacyThemeLoaderMap[themeName]
117+
) {
118+
return legacyThemeLoaderMap[themeName];
119+
}
120+
return null;
121+
}, [themeName, shouldLoadLegacyCSS]);
122+
123+
if (themeName && shouldLoadLegacyCSS && LegacyThemeLoader) {
124+
const dashGridOptions = {
125+
...props.dashGridOptions,
126+
theme: 'legacy',
127+
};
128+
return (
129+
<Suspense fallback={null}>
130+
<LegacyThemeBaseCSS />
131+
<LegacyThemeLoader />
132+
<Suspense fallback={null}>
133+
<RealComponent
134+
parentState={state}
135+
{...props}
136+
dashGridOptions={dashGridOptions}
137+
/>
138+
</Suspense>
139+
</Suspense>
140+
);
141+
}
142+
50143
return (
51144
<Suspense fallback={null}>
52145
<RealComponent parentState={state} {...props} />
@@ -57,7 +150,7 @@ function DashAgGrid(props) {
57150
DashAgGrid.dashRenderType = true;
58151

59152
DashAgGrid.defaultProps = {
60-
className: 'ag-theme-alpine',
153+
className: '',
61154
resetColumnState: false,
62155
exportDataAsCsv: false,
63156
selectAll: false,

tests/examples/assets_legacy_themes/README.md

Lines changed: 0 additions & 3 deletions
This file was deleted.

tests/examples/assets_legacy_themes/ag-grid.css

Lines changed: 0 additions & 13 deletions
This file was deleted.

tests/examples/assets_legacy_themes/ag-theme-alpine.min.css

Lines changed: 0 additions & 3 deletions
This file was deleted.

tests/examples/assets_legacy_themes/ag-theme-balham.min.css

Lines changed: 0 additions & 3 deletions
This file was deleted.

tests/examples/assets_legacy_themes/ag-theme-material.min.css

Lines changed: 0 additions & 5 deletions
This file was deleted.

tests/examples/assets_legacy_themes/ag-theme-quartz.min.css

Lines changed: 0 additions & 7 deletions
This file was deleted.

tests/examples/themes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
{"label": "Alpine", "value": "themeAlpine"},
4747
{"label": "Custom Balham with red accent", "value": '{ "function": "themeBalham.withParams({ accentColor: \'red\' })"}'},
4848
{"label": "Invalid theme name", "value": "invalidTheme"},
49-
], value="themeQuartz", id="themeSelector"),
49+
], value="", id="themeSelector"),
5050
dag.AgGrid(
5151
id="grid",
5252
columnDefs=columnDefs,
@@ -61,6 +61,7 @@
6161
Output("grid", "dashGridOptions"),
6262
Input("themeSelector", "value"),
6363
State("grid", "dashGridOptions"),
64+
prevent_initial_call=True,
6465
)
6566
def addGrid(selected_theme, dash_grid_options):
6667
try:

tests/examples/themes_legacy.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
legacy theme in action.
88
"""
99

10-
app = Dash(__name__, assets_folder="assets_legacy_themes/")
10+
app = Dash(__name__,)
1111

1212
rowData = [
1313
{"weight": 0.074657, "date": "01/01/2024"},
@@ -17,8 +17,8 @@
1717
]
1818

1919
columnDefs = [
20-
{"field": "weight", "cellDataType": "percentage"},
21-
{"field": "date", "cellDataType": "dateString"},
20+
{"field": "weight"},
21+
{"field": "date"},
2222
]
2323

2424
app.layout = html.Div(
@@ -28,8 +28,7 @@
2828
columnDefs=columnDefs,
2929
rowData=rowData,
3030
defaultColDef={"filter": True, "editable": True},
31-
dashGridOptions={"theme": "legacy"},
32-
className="ag-theme-material",
31+
className="ag-theme-balham",
3332
),
3433
],
3534
)

0 commit comments

Comments
 (0)