1
0
mirror of https://github.com/home-assistant/frontend.git synced 2025-12-20 02:38:53 +00:00

Revert "Default entity name to friendly name"

This reverts commit a607edca96.
This commit is contained in:
Paul Bottein
2025-10-29 13:02:55 +01:00
parent a607edca96
commit 89b9780345
19 changed files with 87 additions and 46 deletions

View File

@@ -235,8 +235,5 @@
"tslib": "2.8.1", "tslib": "2.8.1",
"@material/mwc-list@^0.27.0": "patch:@material/mwc-list@npm%3A0.27.0#~/.yarn/patches/@material-mwc-list-npm-0.27.0-5344fc9de4.patch" "@material/mwc-list@^0.27.0": "patch:@material/mwc-list@npm%3A0.27.0#~/.yarn/patches/@material-mwc-list-npm-0.27.0-5344fc9de4.patch"
}, },
"packageManager": "yarn@4.10.3", "packageManager": "yarn@4.10.3"
"volta": {
"node": "22.21.1"
}
} }

View File

@@ -312,7 +312,7 @@ export class HaEntityNamePicker extends LitElement {
private _toValue = memoizeOne( private _toValue = memoizeOne(
(items: EntityNameItem[]): typeof this.value => { (items: EntityNameItem[]): typeof this.value => {
if (items.length === 0) { if (items.length === 0) {
return undefined; return "";
} }
if (items.length === 1) { if (items.length === 1) {
const item = items[0]; const item = items[0];

View File

@@ -1,29 +1,28 @@
import type { HassEntity } from "home-assistant-js-websocket"; import type { HassEntity } from "home-assistant-js-websocket";
import { ensureArray } from "../../../../common/array/ensure-array"; import {
import type { EntityNameItem } from "../../../../common/entity/compute_entity_name_display"; DEFAULT_ENTITY_NAME,
import { computeStateName } from "../../../../common/entity/compute_state_name"; type EntityNameItem,
} from "../../../../common/entity/compute_entity_name_display";
import type { HomeAssistant } from "../../../../types"; import type { HomeAssistant } from "../../../../types";
import { ensureArray } from "../../../../common/array/ensure-array";
/** /**
* Computes the display name for an entity in Lovelace (cards and badges). * Computes the display name for an entity in Lovelace (cards and badges).
* *
* @param hass - The Home Assistant instance * @param hass - The Home Assistant instance
* @param stateObj - The entity state object * @param stateObj - The entity state object
* @param config - The name configuration (string for override, or EntityNameItem[] for structured naming) * @param nameConfig - The name configuration (string for override, or EntityNameItem[] for structured naming)
* @returns The computed entity name * @returns The computed entity name
*/ */
export const computeLovelaceEntityName = ( export const computeLovelaceEntityName = (
hass: HomeAssistant, hass: HomeAssistant,
stateObj: HassEntity | undefined, stateObj: HassEntity | undefined,
config: string | EntityNameItem | EntityNameItem[] | undefined nameConfig: string | EntityNameItem | EntityNameItem[] | undefined
): string => { ): string => {
// If no config is provided, fall back to the default state name if (typeof nameConfig === "string") {
if (!config) { return nameConfig;
return stateObj ? computeStateName(stateObj) : "";
}
if (typeof config === "string") {
return config;
} }
const config = nameConfig || DEFAULT_ENTITY_NAME;
if (stateObj) { if (stateObj) {
return hass.formatEntityName(stateObj, config); return hass.formatEntityName(stateObj, config);
} }

View File

@@ -4,6 +4,7 @@ import { customElement, property, state } from "lit/decorators";
import memoizeOne from "memoize-one"; import memoizeOne from "memoize-one";
import { array, assert, assign, object, optional, string } from "superstruct"; import { array, assert, assign, object, optional, string } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import { supportsFeature } from "../../../../common/entity/supports-feature"; import { supportsFeature } from "../../../../common/entity/supports-feature";
import type { LocalizeFunc } from "../../../../common/translations/localize"; import type { LocalizeFunc } from "../../../../common/translations/localize";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
@@ -64,7 +65,9 @@ export class HuiAlarmPanelCardEditor
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -5,6 +5,7 @@ import { customElement, property, state } from "lit/decorators";
import memoizeOne from "memoize-one"; import memoizeOne from "memoize-one";
import { assert, assign, boolean, object, optional, string } from "superstruct"; import { assert, assign, boolean, object, optional, string } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
import type { import type {
HaFormSchema, HaFormSchema,
@@ -72,7 +73,7 @@ export class HuiButtonCardEditor
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: { default_name: DEFAULT_ENTITY_NAME },
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -13,6 +13,7 @@ import {
string, string,
union, union,
} from "superstruct"; } from "superstruct";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import type { LocalizeFunc } from "../../../../common/translations/localize"; import type { LocalizeFunc } from "../../../../common/translations/localize";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
@@ -85,7 +86,9 @@ export class HuiEntityBadgeEditor
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -1,4 +1,5 @@
import { assert, assign, boolean, object, optional, string } from "superstruct"; import { assert, assign, boolean, object, optional, string } from "superstruct";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import type { LocalizeFunc } from "../../../../common/translations/localize"; import type { LocalizeFunc } from "../../../../common/translations/localize";
import type { HaFormSchema } from "../../../../components/ha-form/types"; import type { HaFormSchema } from "../../../../components/ha-form/types";
import { headerFooterConfigStructs } from "../../header-footer/structs"; import { headerFooterConfigStructs } from "../../header-footer/structs";
@@ -25,7 +26,9 @@ const SCHEMA = [
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -14,6 +14,7 @@ import {
string, string,
} from "superstruct"; } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
import type { SchemaUnion } from "../../../../components/ha-form/types"; import type { SchemaUnion } from "../../../../components/ha-form/types";
import { NON_NUMERIC_ATTRIBUTES } from "../../../../data/entity_attributes"; import { NON_NUMERIC_ATTRIBUTES } from "../../../../data/entity_attributes";
@@ -101,7 +102,9 @@ export class HuiGaugeCardEditor
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -14,6 +14,7 @@ import {
} from "superstruct"; } from "superstruct";
import type { HASSDomEvent } from "../../../../common/dom/fire_event"; import type { HASSDomEvent } from "../../../../common/dom/fire_event";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import "../../../../components/ha-expansion-panel"; import "../../../../components/ha-expansion-panel";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
import type { import type {
@@ -60,7 +61,9 @@ const SCHEMA = [
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -1,9 +1,10 @@
import { mdiGestureTap } from "@mdi/js";
import type { CSSResultGroup } from "lit"; import type { CSSResultGroup } from "lit";
import { html, LitElement, nothing } from "lit"; import { html, LitElement, nothing } from "lit";
import { customElement, property, state } from "lit/decorators"; import { customElement, property, state } from "lit/decorators";
import { assert, assign, object, optional, string } from "superstruct"; import { assert, assign, object, optional, string } from "superstruct";
import { mdiGestureTap } from "@mdi/js";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
import type { SchemaUnion } from "../../../../components/ha-form/types"; import type { SchemaUnion } from "../../../../components/ha-form/types";
import type { HomeAssistant } from "../../../../types"; import type { HomeAssistant } from "../../../../types";
@@ -36,7 +37,9 @@ const SCHEMA = [
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -2,6 +2,7 @@ import { html, LitElement, nothing } from "lit";
import { customElement, property, state } from "lit/decorators"; import { customElement, property, state } from "lit/decorators";
import { assert, assign, object, optional, string } from "superstruct"; import { assert, assign, object, optional, string } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
import type { import type {
HaFormSchema, HaFormSchema,
@@ -32,7 +33,9 @@ const SCHEMA = [
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -1,8 +1,8 @@
import memoizeOne from "memoize-one";
import { mdiGestureTap } from "@mdi/js"; import { mdiGestureTap } from "@mdi/js";
import type { CSSResultGroup } from "lit"; import type { CSSResultGroup } from "lit";
import { html, LitElement, nothing } from "lit"; import { html, LitElement, nothing } from "lit";
import { customElement, property, state } from "lit/decorators"; import { customElement, property, state } from "lit/decorators";
import memoizeOne from "memoize-one";
import { import {
assert, assert,
assign, assign,
@@ -15,6 +15,7 @@ import {
} from "superstruct"; } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { computeDomain } from "../../../../common/entity/compute_domain"; import { computeDomain } from "../../../../common/entity/compute_domain";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import type { LocalizeFunc } from "../../../../common/translations/localize"; import type { LocalizeFunc } from "../../../../common/translations/localize";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
import type { import type {
@@ -70,7 +71,9 @@ export class HuiPictureEntityCardEditor
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -2,6 +2,7 @@ import { html, LitElement, nothing } from "lit";
import { customElement, property, state } from "lit/decorators"; import { customElement, property, state } from "lit/decorators";
import { assert, assign, object, optional, string } from "superstruct"; import { assert, assign, object, optional, string } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
import type { SchemaUnion } from "../../../../components/ha-form/types"; import type { SchemaUnion } from "../../../../components/ha-form/types";
import type { HomeAssistant } from "../../../../types"; import type { HomeAssistant } from "../../../../types";
@@ -24,7 +25,9 @@ const SCHEMA = [
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -1,7 +1,7 @@
import memoizeOne from "memoize-one";
import type { CSSResultGroup } from "lit"; import type { CSSResultGroup } from "lit";
import { html, LitElement, nothing } from "lit"; import { html, LitElement, nothing } from "lit";
import { customElement, property, state } from "lit/decorators"; import { customElement, property, state } from "lit/decorators";
import memoizeOne from "memoize-one";
import { import {
assert, assert,
assign, assign,
@@ -12,17 +12,18 @@ import {
string, string,
union, union,
} from "superstruct"; } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event"; import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import type { LocalizeFunc } from "../../../../common/translations/localize"; import type { LocalizeFunc } from "../../../../common/translations/localize";
import { fireEvent } from "../../../../common/dom/fire_event";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
import type { SchemaUnion } from "../../../../components/ha-form/types"; import type { SchemaUnion } from "../../../../components/ha-form/types";
import type { HomeAssistant } from "../../../../types"; import type { HomeAssistant } from "../../../../types";
import { DEFAULT_HOURS_TO_SHOW } from "../../cards/hui-sensor-card";
import type { SensorCardConfig } from "../../cards/types"; import type { SensorCardConfig } from "../../cards/types";
import type { LovelaceCardEditor } from "../../types"; import type { LovelaceCardEditor } from "../../types";
import { baseLovelaceCardConfig } from "../structs/base-card-struct"; import { baseLovelaceCardConfig } from "../structs/base-card-struct";
import { entityNameStruct } from "../structs/entity-name-struct"; import { entityNameStruct } from "../structs/entity-name-struct";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import { DEFAULT_HOURS_TO_SHOW } from "../../cards/hui-sensor-card";
const cardConfigStruct = assign( const cardConfigStruct = assign(
baseLovelaceCardConfig, baseLovelaceCardConfig,
@@ -70,7 +71,9 @@ export class HuiSensorCardEditor
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -14,7 +14,7 @@ import {
} from "superstruct"; } from "superstruct";
import type { HASSDomEvent } from "../../../../common/dom/fire_event"; import type { HASSDomEvent } from "../../../../common/dom/fire_event";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { computeDomain } from "../../../../common/entity/compute_domain"; import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import "../../../../components/ha-expansion-panel"; import "../../../../components/ha-expansion-panel";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
import type { import type {
@@ -35,6 +35,7 @@ import type { EditDetailElementEvent, EditSubElementEvent } from "../types";
import { configElementStyle } from "./config-elements-style"; import { configElementStyle } from "./config-elements-style";
import "./hui-card-features-editor"; import "./hui-card-features-editor";
import type { FeatureType } from "./hui-card-features-editor"; import type { FeatureType } from "./hui-card-features-editor";
import { computeDomain } from "../../../../common/entity/compute_domain";
const COMPATIBLE_FEATURES_TYPES: Record<string, FeatureType[]> = { const COMPATIBLE_FEATURES_TYPES: Record<string, FeatureType[]> = {
climate: [ climate: [
@@ -88,7 +89,9 @@ export class HuiThermostatCardEditor
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -16,6 +16,7 @@ import {
} from "superstruct"; } from "superstruct";
import type { HASSDomEvent } from "../../../../common/dom/fire_event"; import type { HASSDomEvent } from "../../../../common/dom/fire_event";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import type { LocalizeFunc } from "../../../../common/translations/localize"; import type { LocalizeFunc } from "../../../../common/translations/localize";
import { orderProperties } from "../../../../common/util/order-properties"; import { orderProperties } from "../../../../common/util/order-properties";
import "../../../../components/ha-expansion-panel"; import "../../../../components/ha-expansion-panel";
@@ -101,7 +102,9 @@ export class HuiTileCardEditor
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -12,6 +12,7 @@ import {
string, string,
} from "superstruct"; } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import { supportsFeature } from "../../../../common/entity/supports-feature"; import { supportsFeature } from "../../../../common/entity/supports-feature";
import type { LocalizeFunc } from "../../../../common/translations/localize"; import type { LocalizeFunc } from "../../../../common/translations/localize";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
@@ -152,7 +153,9 @@ export class HuiWeatherForecastCardEditor
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -13,6 +13,7 @@ import {
union, union,
} from "superstruct"; } from "superstruct";
import { fireEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event";
import { DEFAULT_ENTITY_NAME } from "../../../../common/entity/compute_entity_name_display";
import type { LocalizeFunc } from "../../../../common/translations/localize"; import type { LocalizeFunc } from "../../../../common/translations/localize";
import "../../../../components/ha-expansion-panel"; import "../../../../components/ha-expansion-panel";
import "../../../../components/ha-form/ha-form"; import "../../../../components/ha-form/ha-form";
@@ -93,7 +94,9 @@ export class HuiHeadingEntityEditor
{ {
name: "name", name: "name",
selector: { selector: {
entity_name: {}, entity_name: {
default_name: DEFAULT_ENTITY_NAME,
},
}, },
context: { entity: "entity" }, context: { entity: "entity" },
}, },

View File

@@ -1,4 +1,5 @@
import { describe, expect, it, vi } from "vitest"; import { describe, expect, it, vi } from "vitest";
import { DEFAULT_ENTITY_NAME } from "../../../../../src/common/entity/compute_entity_name_display";
import { computeLovelaceEntityName } from "../../../../../src/panels/lovelace/common/entity/compute-lovelace-entity-name"; import { computeLovelaceEntityName } from "../../../../../src/panels/lovelace/common/entity/compute-lovelace-entity-name";
import type { HomeAssistant } from "../../../../../src/types"; import type { HomeAssistant } from "../../../../../src/types";
import { mockStateObj } from "../../../../common/entity/context/context-mock"; import { mockStateObj } from "../../../../common/entity/context/context-mock";
@@ -22,29 +23,30 @@ describe("computeLovelaceEntityName", () => {
expect(mockFormatEntityName).not.toHaveBeenCalled(); expect(mockFormatEntityName).not.toHaveBeenCalled();
}); });
it("return state name when nameConfig is empty string", () => { it("returns empty string when nameConfig is empty string", () => {
const mockFormatEntityName = vi.fn(); const mockFormatEntityName = vi.fn();
const hass = createMockHass(mockFormatEntityName); const hass = createMockHass(mockFormatEntityName);
const stateObj = mockStateObj({ entity_id: "light.kitchen" }); const stateObj = mockStateObj({ entity_id: "light.kitchen" });
const result = computeLovelaceEntityName(hass, stateObj, ""); const result = computeLovelaceEntityName(hass, stateObj, "");
expect(result).toBe("Kitchen Light"); expect(result).toBe("");
expect(mockFormatEntityName).not.toHaveBeenCalled(); expect(mockFormatEntityName).not.toHaveBeenCalled();
}); });
it("return state name when nameConfig is undefined", () => { it("calls formatEntityName with DEFAULT_ENTITY_NAME when nameConfig is undefined", () => {
const mockFormatEntityName = vi.fn(() => "Formatted Name"); const mockFormatEntityName = vi.fn(() => "Formatted Name");
const hass = createMockHass(mockFormatEntityName); const hass = createMockHass(mockFormatEntityName);
const stateObj = mockStateObj({ const stateObj = mockStateObj({ entity_id: "light.kitchen" });
entity_id: "light.kitchen",
attributes: { friendly_name: "Kitchen Light" },
});
const result = computeLovelaceEntityName(hass, stateObj, undefined); const result = computeLovelaceEntityName(hass, stateObj, undefined);
expect(result).toBe("Kitchen Light"); expect(result).toBe("Formatted Name");
expect(mockFormatEntityName).not.toHaveBeenCalled(); expect(mockFormatEntityName).toHaveBeenCalledTimes(1);
expect(mockFormatEntityName).toHaveBeenCalledWith(
stateObj,
DEFAULT_ENTITY_NAME
);
}); });
it("calls formatEntityName with EntityNameItem config", () => { it("calls formatEntityName with EntityNameItem config", () => {