bito-code-review[bot] commented on code in PR #36732:
URL: https://github.com/apache/superset/pull/36732#discussion_r2737589479
##########
superset-frontend/plugins/legacy-plugin-chart-country-map/src/CountryMap.js:
##########
@@ -53,22 +101,129 @@ function CountryMap(element, props) {
country,
linearColorScheme,
numberFormat,
+ customColorScale = props.customColorScale || [],
colorScheme,
sliceId,
} = props;
const container = element;
const format = getNumberFormatter(numberFormat);
- const linearColorScale = getSequentialSchemeRegistry()
- .get(linearColorScheme)
- .createLinearScale(d3Extent(data, v => v.metric));
- const colorScale = CategoricalColorNamespace.getScale(colorScheme);
+ const normalizedScale = normalizeScale(customColorScale);
+ const normalizedScaleWithColors = Array.isArray(normalizedScale)
+ ? normalizedScale.map(e => {
+ if (!e || typeof e !== 'object') return e;
+ return { ...e, color: normalizeColorKeyword(e.color) };
+ })
+ : [];
+
+ const parsedData = Array.isArray(data)
+ ? data.map(r => ({ ...r, metric: safeNumber(r.metric) }))
+ : [];
+
+ const numericValues = parsedData
+ .map(r => r.metric)
+ .filter(v => Number.isFinite(v));
+
+ let minValue = 0;
+ let maxValue = 1;
+ if (numericValues.length > 0) {
+ const extent = d3Extent(numericValues);
+ minValue = extent[0];
+ maxValue = extent[1];
+ }
+ const valueRange = maxValue - minValue;
+ const valueRangeNonZero = valueRange === 0 ? 1 : valueRange;
+
+ let percentColorScale = null;
+ if (
+ Array.isArray(normalizedScaleWithColors) &&
+ normalizedScaleWithColors.length >= 2
+ ) {
+ const sorted = normalizedScaleWithColors
+ .filter(
+ e =>
+ e &&
+ typeof e.percent === 'number' &&
+ e.percent >= 0 &&
+ e.percent <= 100 &&
+ typeof e.color === 'string',
+ )
+ .slice()
+ .sort((a, b) => a.percent - b.percent);
+
+ if (sorted.length >= 2) {
+ const domainPerc = sorted.map(e => e.percent);
+ const rangeColors = sorted.map(e => e.color);
+ percentColorScale = d3.scale
+ .linear()
+ .domain(domainPerc)
+ .range(rangeColors)
+ .clamp(true)
+ // Remove interpolation to avoid blending between steps - always
return lower boundary
+ .interpolate(function (a, b) {
+ return a;
+ });
Review Comment:
<div>
<div id="suggestion">
<div id="issue"><b>Broken interpolator function</b></div>
<div id="fix">
The interpolate method must return an interpolator function, not a value.
Returning 'a' directly will cause a TypeError when d3 calls it with a parameter
t, breaking color scaling for custom color rules.
</div>
<details>
<summary>
<b>Code suggestion</b>
</summary>
<blockquote>Check the AI-generated fix before applying</blockquote>
<div id="code">
````suggestion
.interpolate(function (a, b) {
return function(t) { return a; };
});
````
</div>
</details>
</div>
<small><i>Code Review Run #32187a</i></small>
</div>
---
Should Bito avoid suggestions like this for future reviews? (<a
href=https://alpha.bito.ai/home/ai-agents/review-rules>Manage Rules</a>)
- [ ] Yes, avoid them
--
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]