mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-25 18:26:35 +00:00
Improve broken cards on dashboards (#25557)
This commit is contained in:
parent
549451eccb
commit
28fe60f02b
@ -41,6 +41,7 @@ import type {
|
||||
} from "../../types";
|
||||
import { showCalendarEventDetailDialog } from "./show-dialog-calendar-event-detail";
|
||||
import { showCalendarEventEditDialog } from "./show-dialog-calendar-event-editor";
|
||||
import "../lovelace/components/hui-warning";
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
@ -126,11 +127,8 @@ export class HAFullCalendar extends LitElement {
|
||||
${this.calendar
|
||||
? html`
|
||||
${this.error
|
||||
? html`<ha-alert
|
||||
alert-type="error"
|
||||
dismissable
|
||||
@alert-dismissed-clicked=${this._clearError}
|
||||
>${this.error}</ha-alert
|
||||
? html`<hui-warning .hass=${this.hass} severity="warning"
|
||||
>${this.error}</hui-warning
|
||||
>`
|
||||
: ""}
|
||||
<div class="header">
|
||||
@ -420,10 +418,6 @@ export class HAFullCalendar extends LitElement {
|
||||
);
|
||||
});
|
||||
|
||||
private _clearError() {
|
||||
this.error = undefined;
|
||||
}
|
||||
|
||||
static get styles(): CSSResultGroup {
|
||||
return [
|
||||
haStyle,
|
||||
@ -510,11 +504,6 @@ export class HAFullCalendar extends LitElement {
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
ha-alert {
|
||||
display: block;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
#calendar {
|
||||
flex-grow: 1;
|
||||
background-color: var(
|
||||
|
@ -86,7 +86,7 @@ class HuiEnergyCarbonGaugeCard
|
||||
const co2State = this.hass.states[this._data.co2SignalEntity];
|
||||
|
||||
if (!co2State) {
|
||||
return html`<hui-warning>
|
||||
return html`<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._data.co2SignalEntity)}
|
||||
</hui-warning>`;
|
||||
}
|
||||
|
@ -220,7 +220,7 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -363,7 +363,7 @@ export class HuiAreaCard
|
||||
|
||||
if (area === null) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${this.hass.localize("ui.card.area.area_not_found")}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -179,7 +179,7 @@ export class HuiButtonCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (this._config.entity && !stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -4,7 +4,6 @@ import { customElement, property, state } from "lit/decorators";
|
||||
import { getColorByIndex } from "../../../common/color/colors";
|
||||
import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element";
|
||||
import type { HASSDomEvent } from "../../../common/dom/fire_event";
|
||||
import { computeStateName } from "../../../common/entity/compute_state_name";
|
||||
import { debounce } from "../../../common/util/debounce";
|
||||
import "../../../components/ha-card";
|
||||
import type { Calendar, CalendarEvent } from "../../../data/calendar";
|
||||
@ -176,17 +175,9 @@ export class HuiCalendarCard extends LitElement implements LovelaceCard {
|
||||
this._events = result.events;
|
||||
|
||||
if (result.errors.length > 0) {
|
||||
const nameList = result.errors
|
||||
.map((error_entity_id) =>
|
||||
this.hass!.states[error_entity_id]
|
||||
? computeStateName(this.hass!.states[error_entity_id])
|
||||
: error_entity_id
|
||||
)
|
||||
.join(", ");
|
||||
|
||||
this._error = `${this.hass!.localize(
|
||||
"ui.components.calendar.event_retrieval_error"
|
||||
)} ${nameList}`;
|
||||
)}`;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,6 @@ import {
|
||||
checkConditionsMet,
|
||||
} from "../common/validate-condition";
|
||||
import { createCardElement } from "../create-element/create-card-element";
|
||||
import { createErrorCardConfig } from "../create-element/create-element-base";
|
||||
import type { LovelaceCard, LovelaceGridOptions } from "../types";
|
||||
|
||||
declare global {
|
||||
@ -191,7 +190,9 @@ export class HuiCard extends ReactiveElement {
|
||||
this._element.hass = this.hass;
|
||||
}
|
||||
} catch (e: any) {
|
||||
this._loadElement(createErrorCardConfig(e.message, null));
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(this.config?.type, e);
|
||||
this._loadElement({ type: "error" });
|
||||
}
|
||||
}
|
||||
if (changedProps.has("preview")) {
|
||||
@ -200,7 +201,9 @@ export class HuiCard extends ReactiveElement {
|
||||
// For backwards compatibility
|
||||
(this._element as any).editMode = this.preview;
|
||||
} catch (e: any) {
|
||||
this._loadElement(createErrorCardConfig(e.message, null));
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(this.config?.type, e);
|
||||
this._loadElement({ type: "error" });
|
||||
}
|
||||
}
|
||||
if (changedProps.has("layout")) {
|
||||
@ -209,7 +212,9 @@ export class HuiCard extends ReactiveElement {
|
||||
// For backwards compatibility
|
||||
(this._element as any).isPanel = this.layout === "panel";
|
||||
} catch (e: any) {
|
||||
this._loadElement(createErrorCardConfig(e.message, null));
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(this.config?.type, e);
|
||||
this._loadElement({ type: "error" });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ export class HuiEntityCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -1,52 +1,106 @@
|
||||
import { dump } from "js-yaml";
|
||||
import { css, html, LitElement, nothing } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import "../../../components/ha-alert";
|
||||
import { mdiAlertCircleOutline, mdiAlertOutline } from "@mdi/js";
|
||||
import type { HomeAssistant } from "../../../types";
|
||||
import type { LovelaceCard } from "../types";
|
||||
import type { LovelaceCard, LovelaceGridOptions } from "../types";
|
||||
import type { ErrorCardConfig } from "./types";
|
||||
import "../../../components/ha-card";
|
||||
import "../../../components/ha-svg-icon";
|
||||
|
||||
const ERROR_ICONS = {
|
||||
warning: mdiAlertOutline,
|
||||
error: mdiAlertCircleOutline,
|
||||
};
|
||||
|
||||
@customElement("hui-error-card")
|
||||
export class HuiErrorCard extends LitElement implements LovelaceCard {
|
||||
public hass?: HomeAssistant;
|
||||
@property({ attribute: false }) public hass?: HomeAssistant;
|
||||
|
||||
@property({ attribute: false }) public preview = false;
|
||||
|
||||
@property({ attribute: "severity" }) public severity: "warning" | "error" =
|
||||
"error";
|
||||
|
||||
@state() private _config?: ErrorCardConfig;
|
||||
|
||||
public getCardSize(): number {
|
||||
return 4;
|
||||
return 1;
|
||||
}
|
||||
|
||||
public getGridOptions(): LovelaceGridOptions {
|
||||
return {
|
||||
columns: 6,
|
||||
rows: 1,
|
||||
min_rows: 1,
|
||||
min_columns: 6,
|
||||
};
|
||||
}
|
||||
|
||||
public setConfig(config: ErrorCardConfig): void {
|
||||
this._config = config;
|
||||
this.severity = config.severity || "error";
|
||||
}
|
||||
|
||||
protected render() {
|
||||
if (!this._config) {
|
||||
return nothing;
|
||||
}
|
||||
const error =
|
||||
this._config?.error ||
|
||||
this.hass?.localize("ui.errors.config.configuration_error");
|
||||
const showTitle = this.hass === undefined || this.hass?.user?.is_admin;
|
||||
|
||||
let dumped: string | undefined;
|
||||
|
||||
if (this._config.origConfig) {
|
||||
try {
|
||||
dumped = dump(this._config.origConfig);
|
||||
} catch (_err: any) {
|
||||
dumped = `[Error dumping ${this._config.origConfig}]`;
|
||||
}
|
||||
}
|
||||
|
||||
return html`<ha-alert alert-type="error" .title=${this._config.error}>
|
||||
${dumped ? html`<pre>${dumped}</pre>` : ""}
|
||||
</ha-alert>`;
|
||||
return html`
|
||||
<ha-card class="${this.severity} ${showTitle ? "" : "no-title"}">
|
||||
<div class="icon">
|
||||
<slot name="icon">
|
||||
<ha-svg-icon .path=${ERROR_ICONS[this.severity]}></ha-svg-icon>
|
||||
</slot>
|
||||
</div>
|
||||
${showTitle
|
||||
? html`<div class="title"><slot>${error}</slot></div>`
|
||||
: nothing}
|
||||
</ha-card>
|
||||
`;
|
||||
}
|
||||
|
||||
static styles = css`
|
||||
pre {
|
||||
font-family: var(--ha-font-family-code);
|
||||
white-space: break-spaces;
|
||||
user-select: text;
|
||||
ha-card {
|
||||
height: 100%;
|
||||
border-width: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
column-gap: 16px;
|
||||
padding: 16px;
|
||||
}
|
||||
ha-card::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
opacity: 0.12;
|
||||
pointer-events: none;
|
||||
content: "";
|
||||
border-radius: var(--ha-card-border-radius, 12px);
|
||||
}
|
||||
.no-title {
|
||||
justify-content: center;
|
||||
}
|
||||
.title {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
font-weight: var(--ha-font-weight-bold);
|
||||
}
|
||||
ha-card.warning > .icon {
|
||||
color: var(--warning-color);
|
||||
}
|
||||
ha-card.warning::after {
|
||||
background-color: var(--warning-color);
|
||||
}
|
||||
ha-card.error > .icon {
|
||||
color: var(--error-color);
|
||||
}
|
||||
ha-card.error::after {
|
||||
background-color: var(--error-color);
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
@ -90,7 +90,7 @@ class HuiGaugeCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -121,7 +121,7 @@ export class HuiHumidifierCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -82,7 +82,7 @@ export class HuiLightCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -174,7 +174,7 @@ export class HuiLogbookCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!isComponentLoaded(this.hass, "logbook")) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${this.hass.localize("ui.components.logbook.not_loaded", {
|
||||
platform: "logbook",
|
||||
})}</hui-warning
|
||||
|
@ -145,7 +145,7 @@ export class HuiMediaControlCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -100,7 +100,7 @@ export class HuiPictureCard extends LitElement implements LovelaceCard {
|
||||
if (this._config.image_entity) {
|
||||
stateObj = this.hass.states[this._config.image_entity];
|
||||
if (!stateObj) {
|
||||
return html`<hui-warning>
|
||||
return html`<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.image_entity)}
|
||||
</hui-warning>`;
|
||||
}
|
||||
|
@ -119,7 +119,7 @@ class HuiPictureEntityCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -104,7 +104,7 @@ class HuiPlantStatusCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -113,7 +113,7 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -1,4 +1,3 @@
|
||||
import { mdiExclamationThick, mdiHelp } from "@mdi/js";
|
||||
import type { HassEntity } from "home-assistant-js-websocket";
|
||||
import { LitElement, css, html, nothing } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
@ -37,6 +36,7 @@ import type {
|
||||
} from "../types";
|
||||
import { renderTileBadge } from "./tile/badges/tile-badge";
|
||||
import type { TileCardConfig } from "./types";
|
||||
import { createEntityNotFoundWarning } from "../components/hui-warning";
|
||||
|
||||
export const getEntityDefaultTileIconAction = (entityId: string) => {
|
||||
const domain = computeDomain(entityId);
|
||||
@ -249,20 +249,9 @@ export class HuiTileCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<ha-card>
|
||||
<div class="content ${classMap(contentClasses)}">
|
||||
<ha-tile-icon>
|
||||
<ha-svg-icon slot="icon" .path=${mdiHelp}></ha-svg-icon>
|
||||
<ha-tile-badge class="not-found">
|
||||
<ha-svg-icon .path=${mdiExclamationThick}></ha-svg-icon>
|
||||
</ha-tile-badge>
|
||||
</ha-tile-icon>
|
||||
<ha-tile-info
|
||||
.primary=${entityId}
|
||||
secondary=${this.hass.localize("ui.card.tile.not_found")}
|
||||
></ha-tile-info>
|
||||
</div>
|
||||
</ha-card>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
}
|
||||
|
||||
|
@ -241,7 +241,7 @@ export class HuiTodoListCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._entityId)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -210,7 +210,7 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -215,8 +215,9 @@ export interface EntityFilterCardConfig extends LovelaceCardConfig {
|
||||
}
|
||||
|
||||
export interface ErrorCardConfig extends LovelaceCardConfig {
|
||||
error: string;
|
||||
origConfig: LovelaceCardConfig;
|
||||
error?: string;
|
||||
origConfig?: LovelaceCardConfig;
|
||||
severity?: "warning" | "error";
|
||||
}
|
||||
|
||||
export interface SeverityConfig {
|
||||
|
@ -46,7 +46,7 @@ export class HuiGenericEntityRow extends LitElement {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this.config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -1,24 +1,28 @@
|
||||
import { STATE_NOT_RUNNING } from "home-assistant-js-websocket";
|
||||
import type { TemplateResult } from "lit";
|
||||
import { html, LitElement } from "lit";
|
||||
import { customElement } from "lit/decorators";
|
||||
import { customElement, property } from "lit/decorators";
|
||||
import "../../../components/ha-alert";
|
||||
import type { HomeAssistant } from "../../../types";
|
||||
import "../cards/hui-error-card";
|
||||
|
||||
export const createEntityNotFoundWarning = (
|
||||
hass: HomeAssistant,
|
||||
entityId: string
|
||||
// left for backwards compatibility for custom cards
|
||||
_entityId: string
|
||||
) =>
|
||||
hass.config.state !== STATE_NOT_RUNNING
|
||||
? hass.localize("ui.panel.lovelace.warning.entity_not_found", {
|
||||
entity: entityId || "[empty]",
|
||||
})
|
||||
? hass.localize("ui.card.common.entity_not_found")
|
||||
: hass.localize("ui.panel.lovelace.warning.starting");
|
||||
|
||||
@customElement("hui-warning")
|
||||
export class HuiWarning extends LitElement {
|
||||
@property({ attribute: false }) public hass?: HomeAssistant;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<ha-alert alert-type="warning"><slot></slot></ha-alert> `;
|
||||
return html`<hui-error-card .hass=${this.hass} severity="warning"
|
||||
><slot></slot
|
||||
></hui-error-card>`;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,10 @@ import type { ErrorCardConfig } from "../cards/types";
|
||||
import type { LovelaceElement, LovelaceElementConfig } from "../elements/types";
|
||||
import type { LovelaceRow, LovelaceRowConfig } from "../entity-rows/types";
|
||||
import type { LovelaceHeaderFooterConfig } from "../header-footer/types";
|
||||
import type { LovelaceHeadingBadgeConfig } from "../heading-badges/types";
|
||||
import type {
|
||||
ErrorBadgeConfig as ErrorHeadingBadgeConfig,
|
||||
LovelaceHeadingBadgeConfig,
|
||||
} from "../heading-badges/types";
|
||||
import type {
|
||||
LovelaceBadge,
|
||||
LovelaceBadgeConstructor,
|
||||
@ -31,6 +34,7 @@ import type {
|
||||
LovelaceHeadingBadgeConstructor,
|
||||
LovelaceRowConstructor,
|
||||
} from "../types";
|
||||
import type { ErrorBadgeConfig } from "../badges/types";
|
||||
|
||||
const TIMEOUT = 2000;
|
||||
|
||||
@ -96,7 +100,7 @@ export const createErrorCardElement = (config: ErrorCardConfig) => {
|
||||
return el;
|
||||
};
|
||||
|
||||
export const createErrorBadgeElement = (config: ErrorCardConfig) => {
|
||||
export const createErrorBadgeElement = (config: ErrorBadgeConfig) => {
|
||||
const el = document.createElement("hui-error-badge");
|
||||
if (customElements.get("hui-error-badge")) {
|
||||
el.setConfig(config);
|
||||
@ -110,7 +114,9 @@ export const createErrorBadgeElement = (config: ErrorCardConfig) => {
|
||||
return el;
|
||||
};
|
||||
|
||||
export const createErrorHeadingBadgeElement = (config: ErrorCardConfig) => {
|
||||
export const createErrorHeadingBadgeElement = (
|
||||
config: ErrorHeadingBadgeConfig
|
||||
) => {
|
||||
const el = document.createElement("hui-error-heading-badge");
|
||||
if (customElements.get("hui-error-heading-badge")) {
|
||||
el.setConfig(config);
|
||||
@ -124,12 +130,6 @@ export const createErrorHeadingBadgeElement = (config: ErrorCardConfig) => {
|
||||
return el;
|
||||
};
|
||||
|
||||
export const createErrorCardConfig = (error, origConfig) => ({
|
||||
type: "error",
|
||||
error,
|
||||
origConfig,
|
||||
});
|
||||
|
||||
export const createErrorBadgeConfig = (error, origConfig) => ({
|
||||
type: "error",
|
||||
error,
|
||||
@ -167,7 +167,7 @@ const _createErrorElement = <T extends keyof CreateElementConfigTypes>(
|
||||
createErrorHeadingBadgeConfig(error, config)
|
||||
);
|
||||
}
|
||||
return createErrorCardElement(createErrorCardConfig(error, config));
|
||||
return createErrorCardElement({ type: "error" });
|
||||
};
|
||||
|
||||
const _customCreate = <T extends keyof CreateElementConfigTypes>(
|
||||
|
@ -36,7 +36,7 @@ class HuiButtonEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -35,7 +35,7 @@ class HuiClimateEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -37,7 +37,7 @@ class HuiCoverEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -36,7 +36,7 @@ class HuiDateEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -39,7 +39,7 @@ class HuiInputDatetimeEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -45,7 +45,7 @@ class HuiEventEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -49,7 +49,7 @@ class HuiGroupEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -37,7 +37,7 @@ class HuiHumidifierEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -36,7 +36,7 @@ class HuiInputButtonEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -41,7 +41,7 @@ class HuiInputDatetimeEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -65,7 +65,7 @@ class HuiInputNumberEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -45,7 +45,7 @@ class HuiInputSelectEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -37,7 +37,7 @@ class HuiInputTextEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -37,7 +37,7 @@ class HuiLockEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -92,7 +92,7 @@ class HuiMediaPlayerEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -65,7 +65,7 @@ class HuiNumberEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -38,7 +38,7 @@ class HuiSceneEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -39,7 +39,7 @@ class HuiScriptEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -45,7 +45,7 @@ class HuiSelectEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -42,7 +42,7 @@ class HuiSensorEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -34,7 +34,7 @@ class HuiSimpleEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -40,7 +40,7 @@ class HuiTextEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -37,7 +37,7 @@ class HuiTimeEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -30,7 +30,7 @@ class HuiTimerEntityRow extends LitElement {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -35,7 +35,7 @@ class HuiToggleEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -38,7 +38,7 @@ class HuiUpdateEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -35,7 +35,7 @@ class HuiValveEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -105,7 +105,7 @@ class HuiWeatherEntityRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -42,7 +42,7 @@ class HuiAttributeRow extends LitElement implements LovelaceRow {
|
||||
|
||||
if (!stateObj) {
|
||||
return html`
|
||||
<hui-warning>
|
||||
<hui-warning .hass=${this.hass}>
|
||||
${createEntityNotFoundWarning(this.hass, this._config.entity)}
|
||||
</hui-warning>
|
||||
`;
|
||||
|
@ -63,7 +63,7 @@ export class PanelView extends LitElement implements LovelaceViewElement {
|
||||
protected render(): TemplateResult {
|
||||
return html`
|
||||
${this.cards!.length > 1
|
||||
? html`<hui-warning>
|
||||
? html`<hui-warning .hass=${this.hass}>
|
||||
${this.hass!.localize(
|
||||
"ui.panel.lovelace.editor.view.panel_mode.warning_multiple_cards"
|
||||
)}
|
||||
|
@ -72,14 +72,15 @@
|
||||
},
|
||||
"badge": {
|
||||
"entity": {
|
||||
"not_found": "[%key:ui::card::tile::not_found%]"
|
||||
"not_found": "[%key:ui::card::common::entity_not_found%]"
|
||||
}
|
||||
},
|
||||
"card": {
|
||||
"common": {
|
||||
"turn_on": "Turn on",
|
||||
"turn_off": "Turn off",
|
||||
"toggle": "Toggle"
|
||||
"toggle": "Toggle",
|
||||
"entity_not_found": "Entity not found"
|
||||
},
|
||||
"alarm_control_panel": {
|
||||
"code": "Code",
|
||||
@ -257,9 +258,6 @@
|
||||
"finish": "finish"
|
||||
}
|
||||
},
|
||||
"tile": {
|
||||
"not_found": "Entity not found"
|
||||
},
|
||||
"vacuum": {
|
||||
"actions": {
|
||||
"resume_cleaning": "Resume cleaning",
|
||||
@ -1010,7 +1008,7 @@
|
||||
"my_calendars": "My calendars",
|
||||
"create_calendar": "Create calendar",
|
||||
"today": "Today",
|
||||
"event_retrieval_error": "Could not retrieve events for calendars:",
|
||||
"event_retrieval_error": "Could not retrieve events for calendars",
|
||||
"event": {
|
||||
"add": "Add event",
|
||||
"delete": "Delete event",
|
||||
|
Loading…
x
Reference in New Issue
Block a user