From 6d54496187d8a274de91c23fda93b3de2baa44b3 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 20 Feb 2020 00:32:31 +0000 Subject: [PATCH 1/4] [ci skip] Translation update --- translations/ca.json | 5 +++++ translations/da.json | 12 ++++++++++++ translations/de.json | 7 +++++++ translations/es.json | 5 +++++ translations/it.json | 5 +++++ translations/nb.json | 14 +++++++++++++- translations/pl.json | 19 ++++++++++++------- translations/ru.json | 7 ++++++- translations/zh-Hant.json | 5 +++++ 9 files changed, 70 insertions(+), 9 deletions(-) diff --git a/translations/ca.json b/translations/ca.json index f8c935b556..21f48285ca 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -1916,6 +1916,11 @@ "toggle": "Commuta {name}", "url": "Obre un finestra a {url_path}" }, + "safe-mode": { + "description": "Home Assistant ha tingut algun problema en carregar la configuració i ara s'està executant en mode segur. Mira el registre d’errors per veure què ha anat malament.", + "header": "Mode segur activat", + "show_errors": "Mostra els errors" + }, "shopping-list": { "add_item": "Afegir element", "checked_items": "Articles seleccionats", diff --git a/translations/da.json b/translations/da.json index 9eb2871e59..8f7cef85f7 100644 --- a/translations/da.json +++ b/translations/da.json @@ -581,6 +581,7 @@ "entity": "Relaterede entiteter", "group": "En del af følgende grupper", "integration": "Integration", + "no_related_found": "Ingen relaterede elementer fundet.", "scene": "En del af følgende scener", "script": "En del af følgende scripts" }, @@ -630,6 +631,7 @@ "unavailable": "Denne entitet er ikke tilgængelig i øjeblikket.", "update": "OPDATER" }, + "no_unique_id": "Denne entitet har ikke et unikt id. Derfor kan dens indstillinger ikke styres fra brugerfladen.", "related": "Relaterede", "settings": "Indstillinger" }, @@ -1323,6 +1325,7 @@ "filter": { "filter": "Filtrer", "show_disabled": "Vis deaktiverede entiteter", + "show_readonly": "Vis skrivebeskyttede entiteter", "show_unavailable": "Vis utilgængelige entiteter" }, "header": "Entiteter", @@ -1346,6 +1349,7 @@ "status": { "disabled": "Deaktiveret", "ok": "Ok", + "readonly": "Skrivebeskyttet", "unavailable": "Utilgængelig" }, "unavailable": "(utilgængelig)" @@ -1702,6 +1706,9 @@ "update": "Opdater" }, "edit_home_zone": "Lokaliteten af dit hjem kan ændres i den generelle konfiguration.", + "edit_home_zone_narrow": "Radius af hjemmezonen kan ikke redigeres fra brugerfladen endnu. Lokaliteten kan ændres fra den generelle konfiguration.", + "go_to_core_config": "Gå til generel konfiguration?", + "home_zone_core_config": "Lokaliteten af din hjemmezone kan redigeres fra den generelle konfigurationsside. Radius af hjemmezonen kan ikke redigeres fra brugerfladen endnu. Vil du gå til den generelle konfiguration?", "introduction": "Zoner giver dig mulighed for at angive bestemte områder på jorden. Når en person er inden for en zone, vil tilstanden antage navnet fra zonen. Zoner kan også bruges som udløser eller tilstand inde i automatiseringsopsætninger.", "no_zones_created_yet": "Det ser ud til, at du ikke har oprettet nogen zoner endnu." }, @@ -1909,6 +1916,11 @@ "toggle": "Skift {name}", "url": "Åbn vindue til {url_path}" }, + "safe-mode": { + "description": "Home Assistant løb ind i problemer indlæsningen af din konfiguration, og kører nu i fejlsikret tilstand. Se på fejlloggen for at se, hvad der gik galt.", + "header": "Safe mode aktiveret", + "show_errors": "Vis fejlmeddelelser" + }, "shopping-list": { "add_item": "Tilføj element", "checked_items": "Markerede elementer", diff --git a/translations/de.json b/translations/de.json index c284fb2a9f..6c481e6f29 100644 --- a/translations/de.json +++ b/translations/de.json @@ -581,6 +581,7 @@ "entity": "Verwandte Entitäten", "group": "Teil der folgenden Gruppen", "integration": "Integration", + "no_related_found": "Es wurden keine verwandten Elemente gefunden.", "scene": "Teil der folgenden Szenen", "script": "Teil der folgenden Skripte" }, @@ -1346,6 +1347,7 @@ "status": { "disabled": "Deaktiviert", "ok": "Ok", + "readonly": "Schreibgeschützt", "unavailable": "Nicht verfügbar" }, "unavailable": "(nicht verfügbar)" @@ -1702,6 +1704,7 @@ "update": "Aktualisieren" }, "edit_home_zone": "Der Standort Ihres Hauses kann in der allgemeinen Konfiguration geändert werden.", + "go_to_core_config": "Zur allgemeinen Konfiguration gehen?", "introduction": "Mit Zonen können Sie bestimmte Regionen auf der Erde angeben. Befindet sich eine Person in einer Zone, übernimmt der Zustand den Namen aus der Zone. Zonen können auch als Auslöser oder Bedingung in Automatisierungs-Setups verwendet werden.", "no_zones_created_yet": "Es sieht so aus, als hätten Sie noch keine Zonen erstellt." }, @@ -1909,6 +1912,10 @@ "toggle": "{name} umschalten", "url": "Fenster zu {url_path} öffnen" }, + "safe-mode": { + "header": "Abgesicherter Modus aktiviert", + "show_errors": "Fehler anzeigen" + }, "shopping-list": { "add_item": "Artikel hinzufügen", "checked_items": "Markierte Artikel", diff --git a/translations/es.json b/translations/es.json index 6b18bb436c..bb4989e6ae 100644 --- a/translations/es.json +++ b/translations/es.json @@ -1916,6 +1916,11 @@ "toggle": "Alternar {name}", "url": "Abrir ventana a {url_path}" }, + "safe-mode": { + "description": "Home Assistant tuvo problemas al cargar tu configuración y ahora se está ejecutando en modo seguro. Echa un vistazo al registro de errores para ver qué salió mal.", + "header": "Modo Seguro Activado", + "show_errors": "Mostrar errores" + }, "shopping-list": { "add_item": "Añadir artículo", "checked_items": "Elementos marcados", diff --git a/translations/it.json b/translations/it.json index a0e2b3bb65..11f7ba467a 100644 --- a/translations/it.json +++ b/translations/it.json @@ -1916,6 +1916,11 @@ "toggle": "Commuta {name}", "url": "Aprire la finestra per {url_path}" }, + "safe-mode": { + "description": "Home Assistant ha riscontrato problemi durante il caricamento della configurazione ed è ora in esecuzione in modalità provvisoria. Dai un'occhiata al log degli errori per vedere cosa è andato storto.", + "header": "Modalità provvisoria attivata", + "show_errors": "Mostra errori" + }, "shopping-list": { "add_item": "Aggiungi elemento", "checked_items": "Elementi selezionati", diff --git a/translations/nb.json b/translations/nb.json index 140f0a897a..2ce8716ff3 100644 --- a/translations/nb.json +++ b/translations/nb.json @@ -581,6 +581,7 @@ "entity": "Beslektede entiteter", "group": "Del av følgende grupper", "integration": "Integrering", + "no_related_found": "Finner ingen relaterte elementer.", "scene": "Del av følgende scener", "script": "Del av følgende skript" }, @@ -630,6 +631,7 @@ "unavailable": "Denne entiteten er ikke tilgjengelig for øyeblikket.", "update": "OPPDATÉR" }, + "no_unique_id": "Denne enheten har ikke en unik ID, derfor kan innstillingene ikke administreres fra brukergrensesnittet.", "related": "Relaterte", "settings": "Innstillinger" }, @@ -1323,6 +1325,7 @@ "filter": { "filter": "Filter", "show_disabled": "Vis deaktiverte entiteter", + "show_readonly": "Vis skrivebeskyttede enheter", "show_unavailable": "Vis utilgjengelige enheter" }, "header": "Entiteter", @@ -1346,6 +1349,7 @@ "status": { "disabled": "Deaktivert", "ok": "Ok", + "readonly": "Skrivebeskyttet", "unavailable": "Utilgjengelig" }, "unavailable": "(utilgjengelig)" @@ -1701,7 +1705,10 @@ "required_error_msg": "Dette feltet er påkrevd", "update": "Oppdater" }, - "edit_home_zone": "Plasseringen av hjemmet ditt kan endres i general-konfigurasjonen.", + "edit_home_zone": "Radien til Hjemmesonen kan ikke redigeres fra frontend ennå. Dra markøren på kartet for å flytte hjemmesonen.", + "edit_home_zone_narrow": "Radiusen til hjemsonen kan ikke redigeres fra frontend ennå. Plasseringen kan endres fra den generelle konfigurasjonen.", + "go_to_core_config": "Gå til generell konfigurasjon?", + "home_zone_core_config": "Plasseringen av hjemmesonen kan redigeres fra den generelle konfigurasjonssiden. Radiusen til hjemsonen kan ikke redigeres fra frontend ennå. Vil du gå til den generelle konfigurasjonen?", "introduction": "Med soner kan du angi bestemte områder på jorden. Når en person er innenfor en sone, vil staten ta navnet fra sonen. Soner kan også brukes som en utløser eller tilstand i automatiserings oppsett.", "no_zones_created_yet": "Det ser ut til at du ikke har opprettet noen soner enda." }, @@ -1909,6 +1916,11 @@ "toggle": "Veksle {name}", "url": "Åpne vindu til {url_path}" }, + "safe-mode": { + "description": "Home Assistant fikk problemer under lasting av konfigurasjonen og kjører nå i sikkermodus. Ta en titt på feilloggen for å se hva som gikk galt.", + "header": "Sikkermodus aktivert", + "show_errors": "Vis feil" + }, "shopping-list": { "add_item": "Legg til", "checked_items": "Merkede elementer", diff --git a/translations/pl.json b/translations/pl.json index 7ed20d4333..1e33d72593 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -560,14 +560,14 @@ "device-picker": { "clear": "Wyczyść", "device": "Urządzenie", - "show_devices": "Wyświetl urządzenia", + "show_devices": "Pokaż urządzenia", "toggle": "Przełącz" }, "entity": { "entity-picker": { "clear": "Wyczyść", "entity": "Encja", - "show_entities": "Wyświetl encje" + "show_entities": "Pokaż encje" } }, "history_charts": { @@ -631,7 +631,7 @@ "unavailable": "Ta encja nie jest obecnie dostępna.", "update": "AKTUALIZUJ" }, - "no_unique_id": "Ten encja nie ma unikalnego identyfikatora, dlatego jego ustawieniami nie można zarządzać z interfejsu użytkownika.", + "no_unique_id": "Ten encja nie ma unikalnego identyfikatora, dlatego z poziomu interfejsu użytkownika nie można zarządzać jej ustawieniami.", "related": "Powiązane", "settings": "Ustawienia" }, @@ -1325,7 +1325,7 @@ "filter": { "filter": "Filtr", "show_disabled": "Wyświetlaj wyłączone encje", - "show_readonly": "Pokaż encje tylko do odczytu", + "show_readonly": "Wyświetlaj encje tylko do odczytu", "show_unavailable": "Wyświetlaj niedostępne encje" }, "header": "Rejestr encji", @@ -1705,10 +1705,10 @@ "required_error_msg": "To pole jest wymagane", "update": "Aktualizuj" }, - "edit_home_zone": "Lokalizację domu można zmienić w konfiguracji ogólnej.", - "edit_home_zone_narrow": "Promienia strefy domowej nie można jeszcze edytować z poziomu interfejsu użytkownika. Lokalizację można zmienić z ogólnej konfiguracji.", + "edit_home_zone": "Lokalizację strefy domowej można zmienić w konfiguracji ogólnej.", + "edit_home_zone_narrow": "Promienia strefy domowej nie można jeszcze edytować z poziomu interfejsu użytkownika. Lokalizację tej strefy można zmienić w konfiguracji ogólnej.", "go_to_core_config": "Czy chcesz przejść do konfiguracji ogólnej?", - "home_zone_core_config": "Lokalizację strefy domowej można edytować na stronie konfiguracji ogólnej. Promienia strefy domowej nie można jeszcze edytować z poziomu interfejsu użytkownika. Czy chcesz przejść do ogólnej konfiguracji?", + "home_zone_core_config": "Lokalizację strefy domowej można edytować w konfiguracji ogólnej. Promienia strefy domowej nie można jeszcze edytować z poziomu interfejsu użytkownika. Czy chcesz przejść do konfiguracji ogólnej?", "introduction": "Strefy pozwalają określić regiony na ziemi. Gdy dana osoba znajduje się w strefie, jej encja pobierze stan z nazwy strefy. Strefy mogą być również używane jako wyzwalacz lub warunek w automatyzacjach.", "no_zones_created_yet": "Wygląda na to, że nie utworzyłeś jeszcze żadnych stref." }, @@ -1916,6 +1916,11 @@ "toggle": "Przełącz {name}", "url": "Otwórz okno do {url_path}" }, + "safe-mode": { + "description": "Podczas ładowania konfiguracji Home Assistant napotkał problemy i działa teraz w trybie awaryjnym. Zajrzyj do loga, aby sprawdzić, co poszło nie tak.", + "header": "Tryb awaryjny aktywny", + "show_errors": "Pokaż błędy" + }, "shopping-list": { "add_item": "Dodaj pozycję", "checked_items": "Pozycje zaznaczone", diff --git a/translations/ru.json b/translations/ru.json index b4f8ff55db..8dc780aaae 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -1697,7 +1697,7 @@ "required_error_msg": "Обязательное поле", "update": "Обновить" }, - "edit_home_zone": "Местоположение Вашего дома может быть изменено в разделе настроек \"Общие\".", + "edit_home_zone": "Радиус домашней зоны изменить в пользовательском интерфейсе в настоящее время невозможно. Чтобы изменить местоположение домашней зоны, переместите маркер на карте.", "edit_home_zone_narrow": "Местоположение домашней зоны может быть изменено в разделе настроек \"Общие\". Радиус домашней зоны изменить в пользовательском интерфейсе в настоящее время невозможно.", "go_to_core_config": "Перейти в раздел \"Общие\"?", "home_zone_core_config": "Местоположение домашней зоны может быть изменено в разделе настроек \"Общие\". Радиус домашней зоны изменить в пользовательском интерфейсе в настоящее время невозможно. Перейти в раздел настроек \"Общие\"?", @@ -1908,6 +1908,11 @@ "toggle": "Переключить {name}", "url": "Открыть окно {url_path}" }, + "safe-mode": { + "description": "Home Assistant столкнулся с проблемой при загрузке Вашей конфигурации и теперь работает в безопасном режиме. Ознакомьтесь с журналом ошибок, чтобы увидеть, что пошло не так.", + "header": "Безопасный режим", + "show_errors": "Показать ошибки" + }, "shopping-list": { "add_item": "Добавить элемент", "checked_items": "Отмеченные элементы", diff --git a/translations/zh-Hant.json b/translations/zh-Hant.json index f4bc1a0d9f..433a60b07e 100644 --- a/translations/zh-Hant.json +++ b/translations/zh-Hant.json @@ -1916,6 +1916,11 @@ "toggle": "切換 {name}", "url": "開啟視窗至 {url_path}" }, + "safe-mode": { + "description": "Home Assistant 於載入設定時發生問題、正以安全模式執行中。請參閱錯誤紀錄、以找出問題。", + "header": "安全模式已開啟", + "show_errors": "顯示錯誤" + }, "shopping-list": { "add_item": "新增項目", "checked_items": "已選取項目", From 52609dded97e262421395c84c63cb8c3c34449bd Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 20 Feb 2020 00:55:42 -0800 Subject: [PATCH 2/4] Add rebuild support to editor preview (#4932) * Add rebuild support to editor preview * getLovelaceCardClass function added * Use error class * Tiny cleanup * Misplaced comment --- .../lovelace/common/get-card-element-tag.ts | 7 -- .../create-element/create-card-element.ts | 8 +- .../create-element/create-element-base.ts | 86 +++++++++++++++++-- .../editor/card-editor/hui-card-editor.ts | 10 +-- .../editor/card-editor/hui-card-picker.ts | 9 +- .../editor/card-editor/hui-card-preview.ts | 19 +++- src/panels/lovelace/types.ts | 7 +- 7 files changed, 112 insertions(+), 34 deletions(-) delete mode 100644 src/panels/lovelace/common/get-card-element-tag.ts diff --git a/src/panels/lovelace/common/get-card-element-tag.ts b/src/panels/lovelace/common/get-card-element-tag.ts deleted file mode 100644 index ee80d760a1..0000000000 --- a/src/panels/lovelace/common/get-card-element-tag.ts +++ /dev/null @@ -1,7 +0,0 @@ -const CUSTOM_TYPE_PREFIX = "custom:"; - -export function getCardElementTag(type: string): string { - return type.startsWith(CUSTOM_TYPE_PREFIX) - ? type.substr(CUSTOM_TYPE_PREFIX.length) - : `hui-${type}-card`; -} diff --git a/src/panels/lovelace/create-element/create-card-element.ts b/src/panels/lovelace/create-element/create-card-element.ts index d3acc76267..3669bba1f4 100644 --- a/src/panels/lovelace/create-element/create-card-element.ts +++ b/src/panels/lovelace/create-element/create-card-element.ts @@ -11,7 +11,10 @@ import "../cards/hui-thermostat-card"; import "../cards/hui-vertical-stack-card"; import "../cards/hui-weather-forecast-card"; import { LovelaceCardConfig } from "../../../data/lovelace"; -import { createLovelaceElement } from "./create-element-base"; +import { + createLovelaceElement, + getLovelaceElementClass, +} from "./create-element-base"; const ALWAYS_LOADED_TYPES = new Set([ "entities", @@ -56,3 +59,6 @@ export const createCardElement = (config: LovelaceCardConfig) => undefined, undefined ); + +export const getCardElementClass = (type: string) => + getLovelaceElementClass(type, "card", ALWAYS_LOADED_TYPES, LAZY_LOAD_TYPES); diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts index 61f1b6a432..72c85b9709 100644 --- a/src/panels/lovelace/create-element/create-element-base.ts +++ b/src/panels/lovelace/create-element/create-element-base.ts @@ -7,7 +7,12 @@ import { createErrorCardElement, createErrorCardConfig, } from "../cards/hui-error-card"; -import { LovelaceCard, LovelaceBadge, LovelaceHeaderFooter } from "../types"; +import { + LovelaceCard, + LovelaceBadge, + LovelaceHeaderFooter, + LovelaceCardConstructor, +} from "../types"; import { fireEvent } from "../../../common/dom/fire_event"; import { LovelaceElementConfig, LovelaceElement } from "../elements/types"; import { LovelaceRow, LovelaceRowConfig } from "../entity-rows/types"; @@ -17,13 +22,30 @@ const CUSTOM_TYPE_PREFIX = "custom:"; const TIMEOUT = 2000; interface CreateElementConfigTypes { - card: { config: LovelaceCardConfig; element: LovelaceCard }; - badge: { config: LovelaceBadgeConfig; element: LovelaceBadge }; - element: { config: LovelaceElementConfig; element: LovelaceElement }; - row: { config: LovelaceRowConfig; element: LovelaceRow }; + card: { + config: LovelaceCardConfig; + element: LovelaceCard; + constructor: LovelaceCardConstructor; + }; + badge: { + config: LovelaceBadgeConfig; + element: LovelaceBadge; + constructor: unknown; + }; + element: { + config: LovelaceElementConfig; + element: LovelaceElement; + constructor: unknown; + }; + row: { + config: LovelaceRowConfig; + element: LovelaceRow; + constructor: unknown; + }; "header-footer": { config: LovelaceHeaderFooterConfig; element: LovelaceHeaderFooter; + constructor: unknown; }; } @@ -75,11 +97,16 @@ const _maybeCreate = ( return element; }; +const _getCustomTag = (type: string) => + type.startsWith(CUSTOM_TYPE_PREFIX) + ? type.substr(CUSTOM_TYPE_PREFIX.length) + : undefined; + export const createLovelaceElement = ( tagSuffix: T, config: CreateElementConfigTypes[T]["config"], alwaysLoadTypes?: Set, - lazyLoadTypes?: { [domain: string]: () => unknown }, + lazyLoadTypes?: { [domain: string]: () => Promise }, // Allow looking at "entity" in config and mapping that to a type domainTypes?: { _domain_not_found: string; [domain: string]: string }, // Default type if no type given. If given, entity types will not work. @@ -98,8 +125,10 @@ export const createLovelaceElement = ( return _createErrorElement("No card type configured.", config); } - if (config.type && config.type.startsWith(CUSTOM_TYPE_PREFIX)) { - return _maybeCreate(config.type.substr(CUSTOM_TYPE_PREFIX.length), config); + const customTag = config.type ? _getCustomTag(config.type) : undefined; + + if (customTag) { + return _maybeCreate(customTag, config); } let type: string | undefined; @@ -131,3 +160,44 @@ export const createLovelaceElement = ( return _createErrorElement(`Unknown type encountered: ${type}.`, config); }; + +export const getLovelaceElementClass = async < + T extends keyof CreateElementConfigTypes +>( + type: string, + tagSuffix: T, + alwaysLoadTypes?: Set, + lazyLoadTypes?: { [domain: string]: () => Promise } +): Promise => { + const customTag = _getCustomTag(type); + + if (customTag) { + const customCls = customElements.get(customTag); + return customCls + ? customCls + : new Promise((resolve, reject) => { + // We will give custom components up to TIMEOUT seconds to get defined + setTimeout( + () => reject(new Error(`Custom element not found: ${customTag}`)), + TIMEOUT + ); + + customElements + .whenDefined(customTag) + .then(() => resolve(customElements.get(customTag))); + }); + } + + const tag = `hui-${type}-${tagSuffix}`; + const cls = customElements.get(tag); + + if (alwaysLoadTypes && type in alwaysLoadTypes) { + return cls; + } + + if (lazyLoadTypes && type in lazyLoadTypes) { + return cls || lazyLoadTypes[type]().then(() => customElements.get(tag)); + } + + throw new Error(`Unknown type: ${type}`); +}; diff --git a/src/panels/lovelace/editor/card-editor/hui-card-editor.ts b/src/panels/lovelace/editor/card-editor/hui-card-editor.ts index 0509788ef4..9bd7d38cc5 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-editor.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-editor.ts @@ -14,7 +14,6 @@ import "@material/mwc-button"; import { HomeAssistant } from "../../../../types"; import { LovelaceCardConfig } from "../../../../data/lovelace"; import { LovelaceCardEditor } from "../../types"; -import { getCardElementTag } from "../../common/get-card-element-tag"; import { computeRTL } from "../../../../common/util/compute_rtl"; import "../../../../components/ha-code-editor"; @@ -23,6 +22,7 @@ import "../../../../components/ha-code-editor"; import { HaCodeEditor } from "../../../../components/ha-code-editor"; import { fireEvent } from "../../../../common/dom/fire_event"; import { EntityConfig } from "../../entity-rows/types"; +import { getCardElementClass } from "../../create-element/create-card-element"; declare global { interface HASSDomEvents { @@ -215,13 +215,7 @@ export class HuiCardEditor extends LitElement { throw new Error("No card type defined"); } - const tag = getCardElementTag(cardType); - - // Check if the card type exists - const elClass = customElements.get(tag); - if (!elClass) { - throw new Error(`Unknown card type encountered: ${cardType}.`); - } + const elClass = await getCardElementClass(cardType); this._loading = true; // Check if a GUI editor exists diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index 422e24d86b..a035237067 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -10,9 +10,9 @@ import "@material/mwc-button"; import { HomeAssistant } from "../../../../types"; import { LovelaceCardConfig } from "../../../../data/lovelace"; -import { getCardElementTag } from "../../common/get-card-element-tag"; import { CardPickTarget } from "../types"; import { fireEvent } from "../../../../common/dom/fire_event"; +import { getCardElementClass } from "../../create-element/create-card-element"; const cards: string[] = [ "alarm-panel", @@ -94,15 +94,14 @@ export class HuiCardPicker extends LitElement { }); } - private _cardPicked(ev: Event): void { + private async _cardPicked(ev: Event): Promise { const type = (ev.currentTarget! as CardPickTarget).type; - const tag = getCardElementTag(type); - const elClass = customElements.get(tag); + const elClass = await getCardElementClass(type); let config: LovelaceCardConfig = { type }; if (elClass && elClass.getStubConfig) { - const cardConfig = elClass.getStubConfig(this.hass); + const cardConfig = elClass.getStubConfig(this.hass!); config = { ...config, ...cardConfig }; } diff --git a/src/panels/lovelace/editor/card-editor/hui-card-preview.ts b/src/panels/lovelace/editor/card-editor/hui-card-preview.ts index 46c03731e5..9bce069854 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-preview.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-preview.ts @@ -7,13 +7,23 @@ import { HomeAssistant } from "../../../../types"; import { LovelaceCardConfig } from "../../../../data/lovelace"; import { LovelaceCard } from "../../types"; import { ConfigError } from "../types"; -import { getCardElementTag } from "../../common/get-card-element-tag"; import { createErrorCardConfig } from "../../cards/hui-error-card"; import { computeRTL } from "../../../../common/util/compute_rtl"; export class HuiCardPreview extends HTMLElement { private _hass?: HomeAssistant; private _element?: LovelaceCard; + private _config?: LovelaceCardConfig; + + constructor() { + super(); + this.addEventListener("ll-rebuild", () => { + this._cleanup(); + if (this._config) { + this.config = this._config; + } + }); + } set hass(hass: HomeAssistant) { if (!this._hass || this._hass.language !== hass.language) { @@ -36,6 +46,9 @@ export class HuiCardPreview extends HTMLElement { } set config(configValue: LovelaceCardConfig) { + const curConfig = this._config; + this._config = configValue; + if (!configValue) { this._cleanup(); return; @@ -53,9 +66,7 @@ export class HuiCardPreview extends HTMLElement { return; } - const tag = getCardElementTag(configValue.type); - - if (tag.toUpperCase() === this._element.tagName) { + if (curConfig && configValue.type === curConfig.type) { try { this._element.setConfig(deepClone(configValue)); } catch (err) { diff --git a/src/panels/lovelace/types.ts b/src/panels/lovelace/types.ts index 2e2cbab398..71b36c01e2 100644 --- a/src/panels/lovelace/types.ts +++ b/src/panels/lovelace/types.ts @@ -1,4 +1,4 @@ -import { HomeAssistant } from "../../types"; +import { HomeAssistant, Constructor } from "../../types"; import { LovelaceCardConfig, LovelaceConfig, @@ -37,6 +37,11 @@ export interface LovelaceCard extends HTMLElement { setConfig(config: LovelaceCardConfig): void; } +export interface LovelaceCardConstructor extends Constructor { + getStubConfig?: (hass: HomeAssistant) => LovelaceCardConfig; + getConfigElement?: () => LovelaceCardEditor; +} + export interface LovelaceHeaderFooter extends HTMLElement { hass?: HomeAssistant; setConfig(config: LovelaceHeaderFooterConfig): void; From fc88922ce3fe5fb716654405f7f9716fc8e1b350 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Thu, 20 Feb 2020 03:57:14 -0500 Subject: [PATCH 3/4] Fix CPU and Browser Usuage (#4935) --- src/panels/lovelace/cards/hui-history-graph-card.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/panels/lovelace/cards/hui-history-graph-card.ts b/src/panels/lovelace/cards/hui-history-graph-card.ts index 4618751429..02a895ac99 100644 --- a/src/panels/lovelace/cards/hui-history-graph-card.ts +++ b/src/panels/lovelace/cards/hui-history-graph-card.ts @@ -87,9 +87,11 @@ export class HuiHistoryGraphCard extends LitElement implements LovelaceCard { return; } - const oldConfig = changedProps.get("_config") as - | HistoryGraphCardConfig - | undefined; + if (!changedProps.has("_config")) { + return; + } + + const oldConfig = changedProps.get("_config") as HistoryGraphCardConfig; if (oldConfig !== this._config) { this._getStateHistory(); From 65421fa551f670c2bdb42df67bc44dcace2a259d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 20 Feb 2020 10:14:57 -0800 Subject: [PATCH 4/4] Bumped version to 20200220.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1db707edd4..6f704edce6 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200219.0", + version="20200220.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors",