From 28c9631b6c3319361affee902f33fcc605fc3362 Mon Sep 17 00:00:00 2001 From: Robin Wittebol Date: Mon, 28 Feb 2022 12:29:07 +0100 Subject: [PATCH 01/10] Remove white border on date-range-picker triangle (#11877) --- src/components/date-range-picker.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/date-range-picker.ts b/src/components/date-range-picker.ts index 6ad2905564..f0c0951a77 100644 --- a/src/components/date-range-picker.ts +++ b/src/components/date-range-picker.ts @@ -115,6 +115,9 @@ class DateRangePickerElement extends WrappedElement { color: var(--primary-text-color); min-width: initial !important; } + .daterangepicker:after { + display: none; + } .daterangepicker:after { border-bottom: 6px solid var(--card-background-color); } From 89e0bb3f168868af0563685c9e5832d2707094e1 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 28 Feb 2022 12:29:53 +0100 Subject: [PATCH 02/10] Fix date input in Safari (#11871) * Fix date input in Safari * helper --- src/data/input_datetime.ts | 14 ++++++++++++++ .../more-info/controls/more-info-input_datetime.ts | 7 +++++-- .../entity-rows/hui-input-datetime-entity-row.ts | 7 +++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/data/input_datetime.ts b/src/data/input_datetime.ts index 16a2f1b09d..08af492afd 100644 --- a/src/data/input_datetime.ts +++ b/src/data/input_datetime.ts @@ -1,3 +1,4 @@ +import { HassEntity } from "home-assistant-js-websocket"; import { HomeAssistant } from "../types"; export interface InputDateTime { @@ -17,6 +18,19 @@ export interface InputDateTimeMutableParams { has_date: boolean; } +export const stateToIsoDateString = (entityState: HassEntity) => + `${entityState.attributes.year || "1970"}-${String( + entityState.attributes.month || "01" + ).padStart(2, "0")}-${String(entityState.attributes.day || "01").padStart( + 2, + "0" + )}T${String(entityState.attributes.hour || "00").padStart(2, "0")}:${String( + entityState.attributes.minute || "00" + ).padStart(2, "0")}:${String(entityState.attributes.second || "00").padStart( + 2, + "0" + )}`; + export const setInputDateTimeValue = ( hass: HomeAssistant, entityId: string, diff --git a/src/dialogs/more-info/controls/more-info-input_datetime.ts b/src/dialogs/more-info/controls/more-info-input_datetime.ts index a0f11eb726..2bcb5f534e 100644 --- a/src/dialogs/more-info/controls/more-info-input_datetime.ts +++ b/src/dialogs/more-info/controls/more-info-input_datetime.ts @@ -4,7 +4,10 @@ import { customElement, property } from "lit/decorators"; import "../../../components/ha-date-input"; import "../../../components/ha-time-input"; import { UNAVAILABLE_STATES, UNKNOWN } from "../../../data/entity"; -import { setInputDateTimeValue } from "../../../data/input_datetime"; +import { + setInputDateTimeValue, + stateToIsoDateString, +} from "../../../data/input_datetime"; import type { HomeAssistant } from "../../../types"; @customElement("more-info-input_datetime") @@ -24,7 +27,7 @@ class MoreInfoInputDatetime extends LitElement { ? html` diff --git a/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts index 393f0bc7b1..f542b2ec6d 100644 --- a/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts @@ -9,7 +9,10 @@ import { import { customElement, property, state } from "lit/decorators"; import "../../../components/ha-date-input"; import { UNAVAILABLE_STATES, UNKNOWN } from "../../../data/entity"; -import { setInputDateTimeValue } from "../../../data/input_datetime"; +import { + setInputDateTimeValue, + stateToIsoDateString, +} from "../../../data/input_datetime"; import type { HomeAssistant } from "../../../types"; import { hasConfigOrEntityChanged } from "../common/has-changed"; import "../components/hui-generic-entity-row"; @@ -65,7 +68,7 @@ class HuiInputDatetimeEntityRow extends LitElement implements LovelaceRow { .label=${stateObj.attributes.has_time ? name : undefined} .locale=${this.hass.locale} .disabled=${UNAVAILABLE_STATES.includes(stateObj.state)} - .value=${`${stateObj.attributes.year}-${stateObj.attributes.month}-${stateObj.attributes.day}`} + .value=${stateToIsoDateString(stateObj)} @value-changed=${this._dateChanged} > From 437de42c55b3a15edc16cf05124d030f7240f0fa Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 28 Feb 2022 03:30:49 -0800 Subject: [PATCH 03/10] Handle resolve media and cannot play errors (#11878) --- .../media-browser/browser-media-player.ts | 5 +++ .../media-browser/ha-bar-media-player.ts | 32 ++++++++++++++----- .../media-browser/ha-panel-media-browser.ts | 23 +++++++++---- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/panels/media-browser/browser-media-player.ts b/src/panels/media-browser/browser-media-player.ts index bc88414a98..b4096f9a7f 100644 --- a/src/panels/media-browser/browser-media-player.ts +++ b/src/panels/media-browser/browser-media-player.ts @@ -9,6 +9,8 @@ import { import { ResolvedMediaSource } from "../../data/media_source"; import { HomeAssistant } from "../../types"; +export const ERR_UNSUPPORTED_MEDIA = "Unsupported Media"; + export class BrowserMediaPlayer { private player: HTMLAudioElement; @@ -25,6 +27,9 @@ export class BrowserMediaPlayer { private onChange: () => void ) { const player = new Audio(this.resolved.url); + if (player.canPlayType(resolved.mime_type) === "") { + throw new Error(ERR_UNSUPPORTED_MEDIA); + } player.autoplay = true; player.volume = volume; player.addEventListener("play", this._handleChange); diff --git a/src/panels/media-browser/ha-bar-media-player.ts b/src/panels/media-browser/ha-bar-media-player.ts index 14b6b6cdfd..3e913c6e43 100644 --- a/src/panels/media-browser/ha-bar-media-player.ts +++ b/src/panels/media-browser/ha-bar-media-player.ts @@ -49,9 +49,13 @@ import { SUPPORT_VOLUME_SET, } from "../../data/media-player"; import { ResolvedMediaSource } from "../../data/media_source"; +import { showAlertDialog } from "../../dialogs/generic/show-dialog-box"; import type { HomeAssistant } from "../../types"; import "../lovelace/components/hui-marquee"; -import { BrowserMediaPlayer } from "./browser-media-player"; +import { + BrowserMediaPlayer, + ERR_UNSUPPORTED_MEDIA, +} from "./browser-media-player"; declare global { interface HASSDomEvents { @@ -125,13 +129,25 @@ export class BarMediaPlayer extends LitElement { throw Error("Only browser supported"); } this._tearDownBrowserPlayer(); - this._browserPlayer = new BrowserMediaPlayer( - this.hass, - item, - resolved, - this._browserPlayerVolume, - () => this.requestUpdate("_browserPlayer") - ); + try { + this._browserPlayer = new BrowserMediaPlayer( + this.hass, + item, + resolved, + this._browserPlayerVolume, + () => this.requestUpdate("_browserPlayer") + ); + } catch (err: any) { + if (err.message === ERR_UNSUPPORTED_MEDIA) { + showAlertDialog(this, { + text: this.hass.localize( + "ui.components.media-browser.media_not_supported" + ), + }); + } else { + throw err; + } + } this._newMediaExpected = false; } diff --git a/src/panels/media-browser/ha-panel-media-browser.ts b/src/panels/media-browser/ha-panel-media-browser.ts index af3339077e..30cc866b17 100644 --- a/src/panels/media-browser/ha-panel-media-browser.ts +++ b/src/panels/media-browser/ha-panel-media-browser.ts @@ -27,7 +27,10 @@ import { MediaPickedEvent, MediaPlayerItem, } from "../../data/media-player"; -import { resolveMediaSource } from "../../data/media_source"; +import { + ResolvedMediaSource, + resolveMediaSource, +} from "../../data/media_source"; import "../../layouts/ha-app-layout"; import { haStyle } from "../../resources/styles"; import type { HomeAssistant, Route } from "../../types"; @@ -224,11 +227,19 @@ class PanelMediaBrowser extends LitElement { } this._player.showResolvingNewMediaPicked(); - - const resolvedUrl = await resolveMediaSource( - this.hass, - item.media_content_id - ); + let resolvedUrl: ResolvedMediaSource; + try { + resolvedUrl = await resolveMediaSource(this.hass, item.media_content_id); + } catch (err: any) { + showAlertDialog(this, { + title: this.hass.localize( + "ui.components.media-browser.media_browsing_error" + ), + text: err.message, + }); + this._player.hideResolvingNewMediaPicked(); + return; + } if (resolvedUrl.mime_type.startsWith("audio/")) { this._player.playItem(item, resolvedUrl); From 1159798b8dab912416b9e93357256038326cf44f Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 28 Feb 2022 19:32:36 +0100 Subject: [PATCH 04/10] Energy: Wait with subscribe for _config to be set (#11884) --- src/mixins/subscribe-mixin.ts | 18 +++++++++++++++++- .../hui-energy-carbon-consumed-gauge-card.ts | 2 ++ .../energy/hui-energy-devices-graph-card.ts | 2 ++ .../energy/hui-energy-distribution-card.ts | 2 ++ .../cards/energy/hui-energy-gas-graph-card.ts | 2 ++ .../hui-energy-grid-neutrality-gauge-card.ts | 2 ++ .../hui-energy-solar-consumed-gauge-card.ts | 2 ++ .../energy/hui-energy-solar-graph-card.ts | 2 ++ .../energy/hui-energy-sources-table-card.ts | 2 ++ .../energy/hui-energy-usage-graph-card.ts | 2 ++ 10 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/mixins/subscribe-mixin.ts b/src/mixins/subscribe-mixin.ts index 9895637df3..66dbd99519 100644 --- a/src/mixins/subscribe-mixin.ts +++ b/src/mixins/subscribe-mixin.ts @@ -13,6 +13,9 @@ export const SubscribeMixin = >( class SubscribeClass extends superClass { @property({ attribute: false }) public hass?: HomeAssistant; + // we wait with subscribing till these properties are set on the host element + protected hassSubscribeRequiredHostProps?: string[]; + private __unsubs?: Array>; public connectedCallback() { @@ -39,6 +42,16 @@ export const SubscribeMixin = >( super.updated(changedProps); if (changedProps.has("hass")) { this.__checkSubscribed(); + return; + } + if (!this.hassSubscribeRequiredHostProps) { + return; + } + for (const key of changedProps.keys()) { + if (this.hassSubscribeRequiredHostProps.includes(key as string)) { + this.__checkSubscribed(); + return; + } } } @@ -52,7 +65,10 @@ export const SubscribeMixin = >( if ( this.__unsubs !== undefined || !(this as unknown as Element).isConnected || - this.hass === undefined + this.hass === undefined || + this.hassSubscribeRequiredHostProps?.some( + (prop) => this[prop] === undefined + ) ) { return; } diff --git a/src/panels/lovelace/cards/energy/hui-energy-carbon-consumed-gauge-card.ts b/src/panels/lovelace/cards/energy/hui-energy-carbon-consumed-gauge-card.ts index b172f912de..ea2c81d949 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-carbon-consumed-gauge-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-carbon-consumed-gauge-card.ts @@ -32,6 +32,8 @@ class HuiEnergyCarbonGaugeCard @state() private _data?: EnergyData; + protected hassSubscribeRequiredHostProps = ["_config"]; + public getCardSize(): number { return 4; } diff --git a/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts index df4cd50974..f65454631b 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-devices-graph-card.ts @@ -49,6 +49,8 @@ export class HuiEnergyDevicesGraphCard @query("ha-chart-base") private _chart?: HaChartBase; + protected hassSubscribeRequiredHostProps = ["_config"]; + public hassSubscribe(): UnsubscribeFunc[] { return [ getEnergyDataCollection(this.hass, { diff --git a/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts b/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts index 1f85a6e857..c8b573c611 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-distribution-card.ts @@ -43,6 +43,8 @@ class HuiEnergyDistrubutionCard @state() private _data?: EnergyData; + protected hassSubscribeRequiredHostProps = ["_config"]; + public setConfig(config: EnergyDistributionCardConfig): void { this._config = config; } diff --git a/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts index e1941a7c47..8953ebfd6d 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-gas-graph-card.ts @@ -62,6 +62,8 @@ export class HuiEnergyGasGraphCard @state() private _unit?: string; + protected hassSubscribeRequiredHostProps = ["_config"]; + public hassSubscribe(): UnsubscribeFunc[] { return [ getEnergyDataCollection(this.hass, { diff --git a/src/panels/lovelace/cards/energy/hui-energy-grid-neutrality-gauge-card.ts b/src/panels/lovelace/cards/energy/hui-energy-grid-neutrality-gauge-card.ts index cc26d82a0d..bdc0892a62 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-grid-neutrality-gauge-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-grid-neutrality-gauge-card.ts @@ -35,6 +35,8 @@ class HuiEnergyGridGaugeCard @state() private _data?: EnergyData; + protected hassSubscribeRequiredHostProps = ["_config"]; + public hassSubscribe(): UnsubscribeFunc[] { return [ getEnergyDataCollection(this.hass!, { diff --git a/src/panels/lovelace/cards/energy/hui-energy-solar-consumed-gauge-card.ts b/src/panels/lovelace/cards/energy/hui-energy-solar-consumed-gauge-card.ts index 578ae00fd5..756e78410f 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-solar-consumed-gauge-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-solar-consumed-gauge-card.ts @@ -30,6 +30,8 @@ class HuiEnergySolarGaugeCard @state() private _data?: EnergyData; + protected hassSubscribeRequiredHostProps = ["_config"]; + public hassSubscribe(): UnsubscribeFunc[] { return [ getEnergyDataCollection(this.hass!, { diff --git a/src/panels/lovelace/cards/energy/hui-energy-solar-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-solar-graph-card.ts index 157079a24e..6e3abbe7d7 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-solar-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-solar-graph-card.ts @@ -61,6 +61,8 @@ export class HuiEnergySolarGraphCard @state() private _end = endOfToday(); + protected hassSubscribeRequiredHostProps = ["_config"]; + public hassSubscribe(): UnsubscribeFunc[] { return [ getEnergyDataCollection(this.hass, { diff --git a/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts b/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts index 136d4fd81c..e3bce86105 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-sources-table-card.ts @@ -45,6 +45,8 @@ export class HuiEnergySourcesTableCard @state() private _data?: EnergyData; + protected hassSubscribeRequiredHostProps = ["_config"]; + public hassSubscribe(): UnsubscribeFunc[] { return [ getEnergyDataCollection(this.hass, { diff --git a/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts index e75a5776e3..8bd48b0b2c 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-usage-graph-card.ts @@ -50,6 +50,8 @@ export class HuiEnergyUsageGraphCard @state() private _end = endOfToday(); + protected hassSubscribeRequiredHostProps = ["_config"]; + public hassSubscribe(): UnsubscribeFunc[] { return [ getEnergyDataCollection(this.hass, { From a9e5a5dd44dfa9412755fa38f449080d6bde7bf5 Mon Sep 17 00:00:00 2001 From: Steve Repsher Date: Mon, 28 Feb 2022 17:53:39 -0500 Subject: [PATCH 05/10] Add a few button labels (#11885) * Add label to remove addon repository button * Add label to delete energy device button * Add label to quick bar button --- hassio/src/dialogs/repositories/dialog-hassio-repositories.ts | 3 +++ src/panels/config/dashboard/ha-config-dashboard.ts | 1 + .../config/energy/components/ha-energy-device-settings.ts | 1 + 3 files changed, 5 insertions(+) diff --git a/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts b/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts index b208093465..d42cb05a4b 100644 --- a/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts +++ b/hassio/src/dialogs/repositories/dialog-hassio-repositories.ts @@ -106,6 +106,9 @@ class HassioRepositoriesDialog extends LitElement {
${this.hass.localize("panel.config")}
diff --git a/src/panels/config/energy/components/ha-energy-device-settings.ts b/src/panels/config/energy/components/ha-energy-device-settings.ts index fe75d061f6..b135201f13 100644 --- a/src/panels/config/energy/components/ha-energy-device-settings.ts +++ b/src/panels/config/energy/components/ha-energy-device-settings.ts @@ -86,6 +86,7 @@ export class EnergyDeviceSettings extends LitElement { : device.stat_consumption} Date: Tue, 1 Mar 2022 00:31:09 +0100 Subject: [PATCH 06/10] Remove autofocus form log panel search (#11888) --- src/panels/config/logs/ha-config-logs.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/panels/config/logs/ha-config-logs.ts b/src/panels/config/logs/ha-config-logs.ts index ef179eee07..cd979817c6 100644 --- a/src/panels/config/logs/ha-config-logs.ts +++ b/src/panels/config/logs/ha-config-logs.ts @@ -55,7 +55,6 @@ export class HaConfigLogs extends LitElement { : html`