diff --git a/src/components/chart/ha-chart-base.ts b/src/components/chart/ha-chart-base.ts
index 64db12b3df..2ecad752a3 100644
--- a/src/components/chart/ha-chart-base.ts
+++ b/src/components/chart/ha-chart-base.ts
@@ -220,11 +220,11 @@ export class HaChartBase extends LitElement {
return nothing;
}
const datasets = ensureArray(this.data);
- const items = (legend.data ||
- datasets
+ const items: LegendComponentOption["data"] =
+ legend.data ||
+ ((datasets
.filter((d) => (d.data as any[])?.length && (d.id || d.name))
- .map((d) => d.name ?? d.id) ||
- []) as string[];
+ .map((d) => d.name ?? d.id) || []) as string[]);
const isMobile = window.matchMedia(
"all and (max-width: 450px), all and (max-height: 500px)"
@@ -239,20 +239,32 @@ export class HaChartBase extends LitElement {
})}
>
- ${items.map((item: string, index: number) => {
+ ${items.map((item, index) => {
if (!this.expandLegend && index >= overflowLimit) {
return nothing;
}
- const dataset = datasets.find(
- (d) => d.id === item || d.name === item
- );
- const color = dataset?.color as string;
- const borderColor = dataset?.itemStyle?.borderColor as string;
+ let itemStyle: Record = {};
+ let name = "";
+ if (typeof item === "string") {
+ name = item;
+ const dataset = datasets.find(
+ (d) => d.id === item || d.name === item
+ );
+ itemStyle = {
+ color: dataset?.color as string,
+ ...(dataset?.itemStyle as { borderColor?: string }),
+ };
+ } else {
+ name = item.name ?? "";
+ itemStyle = item.itemStyle ?? {};
+ }
+ const color = itemStyle?.color as string;
+ const borderColor = itemStyle?.borderColor as string;
return html`-
-
${item}
+ ${name}
`;
})}
${items.length > overflowLimit
diff --git a/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts
index c3d9c5cc23..917d9e5950 100644
--- a/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts
+++ b/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts
@@ -6,6 +6,7 @@ import { customElement, property, state } from "lit/decorators";
import { classMap } from "lit/directives/class-map";
import memoizeOne from "memoize-one";
import type { BarSeriesOption } from "echarts/charts";
+import type { LegendComponentOption } from "echarts/components";
import { getGraphColorByIndex } from "../../../../common/color/colors";
import { getEnergyColor } from "./common/color";
import "../../../../components/ha-card";
@@ -54,6 +55,8 @@ export class HuiEnergyDevicesDetailGraphCard
@state() private _data?: EnergyData;
+ @state() private _legendData?: LegendComponentOption["data"];
+
@state() private _start = startOfToday();
@state() private _end = endOfToday();
@@ -185,6 +188,7 @@ export class HuiEnergyDevicesDetailGraphCard
legend: {
show: true,
type: "custom",
+ data: this._legendData,
selected: this._hiddenStats.reduce((acc, stat) => {
acc[stat] = false;
return acc;
@@ -310,6 +314,13 @@ export class HuiEnergyDevicesDetailGraphCard
);
datasets.push(...processedData);
+ this._legendData = processedData.map((d) => ({
+ name: d.name as string,
+ itemStyle: {
+ color: d.color as string,
+ borderColor: d.itemStyle?.borderColor as string,
+ },
+ }));
if (showUntracked) {
const untrackedData = this._processUntracked(
@@ -319,6 +330,13 @@ export class HuiEnergyDevicesDetailGraphCard
false
);
datasets.push(untrackedData);
+ this._legendData.push({
+ name: untrackedData.name as string,
+ itemStyle: {
+ color: untrackedData.color as string,
+ borderColor: untrackedData.itemStyle?.borderColor as string,
+ },
+ });
}
fillDataGapsAndRoundCaps(datasets);