This is an automated email from the ASF dual-hosted git repository. maximebeauchemin pushed a commit to branch default_chart_settings in repository https://gitbox.apache.org/repos/asf/superset.git
commit eead618d867a87e60c2f66a2bd5761663cdb2beb Author: Maxime Beauchemin <maximebeauche...@gmail.com> AuthorDate: Sun Aug 3 17:58:45 2025 -0700 refactor: Simplify Chart Defaults extra field parsing Replaced complex IIFE pattern with a clean helper function for parsing the datasource.extra field in Chart Defaults form controls. Changes: - Added parseExtra() helper function to handle string/object parsing - Simplified all value props to use parseExtra(datasource.extra).default_chart_metadata?.field - Streamlined onChange handlers to use the same helper consistently - Improved code readability and maintainability - Fixed issue with saved defaults not displaying when reopening DatasetEditor The helper function handles all edge cases (null, string, object) and provides safe fallbacks, making the Chart Defaults section more robust. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <nore...@anthropic.com> --- .../src/components/Datasource/DatasourceEditor.jsx | 111 +++++++-------------- 1 file changed, 36 insertions(+), 75 deletions(-) diff --git a/superset-frontend/src/components/Datasource/DatasourceEditor.jsx b/superset-frontend/src/components/Datasource/DatasourceEditor.jsx index d1ea76ba24..26e30b219e 100644 --- a/superset-frontend/src/components/Datasource/DatasourceEditor.jsx +++ b/superset-frontend/src/components/Datasource/DatasourceEditor.jsx @@ -77,6 +77,17 @@ import { fetchSyncedColumns, updateColumns } from './utils'; const extensionsRegistry = getExtensionsRegistry(); +// Helper function to safely parse extra field +const parseExtra = extra => { + if (!extra) return {}; + if (typeof extra === 'object') return extra; + try { + return JSON.parse(extra); + } catch { + return {}; + } +}; + const DatasourceContainer = styled.div` .change-warning { margin: 16px 10px 0; @@ -1061,22 +1072,12 @@ class DatasourceEditor extends PureComponent { label: metric.verbose_name || metric.metric_name, })) || [] } - value={(() => { - try { - const extra = - typeof datasource.extra === 'string' - ? JSON.parse(datasource.extra || '{}') - : datasource.extra || {}; - return extra.default_chart_metadata?.default_metric; - } catch { - return undefined; - } - })()} + value={ + parseExtra(datasource.extra).default_chart_metadata + ?.default_metric + } onChange={value => { - const extra = - typeof datasource.extra === 'string' - ? JSON.parse(datasource.extra || '{}') - : { ...(datasource.extra || {}) }; + const extra = { ...parseExtra(datasource.extra) }; if (!extra.default_chart_metadata) { extra.default_chart_metadata = {}; } @@ -1105,22 +1106,12 @@ class DatasourceEditor extends PureComponent { label: column.verbose_name || column.column_name, })) || [] } - value={(() => { - try { - const extra = - typeof datasource.extra === 'string' - ? JSON.parse(datasource.extra || '{}') - : datasource.extra || {}; - return extra.default_chart_metadata?.default_dimension; - } catch { - return undefined; - } - })()} + value={ + parseExtra(datasource.extra).default_chart_metadata + ?.default_dimension + } onChange={value => { - const extra = - typeof datasource.extra === 'string' - ? JSON.parse(datasource.extra || '{}') - : { ...(datasource.extra || {}) }; + const extra = { ...parseExtra(datasource.extra) }; if (!extra.default_chart_metadata) { extra.default_chart_metadata = {}; } @@ -1154,22 +1145,12 @@ class DatasourceEditor extends PureComponent { { value: 'P1M', label: t('Month') }, { value: 'P1Y', label: t('Year') }, ]} - value={(() => { - try { - const extra = - typeof datasource.extra === 'string' - ? JSON.parse(datasource.extra || '{}') - : datasource.extra || {}; - return extra.default_chart_metadata?.default_time_grain; - } catch { - return undefined; - } - })()} + value={ + parseExtra(datasource.extra).default_chart_metadata + ?.default_time_grain + } onChange={value => { - const extra = - typeof datasource.extra === 'string' - ? JSON.parse(datasource.extra || '{}') - : { ...(datasource.extra || {}) }; + const extra = { ...parseExtra(datasource.extra) }; if (!extra.default_chart_metadata) { extra.default_chart_metadata = {}; } @@ -1198,22 +1179,12 @@ class DatasourceEditor extends PureComponent { { value: 'Last year', label: t('Last year') }, { value: 'No filter', label: t('No filter') }, ]} - value={(() => { - try { - const extra = - typeof datasource.extra === 'string' - ? JSON.parse(datasource.extra || '{}') - : datasource.extra || {}; - return extra.default_chart_metadata?.default_time_range; - } catch { - return undefined; - } - })()} + value={ + parseExtra(datasource.extra).default_chart_metadata + ?.default_time_range + } onChange={value => { - const extra = - typeof datasource.extra === 'string' - ? JSON.parse(datasource.extra || '{}') - : { ...(datasource.extra || {}) }; + const extra = { ...parseExtra(datasource.extra) }; if (!extra.default_chart_metadata) { extra.default_chart_metadata = {}; } @@ -1234,22 +1205,12 @@ class DatasourceEditor extends PureComponent { control={ <TextControl name="default_row_limit" - value={(() => { - try { - const extra = - typeof datasource.extra === 'string' - ? JSON.parse(datasource.extra || '{}') - : datasource.extra || {}; - return extra.default_chart_metadata?.default_row_limit; - } catch { - return undefined; - } - })()} + value={ + parseExtra(datasource.extra).default_chart_metadata + ?.default_row_limit + } onChange={value => { - const extra = - typeof datasource.extra === 'string' - ? JSON.parse(datasource.extra || '{}') - : { ...(datasource.extra || {}) }; + const extra = { ...parseExtra(datasource.extra) }; if (!extra.default_chart_metadata) { extra.default_chart_metadata = {}; }