From acd335e249914358b18b9f29cc85921de3480916 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 29 Apr 2021 14:06:52 -0700 Subject: [PATCH 01/14] Set columns to 4 in demo --- gallery/src/demos/demo-hui-grid-and-stack-card.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/gallery/src/demos/demo-hui-grid-and-stack-card.ts b/gallery/src/demos/demo-hui-grid-and-stack-card.ts index 8beb16a20d..e22b5c20d4 100644 --- a/gallery/src/demos/demo-hui-grid-and-stack-card.ts +++ b/gallery/src/demos/demo-hui-grid-and-stack-card.ts @@ -108,6 +108,7 @@ const CONFIGS = [ heading: "Columns 4", config: ` - type: grid + columns: 4 cards: - type: entity entity: light.kitchen_lights From a288fd370fddf398bfd79c466da076eba5bf7009 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 29 Apr 2021 16:10:29 -0700 Subject: [PATCH 02/14] Fix gallery element definitions (#9046) --- gallery/src/demos/demo-hui-alarm-panel-card.ts | 6 +++++- gallery/src/demos/demo-hui-conditional-card.ts | 6 +++++- gallery/src/demos/demo-hui-entities-card.ts | 6 +++++- gallery/src/demos/demo-hui-entity-button-card.ts | 6 +++++- gallery/src/demos/demo-hui-entity-filter-card.ts | 6 +++++- gallery/src/demos/demo-hui-gauge-card.ts | 6 +++++- gallery/src/demos/demo-hui-glance-card.ts | 10 +++++++--- gallery/src/demos/demo-hui-iframe-card.ts | 6 +++++- gallery/src/demos/demo-hui-light-card.ts | 6 +++++- gallery/src/demos/demo-hui-map-card.ts | 6 +++++- gallery/src/demos/demo-hui-markdown-card.ts | 6 +++++- gallery/src/demos/demo-hui-media-control-card.ts | 6 +++++- gallery/src/demos/demo-hui-media-player-rows.ts | 6 +++++- gallery/src/demos/demo-hui-picture-elements-card.ts | 6 +++++- gallery/src/demos/demo-hui-picture-entity-card.ts | 6 +++++- gallery/src/demos/demo-hui-picture-glance-card.ts | 6 +++++- gallery/src/demos/demo-hui-plant-card.ts | 6 +++++- gallery/src/demos/demo-hui-shopping-list-card.ts | 6 +++++- gallery/src/demos/demo-hui-thermostat-card.ts | 6 +++++- 19 files changed, 97 insertions(+), 21 deletions(-) diff --git a/gallery/src/demos/demo-hui-alarm-panel-card.ts b/gallery/src/demos/demo-hui-alarm-panel-card.ts index 4c66b22559..0042b31874 100644 --- a/gallery/src/demos/demo-hui-alarm-panel-card.ts +++ b/gallery/src/demos/demo-hui-alarm-panel-card.ts @@ -93,4 +93,8 @@ class DemoAlarmPanelEntity extends LitElement { } } -customElements.define("demo-hui-alarm-panel-card", DemoAlarmPanelEntity); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-alarm-panel-card": DemoAlarmPanelEntity; + } +} diff --git a/gallery/src/demos/demo-hui-conditional-card.ts b/gallery/src/demos/demo-hui-conditional-card.ts index cf70db64aa..9d91c76f88 100644 --- a/gallery/src/demos/demo-hui-conditional-card.ts +++ b/gallery/src/demos/demo-hui-conditional-card.ts @@ -75,4 +75,8 @@ class DemoConditional extends LitElement { } } -customElements.define("demo-hui-conditional-card", DemoConditional); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-conditional-card": DemoConditional; + } +} diff --git a/gallery/src/demos/demo-hui-entities-card.ts b/gallery/src/demos/demo-hui-entities-card.ts index 7511e061b5..8f030ec6cb 100644 --- a/gallery/src/demos/demo-hui-entities-card.ts +++ b/gallery/src/demos/demo-hui-entities-card.ts @@ -239,4 +239,8 @@ class DemoEntities extends LitElement { } } -customElements.define("demo-hui-entities-card", DemoEntities); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-entities-card": DemoEntities; + } +} diff --git a/gallery/src/demos/demo-hui-entity-button-card.ts b/gallery/src/demos/demo-hui-entity-button-card.ts index 1e3201fa10..56d7018e36 100644 --- a/gallery/src/demos/demo-hui-entity-button-card.ts +++ b/gallery/src/demos/demo-hui-entity-button-card.ts @@ -91,4 +91,8 @@ class DemoButtonEntity extends LitElement { } } -customElements.define("demo-hui-entity-button-card", DemoButtonEntity); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-entity-button-card": DemoButtonEntity; + } +} diff --git a/gallery/src/demos/demo-hui-entity-filter-card.ts b/gallery/src/demos/demo-hui-entity-filter-card.ts index c3e22f0e46..309e43f7dd 100644 --- a/gallery/src/demos/demo-hui-entity-filter-card.ts +++ b/gallery/src/demos/demo-hui-entity-filter-card.ts @@ -132,4 +132,8 @@ class DemoEntityFilter extends LitElement { } } -customElements.define("demo-hui-entity-filter-card", DemoEntityFilter); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-entity-filter-card": DemoEntityFilter; + } +} diff --git a/gallery/src/demos/demo-hui-gauge-card.ts b/gallery/src/demos/demo-hui-gauge-card.ts index 35e794f317..659955354b 100644 --- a/gallery/src/demos/demo-hui-gauge-card.ts +++ b/gallery/src/demos/demo-hui-gauge-card.ts @@ -129,4 +129,8 @@ class DemoGaugeEntity extends LitElement { } } -customElements.define("demo-hui-gauge-card", DemoGaugeEntity); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-gauge-card": DemoGaugeEntity; + } +} diff --git a/gallery/src/demos/demo-hui-glance-card.ts b/gallery/src/demos/demo-hui-glance-card.ts index 2d3d83193e..9f407307eb 100644 --- a/gallery/src/demos/demo-hui-glance-card.ts +++ b/gallery/src/demos/demo-hui-glance-card.ts @@ -186,7 +186,7 @@ const CONFIGS = [ name: - light.kitchen_lights - entity: lock.kitchen_door - name: + name: - light.ceiling_lights `, }, @@ -194,7 +194,7 @@ const CONFIGS = [ heading: "Custom tap action", config: ` - type: glance - columns: 4 + columns: 4 entities: - entity: lock.kitchen_door name: Custom @@ -232,4 +232,8 @@ class DemoGlanceEntity extends LitElement { } } -customElements.define("demo-hui-glance-card", DemoGlanceEntity); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-glance-card": DemoGlanceEntity; + } +} diff --git a/gallery/src/demos/demo-hui-iframe-card.ts b/gallery/src/demos/demo-hui-iframe-card.ts index a2d493476b..f4497e9428 100644 --- a/gallery/src/demos/demo-hui-iframe-card.ts +++ b/gallery/src/demos/demo-hui-iframe-card.ts @@ -42,4 +42,8 @@ class DemoIframe extends LitElement { } } -customElements.define("demo-hui-iframe-card", DemoIframe); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-iframe-card": DemoIframe; + } +} diff --git a/gallery/src/demos/demo-hui-light-card.ts b/gallery/src/demos/demo-hui-light-card.ts index 71d12b4af8..26c419f9e5 100644 --- a/gallery/src/demos/demo-hui-light-card.ts +++ b/gallery/src/demos/demo-hui-light-card.ts @@ -85,4 +85,8 @@ class DemoLightEntity extends LitElement { } } -customElements.define("demo-hui-light-card", DemoLightEntity); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-light-card": DemoLightEntity; + } +} diff --git a/gallery/src/demos/demo-hui-map-card.ts b/gallery/src/demos/demo-hui-map-card.ts index 2cc55f499d..ccb47deabb 100644 --- a/gallery/src/demos/demo-hui-map-card.ts +++ b/gallery/src/demos/demo-hui-map-card.ts @@ -183,4 +183,8 @@ class DemoMap extends LitElement { } } -customElements.define("demo-hui-map-card", DemoMap); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-map-card": DemoMap; + } +} diff --git a/gallery/src/demos/demo-hui-markdown-card.ts b/gallery/src/demos/demo-hui-markdown-card.ts index 8321eff7d3..94f63f404d 100644 --- a/gallery/src/demos/demo-hui-markdown-card.ts +++ b/gallery/src/demos/demo-hui-markdown-card.ts @@ -276,4 +276,8 @@ class DemoMarkdown extends LitElement { } } -customElements.define("demo-hui-markdown-card", DemoMarkdown); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-markdown-card": DemoMarkdown; + } +} diff --git a/gallery/src/demos/demo-hui-media-control-card.ts b/gallery/src/demos/demo-hui-media-control-card.ts index 55bbc0168c..3b032c409e 100644 --- a/gallery/src/demos/demo-hui-media-control-card.ts +++ b/gallery/src/demos/demo-hui-media-control-card.ts @@ -180,4 +180,8 @@ class DemoHuiMediaControlCard extends LitElement { } } -customElements.define("demo-hui-media-control-card", DemoHuiMediaControlCard); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-media-control-card": DemoHuiMediaControlCard; + } +} diff --git a/gallery/src/demos/demo-hui-media-player-rows.ts b/gallery/src/demos/demo-hui-media-player-rows.ts index 9ffabfee9b..500bfca693 100644 --- a/gallery/src/demos/demo-hui-media-player-rows.ts +++ b/gallery/src/demos/demo-hui-media-player-rows.ts @@ -77,4 +77,8 @@ class DemoHuiMediaPlayerRow extends LitElement { } } -customElements.define("demo-hui-media-player-row", DemoHuiMediaPlayerRow); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-media-player-row": DemoHuiMediaPlayerRow; + } +} diff --git a/gallery/src/demos/demo-hui-picture-elements-card.ts b/gallery/src/demos/demo-hui-picture-elements-card.ts index 6e6ffd86a0..5ab818911c 100644 --- a/gallery/src/demos/demo-hui-picture-elements-card.ts +++ b/gallery/src/demos/demo-hui-picture-elements-card.ts @@ -147,4 +147,8 @@ class DemoPictureElements extends LitElement { } } -customElements.define("demo-hui-picture-elements-card", DemoPictureElements); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-picture-elements-card": DemoPictureElements; + } +} diff --git a/gallery/src/demos/demo-hui-picture-entity-card.ts b/gallery/src/demos/demo-hui-picture-entity-card.ts index fd0c5fea94..3a1b64f76e 100644 --- a/gallery/src/demos/demo-hui-picture-entity-card.ts +++ b/gallery/src/demos/demo-hui-picture-entity-card.ts @@ -102,4 +102,8 @@ class DemoPictureEntity extends LitElement { } } -customElements.define("demo-hui-picture-entity-card", DemoPictureEntity); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-picture-entity-card": DemoPictureEntity; + } +} diff --git a/gallery/src/demos/demo-hui-picture-glance-card.ts b/gallery/src/demos/demo-hui-picture-glance-card.ts index 9ecafb7f5a..f6790efc3d 100644 --- a/gallery/src/demos/demo-hui-picture-glance-card.ts +++ b/gallery/src/demos/demo-hui-picture-glance-card.ts @@ -143,4 +143,8 @@ class DemoPictureGlance extends LitElement { } } -customElements.define("demo-hui-picture-glance-card", DemoPictureGlance); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-picture-glance-card": DemoPictureGlance; + } +} diff --git a/gallery/src/demos/demo-hui-plant-card.ts b/gallery/src/demos/demo-hui-plant-card.ts index a1d49afe5b..9e8aff318e 100644 --- a/gallery/src/demos/demo-hui-plant-card.ts +++ b/gallery/src/demos/demo-hui-plant-card.ts @@ -52,4 +52,8 @@ export class DemoPlantEntity extends LitElement { } } -customElements.define("demo-hui-plant-card", DemoPlantEntity); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-plant-card": DemoPlantEntity; + } +} diff --git a/gallery/src/demos/demo-hui-shopping-list-card.ts b/gallery/src/demos/demo-hui-shopping-list-card.ts index a17bd61f12..61f9aa9062 100644 --- a/gallery/src/demos/demo-hui-shopping-list-card.ts +++ b/gallery/src/demos/demo-hui-shopping-list-card.ts @@ -48,4 +48,8 @@ class DemoShoppingListEntity extends LitElement { } } -customElements.define("demo-hui-shopping-list-card", DemoShoppingListEntity); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-shopping-list-card": DemoShoppingListEntity; + } +} diff --git a/gallery/src/demos/demo-hui-thermostat-card.ts b/gallery/src/demos/demo-hui-thermostat-card.ts index 30e08d3e29..e6cdaae788 100644 --- a/gallery/src/demos/demo-hui-thermostat-card.ts +++ b/gallery/src/demos/demo-hui-thermostat-card.ts @@ -96,4 +96,8 @@ class DemoThermostatEntity extends LitElement { } } -customElements.define("demo-hui-thermostat-card", DemoThermostatEntity); +declare global { + interface HTMLElementTagNameMap { + "demo-hui-thermostat-card": DemoThermostatEntity; + } +} From a28616d535c5824150d95753d1d22e9aeceba821 Mon Sep 17 00:00:00 2001 From: rmogstad Date: Thu, 29 Apr 2021 16:11:03 -0700 Subject: [PATCH 03/14] Fix browser language detection for region specific languages (#8982) (#9026) --- src/util/hass-translation.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/util/hass-translation.ts b/src/util/hass-translation.ts index 694af2ee4e..a203ec894e 100644 --- a/src/util/hass-translation.ts +++ b/src/util/hass-translation.ts @@ -36,9 +36,18 @@ export function findAvailableLanguage(language: string) { return LOCALE_LOOKUP[langLower]; } - return Object.keys(translationMetadata.translations).find( + const translation = Object.keys(translationMetadata.translations).find( (lang) => lang.toLowerCase() === langLower ); + if (translation) { + return translation; + } + + if (language.includes("-")) { + return findAvailableLanguage(language.split("-")[0]); + } + + return undefined; } /** @@ -94,13 +103,6 @@ export function getLocalLanguage() { if (language) { return language; } - if (navigator.language && navigator.language.includes("-")) { - language = findAvailableLanguage(navigator.language.split("-")[0]); - if (language) { - return language; - } - } - // Final fallback return "en"; } From 7add6eb73630f707cee50b3992c04f4a27338ef2 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 30 Apr 2021 01:45:22 +0000 Subject: [PATCH 04/14] Translation update --- translations/frontend/bg.json | 26 ++++++++++--- translations/frontend/ca.json | 6 +++ translations/frontend/es-419.json | 2 +- translations/frontend/es.json | 27 ++++++++++++- translations/frontend/id.json | 33 ++++++++++++++-- translations/frontend/ko.json | 11 +++++- translations/frontend/nl.json | 10 ++--- translations/frontend/pl.json | 61 +++++++++++++++++++++++++++--- translations/frontend/ru.json | 4 +- translations/frontend/zh-Hans.json | 40 +++++++++++++++++++- translations/frontend/zh-Hant.json | 27 ++++++++++++- 11 files changed, 218 insertions(+), 29 deletions(-) diff --git a/translations/frontend/bg.json b/translations/frontend/bg.json index 743edccdd2..973e350815 100644 --- a/translations/frontend/bg.json +++ b/translations/frontend/bg.json @@ -1105,7 +1105,18 @@ } }, "zha_reconfigure_device": { - "heading": "Преконфигуриране на устройство" + "attribute": "Атрибут", + "bind_header": "Обвързване", + "button_hide": "Скрийте детайлите", + "button_show": "Покажи детайли", + "cluster_header": "Клъстер", + "configuration_complete": "Преконфигурирането на устройството завърши.", + "configuration_failed": "Преконфигурирането на устройството не бе успешно. Допълнителна информация може да бъде налична в дневниците.", + "heading": "Преконфигуриране на устройство", + "in_progress": "Устройството се преконфигурира. Това може да отнеме известно време.", + "min_max_change": "мин/макс/промяна", + "reporting_header": "Отчитане", + "start_reconfiguration": "Стартиране на преконфигуриране" } }, "duration": { @@ -1966,12 +1977,12 @@ } }, "info": { - "built_using": "Изграден с използване на", + "built_using": "Изграден с използването на", "caption": "Информация", "copy_github": "За GitHub", "description": "Версия, състояние на системата и връзки към документация", "documentation": "Документация", - "frontend": "Интерфейс", + "frontend": "интерфейс", "frontend_version": "Версия на интерфейса: {version} - {type}", "home_assistant_logo": "Лого на Home Assistant", "icons_by": "Икони от", @@ -1979,7 +1990,7 @@ "license": "Публикувано под лиценза Apache 2.0", "path_configuration": "Път към configuration.yaml: {path}", "server": "сървър", - "source": "Източник:", + "source": "Изходен код:", "system_health": { "manage": "Управление", "more_info": "повече информация" @@ -2056,7 +2067,7 @@ "show": "Покажи", "show_disabled": "Показване на деактивираните интеграции" }, - "discovered": "Открити", + "discovered": "Открит", "home_assistant_website": "Уебсайт на Home Assistant", "ignore": { "confirm_ignore": "Наистина ли не искате да настроите тази интеграция? Можете да отмените това, като кликнете върху „Показване на игнорирани интеграции“ в менюто горе вдясно." @@ -2140,16 +2151,20 @@ "resources": { "cant_edit_yaml": "Използвате Lovelace в YAML режим, следователно не можете да управлявате ресурсите си чрез потребителския интерфейс. Управлявайте ги в configuration.yaml.", "caption": "Ресурси", + "confirm_delete": "Сигурни ли сте, че искате да изтриете този ресурс?", "detail": { "create": "Създаване", "delete": "Изтриване", "dismiss": "Затвори", + "new_resource": "Добавяне на нов ресурс", + "type": "Тип на ресурса", "update": "Актуализиране", "url": "URL", "url_error_msg": "URL е задължително поле", "warning_header": "Бъдете предпазливи!" }, "picker": { + "add_resource": "Добавяне на ресурс", "headers": { "type": "Тип", "url": "URL" @@ -2564,6 +2579,7 @@ "node_status": "Състояние на възела" }, "navigation": { + "logs": "Логове", "network": "Мрежа" }, "network_status": { diff --git a/translations/frontend/ca.json b/translations/frontend/ca.json index cf74480e6d..4211da2de6 100644 --- a/translations/frontend/ca.json +++ b/translations/frontend/ca.json @@ -1198,6 +1198,7 @@ }, "zha_reconfigure_device": { "attribute": "Atribut", + "battery_device_warning": "Hauràs de despertar els dispositius amb bateria abans d'iniciar el procés de reconfiguració. Consulta el manual del dispositiu per saber els passos per a despertar-lo.", "bind_header": "Vinculació", "button_hide": "Amaga els detalls", "button_show": "Mostra els detalls", @@ -1207,7 +1208,9 @@ "configuring_alt": "Configurant", "heading": "S'està reconfigurant el dispositiu", "in_progress": "El dispositiu s'està reconfigurant. Això pot trigar una estona.", + "introduction": "Reconfigura un dispositiu de la xarxa Zigbee. Fes-ho si el dispositiu no funciona correctament.", "min_max_change": "min/max/canvi", + "reporting_header": "Informant", "run_in_background": "Pots tancar aquest diàleg, la reconfiguració continuarà en segon pla.", "start_reconfiguration": "Inicia la reconfiguració" } @@ -2972,9 +2975,12 @@ "unknown": "Desconegut" }, "reinterview_node": { + "battery_device_warning": "Hauràs de despertar els dispositius amb bateria abans d'iniciar el procés de consulta. Fes un cop d'ull al manual del dispositiu per saber com despertar-lo.", "in_progress": "S'està consultant el dispositiu. Això pot trigar una estona.", "interview_complete": "Consulta del dispositiu completada.", "interview_failed": "Ha fallat la consulta del dispositiu. Pots trobar informació addicional als registres.", + "introduction": "Torna a consultar un dispositiu de la xarxa Zigbee. Fes-ho si el dispositiu no funciona correctament.", + "run_in_background": "Pots tancar aquest diàleg, la consulta continuarà en segon pla.", "start_reinterview": "Torna a iniciar consulta", "title": "Torna a consultar un dispositiu Z-Wave" }, diff --git a/translations/frontend/es-419.json b/translations/frontend/es-419.json index 7425cff854..0c22036f4c 100644 --- a/translations/frontend/es-419.json +++ b/translations/frontend/es-419.json @@ -3725,7 +3725,7 @@ "working": "Por favor, espere" }, "initializing": "Inicializando", - "logging_in_to_with": "Iniciando sesión en ** {locationName} ** con ** {authProviderName} **.", + "logging_in_to_with": "Iniciando sesión en **{locationName}** con **{authProviderName}**.", "logging_in_with": "Iniciando sesión con **{authProviderName}**.", "pick_auth_provider": "O inicia sesión con" }, diff --git a/translations/frontend/es.json b/translations/frontend/es.json index ddf26827ce..311e8ee226 100644 --- a/translations/frontend/es.json +++ b/translations/frontend/es.json @@ -1197,7 +1197,22 @@ } }, "zha_reconfigure_device": { - "heading": "Reconfigurando el dispositivo" + "attribute": "Atributo", + "battery_device_warning": "Antes de iniciar el proceso de reconfiguración, deberás despertar los dispositivos que funcionan con batería. Consulta el manual de tu dispositivo para obtener instrucciones sobre cómo despertar el dispositivo.", + "bind_header": "Emparejamiento", + "button_hide": "Ocultar detalles", + "button_show": "Mostrar detalles", + "cluster_header": "Clúster", + "configuration_complete": "Reconfiguración del dispositivo completada.", + "configuration_failed": "Error en la reconfiguración del dispositivo. Es posible que haya información adicional disponible en los registros.", + "configuring_alt": "Configurando", + "heading": "Reconfigurando el dispositivo", + "in_progress": "El dispositivo se está reconfigurando. Esto puede llevar algún tiempo.", + "introduction": "Reconfigura un dispositivo en tu red Zigbee. Utiliza esta función si tu dispositivo no funciona correctamente.", + "min_max_change": "min/max/cambio", + "reporting_header": "Informes", + "run_in_background": "Puedes cerrar este cuadro de diálogo y la reconfiguración continuará en segundo plano.", + "start_reconfiguration": "Iniciar reconfiguración" } }, "duration": { @@ -1260,7 +1275,8 @@ "caption": "Áreas", "data_table": { "area": "Área", - "devices": "Dispositivos" + "devices": "Dispositivos", + "entities": "Entidades" }, "delete": { "confirmation_text": "Todos los dispositivos en esta área quedarán sin asignar.", @@ -1272,8 +1288,10 @@ "create": "Crear", "default_name": "Área Nueva", "delete": "Eliminar", + "linked_entities_caption": "Entidades", "name": "Nombre", "name_required": "Se requiere el nombre", + "no_linked_entities": "No hay entidades vinculadas a este área.", "unknown_error": "Error desconocido", "update": "Actualizar" }, @@ -2924,7 +2942,12 @@ "node_status": "Estado del Nodo", "zwave_info": "Información de Z-Wave" }, + "logs": { + "log_level": "Nivel de registro", + "title": "Registros de Z-Wave JS" + }, "navigation": { + "logs": "Registros", "network": "Red" }, "network_status": { diff --git a/translations/frontend/id.json b/translations/frontend/id.json index fafa0de0fa..8a5deab0f0 100644 --- a/translations/frontend/id.json +++ b/translations/frontend/id.json @@ -561,9 +561,12 @@ }, "light": { "brightness": "Kecerahan", + "cold_white_value": "Kecerahan putih dingin", + "color_brightness": "Kecerahan warna", "color_temperature": "Temperatur warna", "effect": "Efek", - "white_value": "Nilai putih" + "warm_white_value": "Kecerahan putih hangat", + "white_value": "Kecerahan putih" }, "lock": { "code": "Kode", @@ -886,6 +889,7 @@ } }, "service-control": { + "integration_doc": "Dokumentasi integrasi", "required": "Bidang ini wajib diisi", "service_data": "Data layanan", "target": "Target", @@ -1193,7 +1197,20 @@ } }, "zha_reconfigure_device": { - "heading": "Mengonfigurasi ulang perangkat" + "attribute": "Atribut", + "button_hide": "Sembunyikan Detail", + "button_show": "Tampilkan Detail", + "cluster_header": "Klaster", + "configuration_complete": "Konfigurasi ulang perangkat selesai.", + "configuration_failed": "Konfigurasi ulang perangkat gagal. Informasi tambahan mungkin tersedia di log.", + "configuring_alt": "Mengonfigurasi", + "heading": "Mengonfigurasi ulang perangkat", + "in_progress": "Perangkat sedang dikonfigurasi ulang. Proses ini mungkin membutuhkan beberapa saat.", + "introduction": "Konfigurasi ulang sebuah perangkat di jaringan Zigbee Anda. Gunakan fitur ini jika perangkat tersebut tidak berfungsi dengan benar.", + "min_max_change": "min/maks/perubahan", + "reporting_header": "Pelaporan", + "run_in_background": "Anda dapat menutup dialog ini dan konfigurasi ulang akan dilanjutkan di latar belakang.", + "start_reconfiguration": "Mulai Konfigurasi Ulang" } }, "duration": { @@ -1256,7 +1273,8 @@ "caption": "Area", "data_table": { "area": "Area", - "devices": "Perangkat" + "devices": "Perangkat", + "entities": "Entitas" }, "delete": { "confirmation_text": "Semua perangkat di area ini akan dibatalkan penetapan areanya.", @@ -1268,8 +1286,10 @@ "create": "Buat", "default_name": "Area Baru", "delete": "Hapus", + "linked_entities_caption": "Entitas", "name": "Nama", "name_required": "Nama wajib diisi", + "no_linked_entities": "Tidak ada entitas yang terkait dengan area ini.", "unknown_error": "Kesalahan yang tidak diketahui", "update": "Perbarui" }, @@ -1607,6 +1627,7 @@ "add_automation": "Tambah otomasi", "delete_automation": "Hapus otomasi", "delete_confirm": "Yakin ingin menghapus otomasi ini?", + "dev_automation": "Otomatisasi debug", "duplicate": "Gandakan", "duplicate_automation": "Gandakan otomasi", "edit_automation": "Edit otomasi", @@ -1880,7 +1901,11 @@ "description": "ID instans, versi, dan jenis instalasi." }, "usage_supervisor": { + "description": "Nama, versi, dan kemampuan.", "title": "Integrasi dan add-on yang digunakan" + }, + "usage": { + "title": "Integrasi yang Digunakan" } } }, @@ -2139,6 +2164,8 @@ "caption": "Integrasi", "config_entry": { "area": "Di {area}", + "check_the_logs": "Periksa log", + "configure": "Konfigurasikan", "delete": "Hapus", "delete_confirm": "Yakin ingin menghapus integrasi ini?", "device_unavailable": "Perangkat tidak tersedia", diff --git a/translations/frontend/ko.json b/translations/frontend/ko.json index 61fc63c695..8d6ef37bad 100644 --- a/translations/frontend/ko.json +++ b/translations/frontend/ko.json @@ -1275,7 +1275,8 @@ "caption": "영역", "data_table": { "area": "영역", - "devices": "기기" + "devices": "기기", + "entities": "구성요소" }, "delete": { "confirmation_text": "이 영역에 속한 모든 기기가 할당 해제됩니다.", @@ -1287,8 +1288,10 @@ "create": "만들기", "default_name": "새로운 영역", "delete": "삭제하기", + "linked_entities_caption": "구성요소", "name": "이름", "name_required": "이름은 필수 요소입니다", + "no_linked_entities": "이 영역에 등록된 구성요소가 없습니다.", "unknown_error": "알 수 없는 오류", "update": "업데이트" }, @@ -2808,6 +2811,7 @@ "update_button": "구성 업데이트", "zha_options": { "default_light_transition": "조명 전환 시간 기본 값(초)", + "enable_identify_on_join": "장치가 네트워크에 연결될 때 식별 효과 활성화", "title": "전역 옵션" } }, @@ -2935,7 +2939,12 @@ "node_status": "노드 상태", "zwave_info": "Z-Wave 정보" }, + "logs": { + "log_level": "로그 레벨", + "title": "Z-Wave JS 로그" + }, "navigation": { + "logs": "로그", "network": "네트워크" }, "network_status": { diff --git a/translations/frontend/nl.json b/translations/frontend/nl.json index 28b2420907..aeaab58219 100644 --- a/translations/frontend/nl.json +++ b/translations/frontend/nl.json @@ -1258,7 +1258,7 @@ "notification_toast": { "connection_lost": "Verbinding verbroken. Opnieuw verbinden...", "dismiss": "Afwijzen", - "intergration_starting": "Start {integration}, niet alles is beschikbaar totdat het voltooid is.", + "intergration_starting": "{integration} starten, niet alles is beschikbaar totdat het voltooid is.", "service_call_failed": "Kan service {service} niet aanroepen", "started": "Home Assistant is gestart!", "starting": "Home Assistant is aan het opstarten. Tijdens het opstarten is niet alles beschikbaar.", @@ -1773,7 +1773,7 @@ "disable_hook_error_msg": "Kan webhook niet uitschakelen:", "info": "Alles wat is geconfigureerd om door een webhook te worden geactiveerd, kan een openbaar toegankelijke URL krijgen zodat u gegevens overal naar Home Assistant kunt terugsturen, zonder uw exemplaar aan internet bloot te stellen.", "link_learn_more": "Meer informatie over het maken van door webhook aangedreven automatiseringen.", - "loading": "Laden ...", + "loading": "Laden...", "manage": "Beheer", "no_hooks_yet": "Het lijkt erop dat je nog geen webhooks hebt. Ga aan de slag door het configureren van een ", "no_hooks_yet_link_automation": "webhook automatisering", @@ -1967,7 +1967,7 @@ } }, "devices": { - "add_prompt": "Er is nog geen {name} toegevoegd met dit apparaat. U kunt er één toevoegen door op de + knop hierboven te klikken.", + "add_prompt": "Er zijn nog geen {name} toegevoegd met dit apparaat. U kunt er één toevoegen door op de + knop hierboven te klikken.", "automation": { "actions": { "caption": "Wanneer iets wordt getriggerd...", @@ -2285,7 +2285,7 @@ "rename_input_label": "Invoernaam", "search": "Zoek integraties" }, - "introduction": "Hier kun je je componenten en Home Assistant configureren. Het is nog niet mogelijk om alles te configureren vanuit de interface, maar we werken er aan.", + "introduction": "Hier kunt u uw componenten en Home Assistant configureren. Het is nog niet mogelijk om alles te configureren vanuit de interface, maar we werken er aan.", "logs": { "caption": "Logboek", "clear": "Wis", @@ -2301,7 +2301,7 @@ "warning": "WAARSCHUWING" }, "load_full_log": "Laad volledige Home Assistant logboek", - "loading_log": "Foutenlogboek laden ...", + "loading_log": "Foutenlogboek laden...", "multiple_messages": "bericht kwam voor het eerst om {time} en verschijnt {counter} keer", "no_errors": "Er zijn geen fouten gemeld", "no_issues": "Er zijn geen problemen!", diff --git a/translations/frontend/pl.json b/translations/frontend/pl.json index 077fbb4cff..59c3f13de9 100644 --- a/translations/frontend/pl.json +++ b/translations/frontend/pl.json @@ -561,9 +561,12 @@ }, "light": { "brightness": "Jasność", + "cold_white_value": "Jasność zimnej bieli", + "color_brightness": "Jasność koloru", "color_temperature": "Temperatura barwy", "effect": "Efekt", - "white_value": "Wartość bieli" + "warm_white_value": "Jasność ciepłej bieli", + "white_value": "Jasność bieli" }, "lock": { "code": "Kod", @@ -886,6 +889,7 @@ } }, "service-control": { + "integration_doc": "Dokumentacja integracji", "required": "To pole jest wymagane", "service_data": "Dane usługi", "target": "Cele", @@ -1193,7 +1197,22 @@ } }, "zha_reconfigure_device": { - "heading": "Ponowne konfigurowanie urządzenia" + "attribute": "Atrybut", + "battery_device_warning": "Przed rozpoczęciem ponownej konfiguracji, urządzenia zasilane bateryjnie muszą zostać wybudzone. Zapoznaj się z instrukcją obsługi urządzenia, aby uzyskać informacje dotyczące wybudzania.", + "bind_header": "Wiązanie", + "button_hide": "Ukryj szczegóły", + "button_show": "Pokaż szczegóły", + "cluster_header": "Klaster", + "configuration_complete": "Ponowna konfiguracja urządzenia zakończona.", + "configuration_failed": "Ponowna konfiguracja urządzenia nie powiodła się. Dodatkowe informacje mogą być dostępne w logach.", + "configuring_alt": "Konfigurowanie", + "heading": "Ponowne konfigurowanie urządzenia", + "in_progress": "Urządzenie jest ponownie konfigurowane. To może zająć trochę czasu.", + "introduction": "Skonfiguruj ponownie urządzenie w sieci Zigbee. Użyj tej funkcji, jeśli urządzenie nie działa poprawnie.", + "min_max_change": "min/max/zmiana", + "reporting_header": "Raportowanie", + "run_in_background": "Możesz zamknąć to okno, a ponowna konfiguracja będzie kontynuowane w tle.", + "start_reconfiguration": "Rozpocznij konfigurację urządzenia" } }, "duration": { @@ -1256,7 +1275,8 @@ "caption": "Obszary", "data_table": { "area": "Obszar", - "devices": "Urządzenia" + "devices": "Urządzenia", + "entities": "Encje" }, "delete": { "confirmation_text": "Wszystkie urządzenia z tego obszaru pozostaną bez przypisanego obszaru.", @@ -1268,8 +1288,10 @@ "create": "Utwórz", "default_name": "Nowy obszar", "delete": "Usuń", + "linked_entities_caption": "Encje", "name": "Nazwa", "name_required": "Nazwa jest wymagana", + "no_linked_entities": "Brak encji powiązanych z tym obszarem.", "unknown_error": "Nieznany błąd", "update": "Aktualizuj" }, @@ -2787,6 +2809,15 @@ "manufacturer_code_override": "Zastąpienie kodu producenta", "value": "Wartość" }, + "configuration_page": { + "shortcuts_title": "Skróty", + "update_button": "Zaktualizuj konfigurację", + "zha_options": { + "default_light_transition": "Domyślny czas efektu przejścia dla światła (w sekundach)", + "enable_identify_on_join": "Włącz efekt identyfikacji, gdy urządzenia dołączają do sieci", + "title": "Opcje ogólne" + } + }, "device_pairing_card": { "CONFIGURED": "Konfigurowanie zakończone", "CONFIGURED_status_text": "Inicjalizacja", @@ -2911,7 +2942,12 @@ "node_status": "Stan węzła", "zwave_info": "Informacje Z-Wave" }, + "logs": { + "log_level": "Poziom loga", + "title": "Logi Z-Wave JS" + }, "navigation": { + "logs": "Logi", "network": "Sieć" }, "network_status": { @@ -2926,6 +2962,9 @@ "header": "Konfiguracja urządzenia Z-Wave", "introduction": "Zarządzaj i dostosuj specyficznymi parametrami konfiguracyjnymi dla wybranego urządzenia (nody)", "parameter_is_read_only": "Ten parametr jest tylko do odczytu.", + "set_param_accepted": "Parametr został zaktualizowany.", + "set_param_error": "Wystąpił błąd.", + "set_param_queued": "Zmiana parametru została umieszczona w kolejce i zostanie zaktualizowana po wybudzeniu urządzenia.", "zwave_js_device_database": "Baza danych urządzeń Z-Wave JS" }, "node_status": { @@ -2935,6 +2974,16 @@ "dead": "martwy", "unknown": "nieznany" }, + "reinterview_node": { + "battery_device_warning": "Przed rozpoczęciem odpytywania, urządzenia zasilane bateryjnie muszą zostać wybudzone. Zapoznaj się z instrukcją obsługi urządzenia, aby uzyskać informacje dotyczące wybudzania.", + "in_progress": "Urządzenie jest odpytywane. To może zająć trochę czasu.", + "interview_complete": "Odpytywanie urządzenia zakończone.", + "interview_failed": "Odpytywanie urządzenia nie powiodło się. Dodatkowe informacje mogą być dostępne w logach.", + "introduction": "Odpytaj urządzenie w swojej sieci Z-Wave. Użyj tej funkcji, jeśli Twoje urządzenie nie działa lub działa nieprawidłowo.", + "run_in_background": "Możesz zamknąć to okno, a odpytywanie będzie kontynuowane w tle.", + "start_reinterview": "Rozpocznij ponowne odpytywanie", + "title": "Ponowne odpytywanie urządzenia Z-Wave" + }, "remove_node": { "cancel_exclusion": "Anuluj usuwanie węzła", "controller_in_exclusion_mode": "Kontroler Z-Wave jest teraz w trybie usuwania węzła.", @@ -3085,8 +3134,8 @@ "attributes": "Atrybuty", "copy_id": "Skopiuj ID do schowka", "current_entities": "Bieżące encje", - "description1": "Ustaw stany encji urządzeń Home Assistanta.", - "description2": "Nie wpłynie to na rzeczywiste urządzenia.", + "description1": "Ustaw aktualne stany encji urządzeń Home Assistanta.", + "description2": "Jeśli encja należy do urządzenia, nie nastąpi żadna komunikacja z urządzeniem.", "entity": "Encja", "filter_attributes": "filtr atrybutów", "filter_entities": "Filtr encji", @@ -3458,7 +3507,7 @@ "duplicate": "Duplikuj kartę", "edit": "Edytuj", "header": "Konfiguracja karty", - "move": "Przenieś", + "move": "Przenieś do widoku", "move_after": "Przesuń kartę za", "move_before": "Przesuń kartę przed", "options": "Więcej opcji", diff --git a/translations/frontend/ru.json b/translations/frontend/ru.json index 39202e1bcb..6f77229da4 100644 --- a/translations/frontend/ru.json +++ b/translations/frontend/ru.json @@ -1291,7 +1291,7 @@ "linked_entities_caption": "Объекты", "name": "Название", "name_required": "Укажите название помещения", - "no_linked_entities": "С этим помещением не связаны никакие объекты.", + "no_linked_entities": "Не найдено связей с объектами", "unknown_error": "Неизвестная ошибка.", "update": "Обновить" }, @@ -2111,7 +2111,7 @@ "show": "Показать" }, "hassio": { - "button": "Настроить" + "button": "Настройки" }, "header": "Настройка Home Assistant", "helpers": { diff --git a/translations/frontend/zh-Hans.json b/translations/frontend/zh-Hans.json index 849d7e3c85..10d2e71e6b 100644 --- a/translations/frontend/zh-Hans.json +++ b/translations/frontend/zh-Hans.json @@ -561,8 +561,11 @@ }, "light": { "brightness": "亮度", + "cold_white_value": "冷白亮度", + "color_brightness": "色彩亮度", "color_temperature": "色温", "effect": "效果", + "warm_white_value": "暖白亮度", "white_value": "白度值" }, "lock": { @@ -1194,7 +1197,22 @@ } }, "zha_reconfigure_device": { - "heading": "重新配置设备" + "attribute": "属性", + "battery_device_warning": "开始重新配置之前,需要唤醒电池供电的设备。有关如何唤醒设备的说明,请参阅设备说明书。", + "bind_header": "绑定", + "button_hide": "隐藏详细信息", + "button_show": "显示详细信息", + "cluster_header": "簇", + "configuration_complete": "设备重新配置完成。", + "configuration_failed": "设备重新配置失败。日志中会有更多信息。", + "configuring_alt": "正在配置", + "heading": "重新配置设备", + "in_progress": "设备正在重新配置。可能需要一段时间。", + "introduction": "重新配置 Zigbee 网络上的设备。如果设备功能不正常,请使用此功能。", + "min_max_change": "min/max/change", + "reporting_header": "上报", + "run_in_background": "您可以关闭此对话框,重新配置将在后台继续进行。", + "start_reconfiguration": "开始重新配置" } }, "duration": { @@ -1257,7 +1275,8 @@ "caption": "区域注册表", "data_table": { "area": "区域", - "devices": "设备" + "devices": "设备", + "entities": "实体" }, "delete": { "confirmation_text": "此区域中的所有设备都将取消分配。", @@ -1269,8 +1288,10 @@ "create": "创建", "default_name": "新建区域", "delete": "删除", + "linked_entities_caption": "实体", "name": "名称", "name_required": "名称为必填项", + "no_linked_entities": "此区域下没有实体。", "unknown_error": "未知错误", "update": "更新" }, @@ -2921,7 +2942,12 @@ "node_status": "节点状态", "zwave_info": "Z-Wave 信息" }, + "logs": { + "log_level": "日志级别", + "title": "Z-Wave JS 日志" + }, "navigation": { + "logs": "日志", "network": "网络" }, "network_status": { @@ -2948,6 +2974,16 @@ "dead": "断线", "unknown": "未知" }, + "reinterview_node": { + "battery_device_warning": "开始重新协商之前,需要唤醒电池供电的设备。有关如何唤醒设备的说明,请参阅设备说明书。", + "in_progress": "设备正在重新协商。可能需要一段时间。", + "interview_complete": "设备协商完成。", + "interview_failed": "设备协商失败。日志中会有更多信息。", + "introduction": "重新协商 Z-Wave 网络上的设备。如果设备功能缺失或不正常,请使用此功能。", + "run_in_background": "您可以关闭此对话框,协商将在后台继续进行。", + "start_reinterview": "开始重新协商", + "title": "重新协商 Z-Wave 设备" + }, "remove_node": { "cancel_exclusion": "取消 exclusion", "controller_in_exclusion_mode": "您的 Z-Wave 控制器现在处于 exclusion 模式。", diff --git a/translations/frontend/zh-Hant.json b/translations/frontend/zh-Hant.json index fdcf31fdbd..cdde3715a2 100644 --- a/translations/frontend/zh-Hant.json +++ b/translations/frontend/zh-Hant.json @@ -1197,7 +1197,22 @@ } }, "zha_reconfigure_device": { - "heading": "重新設定裝置" + "attribute": "屬性", + "battery_device_warning": "電池供電裝置必須喚醒以開始重新程序。請參考您的裝置手冊以了解如何喚醒裝置。", + "bind_header": "綁定中", + "button_hide": "隱藏詳細資訊", + "button_show": "顯示詳細資訊", + "cluster_header": "叢集", + "configuration_complete": "裝置設定完成。", + "configuration_failed": "裝置重新設定失敗。日誌中可能包含其他相關資訊。", + "configuring_alt": "設定中", + "heading": "重新設定裝置", + "in_progress": "裝置正在設定,可能需要一點時間。", + "introduction": "重新設定 Zigbee 網路中的裝置。假如功能不正確時,請使用此選項。", + "min_max_change": "最低/最高/變更", + "reporting_header": "回報中", + "run_in_background": "可以關閉此對話框、重新設定將於背景繼續執行。", + "start_reconfiguration": "開始重新設定" } }, "duration": { @@ -1260,7 +1275,8 @@ "caption": "分區", "data_table": { "area": "分區", - "devices": "裝置" + "devices": "裝置", + "entities": "實體" }, "delete": { "confirmation_text": "所有該分區所屬裝置都將變成未指派狀態。", @@ -1272,8 +1288,10 @@ "create": "建立", "default_name": "新分區", "delete": "刪除", + "linked_entities_caption": "實體", "name": "名稱", "name_required": "必須輸入名稱", + "no_linked_entities": "此區域未設定任何裝置。", "unknown_error": "未知錯誤", "update": "更新" }, @@ -2924,7 +2942,12 @@ "node_status": "節點狀態", "zwave_info": "Z-Wave 資訊" }, + "logs": { + "log_level": "日誌記錄等級", + "title": "Z-Wave JS 日誌" + }, "navigation": { + "logs": "日誌", "network": "網路" }, "network_status": { From 551d3ffdf3ac84eed95512f2b2af56072e9ac6fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Fri, 30 Apr 2021 15:01:31 +0200 Subject: [PATCH 05/14] Use haStyleScrollbar for integration card lists (#9051) --- src/panels/config/integrations/ha-integration-card.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/panels/config/integrations/ha-integration-card.ts b/src/panels/config/integrations/ha-integration-card.ts index 557c029d54..5eb1144fe4 100644 --- a/src/panels/config/integrations/ha-integration-card.ts +++ b/src/panels/config/integrations/ha-integration-card.ts @@ -39,7 +39,7 @@ import { showConfirmationDialog, showPromptDialog, } from "../../../dialogs/generic/show-dialog-box"; -import { haStyle } from "../../../resources/styles"; +import { haStyle, haStyleScrollbar } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; import type { ConfigEntryExtended } from "./ha-config-integrations"; import "./ha-integration-header"; @@ -139,7 +139,7 @@ export class HaIntegrationCard extends LitElement { private _renderGroupedIntegration(): TemplateResult { return html` - + ${this.items.map( (item) => html` Date: Fri, 30 Apr 2021 15:02:01 +0200 Subject: [PATCH 06/14] Break primary anywhere (#9050) --- gallery/src/demos/demo-integration-card.ts | 5 +++++ src/panels/config/integrations/ha-integration-header.ts | 1 + 2 files changed, 6 insertions(+) diff --git a/gallery/src/demos/demo-integration-card.ts b/gallery/src/demos/demo-integration-card.ts index 03a44a1853..2c9039b7b3 100644 --- a/gallery/src/demos/demo-integration-card.ts +++ b/gallery/src/demos/demo-integration-card.ts @@ -61,6 +61,9 @@ const nameAsDomainEntry = createConfigEntry("ESPHome"); const longNameEntry = createConfigEntry( "Entry with a super long name that is going to the next line" ); +const longNonBreakingNameEntry = createConfigEntry( + "EntryWithASuperLongNameThatDoesNotBreak" +); const configPanelEntry = createConfigEntry("Config Panel", { domain: "mqtt", localized_domain_name: "MQTT", @@ -141,6 +144,7 @@ const configEntries: Array<{ { items: [optionsFlowEntry] }, { items: [nameAsDomainEntry] }, { items: [longNameEntry] }, + { items: [longNonBreakingNameEntry] }, { items: [setupErrorEntry] }, { items: [migrationErrorEntry] }, { items: [setupRetryEntry] }, @@ -154,6 +158,7 @@ const configEntries: Array<{ setupErrorEntry, migrationErrorEntry, longNameEntry, + longNonBreakingNameEntry, setupRetryEntry, failedUnloadEntry, notLoadedEntry, diff --git a/src/panels/config/integrations/ha-integration-header.ts b/src/panels/config/integrations/ha-integration-header.ts index 02ee9eb208..5d15318bc4 100644 --- a/src/panels/config/integrations/ha-integration-header.ts +++ b/src/panels/config/integrations/ha-integration-header.ts @@ -150,6 +150,7 @@ export class HaIntegrationHeader extends LitElement { margin-top: 16px; margin-right: 2px; font-weight: 400; + line-break: anywhere; color: var(--primary-text-color); } .secondary { From 92b32458ad2bd4016bb9ba73d8c73bf26561c90e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 30 Apr 2021 09:57:20 -0700 Subject: [PATCH 07/14] Fix grid card size when square (#9056) --- gallery/src/demos/demo-hui-grid-and-stack-card.ts | 9 +++++++++ src/panels/lovelace/cards/hui-grid-card.ts | 4 +++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gallery/src/demos/demo-hui-grid-and-stack-card.ts b/gallery/src/demos/demo-hui-grid-and-stack-card.ts index e22b5c20d4..4891d6626e 100644 --- a/gallery/src/demos/demo-hui-grid-and-stack-card.ts +++ b/gallery/src/demos/demo-hui-grid-and-stack-card.ts @@ -143,6 +143,15 @@ const CONFIGS = [ entity: light.kitchen_lights `, }, + { + heading: "Size for single card", + config: ` +- type: grid + cards: + - type: entity + entity: light.kitchen_lights + `, + }, { heading: "Vertical Stack", diff --git a/src/panels/lovelace/cards/hui-grid-card.ts b/src/panels/lovelace/cards/hui-grid-card.ts index 256d889a12..b7880b2f6d 100644 --- a/src/panels/lovelace/cards/hui-grid-card.ts +++ b/src/panels/lovelace/cards/hui-grid-card.ts @@ -25,7 +25,9 @@ class HuiGridCard extends HuiStackCard { if (this.square) { const rowHeight = SQUARE_ROW_HEIGHTS_BY_COLUMNS[this.columns] || 1; return ( - (this._cards.length / this.columns) * rowHeight + + (this._cards.length < this.columns + ? rowHeight + : (this._cards.length / this.columns) * rowHeight) + (this._config.title ? 1 : 0) ); } From ce2743a9822d8bffb8e78e0825cb07caa40212d7 Mon Sep 17 00:00:00 2001 From: "David F. Mulcahey" Date: Fri, 30 Apr 2021 12:59:06 -0400 Subject: [PATCH 08/14] Move ZHA config panel section translations to backend (#9018) --- src/data/translation.ts | 1 + .../integration-panels/zha/zha-config-dashboard.ts | 8 ++++---- src/translations/en.json | 7 +------ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/data/translation.ts b/src/data/translation.ts index bc6603c5c2..d2fc74e560 100644 --- a/src/data/translation.ts +++ b/src/data/translation.ts @@ -25,6 +25,7 @@ export type TranslationCategory = | "title" | "state" | "config" + | "config_panel" | "options" | "device_automation" | "mfa_setup" diff --git a/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts b/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts index 5fc0a889f9..fd67ae4c04 100644 --- a/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts +++ b/src/panels/config/integrations/integration-panels/zha/zha-config-dashboard.ts @@ -63,6 +63,7 @@ class ZHAConfigDashboard extends LitElement { protected firstUpdated(changedProperties: PropertyValues): void { super.firstUpdated(changedProperties); if (this.hass) { + this.hass.loadBackendTranslation("config_panel", "zha", false); this._fetchConfiguration(); } } @@ -108,7 +109,7 @@ class ZHAConfigDashboard extends LitElement { ? Object.entries(this._configuration.schemas).map( ([section, schema]) => html`
@@ -164,9 +165,8 @@ class ZHAConfigDashboard extends LitElement { private _computeLabelCallback(localize, section: string) { // Returns a callback for ha-form to calculate labels per schema object return (schema) => - localize( - `ui.panel.config.zha.configuration_page.${section}.${schema.name}` - ) || schema.name; + localize(`component.zha.config_panel.${section}.${schema.name}`) || + schema.name; } static get styles(): CSSResultArray { diff --git a/src/translations/en.json b/src/translations/en.json index ccc0c3a785..4751425817 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2382,12 +2382,7 @@ }, "configuration_page": { "shortcuts_title": "Shortcuts", - "update_button": "Update Configuration", - "zha_options": { - "title": "Global Options", - "enable_identify_on_join": "Enable identify effect when devices join the network", - "default_light_transition": "Default light transition time (seconds)" - } + "update_button": "Update Configuration" }, "add_device_page": { "spinner": "Searching for ZHA Zigbee devices...", From df22fd00cad424ca81b72946736e8651add5ce22 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 30 Apr 2021 20:34:31 +0200 Subject: [PATCH 09/14] Check if temperature available in forecast (#9055) --- src/dialogs/more-info/controls/more-info-weather.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dialogs/more-info/controls/more-info-weather.ts b/src/dialogs/more-info/controls/more-info-weather.ts index 323f327fd0..06f01bf681 100644 --- a/src/dialogs/more-info/controls/more-info-weather.ts +++ b/src/dialogs/more-info/controls/more-info-weather.ts @@ -204,8 +204,10 @@ class MoreInfoWeather extends LitElement { ` : ""}
- ${formatNumber(item.temperature, this.hass.locale)} - ${getWeatherUnit(this.hass, "temperature")} + ${this._showValue(item.temperature) + ? `${formatNumber(item.temperature, this.hass.locale)} + ${getWeatherUnit(this.hass, "temperature")}` + : ""}
`; From f8aa4724099aaf83991665e99e73b35768092962 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 30 Apr 2021 20:34:45 +0200 Subject: [PATCH 10/14] Only show warning when google is enabled (#9054) --- src/panels/config/cloud/account/cloud-google-pref.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/config/cloud/account/cloud-google-pref.ts b/src/panels/config/cloud/account/cloud-google-pref.ts index 9a606bb764..b0c86ea7f5 100644 --- a/src/panels/config/cloud/account/cloud-google-pref.ts +++ b/src/panels/config/cloud/account/cloud-google-pref.ts @@ -51,7 +51,7 @@ export class CloudGooglePref extends LitElement {

${this.hass.localize("ui.panel.config.cloud.account.google.info")}

- ${!this.cloudStatus.google_registered + ${google_enabled && !this.cloudStatus.google_registered ? html`

${this.hass.localize( From 6d80f15a98f49b719ed91a8c730d5e05adcd1e94 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 30 Apr 2021 20:34:58 +0200 Subject: [PATCH 11/14] Bump codemirror (#9052) --- src/components/ha-code-editor.ts | 6 +----- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/components/ha-code-editor.ts b/src/components/ha-code-editor.ts index 064383ccbf..d830e06e08 100644 --- a/src/components/ha-code-editor.ts +++ b/src/components/ha-code-editor.ts @@ -124,10 +124,6 @@ export class HaCodeEditor extends UpdatingElement { } `; - const container = document.createElement("span"); - - shadowRoot.appendChild(container); - this.codemirror = new this._loadedCodeMirror.EditorView({ state: this._loadedCodeMirror.EditorState.create({ doc: this._value, @@ -160,7 +156,7 @@ export class HaCodeEditor extends UpdatingElement { ], }), root: shadowRoot, - parent: container, + parent: shadowRoot, }); } diff --git a/yarn.lock b/yarn.lock index 51c30e60e8..a6a0e023a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1890,9 +1890,9 @@ "@codemirror/view" "^0.18.0" "@codemirror/rangeset@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.18.0.tgz#8b3bec00c1cee8c3db3827a752a76819ead2dfab" - integrity sha512-+dpK3T6EFv2vkoAc3sTZld0N5SHZDjD3YowFYuMWn0Xw3t+u6k+JZlGBuaFTXdsLeF0auclsm0XhRUpMVuXhTg== + version "0.18.1" + resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.18.1.tgz#0e51e1117fa5aae0134073735a07c659f334a699" + integrity sha512-Q+t92KlvDDD9oNXOvYHNL3kEUF1Y595OjSsl5GNZYI2JPY8IW9PoH1z37sgqgxMMuWQrDNp6AOrnd2j/7uBhFA== dependencies: "@codemirror/state" "^0.18.0" @@ -1942,9 +1942,9 @@ integrity sha512-HMzHNIAbjCiCf3tEJMRg6ul01KPuXxQGNiHlHgAnqPguq/CX+L4Nvj5JlWQAI91Pupk18zhmM1c6eaazX4YeTg== "@codemirror/view@^0.18.0": - version "0.18.9" - resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.18.9.tgz#bc2e4a30556888a07490df293171880275e0cdc3" - integrity sha512-u/sqtt1Exbcpwzj/K37++eToT/MehS6LFE3rfYMNsoxmjT75z2oFM2Q9PLymu344ZxgjgUNWh5cWmVxdjFdTwA== + version "0.18.11" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.18.11.tgz#3a9655758f0743cc57d718723b57ea49a72cdfa7" + integrity sha512-hNWTEGTpfFk1tjUnq4VjREe77rQQiS2nnhK9CDvU2M44g7wtkCFLB8ymvNp+Swo21hfUix33o2MKBeb830961g== dependencies: "@codemirror/rangeset" "^0.18.0" "@codemirror/state" "^0.18.0" From d4118ade0ff89ec712c4667fd228dd528cff05bf Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 30 Apr 2021 21:12:20 +0200 Subject: [PATCH 12/14] Bump lit-html (#9053) Adds support for Lit 2.0 directives --- package.json | 4 ++-- yarn.lock | 32 ++++++-------------------------- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 458085538a..288f1f53d6 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "leaflet": "^1.4.0", "leaflet-draw": "^1.0.4", "lit-element": "^2.4.0", - "lit-html": "^1.3.0", + "lit-html": "^1.4.0", "lit-virtualizer": "^0.4.2", "marked": "2.0.0", "mdn-polyfills": "^5.16.0", @@ -241,7 +241,7 @@ "resolutions": { "@webcomponents/webcomponentsjs": "^2.2.10", "@polymer/polymer": "3.1.0", - "lit-html": "1.3.0", + "lit-html": "1.4.0", "lit-element": "2.4.0" }, "main": "src/home-assistant.js", diff --git a/yarn.lock b/yarn.lock index a6a0e023a7..c71813c38b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9497,10 +9497,10 @@ lit-element@2.4.0, lit-element@^2.0.0, lit-element@^2.2.1, lit-element@^2.3.0, l dependencies: lit-html "^1.1.1" -lit-html@1.3.0, lit-html@^1.0.0, lit-html@^1.1.1, lit-html@^1.1.2, lit-html@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-1.3.0.tgz#c80f3cc5793a6dea6c07172be90a70ab20e56034" - integrity sha512-0Q1bwmaFH9O14vycPHw8C/IeHMk/uSDldVLIefu/kfbTBGIc44KGH6A8p1bDfxUfHdc8q6Ct7kQklWoHgr4t1Q== +lit-html@1.4.0, lit-html@^1.0.0, lit-html@^1.1.1, lit-html@^1.1.2, lit-html@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-1.4.0.tgz#5f18c08d11b52b1d01ceb263df42f115aecef5ca" + integrity sha512-cgaqPSgqHRaTH/P1DnWD/dQxudtrHqD0xo1AoyOGJZir2rXgsvTg77z6Pitwk9B+kL23EakD62HV3x8sT01aWQ== lit-virtualizer@^0.4.2: version "0.4.2" @@ -11301,7 +11301,7 @@ prettier@^2.0.4: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.4.tgz#2d1bae173e355996ee355ec9830a7a1ee05457ef" integrity sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== -pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: +pretty-bytes@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== @@ -12518,7 +12518,7 @@ sortablejs@^1.10.2: resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.10.2.tgz#6e40364d913f98b85a14f6678f92b5c1221f5290" integrity sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A== -source-list-map@^2.0.0, source-list-map@^2.0.1: +source-list-map@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== @@ -13951,14 +13951,6 @@ webpack-merge@^5.7.3: clone-deep "^4.0.1" wildcard "^2.0.0" -webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - webpack-sources@^2.1.1, webpack-sources@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac" @@ -14245,18 +14237,6 @@ workbox-sw@^6.1.5: resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.1.5.tgz#06eb0c91f22e207422175b3f815cd2181c7074a0" integrity sha512-IMDiqxYbKzPorZLGMUMacLB6r76iVQbdTzYthIZoPfy+uFURJFUtqiWQJKg1L+RMyuYXwKXTahCIGkgFs4jBeg== -workbox-webpack-plugin@^6.1.5: - version "6.1.5" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.1.5.tgz#d573f959417c3dae49e112dae9c6b82cc1679229" - integrity sha512-tsgeNAYiFP4STNPDxBVT58eiU8nGUmcv7Lq9FFJkQf5MMu6tPw1OLp+KpszhbCWP+R/nEdu85Gjexs6fY647Kg== - dependencies: - fast-json-stable-stringify "^2.1.0" - pretty-bytes "^5.4.1" - source-map-url "^0.4.0" - upath "^1.2.0" - webpack-sources "^1.4.3" - workbox-build "^6.1.5" - workbox-window@^6.1.5: version "6.1.5" resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.1.5.tgz#017b22342e10c6df6b9672326b575ec950b6cd80" From 5754f4463d8a5cf40c369028d1491dbe95f3c58a Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 30 Apr 2021 21:15:31 +0200 Subject: [PATCH 13/14] Bump babel and eslint (#9049) --- .eslintrc.json | 22 +- .github/workflows/ci.yaml | 6 +- cast/src/launcher/layout/hc-cast.ts | 4 +- cast/src/launcher/layout/hc-connect.ts | 4 +- demo/src/stubs/translations.ts | 4 +- .../addon-store/hassio-addon-repository.ts | 8 +- hassio/src/addon-store/hassio-addon-store.ts | 11 +- .../addon-view/config/hassio-addon-audio.ts | 16 +- .../addon-view/config/hassio-addon-config.ts | 18 +- .../addon-view/config/hassio-addon-network.ts | 37 +- .../src/addon-view/info/hassio-addon-info.ts | 6 +- hassio/src/components/hassio-card-content.ts | 10 +- hassio/src/components/supervisor-metric.ts | 8 +- hassio/src/dashboard/hassio-update.ts | 16 +- .../dialogs/network/dialog-hassio-network.ts | 9 +- .../registries/dialog-hassio-registries.ts | 8 +- .../dialog-hassio-repositories.ts | 30 +- .../snapshot/dialog-hassio-snapshot-upload.ts | 7 +- .../snapshot/dialog-hassio-snapshot.ts | 25 +- hassio/src/snapshots/hassio-snapshots.ts | 4 +- hassio/src/system/hassio-core-info.ts | 2 +- hassio/src/system/hassio-host-info.ts | 4 +- hassio/src/system/hassio-supervisor-info.ts | 4 +- hassio/src/system/hassio-supervisor-log.ts | 8 +- hassio/src/system/hassio-system.ts | 4 +- package.json | 42 +- src/auth/ha-auth-flow.ts | 6 +- src/common/color/convert-color.ts | 19 +- src/common/color/lab.ts | 8 +- src/common/config/can_show_page.ts | 9 +- src/common/decorators/local-storage.ts | 109 +- src/common/decorators/restore-scroll.ts | 56 +- src/common/dom/load_resource.ts | 10 +- src/common/dom/setup-leaflet-map.ts | 5 +- src/common/entity/compute_domain.ts | 5 +- src/common/entity/compute_object_id.ts | 5 +- src/common/entity/compute_state_domain.ts | 5 +- src/common/entity/compute_state_name.ts | 5 +- src/common/entity/has_location.ts | 7 +- src/common/entity/supports-feature.ts | 5 +- src/common/image/extract_color.ts | 7 +- src/common/string/filter/sequence-matching.ts | 5 +- src/common/util/render-status.ts | 5 +- src/components/data-table/ha-data-table.ts | 4 +- src/components/data-table/sort-filter.ts | 14 +- .../data-table/sort_filter_worker.ts | 10 +- .../device/ha-device-automation-picker.ts | 8 +- .../device/ha-device-condition-picker.ts | 4 +- src/components/device/ha-device-picker.ts | 24 +- src/components/dialog/ha-paper-dialog.ts | 6 +- src/components/ha-analytics.ts | 8 +- src/components/ha-area-picker.ts | 8 +- src/components/ha-attributes.ts | 14 +- src/components/ha-date-input.ts | 11 +- src/components/ha-date-range-picker.ts | 4 +- src/components/ha-dialog.ts | 4 +- src/components/ha-file-upload.ts | 4 +- .../ha-form/ha-form-multi_select.ts | 30 +- src/components/ha-form/ha-form-select.ts | 20 +- src/components/ha-formfield.ts | 6 +- .../ha-selector/ha-selector-select.ts | 4 +- src/components/ha-service-control.ts | 12 +- src/components/ha-tabs.ts | 6 +- src/components/ha-toast.ts | 6 +- .../media-player/ha-media-player-browse.ts | 16 +- src/data/automation_i18n.ts | 5 +- src/data/bootstrap_integrations.ts | 11 +- src/data/calendar.ts | 5 +- src/data/device_registry.ts | 13 +- src/data/discovery.ts | 6 +- src/data/hassio/addon.ts | 26 +- src/data/hassio/common.ts | 7 +- src/data/hassio/docker.ts | 2 +- src/data/hassio/hardware.ts | 4 +- src/data/hassio/host.ts | 14 +- src/data/hassio/network.ts | 4 +- src/data/hassio/resolution.ts | 2 +- src/data/hassio/snapshot.ts | 4 +- src/data/hassio/supervisor.ts | 14 +- src/data/history.ts | 5 +- src/data/image.ts | 2 +- src/data/light.ts | 19 +- src/data/mqtt.ts | 5 +- src/data/supervisor/store.ts | 2 +- src/data/weather.ts | 4 +- src/data/ws-templates.ts | 5 +- src/data/zha.ts | 10 +- src/data/zwave_js.ts | 5 +- src/dialogs/config-flow/step-flow-external.ts | 4 +- src/dialogs/config-flow/step-flow-form.ts | 4 +- .../config-flow/step-flow-pick-handler.ts | 14 +- .../domain-toggler/dialog-domain-toggler.ts | 3 +- src/dialogs/generic/show-dialog-box.ts | 6 +- .../controls/more-info-humidifier.ts | 4 +- .../more-info/controls/more-info-remote.ts | 4 +- .../more-info/controls/more-info-sun.ts | 8 +- .../more-info/controls/more-info-vacuum.ts | 4 +- .../more-info/controls/more-info-weather.ts | 8 +- .../persistent-notification-item.ts | 4 +- src/dialogs/quick-bar/ha-quick-bar.ts | 10 +- src/layouts/hass-tabs-subpage-data-table.ts | 8 +- src/layouts/supervisor-error-screen.ts | 8 +- src/panels/calendar/ha-full-calendar.ts | 27 +- .../config/areas/ha-config-area-page.ts | 8 +- .../config/areas/ha-config-areas-dashboard.ts | 7 +- .../action/ha-automation-action-row.ts | 4 +- .../types/ha-automation-action-repeat.ts | 4 +- .../ha-automation-action-wait_for_trigger.ts | 3 +- .../config/automation/ha-automation-picker.ts | 12 +- .../config/automation/ha-config-automation.ts | 7 +- .../automation/trace/ha-automation-trace.ts | 24 +- .../config/blueprint/ha-blueprint-overview.ts | 4 +- src/panels/config/cloud/login/cloud-login.js | 8 +- .../config/dashboard/ha-config-dashboard.ts | 4 +- .../ha-device-automation-card.ts | 8 +- .../ha-device-conditions-card.ts | 4 +- .../device-detail/ha-device-entities-card.ts | 4 +- .../device-detail/ha-device-triggers-card.ts | 4 +- .../mqtt/ha-device-actions-mqtt.ts | 4 +- .../mqtt/mqtt-discovery-payload.ts | 4 +- .../mqtt/mqtt-messages.ts | 4 +- .../config/devices/ha-config-device-page.ts | 7 +- .../devices/ha-config-devices-dashboard.ts | 66 +- .../config/entities/dialog-entity-editor.ts | 4 +- .../config/entities/ha-config-entities.ts | 4 +- .../entities/show-dialog-entity-editor.ts | 5 +- .../helpers/forms/ha-input_select-form.ts | 8 +- .../config/helpers/ha-config-helpers.ts | 28 +- src/panels/config/info/integrations-card.ts | 16 +- src/panels/config/info/system-health-card.ts | 4 +- .../integrations/ha-integration-card.ts | 4 +- .../integrations/ha-integration-header.ts | 6 +- .../mqtt/mqtt-config-panel.ts | 4 +- .../ozw/ozw-network-nodes.ts | 88 +- .../ozw/ozw-network-router.ts | 26 +- .../integration-panels/ozw/ozw-node-config.ts | 4 +- .../ozw/ozw-node-dashboard.ts | 4 +- .../integration-panels/ozw/ozw-node-router.ts | 26 +- .../integration-panels/zha/functions.ts | 5 +- .../zha/zha-cluster-attributes.ts | 4 +- .../zha/zha-cluster-commands.ts | 4 +- .../zha/zha-clusters-data-table.ts | 14 +- .../integration-panels/zha/zha-clusters.ts | 4 +- .../zha/zha-device-binding.ts | 12 +- .../integration-panels/zha/zha-device-card.ts | 7 +- .../zha/zha-device-endpoint-data-table.ts | 18 +- .../zha/zha-group-binding.ts | 14 +- .../integration-panels/zha/zha-group-page.ts | 13 +- .../zha/zha-groups-dashboard.ts | 19 +- .../zwave/ha-config-zwave.js | 4 +- .../zwave/zwave-migration.ts | 4 +- .../integration-panels/zwave/zwave-values.ts | 4 +- src/panels/config/logs/error-log-card.ts | 4 +- src/panels/config/logs/system-log-card.ts | 4 +- .../ha-config-lovelace-dashboards.ts | 12 +- .../resources/ha-config-lovelace-resources.ts | 54 +- .../config/person/dialog-person-detail.ts | 8 +- src/panels/config/person/ha-config-person.ts | 28 +- src/panels/config/scene/ha-config-scene.ts | 11 +- src/panels/config/scene/ha-scene-dashboard.ts | 156 +- src/panels/config/scene/ha-scene-editor.ts | 7 +- src/panels/config/script/ha-config-script.ts | 11 +- src/panels/config/script/ha-script-editor.ts | 4 +- src/panels/config/script/ha-script-picker.ts | 14 +- src/panels/config/tags/dialog-tag-detail.ts | 3 +- src/panels/config/tags/ha-config-tags.ts | 20 +- src/panels/config/zone/ha-config-zone.ts | 73 +- .../event/developer-tools-event.js | 4 +- .../service/developer-tools-service.ts | 7 +- .../state/developer-tools-state.js | 4 +- .../lovelace/cards/hui-alarm-panel-card.ts | 16 +- .../lovelace/cards/hui-calendar-card.ts | 10 +- .../lovelace/cards/hui-entities-card.ts | 8 +- src/panels/lovelace/cards/hui-gauge-card.ts | 5 +- src/panels/lovelace/cards/hui-glance-card.ts | 10 +- .../lovelace/cards/hui-humidifier-card.ts | 8 +- src/panels/lovelace/cards/hui-light-card.ts | 6 +- src/panels/lovelace/cards/hui-sensor-card.ts | 9 +- .../lovelace/cards/hui-shopping-list-card.ts | 3 +- .../lovelace/cards/hui-thermostat-card.ts | 4 +- .../common/generate-lovelace-config.ts | 10 +- .../lovelace/common/graph/coordinates.ts | 13 +- .../lovelace/components/hui-action-editor.ts | 20 +- .../lovelace/components/hui-entity-editor.ts | 8 +- .../components/hui-input-list-editor.ts | 8 +- .../components/hui-theme-select-editor.ts | 7 +- src/panels/lovelace/components/hui-warning.ts | 5 +- .../create-element/create-row-element.ts | 10 +- .../create-element/create-view-element.ts | 5 +- .../card-editor/hui-dialog-create-card.ts | 3 +- .../card-editor/hui-dialog-delete-card.ts | 4 +- .../card-editor/hui-dialog-edit-card.ts | 3 +- .../card-editor/hui-entity-picker-table.ts | 4 +- .../hui-alarm-panel-card-editor.ts | 15 +- .../config-elements/hui-button-card-editor.ts | 3 +- .../hui-calendar-card-editor.ts | 11 +- .../hui-conditional-card-editor.ts | 11 +- .../hui-entities-card-editor.ts | 3 +- .../config-elements/hui-entity-card-editor.ts | 3 +- .../config-elements/hui-gauge-card-editor.ts | 3 +- .../hui-generic-entity-row-editor.ts | 3 +- .../config-elements/hui-glance-card-editor.ts | 3 +- .../hui-graph-footer-editor.ts | 3 +- .../hui-history-graph-card-editor.ts | 3 +- .../hui-humidifier-card-editor.ts | 3 +- .../config-elements/hui-iframe-card-editor.ts | 3 +- .../config-elements/hui-light-card-editor.ts | 3 +- .../hui-logbook-card-editor.ts | 3 +- .../hui-markdown-card-editor.ts | 3 +- .../hui-media-control-card-editor.ts | 3 +- .../hui-picture-card-editor.ts | 3 +- .../hui-picture-entity-card-editor.ts | 7 +- .../hui-picture-glance-card-editor.ts | 7 +- .../hui-plant-status-card-editor.ts | 3 +- .../config-elements/hui-sensor-card-editor.ts | 7 +- .../hui-shopping-list-editor.ts | 3 +- .../config-elements/hui-stack-card-editor.ts | 13 +- .../hui-thermostat-card-editor.ts | 3 +- .../hui-weather-forecast-card-editor.ts | 3 +- .../hui-dialog-create-headerfooter.ts | 3 +- .../hui-header-footer-element-editor.ts | 4 +- .../editor/hui-entities-card-row-editor.ts | 8 +- .../view-editor/hui-dialog-edit-view.ts | 12 +- .../view-editor/hui-view-visibility-editor.ts | 14 +- .../elements/hui-service-button-element.ts | 3 +- .../elements/hui-state-badge-element.ts | 3 +- .../hui-media-player-entity-row.ts | 4 +- .../hui-buttons-header-footer.ts | 3 +- .../header-footer/hui-graph-header-footer.ts | 16 +- .../hui-picture-header-footer.ts | 3 +- src/panels/lovelace/hui-editor.ts | 4 +- .../lovelace/strategies/get-strategy.ts | 1 + src/panels/lovelace/views/hui-masonry-view.ts | 2 +- .../shopping-list/ha-panel-shopping-list.ts | 4 +- src/resources/markdown_worker.ts | 2 +- src/resources/render-markdown.ts | 18 +- src/state-summary/state-card-number.js | 4 +- src/state/connection-mixin.ts | 2 +- src/translations/en.json | 2 +- src/types/node-vibrant.d.ts | 2 +- src/util/brands-url.ts | 5 +- src/util/calculate.ts | 5 +- src/util/documentation-url.ts | 5 +- yarn.lock | 2110 ++++++----------- 244 files changed, 1814 insertions(+), 2804 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 73d6cea999..b1db8a1786 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,8 +4,7 @@ "plugin:@typescript-eslint/recommended", "plugin:wc/recommended", "plugin:lit/recommended", - "prettier", - "prettier/@typescript-eslint" + "prettier" ], "parser": "@typescript-eslint/parser", "parserOptions": { @@ -85,6 +84,25 @@ "@typescript-eslint/explicit-function-return-type": 0, "@typescript-eslint/explicit-module-boundary-types": 0, "@typescript-eslint/no-shadow": ["error"], + "@typescript-eslint/naming-convention": [ + 0, + { + "selector": "default", + "format": ["camelCase", "snake_case"], + "leadingUnderscore": "allow", + "trailingUnderscore": "allow" + }, + { + "selector": ["variable"], + "format": ["camelCase", "snake_case", "UPPER_CASE"], + "leadingUnderscore": "allow", + "trailingUnderscore": "allow" + }, + { + "selector": "typeLike", + "format": ["PascalCase"] + } + ], "lit/attribute-value-entities": 0 }, "plugins": ["disable", "import", "lit", "prettier", "@typescript-eslint"], diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6663a4988e..05c8af47e4 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -37,9 +37,11 @@ jobs: - name: Build resources run: ./node_modules/.bin/gulp gen-icons-json build-translations gather-gallery-demos - name: Run eslint - run: ./node_modules/.bin/eslint '{**/src,src}/**/*.{js,ts,html}' --ignore-path .gitignore + run: yarn run lint:eslint - name: Run tsc - run: ./node_modules/.bin/tsc + run: yarn run lint:types + - name: Run prettier + run: yarn run lint:prettier test: runs-on: ubuntu-latest steps: diff --git a/cast/src/launcher/layout/hc-cast.ts b/cast/src/launcher/layout/hc-cast.ts index 7bcbe70d59..c91e38f2af 100644 --- a/cast/src/launcher/layout/hc-cast.ts +++ b/cast/src/launcher/layout/hc-cast.ts @@ -54,9 +54,7 @@ class HcCast extends LitElement { const error = this.castManager.castState === "NO_DEVICES_AVAILABLE" ? html` -

- There were no suitable Chromecast devices to cast to found. -

+

There were no suitable Chromecast devices to cast to found.

` : undefined; diff --git a/cast/src/launcher/layout/hc-connect.ts b/cast/src/launcher/layout/hc-connect.ts index 8f3e1272ee..518c582f2c 100644 --- a/cast/src/launcher/layout/hc-connect.ts +++ b/cast/src/launcher/layout/hc-connect.ts @@ -86,9 +86,7 @@ export class HcConnect extends LitElement {
- - Retry - + Retry
Log out diff --git a/demo/src/stubs/translations.ts b/demo/src/stubs/translations.ts index 62ee9ac1bd..7eced853f0 100644 --- a/demo/src/stubs/translations.ts +++ b/demo/src/stubs/translations.ts @@ -3,8 +3,6 @@ import { MockHomeAssistant } from "../../../src/fake_data/provide_hass"; export const mockTranslations = (hass: MockHomeAssistant) => { hass.mockWS( "frontend/get_translations", - (/* msg: {language: string, category: string} */) => { - return { resources: {} }; - } + (/* msg: {language: string, category: string} */) => ({ resources: {} }) ); }; diff --git a/hassio/src/addon-store/hassio-addon-repository.ts b/hassio/src/addon-store/hassio-addon-repository.ts index 746ee5cd8d..4e33f15e8b 100644 --- a/hassio/src/addon-store/hassio-addon-repository.ts +++ b/hassio/src/addon-store/hassio-addon-repository.ts @@ -47,9 +47,7 @@ class HassioAddonRepositoryEl extends LitElement { const repo = this.repo; let _addons = this.addons; if (!this.hass.userData?.showAdvanced) { - _addons = _addons.filter((addon) => { - return !addon.advanced; - }); + _addons = _addons.filter((addon) => !addon.advanced); } const addons = this._getAddons(_addons, this.filter); @@ -68,9 +66,7 @@ class HassioAddonRepositoryEl extends LitElement { } return html`
-

- ${repo.name} -

+

${repo.name}

${addons.map( (addon) => html` diff --git a/hassio/src/addon-store/hassio-addon-store.ts b/hassio/src/addon-store/hassio-addon-store.ts index 5ca3d77d73..fd41a504db 100644 --- a/hassio/src/addon-store/hassio-addon-store.ts +++ b/hassio/src/addon-store/hassio-addon-store.ts @@ -86,9 +86,7 @@ class HassioAddonStore extends LitElement { main-page supervisor > - - ${this.supervisor.localize("panel.store")} - + ${this.supervisor.localize("panel.store")} { - return repositories.sort(sortRepos).map((repo) => { + ) => + repositories.sort(sortRepos).map((repo) => { const filteredAddons = addons.filter( (addon) => addon.repository === repo.slug ); @@ -171,8 +169,7 @@ class HassioAddonStore extends LitElement { > ` : html``; - }); - } + }) ); private _handleAction(ev: CustomEvent) { diff --git a/hassio/src/addon-view/config/hassio-addon-audio.ts b/hassio/src/addon-view/config/hassio-addon-audio.ts index de682a9520..79275a39cf 100644 --- a/hassio/src/addon-view/config/hassio-addon-audio.ts +++ b/hassio/src/addon-view/config/hassio-addon-audio.ts @@ -69,13 +69,13 @@ class HassioAddonAudio extends LitElement { .selected=${this._selectedInput!} > ${this._inputDevices && - this._inputDevices.map((item) => { - return html` + this._inputDevices.map( + (item) => html` ${item.name} - `; - })} + ` + )} ${this._outputDevices && - this._outputDevices.map((item) => { - return html` + this._outputDevices.map( + (item) => html` ${item.name} - `; - })} + ` + )}
diff --git a/hassio/src/addon-view/config/hassio-addon-config.ts b/hassio/src/addon-view/config/hassio-addon-config.ts index 706dd12789..56ebbfa5f5 100644 --- a/hassio/src/addon-view/config/hassio-addon-config.ts +++ b/hassio/src/addon-view/config/hassio-addon-config.ts @@ -65,19 +65,15 @@ class HassioAddonConfig extends LitElement { @query("ha-yaml-editor") private _editor?: HaYamlEditor; - public computeLabel = (entry: HaFormSchema): string => { - return ( - this.addon.translations[this.hass.language]?.configuration?.[entry.name] - ?.name || - this.addon.translations.en?.configuration?.[entry.name].name || - entry.name - ); - }; + public computeLabel = (entry: HaFormSchema): string => + this.addon.translations[this.hass.language]?.configuration?.[entry.name] + ?.name || + this.addon.translations.en?.configuration?.[entry.name].name || + entry.name; private _filteredShchema = memoizeOne( - (options: Record, schema: HaFormSchema[]) => { - return schema.filter((entry) => entry.name in options || entry.required); - } + (options: Record, schema: HaFormSchema[]) => + schema.filter((entry) => entry.name in options || entry.required) ); protected render(): TemplateResult { diff --git a/hassio/src/addon-view/config/hassio-addon-network.ts b/hassio/src/addon-view/config/hassio-addon-network.ts index 57eeacd187..256f81175f 100644 --- a/hassio/src/addon-view/config/hassio-addon-network.ts +++ b/hassio/src/addon-view/config/hassio-addon-network.ts @@ -79,12 +79,10 @@ class HassioAddonNetwork extends LitElement { "addon.configuration.network.host" )} - - ${this.supervisor.localize("common.description")} - + ${this.supervisor.localize("common.description")} - ${this._config!.map((item) => { - return html` + ${this._config!.map( + (item) => html` ${item.container} @@ -100,8 +98,8 @@ class HassioAddonNetwork extends LitElement { ${this._computeDescription(item)} - `; - })} + ` + )}
@@ -124,25 +122,20 @@ class HassioAddonNetwork extends LitElement { } } - private _computeDescription = (item: NetworkItem): string => { - return ( - this.addon.translations[this.hass.language]?.network?.[item.container] - ?.description || - this.addon.translations.en?.network?.[item.container]?.description || - item.description - ); - }; + private _computeDescription = (item: NetworkItem): string => + this.addon.translations[this.hass.language]?.network?.[item.container] + ?.description || + this.addon.translations.en?.network?.[item.container]?.description || + item.description; private _setNetworkConfig(): void { const network = this.addon.network || {}; const description = this.addon.network_description || {}; - const items: NetworkItem[] = Object.keys(network).map((key) => { - return { - container: key, - host: network[key], - description: description[key], - }; - }); + const items: NetworkItem[] = Object.keys(network).map((key) => ({ + container: key, + host: network[key], + description: description[key], + })); this._config = items.sort((a, b) => (a.container > b.container ? 1 : -1)); } diff --git a/hassio/src/addon-view/info/hassio-addon-info.ts b/hassio/src/addon-view/info/hassio-addon-info.ts index b0f10392fa..03d2c1bf65 100644 --- a/hassio/src/addon-view/info/hassio-addon-info.ts +++ b/hassio/src/addon-view/info/hassio-addon-info.ts @@ -566,9 +566,7 @@ class HassioAddonInfo extends LitElement { ${this.supervisor.localize("addon.dashboard.hostname")} - - ${this.addon.hostname} - + ${this.addon.hostname} ${metrics.map( (metric) => @@ -997,7 +995,7 @@ class HassioAddonInfo extends LitElement { addons: [this.addon.slug], homeassistant: false, }, - updateHandler: async () => await this._updateAddon(), + updateHandler: async () => this._updateAddon(), }); } diff --git a/hassio/src/components/hassio-card-content.ts b/hassio/src/components/hassio-card-content.ts index 02d3fc7e1b..03884e6b94 100644 --- a/hassio/src/components/hassio-card-content.ts +++ b/hassio/src/components/hassio-card-content.ts @@ -56,13 +56,13 @@ class HassioCardContent extends LitElement { > `}
-
- ${this.title} -
+
${this.title}
${this.description} - ${/* treat as available when undefined */ - this.available === false ? " (Not available)" : ""} + ${ + /* treat as available when undefined */ + this.available === false ? " (Not available)" : "" + } ${this.datetime ? html` - - ${this.description} - + ${this.description}
- - ${roundedValue} % - + ${roundedValue} % 50, diff --git a/hassio/src/dashboard/hassio-update.ts b/hassio/src/dashboard/hassio-update.ts index ccff99445b..1a11ee99e4 100644 --- a/hassio/src/dashboard/hassio-update.ts +++ b/hassio/src/dashboard/hassio-update.ts @@ -40,9 +40,8 @@ import { HomeAssistant } from "../../../src/types"; import { showDialogSupervisorUpdate } from "../dialogs/update/show-dialog-update"; import { hassioStyle } from "../resources/hassio-style"; -const computeVersion = (key: string, version: string): string => { - return key === "os" ? version : `${key}-${version}`; -}; +const computeVersion = (key: string, version: string): string => + key === "os" ? version : `${key}-${version}`; @customElement("hassio-update") export class HassioUpdate extends LitElement { @@ -50,11 +49,12 @@ export class HassioUpdate extends LitElement { @property({ attribute: false }) public supervisor!: Supervisor; - private _pendingUpdates = memoizeOne((supervisor: Supervisor): number => { - return Object.keys(supervisor).filter( - (value) => supervisor[value].update_available - ).length; - }); + private _pendingUpdates = memoizeOne( + (supervisor: Supervisor): number => + Object.keys(supervisor).filter( + (value) => supervisor[value].update_available + ).length + ); protected render(): TemplateResult { if (!this.supervisor) { diff --git a/hassio/src/dialogs/network/dialog-hassio-network.ts b/hassio/src/dialogs/network/dialog-hassio-network.ts index 8e6f9610e4..04f2710465 100644 --- a/hassio/src/dialogs/network/dialog-hassio-network.ts +++ b/hassio/src/dialogs/network/dialog-hassio-network.ts @@ -47,7 +47,8 @@ import { HassioNetworkDialogParams } from "./show-dialog-network"; const IP_VERSIONS = ["ipv4", "ipv6"]; @customElement("dialog-hassio-network") -export class DialogHassioNetwork extends LitElement +export class DialogHassioNetwork + extends LitElement implements HassDialog { @property({ attribute: false }) public hass!: HomeAssistant; @@ -76,9 +77,9 @@ export class DialogHassioNetwork extends LitElement this._dirty = false; this._curTabIndex = 0; this.supervisor = params.supervisor; - this._interfaces = params.supervisor.network.interfaces.sort((a, b) => { - return a.primary > b.primary ? -1 : 1; - }); + this._interfaces = params.supervisor.network.interfaces.sort((a, b) => + a.primary > b.primary ? -1 : 1 + ); this._interface = { ...this._interfaces[this._curTabIndex] }; await this.updateComplete; diff --git a/hassio/src/dialogs/registries/dialog-hassio-registries.ts b/hassio/src/dialogs/registries/dialog-hassio-registries.ts index 292fab3f43..4b77b41436 100644 --- a/hassio/src/dialogs/registries/dialog-hassio-registries.ts +++ b/hassio/src/dialogs/registries/dialog-hassio-registries.ts @@ -108,8 +108,8 @@ class HassioRegistriesDialog extends LitElement { ` : html`${this._registries?.length - ? this._registries.map((entry) => { - return html` + ? this._registries.map( + (entry) => html` ${entry.registry} - `; - }) + ` + ) : html` ${this._error}
` : ""}
${repositories.length - ? repositories.map((repo) => { - return html` + ? repositories.map( + (repo) => html`
${repo.name}
@@ -105,13 +105,9 @@ class HassioRepositoriesDialog extends LitElement {
- `; - }) - : html` - - No repositories - - `} + ` + ) + : html` No repositories `}
{ - return repo.source; - }); + const newRepositories = repositories.map((repo) => repo.source); newRepositories.push(input.value); try { @@ -228,19 +222,13 @@ class HassioRepositoriesDialog extends LitElement { private async _removeRepository(ev: Event) { const slug = (ev.currentTarget as any).slug; const repositories = this._filteredRepositories(this._repositories!); - const repository = repositories.find((repo) => { - return repo.slug === slug; - }); + const repository = repositories.find((repo) => repo.slug === slug); if (!repository) { return; } const newRepositories = repositories - .map((repo) => { - return repo.source; - }) - .filter((repo) => { - return repo !== repository.source; - }); + .map((repo) => repo.source) + .filter((repo) => repo !== repository.source); try { await setSupervisorOption(this.hass, { diff --git a/hassio/src/dialogs/snapshot/dialog-hassio-snapshot-upload.ts b/hassio/src/dialogs/snapshot/dialog-hassio-snapshot-upload.ts index 1f657bf0d8..d4948bd553 100644 --- a/hassio/src/dialogs/snapshot/dialog-hassio-snapshot-upload.ts +++ b/hassio/src/dialogs/snapshot/dialog-hassio-snapshot-upload.ts @@ -18,7 +18,8 @@ import "../../components/hassio-upload-snapshot"; import { HassioSnapshotUploadDialogParams } from "./show-dialog-snapshot-upload"; @customElement("dialog-hassio-snapshot-upload") -export class DialogHassioSnapshotUpload extends LitElement +export class DialogHassioSnapshotUpload + extends LitElement implements HassDialog { @property({ attribute: false }) public hass!: HomeAssistant; @@ -57,9 +58,7 @@ export class DialogHassioSnapshotUpload extends LitElement >
- - Upload snapshot - + Upload snapshot diff --git a/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts b/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts index 34042058d3..b44c9eb6c3 100755 --- a/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts +++ b/hassio/src/dialogs/snapshot/dialog-hassio-snapshot.ts @@ -53,14 +53,13 @@ const _computeFolders = (folders) => { return list; }; -const _computeAddons = (addons) => { - return addons.map((addon) => ({ +const _computeAddons = (addons) => + addons.map((addon) => ({ slug: addon.slug, name: addon.name, version: addon.version, checked: true, })); -}; interface AddonItem { slug: string; @@ -122,9 +121,7 @@ class HassioSnapshotDialog extends LitElement {
- - ${this._computeName} - + ${this._computeName} @@ -152,8 +149,8 @@ class HassioSnapshotDialog extends LitElement { ? html`
Folders:
- ${this._folders.map((item) => { - return html` + ${this._folders.map( + (item) => html` Add-on:
- ${this._addons.map((item) => { - return html` + ${this._addons.map( + (item) => html`
-

- ${this.supervisor.localize("snapshot.create_snapshot")} -

+

${this.supervisor.localize("snapshot.create_snapshot")}

${this.supervisor.localize("snapshot.description")}

diff --git a/hassio/src/system/hassio-core-info.ts b/hassio/src/system/hassio-core-info.ts index bb00dcd05c..bdb156fe20 100644 --- a/hassio/src/system/hassio-core-info.ts +++ b/hassio/src/system/hassio-core-info.ts @@ -178,7 +178,7 @@ class HassioCoreInfo extends LitElement { folders: ["homeassistant"], homeassistant: true, }, - updateHandler: async () => await this._updateCore(), + updateHandler: async () => this._updateCore(), }); } diff --git a/hassio/src/system/hassio-host-info.ts b/hassio/src/system/hassio-host-info.ts index 09e363c1c1..db5e4e2f7e 100644 --- a/hassio/src/system/hassio-host-info.ts +++ b/hassio/src/system/hassio-host-info.ts @@ -97,9 +97,7 @@ class HassioHostInfo extends LitElement { ${this.supervisor.localize("system.host.ip_address")} - - ${primaryIpAddress} - + ${primaryIpAddress} - - ${this.supervisor.localize("system.supervisor.beta_backup")} - + ${this.supervisor.localize("system.supervisor.beta_backup")}

${this.supervisor.localize("system.supervisor.beta_release_items")}