From e49664bad31d4d294a8e0368f86a1bdb5f72e367 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 2 Jun 2021 04:10:37 +0000 Subject: [PATCH 01/14] Translation update --- translations/frontend/ca.json | 12 +++++++++--- translations/frontend/en.json | 4 +++- translations/frontend/es.json | 6 +++++- translations/frontend/et.json | 6 +++++- translations/frontend/it.json | 6 +++++- translations/frontend/nl.json | 4 ++++ translations/frontend/ru.json | 6 +++++- translations/frontend/zh-Hans.json | 8 ++++++-- translations/frontend/zh-Hant.json | 6 +++++- 9 files changed, 47 insertions(+), 11 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index afe04d60bc..26a4bab5be 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -929,8 +929,11 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "Si es desactiva, les entitats descobertes recentment per a {integration} no s'afegiran automàticament a Home Assistant.", + "enable_new_entities_description": "Si està activat, les noves entitats descobertes per {integration} s'afegiran automàticament a Home Assistant.", "enable_new_entities_label": "Activa entitats afegides recentment.", + "enable_polling_description": "Si Home Assistant ha de sondejar automàticament {integration} per obtenir actualitzacions de les entitats.", + "enable_polling_label": "Activa el sondeig per obtenir actualitzacions.", + "restart_home_assistant": "Has de reiniciar Home Assistant per aplicar els canvis.", "title": "Opcions del sistema per a {integration}", "update": "Actualitza" }, @@ -1540,7 +1543,7 @@ "delete_confirm": "Segur que vols eliminar-ho?", "duplicate": "Duplica", "header": "Disparadors", - "introduction": "Els activadors són les regles que fan que es dispari una automatització. Pots definir més d'un activador per a cada automatització. Una vegada s'iniciï un activador, Home Assistant validarà les condicions (si n'hi ha) i finalment cridarà l'acció.", + "introduction": "Els disparadors són les regles que fan que s'executi una automatització. Pots definir més d'un disparador per a cada automatització. Una vegada salti un disparador, Home Assistant validarà les condicions (si n'hi ha) i finalment cridarà l'acció.", "learn_more": "Més informació sobre els activadors", "name": "Disparador", "type_select": "Tipus de disparador", @@ -2073,7 +2076,8 @@ "scripts": "Programes (scripts)", "unknown_error": "Error desconegut", "unnamed_device": "Dispositiu sense nom", - "update": "Actualitza" + "update": "Actualitza", + "update_device_error": "No s'ha pogut actualitzar el dispositiu" }, "entities": { "caption": "Entitats", @@ -2206,6 +2210,7 @@ "depends_on_cloud": "Depèn del núvol", "device_unavailable": "Dispositiu no disponible", "devices": "{count} {count, plural,\n one {dispositiu}\n other {dispositius}\n}", + "disable_error": "S'ha produït un error en activar o desactivar la integració", "disable_restart_confirm": "Reinicia Home Assistant per acabar de desactivar aquesta integració", "disable": { "disable_confirm": "Estàs segur que vols desactivar aquesta entrada de configuració? Els seus dispositius i entitats es desactivaran.", @@ -2217,6 +2222,7 @@ }, "disabled_cause": "Desactivada per {cause}" }, + "disabled_polling": "Sondeig automàtic per l'obtenció de dades actualitzades desactivat", "documentation": "Documentació", "enable_restart_confirm": "Reinicia Home Assistant per acabar d'activar aquesta integració", "entities": "{count} {count, plural,\n one {entitat}\n other {entitats}\n}", diff --git a/translations/frontend/en.json b/translations/frontend/en.json index f076e43678..b9dc7ff55e 100644 --- a/translations/frontend/en.json +++ b/translations/frontend/en.json @@ -2076,7 +2076,8 @@ "scripts": "Scripts", "unknown_error": "Unknown error", "unnamed_device": "Unnamed device", - "update": "Update" + "update": "Update", + "update_device_error": "Updating the device failed" }, "entities": { "caption": "Entities", @@ -2209,6 +2210,7 @@ "depends_on_cloud": "Depends on the cloud", "device_unavailable": "Device unavailable", "devices": "{count} {count, plural,\n one {device}\n other {devices}\n}", + "disable_error": "Enabling or disabling of the integration failed", "disable_restart_confirm": "Restart Home Assistant to finish disabling this integration", "disable": { "disable_confirm": "Are you sure you want to disable this config entry? Its devices and entities will be disabled.", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index a42530ef1f..66b76b4d28 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -929,8 +929,11 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "Si está deshabilitada, las nuevas entidades que se descubran para {integration} no se añadirán automáticamente a Home Assistant.", + "enable_new_entities_description": "Si los dispositivos recién descubiertos para {integration} deberían agregarse automáticamente.", "enable_new_entities_label": "Habilitar entidades recién añadidas.", + "enable_polling_description": "Si Home Assistant debería sondear automáticamente las entidades de {integration} para obtener actualizaciones.", + "enable_polling_label": "Habilitar el sondeo de actualizaciones.", + "restart_home_assistant": "Debes reiniciar Home Assistant para que los cambios surtan efecto.", "title": "Opciones del sistema para {integration}", "update": "Actualizar" }, @@ -2217,6 +2220,7 @@ }, "disabled_cause": "Deshabilitada por {cause}" }, + "disabled_polling": "Sondeo automático para datos actualizados deshabilitado", "documentation": "Documentación", "enable_restart_confirm": "Reinicia Home Assistant para terminar de habilitar esta integración", "entities": "{count} {count, plural,\n one {entidad}\n other {entidades}\n}", diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 29c4b37799..5f6aa82a9a 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -929,8 +929,11 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "Kui see on keelatud ei lisata äsja avastatud sidumise {integration} olemeid automaatselt Home Assistant'i.", + "enable_new_entities_description": "Kas lisada äsja avastatud sidumise {integration} olemed automaatselt Home Assistant'i.", "enable_new_entities_label": "Luba äsja lisatud olemid.", + "enable_polling_description": "Kas Home Assistant peaks automaatselt küsitlema {integration} üksusi uuenduste saamiseks.", + "enable_polling_label": "Luba värskenduste jaoks küsitlus.", + "restart_home_assistant": "Muudatuste jõustumiseks pead Home Assistanti taaskäivitama.", "title": "Süsteemi valikud {integration} jaoks", "update": "Uuenda" }, @@ -2217,6 +2220,7 @@ }, "disabled_cause": "Keelatud {cause} põhjusel" }, + "disabled_polling": "Uuendatud andmete automaatne päring on välja lülitatud", "documentation": "Vaata dokumentatsiooni", "enable_restart_confirm": "Selle sidumise lubamise lõpetamiseks taaskäivita Home Assistant", "entities": "{count} {count, plural,\n one {olem}\n other{olemit}\n}", diff --git a/translations/frontend/it.json b/translations/frontend/it.json index e72b301dd8..1815c2307b 100644 --- a/translations/frontend/it.json +++ b/translations/frontend/it.json @@ -931,6 +931,9 @@ "config_entry_system_options": { "enable_new_entities_description": "Se disabilitato, le entità appena rilevate per {integration} non verranno automaticamente aggiunte a Home Assistant.", "enable_new_entities_label": "Abilita nuove entità aggiunte.", + "enable_polling_description": "Se disabilitato, Home Assistant non richiederà più in automatico aggiornamenti alle entità dell'integrazione {integration}.", + "enable_polling_label": "Abilita il polling per gli aggiornamenti.", + "restart_home_assistant": "È necessario riavviare Home Assistant affinché le modifiche abbiano effetto.", "title": "Opzioni di sistema per {integration}", "update": "Aggiorna" }, @@ -2215,8 +2218,9 @@ "integration": "Integrazione", "user": "utente" }, - "disabled_cause": "Disabilitato da {causa}" + "disabled_cause": "Disabilitato da {cause}" }, + "disabled_polling": "Polling automatico per i dati aggiornati disabilitato", "documentation": "Documentazione", "enable_restart_confirm": "Riavvia Home Assistant per completare l'attivazione di questa integrazione", "entities": "{count} {count, plural, \none {entità}\nother {entità }\n}", diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 7a6c1683d5..606fda0db6 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -931,6 +931,9 @@ "config_entry_system_options": { "enable_new_entities_description": "Indien uitgeschakeld, worden nieuwe entiteiten van {integration} niet automatisch aan Home Assistant toegevoegd.", "enable_new_entities_label": "Voeg nieuwe entiteiten automatisch toe", + "enable_polling_description": "Of Home Assistant automatisch moet pollen voor updates voor {integration} entiteiten", + "enable_polling_label": "Schakel polling voor updates in.", + "restart_home_assistant": "U moet Home Assistant opnieuw starten om uw wijzigingen door te voeren.", "title": "Systeeminstellingen voor {integration}", "update": "Bijwerken" }, @@ -2217,6 +2220,7 @@ }, "disabled_cause": "Uitgeschakeld door {cause}" }, + "disabled_polling": "Automatische polling voor bijgewerkte gegevens uitgeschakeld", "documentation": "Documentatie", "enable_restart_confirm": "Start Home Assistant opnieuw op om het opzetten van deze integratie te voltooien", "entities": "{count} {count, plural,\n one {entiteit}\n other {entiteiten}\n}", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 62a5597b76..e941e8056f 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -929,8 +929,11 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "{integration} будет автоматически добавлять в Home Assistant вновь обнаруженные объекты", + "enable_new_entities_description": "Home Assistant будет автоматически добавлять новые обнаруженные устройства {integration}", "enable_new_entities_label": "Добавлять новые объекты", + "enable_polling_description": "Home Assistant будет автоматически опрашивать объекты {integration} для получения обновлений", + "enable_polling_label": "Включить опрос для получения обновлений", + "restart_home_assistant": "Чтобы изменения вступили в силу, нужно перезапустить Home Assistant.", "title": "{integration}", "update": "Обновить" }, @@ -2217,6 +2220,7 @@ }, "disabled_cause": "Деактивировано {cause}" }, + "disabled_polling": "Автоматический опрос для получения обновленных данных отключен", "documentation": "Документация", "enable_restart_confirm": "Перезапустите Home Assistant, чтобы завершить подключение этой интеграции.", "entities": "{count} {count, plural,\n one {объект}\n few {объекта}\n many {объектов}\n other {объектов}\n}", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 2e84844e56..e4fa98654b 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -929,8 +929,11 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "如果禁用,从 {integration} 新发现的实体将不会自动添加到 Home Assistant。", + "enable_new_entities_description": "是否将 {integration} 新发现的实体自动添加到 Home Assistant。", "enable_new_entities_label": "启用新添加的实体。", + "enable_polling_description": "是否让 Home Assistant 轮询 {integration} 的实体,以便更新其状态。", + "enable_polling_label": "启用轮询刷新。", + "restart_home_assistant": "需要重新启动 Home Assistant 才能使更改生效。", "title": "{integration} 系统选项", "update": "更新" }, @@ -2115,7 +2118,7 @@ "confirm_title": "您要删除这 {number} 个实体吗?" }, "search": "搜索实体", - "selected": "选择了 {number} 项", + "selected": "已选择 {number} 项", "status": { "disabled": "已禁用", "ok": "确定", @@ -2217,6 +2220,7 @@ }, "disabled_cause": "通过{cause}禁用" }, + "disabled_polling": "自动轮询刷新数据已禁用", "documentation": "文档", "enable_restart_confirm": "重启 Home Assistant 以完成此集成的启用", "entities": "{count} {count, plural,\n one {个实体}\n other {个实体}\n}", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index d6f2f605db..0c8477bf11 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -929,8 +929,11 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "關閉後,{integration} 新發現的實體將不會自動新增至 Home Assistant。", + "enable_new_entities_description": "關閉後,{integration} 新發現的實體將不會自動新增。", "enable_new_entities_label": "啟用新增實體", + "enable_polling_description": "是否讓 Home Assistant 自動輪詢 {integration} 實體以獲得更新。", + "enable_polling_label": "開啟自動輪詢更新。", + "restart_home_assistant": "需要重啟 Home Assistant 才能使變更生效。", "title": "{integration} 系統選項", "update": "更新" }, @@ -2217,6 +2220,7 @@ }, "disabled_cause": "由 {cause} 關閉。" }, + "disabled_polling": "自動輪詢更新資料已關閉。", "documentation": "相關文件", "enable_restart_confirm": "重啟 Home Assistant 以完成整合開啟", "entities": "{count} {count, plural,\n one {個實體}\n other {個實體}\n}", From 1b282b65b712985aacdce10fca1ab8a55aa46f84 Mon Sep 17 00:00:00 2001 From: Brynley McDonald Date: Wed, 2 Jun 2021 19:59:22 +1200 Subject: [PATCH 02/14] Add QR code to long lived access tokens dialog (#8948) * Add QR code to long lived access tokens dialog * Apply suggestions from code review Co-authored-by: Bram Kragten * Further changes from code review Co-authored-by: Bram Kragten --- .../ha-long-lived-access-token-dialog.ts | 115 ++++++++++++++++++ .../ha-long-lived-access-tokens-card.ts | 9 +- .../show-long-lived-access-token-dialog.ts | 17 +++ 3 files changed, 134 insertions(+), 7 deletions(-) create mode 100644 src/panels/profile/ha-long-lived-access-token-dialog.ts create mode 100644 src/panels/profile/show-long-lived-access-token-dialog.ts diff --git a/src/panels/profile/ha-long-lived-access-token-dialog.ts b/src/panels/profile/ha-long-lived-access-token-dialog.ts new file mode 100644 index 0000000000..6c526b70d9 --- /dev/null +++ b/src/panels/profile/ha-long-lived-access-token-dialog.ts @@ -0,0 +1,115 @@ +import { + css, + CSSResult, + customElement, + html, + internalProperty, + LitElement, + property, + TemplateResult, +} from "lit-element"; +import "@material/mwc-button"; +import "@polymer/paper-input/paper-input"; +import { fireEvent } from "../../common/dom/fire_event"; +import { createCloseHeading } from "../../components/ha-dialog"; +import { haStyleDialog } from "../../resources/styles"; +import type { HomeAssistant } from "../../types"; +import { LongLivedAccessTokenDialogParams } from "./show-long-lived-access-token-dialog"; + +const QR_LOGO_URL = "/static/icons/favicon-192x192.png"; + +@customElement("ha-long-lived-access-token-dialog") +export class HaLongLivedAccessTokenDialog extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + @property({ attribute: false }) + private _params?: LongLivedAccessTokenDialogParams; + + @internalProperty() private _qrCode?: TemplateResult; + + public showDialog(params: LongLivedAccessTokenDialogParams): void { + this._params = params; + } + + public closeDialog() { + this._params = undefined; + this._qrCode = undefined; + fireEvent(this, "dialog-closed", { dialog: this.localName }); + } + + protected render(): TemplateResult { + if (!this._params || !this._params.token) { + return html``; + } + + return html` + +
+ +
+ ${this._qrCode + ? this._qrCode + : html` + + Generate QR code + + `} +
+
+
+ `; + } + + private async _generateQR() { + const qrcode = await import("qrcode"); + const canvas = await qrcode.toCanvas(this._params?.token, { + width: 180, + errorCorrectionLevel: "Q", + }); + const context = canvas.getContext("2d"); + + const imageObj = new Image(); + imageObj.src = QR_LOGO_URL; + await new Promise((resolve) => { + imageObj.onload = resolve; + }); + context.drawImage( + imageObj, + canvas.width / 3, + canvas.height / 3, + canvas.width / 3, + canvas.height / 3 + ); + + this._qrCode = html``; + } + + static get styles(): CSSResult[] { + return [ + haStyleDialog, + css` + #qr { + text-align: center; + } + `, + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-long-lived-access-token-dialog": HaLongLivedAccessTokenDialog; + } +} diff --git a/src/panels/profile/ha-long-lived-access-tokens-card.ts b/src/panels/profile/ha-long-lived-access-tokens-card.ts index 789a79b206..b8554c35cf 100644 --- a/src/panels/profile/ha-long-lived-access-tokens-card.ts +++ b/src/panels/profile/ha-long-lived-access-tokens-card.ts @@ -18,6 +18,7 @@ import { import { haStyle } from "../../resources/styles"; import "../../styles/polymer-ha-style"; import { HomeAssistant } from "../../types"; +import { showLongLivedAccessTokenDialog } from "./show-long-lived-access-token-dialog"; @customElement("ha-long-lived-access-tokens-card") class HaLongLivedTokens extends LitElement { @@ -118,13 +119,7 @@ class HaLongLivedTokens extends LitElement { client_name: name, }); - showPromptDialog(this, { - title: name, - text: this.hass.localize( - "ui.panel.profile.long_lived_access_tokens.prompt_copy_token" - ), - defaultValue: token, - }); + showLongLivedAccessTokenDialog(this, { token, name }); fireEvent(this, "hass-refresh-tokens"); } catch (err) { diff --git a/src/panels/profile/show-long-lived-access-token-dialog.ts b/src/panels/profile/show-long-lived-access-token-dialog.ts new file mode 100644 index 0000000000..00ac5a9a53 --- /dev/null +++ b/src/panels/profile/show-long-lived-access-token-dialog.ts @@ -0,0 +1,17 @@ +import { fireEvent } from "../../common/dom/fire_event"; + +export interface LongLivedAccessTokenDialogParams { + token: string; + name: string; +} + +export const showLongLivedAccessTokenDialog = ( + element: HTMLElement, + longLivedAccessTokenDialogParams: LongLivedAccessTokenDialogParams +): void => { + fireEvent(element, "show-dialog", { + dialogTag: "ha-long-lived-access-token-dialog", + dialogImport: () => import("./ha-long-lived-access-token-dialog"), + dialogParams: longLivedAccessTokenDialogParams, + }); +}; From fe5f9576c678571b993b1f8f9f66e54b65b05afe Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 2 Jun 2021 10:11:29 +0200 Subject: [PATCH 03/14] Fix dev --- .../ha-long-lived-access-token-dialog.ts | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/panels/profile/ha-long-lived-access-token-dialog.ts b/src/panels/profile/ha-long-lived-access-token-dialog.ts index 6c526b70d9..ad940ccc0a 100644 --- a/src/panels/profile/ha-long-lived-access-token-dialog.ts +++ b/src/panels/profile/ha-long-lived-access-token-dialog.ts @@ -1,15 +1,7 @@ -import { - css, - CSSResult, - customElement, - html, - internalProperty, - LitElement, - property, - TemplateResult, -} from "lit-element"; import "@material/mwc-button"; import "@polymer/paper-input/paper-input"; +import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { customElement, property, state } from "lit/decorators"; import { fireEvent } from "../../common/dom/fire_event"; import { createCloseHeading } from "../../components/ha-dialog"; import { haStyleDialog } from "../../resources/styles"; @@ -22,10 +14,9 @@ const QR_LOGO_URL = "/static/icons/favicon-192x192.png"; export class HaLongLivedAccessTokenDialog extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; - @property({ attribute: false }) - private _params?: LongLivedAccessTokenDialogParams; + @state() private _params?: LongLivedAccessTokenDialogParams; - @internalProperty() private _qrCode?: TemplateResult; + @state() private _qrCode?: TemplateResult; public showDialog(params: LongLivedAccessTokenDialogParams): void { this._params = params; @@ -96,7 +87,7 @@ export class HaLongLivedAccessTokenDialog extends LitElement { this._qrCode = html``; } - static get styles(): CSSResult[] { + static get styles(): CSSResultGroup { return [ haStyleDialog, css` From b05e86d442055d1db4ca167c89147c6dc15bd329 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 2 Jun 2021 18:33:44 +0200 Subject: [PATCH 04/14] Fix noUnderline in search input (#9339) --- src/common/search/search-input.ts | 35 ++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/common/search/search-input.ts b/src/common/search/search-input.ts index bde0c9ab5c..5a45277a0e 100644 --- a/src/common/search/search-input.ts +++ b/src/common/search/search-input.ts @@ -1,9 +1,16 @@ import "@material/mwc-icon-button/mwc-icon-button"; import { mdiClose, mdiMagnify } from "@mdi/js"; import "@polymer/paper-input/paper-input"; -import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; -import { customElement, property } from "lit/decorators"; -import { classMap } from "lit/directives/class-map"; +import type { PaperInputElement } from "@polymer/paper-input/paper-input"; +import { + css, + CSSResultGroup, + html, + LitElement, + PropertyValues, + TemplateResult, +} from "lit"; +import { customElement, property, query } from "lit/decorators"; import "../../components/ha-svg-icon"; import { fireEvent } from "../dom/fire_event"; @@ -27,18 +34,11 @@ class SearchInput extends LitElement { this.shadowRoot!.querySelector("paper-input")!.focus(); } + @query("paper-input", true) private _input!: PaperInputElement; + protected render(): TemplateResult { return html` - Date: Wed, 2 Jun 2021 18:33:55 +0200 Subject: [PATCH 05/14] Fix ZHA visualization (#9337) --- .../zha/zha-network-visualization-page.ts | 137 ++++++++++-------- 1 file changed, 80 insertions(+), 57 deletions(-) diff --git a/src/panels/config/integrations/integration-panels/zha/zha-network-visualization-page.ts b/src/panels/config/integrations/integration-panels/zha/zha-network-visualization-page.ts index b42c15fb6b..4584f2e9b7 100644 --- a/src/panels/config/integrations/integration-panels/zha/zha-network-visualization-page.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-network-visualization-page.ts @@ -9,7 +9,12 @@ import { } from "../../../../../data/zha"; import "../../../../../layouts/hass-tabs-subpage"; import type { HomeAssistant, Route } from "../../../../../types"; -import { Network, Edge, Node, EdgeOptions } from "vis-network/peer"; +import { + Network, + Edge, + Node, + EdgeOptions, +} from "vis-network/peer/esm/vis-network"; import "../../../../../common/search/search-input"; import "../../../../../components/device/ha-device-picker"; import "../../../../../components/ha-button-menu"; @@ -21,6 +26,7 @@ import "../../../../../components/ha-checkbox"; import type { HaCheckbox } from "../../../../../components/ha-checkbox"; import { zhaTabs } from "./zha-config-dashboard"; import { customElement, property, query, state } from "lit/decorators"; +import "../../../../../components/ha-formfield"; @customElement("zha-network-visualization-page") export class ZHANetworkVisualizationPage extends LitElement { @@ -28,7 +34,7 @@ export class ZHANetworkVisualizationPage extends LitElement { @property({ attribute: false }) public route!: Route; - @property({ type: Boolean }) public narrow!: boolean; + @property({ type: Boolean, reflect: true }) public narrow!: boolean; @property({ type: Boolean }) public isWide!: boolean; @@ -67,8 +73,6 @@ export class ZHANetworkVisualizationPage extends LitElement { {}, { autoResize: true, - height: window.innerHeight + "px", - width: window.innerWidth + "px", layout: { improvedLayout: true, }, @@ -135,17 +139,35 @@ export class ZHANetworkVisualizationPage extends LitElement { "ui.panel.config.zha.visualization.header" )} > -
- - + ${this.narrow + ? html` +
+ + +
+ ` + : ""} +
+ ${!this.narrow + ? html`` + : ""} this._filterDevices(device)} @value-changed=${this._onZoomToDevice} > - ${this.hass!.localize("ui.panel.config.zha.visualization.auto_zoom")} - ${this.hass!.localize( - "ui.panel.config.zha.visualization.refresh_topology" - )} +
+ + + + + + ${this.hass!.localize( + "ui.panel.config.zha.visualization.refresh_topology" + )} + +
@@ -352,30 +382,23 @@ export class ZHANetworkVisualizationPage extends LitElement { return [ css` .header { - font-family: var(--paper-font-display1_-_font-family); - -webkit-font-smoothing: var( - --paper-font-display1_-_-webkit-font-smoothing - ); - font-size: var(--paper-font-display1_-_font-size); - font-weight: var(--paper-font-display1_-_font-weight); - letter-spacing: var(--paper-font-display1_-_letter-spacing); - line-height: var(--paper-font-display1_-_line-height); - opacity: var(--dark-primary-opacity); - } - - .table-header { - border-bottom: 1px solid --divider-color; - padding: 0 16px; + border-bottom: 1px solid var(--divider-color); + padding: 0 8px; display: flex; align-items: center; - flex-direction: row; + justify-content: space-between; height: var(--header-height); + box-sizing: border-box; } - :host([narrow]) .table-header { + .header > * { + padding: 0 8px; + } + + :host([narrow]) .header { flex-direction: column; align-items: stretch; - height: var(--header-height) * 3; + height: var(--header-height) * 2; } .search-toolbar { @@ -386,34 +409,34 @@ export class ZHANetworkVisualizationPage extends LitElement { } search-input { - position: relative; - top: 2px; flex: 1; } - :host(:not([narrow])) search-input { - margin: 5px; - } - search-input.header { - left: -8px; + display: block; + position: relative; + top: -2px; + color: var(--secondary-text-color); } ha-device-picker { flex: 1; + position: relative; + top: -4px; } - :host(:not([narrow])) ha-device-picker { - margin: 5px; + .controls { + display: flex; + align-items: center; + justify-content: space-between; } - mwc-button { - font-weight: 500; - color: var(--primary-color); + #visualization { + height: calc(100% - var(--header-height)); + width: 100%; } - - :host(:not([narrow])) mwc-button { - margin: 5px; + :host([narrow]) #visualization { + height: calc(100% - (var(--header-height) * 2)); } `, ]; From 68bc549d6a67ae832c06dd37032a70e84a66c5c6 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 2 Jun 2021 18:34:18 +0200 Subject: [PATCH 06/14] Use HLS light build (#9338) * Use HLS light build * Bump hls, backBufferLength --- package.json | 2 +- src/components/ha-hls-player.ts | 12 +++++++++--- yarn.lock | 8 ++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index c316946391..e54c178377 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,7 @@ "fecha": "^4.2.0", "fuse.js": "^6.0.0", "google-timezones-json": "^1.0.2", - "hls.js": "^1.0.4", + "hls.js": "^1.0.5", "home-assistant-js-websocket": "^5.10.0", "idb-keyval": "^5.0.5", "intl-messageformat": "^9.6.16", diff --git a/src/components/ha-hls-player.ts b/src/components/ha-hls-player.ts index 857e2c1874..6120e5aa91 100644 --- a/src/components/ha-hls-player.ts +++ b/src/components/ha-hls-player.ts @@ -13,6 +13,11 @@ import { nextRender } from "../common/util/render-status"; import { getExternalConfig } from "../external_app/external_config"; import type { HomeAssistant } from "../types"; +type HlsLite = Omit< + HlsType, + "subtitleTrackController" | "audioTrackController" | "emeController" +>; + @customElement("ha-hls-player") class HaHLSPlayer extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -39,7 +44,7 @@ class HaHLSPlayer extends LitElement { @state() private _attached = false; - private _hlsPolyfillInstance?: HlsType; + private _hlsPolyfillInstance?: HlsLite; private _useExoPlayer = false; @@ -103,7 +108,8 @@ class HaHLSPlayer extends LitElement { const useExoPlayerPromise = this._getUseExoPlayer(); const masterPlaylistPromise = fetch(this.url); - const Hls = (await import("hls.js")).default; + const Hls: typeof HlsType = (await import("hls.js/dist/hls.light.min.js")) + .default; let hlsSupported = Hls.isSupported(); if (!hlsSupported) { @@ -182,7 +188,7 @@ class HaHLSPlayer extends LitElement { url: string ) { const hls = new Hls({ - liveBackBufferLength: 60, + backBufferLength: 60, fragLoadingTimeOut: 30000, manifestLoadingTimeOut: 30000, levelLoadingTimeOut: 30000, diff --git a/yarn.lock b/yarn.lock index 5a9c6340ca..af5d0f949e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7462,10 +7462,10 @@ he@1.2.0, he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hls.js@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.0.4.tgz#1b191f0f49c992e5c22d4a648ac73630d13d3c2e" - integrity sha512-sTea9L0ORE9u5dThUjEhDP4t9YzakEYRyMHEYQctaLZf2X9ihjmUbqKneExQWHXZz2cYQs5ihaKUe8QnrQDp7Q== +hls.js@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.0.5.tgz#3879bcf5ebcd6cdc188279cf9c15a74ac773630c" + integrity sha512-G7euEVuzM2AMZ69OzpQikO0HDJTMReX8OMUJmGhgwcjyh2OSsL2mGiqbL+6aK6wmUJelUfIh+FLyH73udZVYKQ== hmac-drbg@^1.0.1: version "1.0.1" From c956491ec554c8ec9c17dda5c3b510238caf8017 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 3 Jun 2021 03:48:04 +0000 Subject: [PATCH 07/14] Translation update --- translations/frontend/ca.json | 2 +- translations/frontend/es.json | 4 +++- translations/frontend/et.json | 4 +++- translations/frontend/nb.json | 10 ++++++++-- translations/frontend/ru.json | 8 +++++--- translations/frontend/zh-Hans.json | 4 +++- translations/frontend/zh-Hant.json | 4 +++- 7 files changed, 26 insertions(+), 10 deletions(-) diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index 26a4bab5be..54c8a184ff 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -1391,7 +1391,7 @@ "type_select": "Tipus de repetició", "type": { "count": { - "label": "Compta" + "label": "Comptador" }, "until": { "conditions": "Condicions de \"Fins que\"", diff --git a/translations/frontend/es.json b/translations/frontend/es.json index 66b76b4d28..002eb09069 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -2076,7 +2076,8 @@ "scripts": "Scripts", "unknown_error": "Error desconocido", "unnamed_device": "Dispositivo sin nombre", - "update": "Actualizar" + "update": "Actualizar", + "update_device_error": "Error al actualizar el dispositivo" }, "entities": { "caption": "Entidades", @@ -2209,6 +2210,7 @@ "depends_on_cloud": "Depende de la nube", "device_unavailable": "Dispositivo no disponible", "devices": "{count} {count, plural,\n one {dispositivo}\n other {dispositivos}\n}", + "disable_error": "Error al habilitar o deshabilitar la integración", "disable_restart_confirm": "Reinicia Home Assistant para terminar de deshabilitar esta integración", "disable": { "disable_confirm": "¿Estás seguro de que deseas deshabilitar esta entrada de configuración? Sus dispositivos y entidades estarán deshabilitados.", diff --git a/translations/frontend/et.json b/translations/frontend/et.json index 5f6aa82a9a..c017a16e88 100644 --- a/translations/frontend/et.json +++ b/translations/frontend/et.json @@ -2076,7 +2076,8 @@ "scripts": "Skriptid", "unknown_error": "Tundmatu viga", "unnamed_device": "Nimetu seade", - "update": "Uuenda" + "update": "Uuenda", + "update_device_error": "Seadme värskendamine nurjus" }, "entities": { "caption": "Olemite register", @@ -2209,6 +2210,7 @@ "depends_on_cloud": "Sõltub pilveteenusest", "device_unavailable": "Seade pole saadaval", "devices": "{count} {count, plural,\n one {seade}\n other {seadet}\n}", + "disable_error": "Sidumise lubamine või keelamine nurjus", "disable_restart_confirm": "Taaskäivita Home Assistant, et lõpetada selle sidumise keelamine", "disable": { "disable_confirm": "Kas soovid selle seadistuskirje kindlasti keelata? Selle seadmed ja üksused keelatakse.", diff --git a/translations/frontend/nb.json b/translations/frontend/nb.json index f5d487d89e..db4682fb93 100644 --- a/translations/frontend/nb.json +++ b/translations/frontend/nb.json @@ -929,8 +929,11 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "Hvis den er deaktivert, blir ikke nyoppdagede entiteter for {integration} automatisk lagt til i Home Assistant.", + "enable_new_entities_description": "Hvis nylig oppdagede enheter for {integration} skal legges til automatisk.", "enable_new_entities_label": "Aktiver entiteter som nylig er lagt til.", + "enable_polling_description": "Hvis Home Assistant automatisk skal avstemme {integration} enheter for oppdateringer.", + "enable_polling_label": "Aktiver avstemning for oppdateringer.", + "restart_home_assistant": "Du må starte Home Assistant på nytt for at endringene skal tre i kraft.", "title": "Systemalternativer for {integration}", "update": "Oppdater" }, @@ -2073,7 +2076,8 @@ "scripts": "Skript", "unknown_error": "Ukjent feil", "unnamed_device": "Enhet uten navn", - "update": "Oppdater" + "update": "Oppdater", + "update_device_error": "Oppdatering av enheten mislyktes" }, "entities": { "caption": "Entiteter", @@ -2206,6 +2210,7 @@ "depends_on_cloud": "Avhenger av skyen", "device_unavailable": "Enheten er utilgjengelig", "devices": "{count} {count, plural,\n one {enhet}\n other {enheter}\n}", + "disable_error": "Aktivering eller deaktivering av integrasjonen mislyktes", "disable_restart_confirm": "Start Home Assistant på nytt for å fullføre deaktiveringen av denne integreringen", "disable": { "disable_confirm": "Er du sikker på at du vil deaktivere denne config-oppføringen? Enhetene og enhetene deaktiveres.", @@ -2217,6 +2222,7 @@ }, "disabled_cause": "Deaktivert av {cause}" }, + "disabled_polling": "Automatisk avstemning for oppdaterte data deaktivert", "documentation": "Dokumentasjon", "enable_restart_confirm": "Start Home Assistant på nytt for å fullføre aktiveringen av denne integreringen", "entities": "{count} {count, plural,\n one {entitet}\n other {entiteter}\n}", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index e941e8056f..0be73ee056 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -394,7 +394,7 @@ "failed_to_delete": "Не удалось удалить", "folder": { "addons/local": "Локальные дополнения", - "homeassistant": "Home Assistant", + "homeassistant": "Home Assistant configuration", "media": "Media", "share": "Share", "ssl": "SSL" @@ -411,7 +411,7 @@ "select_type": "Выберите что нужно восстановить", "selected": "Выбрано: {number}", "type": "Тип снимка", - "upload_snapshot": "Загрузить снимок" + "upload_snapshot": "Загрузить снимок на сервер" }, "store": { "missing_addons": "Пропали дополнения? Активируйте расширенный режим на странице Вашего профиля пользователя", @@ -2076,7 +2076,8 @@ "scripts": "Скрипты", "unknown_error": "Неизвестная ошибка.", "unnamed_device": "Устройство без названия", - "update": "Обновить" + "update": "Обновить", + "update_device_error": "Не удалось обновить устройство" }, "entities": { "caption": "Объекты", @@ -2209,6 +2210,7 @@ "depends_on_cloud": "Зависит от облачных сервисов", "device_unavailable": "Устройство недоступно", "devices": "{count} {count, plural,\n one {устройство}\n few {устройства}\n many {устройств}\n other {устройств}\n}", + "disable_error": "Не удалось активировать или деактивировать интеграцию", "disable_restart_confirm": "Перезапустите Home Assistant, чтобы завершить деактивацию этой интеграции.", "disable": { "disable_confirm": "Вы уверены, что хотите деактивировать эту запись конфигурации? Её дочерние устройства и объекты будут также деактивированы.", diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index e4fa98654b..b40625b2f7 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -2076,7 +2076,8 @@ "scripts": "脚本", "unknown_error": "未知错误", "unnamed_device": "未命名设备", - "update": "更新" + "update": "更新", + "update_device_error": "更新设备失败" }, "entities": { "caption": "实体注册表", @@ -2209,6 +2210,7 @@ "depends_on_cloud": "依赖云端服务", "device_unavailable": "设备不可用", "devices": "{count} {count, plural,\n one {个设备}\n other {个设备}\n}", + "disable_error": "启用/禁用集成失败", "disable_restart_confirm": "重启 Home Assistant 以完成此集成的禁用", "disable": { "disable_confirm": "您确定要禁用此配置条目吗?其设备和实体也将被禁用。", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index 0c8477bf11..3290d42a9c 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -2076,7 +2076,8 @@ "scripts": "腳本", "unknown_error": "未知錯誤", "unnamed_device": "未命名的裝置", - "update": "更新" + "update": "更新", + "update_device_error": "更新裝置失敗" }, "entities": { "caption": "實體", @@ -2209,6 +2210,7 @@ "depends_on_cloud": "跟隨雲服務", "device_unavailable": "裝置不可用", "devices": "{count} {count, plural,\n one {個裝置}\n other {個裝置}\n}", + "disable_error": "開啟或關閉整合失敗", "disable_restart_confirm": "重啟 Home Assistant 以完成整合關閉", "disable": { "disable_confirm": "確定要關閉此設定實體?其裝置與實體將會關閉。", From bdef9fd040ae84fd9e9de924409eb504bf6c1f76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 3 Jun 2021 10:21:04 +0200 Subject: [PATCH 08/14] Add missing media folder to snapshot (#9341) --- hassio/src/components/supervisor-snapshot-content.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hassio/src/components/supervisor-snapshot-content.ts b/hassio/src/components/supervisor-snapshot-content.ts index 8c87976329..2d95864d33 100644 --- a/hassio/src/components/supervisor-snapshot-content.ts +++ b/hassio/src/components/supervisor-snapshot-content.ts @@ -44,6 +44,9 @@ const _computeFolders = (folders): CheckboxItem[] => { if (folders.includes("share")) { list.push({ slug: "share", name: "Share", checked: false }); } + if (folders.includes("media")) { + list.push({ slug: "media", name: "Media", checked: false }); + } if (folders.includes("addons/local")) { list.push({ slug: "addons/local", name: "Local add-ons", checked: false }); } From e00bcc9f48b76b9f331f5452d0a91a828621bb85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 3 Jun 2021 19:01:12 +0200 Subject: [PATCH 09/14] Better exit navigation for my-ingress (#9342) --- hassio/src/ingress-view/hassio-ingress-view.ts | 13 ++++++++++--- src/translations/en.json | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/hassio/src/ingress-view/hassio-ingress-view.ts b/hassio/src/ingress-view/hassio-ingress-view.ts index 710cf3b5e3..24d050acb9 100644 --- a/hassio/src/ingress-view/hassio-ingress-view.ts +++ b/hassio/src/ingress-view/hassio-ingress-view.ts @@ -97,16 +97,23 @@ class HassioIngressView extends LitElement { title: requestedAddon, }); await nextRender(); - history.back(); + navigate("/hassio/store", { replace: true }); return; } - if (!addonInfo.ingress) { + if (!addonInfo.version) { + await showAlertDialog(this, { + text: this.supervisor.localize("my.error_addon_not_installed"), + title: addonInfo.name, + }); + await nextRender(); + navigate(`/hassio/addon/${addonInfo.slug}/info`, { replace: true }); + } else if (!addonInfo.ingress) { await showAlertDialog(this, { text: this.supervisor.localize("my.error_addon_no_ingress"), title: addonInfo.name, }); await nextRender(); - history.back(); + navigate(`/hassio/addon/${addonInfo.slug}/info`, { replace: true }); } else { navigate(`/hassio/ingress/${addonInfo.slug}`, { replace: true }); } diff --git a/src/translations/en.json b/src/translations/en.json index 458e140bc3..6d41d8e276 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -3813,6 +3813,8 @@ "faq_link": "[%key:ui::panel::my::faq_link%]", "error": "[%key:ui::panel::my::error%]", "error_addon_not_found": "Add-on not found", + "error_addon_not_started": "The requested add-on are not running. Please start it first", + "error_addon_not_installed": "The requested add-on is not installed. Please install it first", "error_addon_no_ingress": "The requested add-on does not support ingress" }, "system": { From 509c5b497a111eb26c3291834dd9bbe7bf0d9c0e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 3 Jun 2021 21:34:30 +0200 Subject: [PATCH 10/14] Disable babel compact option (#9335) --- build-scripts/bundle.js | 7 +------ build-scripts/rollup.js | 1 - build-scripts/webpack.js | 1 - 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/build-scripts/bundle.js b/build-scripts/bundle.js index 1183a5ce06..dc4b59b02a 100644 --- a/build-scripts/bundle.js +++ b/build-scripts/bundle.js @@ -52,6 +52,7 @@ module.exports.terserOptions = (latestBuild) => ({ module.exports.babelOptions = ({ latestBuild }) => ({ babelrc: false, + compact: false, presets: [ !latestBuild && [ "@babel/preset-env", @@ -79,12 +80,6 @@ module.exports.babelOptions = ({ latestBuild }) => ({ ].filter(Boolean), }); -// Are already ES5, cause warnings when babelified. -module.exports.babelExclude = () => [ - require.resolve("@mdi/js/mdi.js"), - require.resolve("hls.js"), -]; - const outputPath = (outputRoot, latestBuild) => path.resolve(outputRoot, latestBuild ? "frontend_latest" : "frontend_es5"); diff --git a/build-scripts/rollup.js b/build-scripts/rollup.js index 7d9cf93046..f57e9f7e64 100644 --- a/build-scripts/rollup.js +++ b/build-scripts/rollup.js @@ -57,7 +57,6 @@ const createRollupConfig = ({ babel({ ...bundle.babelOptions({ latestBuild }), extensions, - exclude: bundle.babelExclude(), babelHelpers: isWDS ? "inline" : "bundled", }), string({ diff --git a/build-scripts/webpack.js b/build-scripts/webpack.js index fe025abac2..3dcac91de9 100644 --- a/build-scripts/webpack.js +++ b/build-scripts/webpack.js @@ -47,7 +47,6 @@ const createWebpackConfig = ({ rules: [ { test: /\.m?js$|\.ts$/, - exclude: bundle.babelExclude(), use: { loader: "babel-loader", options: bundle.babelOptions({ latestBuild }), From 8836ba6ceb091825c73ae5a99ba0e06b1827fc59 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Thu, 3 Jun 2021 22:48:52 +0200 Subject: [PATCH 11/14] Pick the correct backend-selected active theme (#9357) --- src/panels/profile/ha-pick-theme-row.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/panels/profile/ha-pick-theme-row.ts b/src/panels/profile/ha-pick-theme-row.ts index bb2ac4a86d..5ae1ecc679 100644 --- a/src/panels/profile/ha-pick-theme-row.ts +++ b/src/panels/profile/ha-pick-theme-row.ts @@ -36,7 +36,9 @@ export class HaPickThemeRow extends LitElement { const hasThemes = this.hass.themes.themes && Object.keys(this.hass.themes.themes).length; const curTheme = - this.hass.selectedTheme?.theme || this.hass.themes.default_theme; + this.hass.selectedTheme?.theme || this.hass.themes.darkMode + ? this.hass.themes.default_dark_theme || this.hass.themes.default_theme + : this.hass.themes.default_theme; const themeSettings = this.hass.selectedTheme; From 5418474f640953e224c77661b20f049bdd0708a7 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 3 Jun 2021 22:50:33 +0200 Subject: [PATCH 12/14] Polyfill `globalThis` in latest build (#9352) --- src/html/authorize.html.template | 3 +++ src/html/index.html.template | 3 +++ src/html/onboarding.html.template | 3 +++ src/resources/compatibility.ts | 19 ++++++++++++++++--- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/html/authorize.html.template b/src/html/authorize.html.template index 1cf1c7bba4..555aea9e0e 100644 --- a/src/html/authorize.html.template +++ b/src/html/authorize.html.template @@ -48,6 +48,9 @@ window.providersPromise = fetch("/auth/providers", { credentials: "same-origin", }); + if (!window.globalThis) { + window.globalThis = window; + }