From 1077fb294514633589dd24639f85d8aeb1e5afb3 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 13 Feb 2020 00:30:41 +0100 Subject: [PATCH 01/31] Spelling: Config(uration) --- src/translations/en.json | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/translations/en.json b/src/translations/en.json index b0f11ebc33..80916a9c1e 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -785,7 +785,7 @@ "validation": { "heading": "Configuration validation", "introduction": "Validate your configuration if you recently made some changes to your configuration and want to make sure that it is all valid", - "check_config": "Check config", + "check_config": "Check configuration", "valid": "Configuration valid!", "invalid": "Configuration invalid" }, @@ -1206,7 +1206,7 @@ "title": "Alexa", "info": "With the Alexa integration for Home Assistant Cloud you'll be able to control all your Home Assistant devices via any Alexa-enabled device.", "enable_ha_skill": "Enable the Home Assistant skill for Alexa", - "config_documentation": "Config documentation", + "config_documentation": "Configuration documentation", "enable_state_reporting": "Enable State Reporting", "info_state_reporting": "If you enable state reporting, Home Assistant will send all state changes of exposed entities to Amazon. This allows you to always see the latest states in the Alexa app and use the state changes to create routines.", "sync_entities": "Sync Entities", @@ -1220,7 +1220,7 @@ "title": "Google Assistant", "info": "With the Google Assistant integration for Home Assistant Cloud you'll be able to control all your Home Assistant devices via any Google Assistant-enabled device.", "enable_ha_skill": "Activate the Home Assistant skill for Google Assistant", - "config_documentation": "Config documentation", + "config_documentation": "Configuration documentation", "enable_state_reporting": "Enable State Reporting", "info_state_reporting": "If you enable state reporting, Home Assistant will send all state changes of exposed entities to Google. This allows you to always see the latest states in the Google app.", "security_devices": "Security Devices", @@ -1407,7 +1407,7 @@ "add_zone": "Add Zone", "confirm_delete": "Are you sure you want to delete this zone?", "configured_in_yaml": "Zones configured via configuration.yaml cannot be edited via the UI.", - "edit_home_zone": "The location of your home can be changed in the general config.", + "edit_home_zone": "The location of your home can be changed in the general configuration.", "detail": { "new_zone": "New Zone", "name": "Name", @@ -1472,7 +1472,7 @@ "submit": "Submit", "not_all_required_fields": "Not all required fields are filled in.", "error_saving_area": "Error saving area: {error}", - "created_config": "Created config for {name}.", + "created_config": "Created configuration for {name}.", "external_step": { "description": "This step requires you to visit an external website to be completed.", "open_site": "Open website" @@ -1639,14 +1639,14 @@ "network_started_note_all_queried": "All nodes have been queried." }, "node_config": { - "header": "Node Config Options", + "header": "Node Configuration Options", "seconds": "seconds", "set_wakeup": "Set Wakeup Interval", - "config_parameter": "Config Parameter", - "config_value": "Config Value", + "config_parameter": "Configuration Parameter", + "config_value": "Configuration Value", "true": "True", "false": "False", - "set_config_parameter": "Set Config Parameter" + "set_config_parameter": "Set Configuration Parameter" }, "values": { "header": "Node Values" @@ -1657,7 +1657,7 @@ "heal_network": "Heal Network", "test_network": "Test Network", "soft_reset": "Soft Reset", - "save_config": "Save Config", + "save_config": "Save Configuration", "add_node_secure": "Add Node Secure", "add_node": "Add Node", "remove_node": "Remove Node", @@ -1712,7 +1712,7 @@ "add_entities": { "yaml_unsupported": "You can not use this function when using Lovelace UI in YAML mode.", "generated_unsupported": "You can only use this function when you have taken control of the Lovelace UI.", - "saving_failed": "Saving Lovelace UI config failed." + "saving_failed": "Saving Lovelace UI configuration failed." }, "views": { "confirm_delete": "Are you sure you want to delete this view?", @@ -1729,21 +1729,21 @@ "header": "Edit UI", "menu": { "open": "Open Lovelace UI menu", - "raw_editor": "Raw config editor" + "raw_editor": "Raw configuration editor" }, "raw_editor": { - "header": "Edit Config", + "header": "Edit Configuration", "save": "Save", "unsaved_changes": "Unsaved changes", "saved": "Saved", "confirm_remove_config_title": "Are you sure you want to remove your Lovelace UI configuration? We will automatically generate your Lovelace UI views with your areas and devices.", "confirm_remove_config_text": "We will automatically generate your Lovelace UI views with your areas and devices if you remove your Lovelace UI configuration.", "confirm_unsaved_changes": "You have unsaved changes, are you sure you want to exit?", - "confirm_unsaved_comments": "Your config contains comment(s), these will not be saved. Do you want to continue?", + "confirm_unsaved_comments": "Your configuration contains comment(s), these will not be saved. Do you want to continue?", "error_parse_yaml": "Unable to parse YAML: {error}", - "error_invalid_config": "Your config is not valid: {error}", + "error_invalid_config": "Your configuration is not valid: {error}", "error_save_yaml": "Unable to save YAML: {error}", - "error_remove": "Unable to remove config: {error}" + "error_remove": "Unable to remove configuration: {error}" }, "edit_lovelace": { "header": "Title of your Lovelace UI", @@ -1787,8 +1787,8 @@ "migrate": { "header": "Configuration Incompatible", "para_no_id": "This element doesn't have an ID. Please add an ID to this element in 'ui-lovelace.yaml'.", - "para_migrate": "Home Assistant can add ID's to all your cards and views automatically for you by pressing the 'Migrate config' button.", - "migrate": "Migrate config" + "para_migrate": "Home Assistant can add ID's to all your cards and views automatically for you by pressing the 'Migrate configuration' button.", + "migrate": "Migrate configuration" }, "card": { "alarm-panel": { @@ -2086,7 +2086,7 @@ "data": { "password": "API Password" }, - "description": "Please input the API password in your http config:" + "description": "Please input the API password in your HTTP configuration:" }, "mfa": { "data": { From ab5733718bd0eb8f495d773d921b99e375e4b2bd Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Thu, 13 Feb 2020 00:33:01 +0000 Subject: [PATCH 02/31] [ci skip] Translation update --- translations/ca.json | 11 +++ translations/cs.json | 12 +++ translations/da.json | 12 +++ translations/de.json | 2 +- translations/en.json | 3 +- translations/es-419.json | 57 +++++++++++- translations/es.json | 16 +++- translations/fr.json | 12 +++ translations/hi.json | 5 + translations/hu.json | 26 ++++-- translations/ko.json | 14 ++- translations/nl.json | 24 +++-- translations/pl.json | 12 +++ translations/pt-BR.json | 92 ++++++++++++++++++- translations/ro.json | 7 ++ translations/ru.json | 18 +++- translations/sl.json | 192 ++++++++++++++++++++++++++++++++++++--- translations/sv.json | 18 +++- translations/uk.json | 6 ++ 19 files changed, 492 insertions(+), 47 deletions(-) diff --git a/translations/ca.json b/translations/ca.json index 80558831c3..69490b2f6f 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -641,6 +641,7 @@ "dismiss": "Desestimar el diàleg", "edit": "Edita entitat", "restored": { + "confirm_remove_text": "Estàs segur que vols eliminar aquesta entitat?", "confirm_remove_title": "Eliminar l'entitat?", "remove_action": "Elimina entitat", "remove_intro": "Si l'entitat ja no s'utilitza, pots borrar-la eliminant-la." @@ -657,6 +658,16 @@ }, "updater": { "title": "Instruccions d'actualització" + }, + "vacuum": { + "commands": "Comandes de l’aspirador:", + "fan_speed": "Velocitat del ventilador", + "locate": "Localitza", + "pause": "Pausa", + "start": "Inici", + "start_pause": "Inicia/Pausa", + "status": "Estat", + "stop": "Atura" } }, "more_info_settings": { diff --git a/translations/cs.json b/translations/cs.json index b8d9e77ad8..862f2e8be5 100644 --- a/translations/cs.json +++ b/translations/cs.json @@ -659,6 +659,18 @@ }, "updater": { "title": "Pokyny pro aktualizaci" + }, + "vacuum": { + "clean_spot": "Čisté místo", + "commands": "Příkazy vysavače:", + "fan_speed": "Rychlost ventilátoru", + "locate": "Lokalizovat", + "pause": "Pauza", + "return_home": "Návrat domů", + "start": "Start", + "start_pause": "Start / Pauza", + "status": "Stav", + "stop": "Stop" } }, "more_info_settings": { diff --git a/translations/da.json b/translations/da.json index 2473b09fe8..d50ed6ae22 100644 --- a/translations/da.json +++ b/translations/da.json @@ -659,6 +659,18 @@ }, "updater": { "title": "Opdateringsvejledning" + }, + "vacuum": { + "clean_spot": "Rengør sted", + "commands": "Støvsuger kommandoer", + "fan_speed": "Blæserhastighed", + "locate": "Lokaliser", + "pause": "Pause", + "return_home": "Retur til ladestation", + "start": "Start", + "start_pause": "Start/Pause", + "status": "Status", + "stop": "Stop" } }, "more_info_settings": { diff --git a/translations/de.json b/translations/de.json index d5af138c64..0bea979e8c 100644 --- a/translations/de.json +++ b/translations/de.json @@ -2325,7 +2325,7 @@ "language": { "dropdown_label": "Sprache", "header": "Sprache", - "link_promo": "Hilf beim Übersetzen" + "link_promo": "Hilfe beim Übersetzen" }, "logout": "Abmelden", "logout_text": "Möchten Sie sich wirklich abmelden?", diff --git a/translations/en.json b/translations/en.json index cbfd5727d3..b30b619c7a 100644 --- a/translations/en.json +++ b/translations/en.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "If disabled, newly discovered entities for {integration} will not be automatically added to Home Assistant.", "enable_new_entities_label": "Enable newly added entities.", - "title": "System Options for {integration}" + "title": "System Options for {integration}", + "update": "Update" }, "confirmation": { "cancel": "Cancel", diff --git a/translations/es-419.json b/translations/es-419.json index 3f0936a577..60fb1bf0ce 100644 --- a/translations/es-419.json +++ b/translations/es-419.json @@ -431,7 +431,9 @@ "preset_mode": "Preestablecido", "swing_mode": "Modo de oscilación", "target_humidity": "Humedad deseada", - "target_temperature": "Temperatura deseada" + "target_temperature": "Temperatura deseada", + "target_temperature_entity": "{name} temperatura objetivo", + "target_temperature_mode": "{name} temperatura objetivo {mode}" }, "counter": { "actions": { @@ -657,6 +659,18 @@ }, "updater": { "title": "Instrucciones de actualización" + }, + "vacuum": { + "clean_spot": "Lugar limpio", + "commands": "Comandos de la aspiradora:", + "fan_speed": "Velocidad del ventilador", + "locate": "Localizar", + "pause": "Pausar", + "return_home": "Volver al inicio", + "start": "Iniciar", + "start_pause": "Iniciar/Pausar", + "status": "Estado", + "stop": "Detener" } }, "more_info_settings": { @@ -694,7 +708,9 @@ "manuf": "por {manufacturer}", "no_area": "Sin área", "power_source": "Fuente de alimentación", + "quirk": "Quirk", "services": { + "reconfigure": "Reconfigure el dispositivo ZHA (dispositivo de curación). Use esto si tiene problemas con el dispositivo. Si el dispositivo en cuestión es un dispositivo alimentado por batería, asegúrese de que esté activado y acepte los comandos cuando utilice este servicio.", "remove": "Eliminar un dispositivo de la red ZigBee.", "updateDeviceName": "Establecer un nombre personalizado para este dispositivo en el registro de dispositivos." }, @@ -1204,6 +1220,7 @@ "attributes_set": "Los siguientes atributos de la entidad se establecen mediante programación.", "caption": "Personalización", "description": "Personaliza tus entidades", + "different_include": "Posiblemente a través de un dominio, un globo o una inclusión diferente.", "pick_attribute": "Elija un atributo para sobrescribir", "picker": { "header": "Personalización", @@ -1211,12 +1228,16 @@ }, "warning": { "include_link": "incluir customize.yaml", - "include_sentence": "Parece que tu configuration.yaml no funciona correctamente" + "include_sentence": "Parece que tu configuration.yaml no funciona correctamente", + "not_applied": "Los cambios realizados aquí están escritos, pero no se aplicarán después de una recarga de configuración a menos que la inclusión esté en su lugar." } }, "devices": { "area_picker_label": "Área", "automation": { + "actions": { + "caption": "Cuando algo se desencadena..." + }, "automations": "Automatizaciones", "conditions": { "caption": "Sólo hacer algo si..." @@ -1583,6 +1604,7 @@ "add_devices": "Agregar dispositivos", "clusters": "Clústeres", "devices": "Dispositivos", + "manufacturer_code_override": "Sobrescritura del código del fabricante", "value": "Valor" }, "description": "Gestión de red de Zigbee Home Automation", @@ -1594,6 +1616,17 @@ "devices": { "header": "Zigbee Home Automation - Dispositivo" }, + "group_binding": { + "bind_button_help": "Vincular el grupo seleccionado a los grupos de dispositivos seleccionados.", + "bind_button_label": "Vincular grupo", + "cluster_selection_help": "Seleccione los clústeres que desea enlazar al grupo seleccionado.", + "group_picker_help": "Seleccione un grupo para emitir un comando de enlace.", + "group_picker_label": "Grupos vinculables", + "header": "Vinculación de grupo", + "introduction": "Vincular y desvincular grupos.", + "unbind_button_help": "Desvincular el grupo seleccionado de los grupos de dispositivos seleccionados.", + "unbind_button_label": "Desvincular grupo" + }, "groups": { "add_members": "Agregar miembros", "adding_members": "Agregando miembros", @@ -1630,6 +1663,7 @@ "node_management": { "header": "Administración de dispositivos", "help_node_dropdown": "Seleccione un dispositivo para ver las opciones por dispositivo.", + "hint_battery_devices": "Nota: Los dispositivos en reposo (alimentados por batería) deben estar despiertos al ejecutar comandos contra ellos. En general, puede activar un dispositivo en reposo activándolo.", "hint_wakeup": "Algunos dispositivos, como los sensores Xiaomi, tienen un botón de activación que puede presionar a intervalos de ~5 segundos para mantener los dispositivos activos mientras interactúa con ellos.", "introduction": "Ejecute comandos ZHA que afectan a un solo dispositivo. Elija un dispositivo para ver una lista de comandos disponibles." }, @@ -1643,6 +1677,7 @@ "zone": { "add_zone": "Agregar zona", "caption": "Zonas", + "configured_in_yaml": "Las zonas configuradas a través de configuration.yaml no se pueden editar a través de la interfaz de usuario.", "confirm_delete": "¿Está seguro de que desea eliminar esta zona?", "create_zone": "Crear zona", "description": "Administre las zonas en las que desea rastrear personas.", @@ -1706,6 +1741,7 @@ "add_node": "Agregar nodo", "add_node_secure": "Agregar nodo seguro", "cancel_command": "Cancelar comando", + "heal_network": "Red de sanación", "remove_node": "Eliminar nodo", "save_config": "Guardar configuración", "soft_reset": "Reinicio suave", @@ -1732,6 +1768,7 @@ "available_events": "Eventos disponibles", "count_listeners": "({count} oyentes)", "data": "Datos del evento (YAML, opcional)", + "description": "Desencadenar un evento en el bus de eventos.", "documentation": "Documentación de eventos.", "event_fired": "Evento {name} desencadenado", "fire_event": "Desencadenar evento", @@ -1776,9 +1813,11 @@ "title": "Registros" }, "mqtt": { + "description_listen": "Escuchar un tema", "description_publish": "Publicar un paquete", "listening_to": "Escuchando a", "message_received": "Mensaje {id} recibido el {topic} a las {time} :", + "payload": "Carga útil (plantilla permitida)", "publish": "Publicar", "start_listening": "Comenzar a escuchar", "stop_listening": "Deja de escuchar", @@ -1893,6 +1932,7 @@ }, "entities": { "name": "Entidades", + "show_header_toggle": "¿Mostrar alternancia de encabezado?", "toggle": "Alternar entidades." }, "entity-button": { @@ -1902,6 +1942,7 @@ "name": "Filtro de entidad" }, "gauge": { + "name": "Gauge", "severity": { "define": "¿Definir gravedad?", "green": "Verde", @@ -1915,6 +1956,8 @@ "camera_view": "Vista de la cámara", "entities": "Entidades", "entity": "Entidad", + "hold_action": "Mantener la acción", + "hours_to_show": "Horas para mostrar", "icon": "Icono", "icon_height": "Altura del icono", "image": "Ruta de la imagen", @@ -1925,13 +1968,15 @@ "show_icon": "¿Mostrar icono?", "show_name": "¿Mostrar nombre?", "show_state": "¿Mostrar estado?", + "tap_action": "Acción de toque", "theme": "Tema", "title": "Título", "unit": "Unidad", "url": "Url" }, "glance": { - "columns": "Columnas" + "columns": "Columnas", + "name": "Glance" }, "history-graph": { "name": "Gráfico histórico" @@ -1953,7 +1998,8 @@ "source": "Fuente" }, "markdown": { - "content": "Contenido" + "content": "Contenido", + "name": "Markdown" }, "media-control": { "name": "Control multimedia" @@ -1964,6 +2010,9 @@ "picture-entity": { "name": "Entidad de imagen" }, + "picture-glance": { + "name": "Picture Glance" + }, "picture": { "name": "Imagen" }, diff --git a/translations/es.json b/translations/es.json index 31ae93775d..2feb96fff9 100644 --- a/translations/es.json +++ b/translations/es.json @@ -659,6 +659,18 @@ }, "updater": { "title": "Instrucciones de actualización" + }, + "vacuum": { + "clean_spot": "Limpiar punto", + "commands": "Comandos de aspiradora:", + "fan_speed": "Velocidad del ventilador", + "locate": "Localizar", + "pause": "Pausa", + "return_home": "Volver a casa", + "start": "Inicio", + "start_pause": "Inicio/Pausa", + "status": "Estado", + "stop": "Detener" } }, "more_info_settings": { @@ -1496,8 +1508,8 @@ "automation": "Recargar automatizaciones", "core": "Recargar ubicación y personalizaciones", "group": "Recargar grupos", - "heading": "Recargando la configuración", - "introduction": "Algunas partes de Home Assistant pueden recargarse sin necesidad de reiniciar. Al pulsar en recargar se descartará la configuración actual y se cargará la nueva.", + "heading": "Recargando la configuración YAML", + "introduction": "Algunas partes de Home Assistant pueden recargarse sin necesidad de reiniciar. Al pulsar en recargar se descartará la configuración YAML actual y se cargará la nueva.", "person": "Recargar personas", "scene": "Recargar escenas", "script": "Recargar scripts", diff --git a/translations/fr.json b/translations/fr.json index 610ccdb054..9803bacee0 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -659,6 +659,18 @@ }, "updater": { "title": "Instructions de mise à jour" + }, + "vacuum": { + "clean_spot": "Nettoyer Endroit", + "commands": "Commandes d'aspirateur :", + "fan_speed": "Vitesse ventilateur", + "locate": "Localiser", + "pause": "Pause", + "return_home": "Rentrer à la maison", + "start": "Démarrer", + "start_pause": "Démarrer/Pause", + "status": "Statut", + "stop": "Arrêter" } }, "more_info_settings": { diff --git a/translations/hi.json b/translations/hi.json index 079990d415..c49cc682a4 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -309,6 +309,11 @@ } } }, + "profile": { + "language": { + "link_promo": "अनुवाद करने में सहायता करें" + } + }, "shopping-list": { "add_item": "आइटम जोड़ें", "microphone_tip": "ऊपर दाईं ओर माइक्रोफ़ोन टैप करें और \"मेरी खरीदारी सूची में कैंडी जोड़ें\" कहें" diff --git a/translations/hu.json b/translations/hu.json index a8b4b2c34a..847f36899f 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -359,7 +359,7 @@ "idle": "Tétlen", "off": "Ki", "on": "Be", - "paused": "Felfüggesztve", + "paused": "Szüneteltetve", "returning": "Dokkolás folyamatban" }, "weather": { @@ -629,7 +629,7 @@ "unavailable": "Ez az entitás jelenleg nem elérhető.", "update": "FRISSÍTÉS" }, - "related": "Kapcsolódás", + "related": "Kapcsolatok", "settings": "Beállítások" }, "generic": { @@ -659,6 +659,18 @@ }, "updater": { "title": "Frissítési Instrukciók" + }, + "vacuum": { + "clean_spot": "Helyi takarítás", + "commands": "Porszívó parancsok:", + "fan_speed": "Szívóerő", + "locate": "Keresés", + "pause": "Szünet", + "return_home": "Hazatérés", + "start": "Indítás", + "start_pause": "Indítás/szünet", + "status": "Állapot", + "stop": "Leállítás" } }, "more_info_settings": { @@ -1112,7 +1124,7 @@ "forgot_password": "elfelejtett jelszó?", "introduction": "A Home Assistant Felhő biztonságos távoli kapcsolatot nyújt a példányodhoz, miközben távol vagy. Azt is lehetővé teszi, hogy csak felhőn alapuló szolgáltatásokhoz csatlakozz: Amazon Alexa, Google Asszisztens.", "introduction2": "Ezt a szolgáltatást partnerünk üzemelteti, a ", - "introduction2a": "vállalat, amelyet a Home Assistant és a Hass.io alapítói alapítottak.", + "introduction2a": "vállalat, amelyet a Home Assistant és a Hass.io alapítói hoztak létre.", "introduction3": "A Home Assistant Felhő egy előfizetéses szolgáltatás egy hónapos ingyenes próbaverzióval. Nincs szükség fizetési információk megadására.", "learn_more_link": "Tudj meg többet a Home Assistant Felhőről", "password": "Jelszó", @@ -1135,7 +1147,7 @@ "information": "Hozz létre egy fiókot ahhoz, hogy elindíthasd az egy hónapos ingyenes Home Assistant Felhő próbaidőszakodat. Nincs szükség fizetési információk megadására.", "information2": "A próbaidőszak hozzáférést biztosít a Home Assistant Felhő minden előnyéhez, beleértve a következőket:", "information3": "Ezt a szolgáltatást partnerünk üzemelteti, a ", - "information3a": "vállalat, amelyet a Home Assistant és a Hass.io alapítói alapítottak.", + "information3a": "vállalat, amelyet a Home Assistant és a Hass.io alapítói hoztak létre.", "information4": "Fiók regisztrálásával elfogadod az alábbi feltételeket.", "link_privacy_policy": "Adatvédelmi irányelvek", "link_terms_conditions": "Felhasználási feltételek", @@ -1253,7 +1265,7 @@ "details": "Itt található minden részlet az eszközről.", "device_not_found": "Eszköz nem található.", "entities": { - "add_entities_lovelace": "Mindet a Lovelace felületre", + "add_entities_lovelace": "Hozzáadás a Lovelace-hez", "entities": "Entitások", "none": "Ennek az eszköznek nincsenek entitásai" }, @@ -1496,8 +1508,8 @@ "automation": "Automatizálások újratöltése", "core": "Lokáció és testreszabások újratöltése", "group": "Csoportok újratöltése", - "heading": "Konfiguráció újratöltés", - "introduction": "A Home Assistant bizonyos részei újraindítás nélkül újratölthetőek. Az újratöltés az aktuális konfiguráció helyére betölti az újat.", + "heading": "YAML konfiguráció újratöltése", + "introduction": "A Home Assistant bizonyos részei újraindítás nélkül újratölthetőek. Újratöltéskor az aktuálisan betöltött YAML konfiguráció helyére betöltődik az új.", "person": "Személyek újratöltése", "scene": "Jelenetek újratöltése", "script": "Szkriptek újratöltése", diff --git a/translations/ko.json b/translations/ko.json index 6723b6b34d..96dfd34192 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -31,7 +31,7 @@ "homeassistant": "Home Assistant", "image_processing": "이미지처리", "input_boolean": "논리입력", - "input_datetime": "날짜/시간입력", + "input_datetime": "날짜 / 시간입력", "input_number": "숫자입력", "input_select": "선택입력", "input_text": "문자입력", @@ -659,6 +659,18 @@ }, "updater": { "title": "업데이트 방법" + }, + "vacuum": { + "clean_spot": "부분 청소", + "commands": "청소기 조작 명령:", + "fan_speed": "팬 속도", + "locate": "위치 이동", + "pause": "일시정지", + "return_home": "충전 복귀", + "start": "시작", + "start_pause": "시작 / 일시정지", + "status": "상태", + "stop": "중지" } }, "more_info_settings": { diff --git a/translations/nl.json b/translations/nl.json index b54b8880c4..35f3646f9d 100644 --- a/translations/nl.json +++ b/translations/nl.json @@ -602,9 +602,9 @@ }, "dialogs": { "config_entry_system_options": { - "enable_new_entities_description": "Indien uitgeschakeld dan worden nieuwe entiteiten van {integration} niet automatisch aan Home Assistant toegevoegd.", + "enable_new_entities_description": "Indien uitgeschakeld, worden nieuwe entiteiten van {integration} niet automatisch aan Home Assistant toegevoegd.", "enable_new_entities_label": "Voeg nieuwe entiteiten automatisch toe", - "title": "Systeeminstellingen voor {integratie}" + "title": "Systeeminstellingen voor {integration}" }, "confirmation": { "cancel": "Annuleren", @@ -659,6 +659,18 @@ }, "updater": { "title": "Update-instructies" + }, + "vacuum": { + "clean_spot": "Plek schoonmaken", + "commands": "Stofzuigeropdrachten:", + "fan_speed": "Ventilatiesnelheid", + "locate": "Zoek", + "pause": "Pauze", + "return_home": "Terugkeren", + "start": "Start", + "start_pause": "Start/Pauze", + "status": "Status", + "stop": "Stop" } }, "more_info_settings": { @@ -1306,7 +1318,7 @@ "filter": { "filter": "filter", "show_disabled": "Uitgeschakelde entiteiten weergeven", - "show_unavailable": "Uitgeschakelde entiteiten weergeven" + "show_unavailable": "Onbeschikbare entiteiten weergeven" }, "header": "Entiteiten", "headers": { @@ -1339,7 +1351,7 @@ "caption": "Integraties", "config_entry": { "area": "In {area}", - "delete_button": "Verwijder {integratie}.", + "delete_button": "Verwijder {integration}.", "delete_confirm": "Weet je zeker dat je deze integratie wilt verwijderen?", "device_unavailable": "apparaat niet beschikbaar", "entity_unavailable": "entiteit niet beschikbaar", @@ -1351,7 +1363,7 @@ "no_devices": "Deze integratie heeft geen apparaten.", "restart_confirm": "Herstart Home Assistant om het verwijderen van deze integratie te voltooien", "settings_button": "Instellingen bewerken voor {integration}", - "system_options_button": "Systeeminstellingen voor {integratie}", + "system_options_button": "Systeeminstellingen voor {integration}", "via": "Verbonden via" }, "config_flow": { @@ -1679,7 +1691,7 @@ "name": "Naam", "new_zone": "Nieuwe zone", "passive": "Passief", - "passive_note": "Passieve zones zijn verborgen in het frontend en worden niet gebruikt als locaties voor apparaat trackers. Dit is handig als je de zone wilt gebruiken voor automatiseringen.", + "passive_note": "Passieve zones zijn verborgen in het frontend en worden niet gebruikt als locaties voor apparaattrackers. Dit is handig als je de zone wilt gebruiken voor automatiseringen.", "radius": "Straal", "required_error_msg": "Dit veld is verplicht", "update": "Bijwerken" diff --git a/translations/pl.json b/translations/pl.json index 43eeee81e7..7998bfb47e 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -659,6 +659,18 @@ }, "updater": { "title": "Instrukcje aktualizacji" + }, + "vacuum": { + "clean_spot": "Wyczyść miejsce", + "commands": "Polecenia odkurzacza:", + "fan_speed": "Prędkość wentylatora", + "locate": "Zlokalizuj", + "pause": "Pauza", + "return_home": "Powrót do domu", + "start": "Start", + "start_pause": "Start/Pauza", + "status": "Status", + "stop": "Zatrzymaj" } }, "more_info_settings": { diff --git a/translations/pt-BR.json b/translations/pt-BR.json index 91eb38e5b6..2a21621f90 100644 --- a/translations/pt-BR.json +++ b/translations/pt-BR.json @@ -536,6 +536,7 @@ }, "common": { "cancel": "Cancelar", + "close": "Fechar", "loading": "Carregando", "no": "Não", "save": "Salvar", @@ -543,10 +544,24 @@ "yes": "Sim" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Adicionar", + "failed_create_area": "Falha ao criar a área.", + "name": "Nome", + "text": "Digite o nome da nova área.", + "title": "Adicionar nova área" + }, + "add_new": "Adicionar nova área…", + "area": "Área", + "clear": "Limpar", + "show_areas": "Mostrar áreas" + }, "device-picker": { "clear": "Limpar", "device": "Dispositivo", - "show_devices": "Mostrar dispositivos" + "show_devices": "Mostrar dispositivos", + "toggle": "Alternar" }, "entity": { "entity-picker": { @@ -625,6 +640,11 @@ "more_info_control": { "dismiss": "Dispensar diálogo", "edit": "Editar entidade", + "restored": { + "confirm_remove_text": "Tem certeza de que deseja remover esta entidade?", + "confirm_remove_title": "Remover entidade?", + "remove_action": "Remover entidade" + }, "script": { "last_action": "Última Ação", "last_triggered": "Último disparo" @@ -637,6 +657,18 @@ }, "updater": { "title": "Atualizar Instruções" + }, + "vacuum": { + "clean_spot": "Limpar local", + "commands": "Comandos do aspirador de pó:", + "fan_speed": "Velocidade do ventilador", + "locate": "Localizar", + "pause": "Pausar", + "return_home": "Voltar para casa", + "start": "Iniciar", + "start_pause": "Iniciar / Pausar", + "status": "Estado", + "stop": "Parar" } }, "more_info_settings": { @@ -1203,14 +1235,19 @@ "actions": { "caption": "Quando algo é acionado ..." }, + "automations": "Automações", "conditions": { "caption": "Só faça alguma coisa se ..." }, + "create": "Crie automação com o dispositivo", + "no_automations": "Sem automações", + "no_device_automations": "Não há automações disponíveis para este dispositivo.", "triggers": { "caption": "Faça alguma coisa quando ..." } }, "automations": "Automações", + "cant_edit": "Você só pode editar itens que são criados na IU.", "caption": "Dispositivos", "confirm_rename_entity_ids": "Você também deseja renomear os IDs das entidades?", "data_table": { @@ -1224,9 +1261,28 @@ "description": "Gerenciar dispositivos conectados", "details": "Aqui estão todos os detalhes do seu dispositivo.", "device_not_found": "Dispositivo não encontrado.", + "entities": { + "add_entities_lovelace": "Adicionar ao Lovelace", + "entities": "Entidades", + "none": "Este dispositivo não possui entidades" + }, "info": "Informação do dispositivo", + "name": "Nome", + "scene": { + "create": "Criar cenário com o dispositivo", + "no_scenes": "Sem cenários", + "scenes": "Cenários" + }, + "scenes": "Cenários", + "script": { + "create": "Criar roteiro com o dispositivo", + "no_scripts": "Sem roteiros", + "scripts": "Roteiros" + }, + "scripts": "Roteiros", "unknown_error": "Erro desconhecido", - "unnamed_device": "Dispositivo sem nome" + "unnamed_device": "Dispositivo sem nome", + "update": "Atualizar" }, "entities": { "caption": "Registro de Entidades", @@ -1246,17 +1302,44 @@ "update": "ATUALIZAR" }, "picker": { + "disable_selected": { + "button": "Desativar selecionado", + "confirm_text": "As entidades desativadas não serão adicionadas ao Assistente Doméstico.", + "confirm_title": "Deseja desativar {number} entidades?" + }, + "enable_selected": { + "button": "Habilitar selecionado", + "confirm_text": "Isso os disponibilizará novamente no Home Assistant se eles estiverem desativados.", + "confirm_title": "Deseja habilitar {number} entidades?" + }, + "filter": { + "filter": "Filtro", + "show_disabled": "Mostrar entidades desativadas", + "show_unavailable": "Mostrar entidades indisponíveis" + }, "header": "Registro de Entidades", "headers": { "enabled": "Habilitado", "entity_id": "ID da entidade", "integration": "Integração", - "name": "Nome" + "name": "Nome", + "status": "Estado" }, "integrations_page": "Página de integrações", "introduction": "O Home Assistant mantém um registro de todas as entidades que já viu e que podem ser identificadas exclusivamente. Cada uma dessas entidades terá um ID de entidade atribuído, que será reservado apenas para essa entidade.", "introduction2": "Use o registro da entidade para sobrescrever o nome, alterar o ID da entidade ou remover a entrada do Home Assistant. Observe que a remoção do registro de entidade não removerá a entidade totalmente. Para fazer isso, siga o link abaixo e remova-o da página de integrações.", + "remove_selected": { + "button": "Remover selecionado", + "confirm_text": "Entidades só podem ser removidas quando a integração não estiver mais fornecendo as entidades.", + "confirm_title": "Deseja remover {number} entidades?" + }, + "selected": "{number} selecionado", "show_disabled": "Mostrar entidades desativadas", + "status": { + "disabled": "Desativado", + "ok": "Ok", + "unavailable": "Indisponível" + }, "unavailable": "(indisponível)" } }, @@ -1544,7 +1627,8 @@ "caption": "Grupos", "description": "Criar e modificar grupos Zigbee", "group-header": "Zigbee Home Automation - Detalhes do Grupo", - "groups-header": "Zigbee Home Automation - Gerenciamento de grupos" + "groups-header": "Zigbee Home Automation - Gerenciamento de grupos", + "zha_zigbee_groups": "Grupos ZHA Zigbee" }, "network_management": { "header": "Gerenciamento de Rede", diff --git a/translations/ro.json b/translations/ro.json index 1b1b0be02d..75d0091dec 100644 --- a/translations/ro.json +++ b/translations/ro.json @@ -625,6 +625,13 @@ }, "updater": { "title": "Actualizați instrucțiunile" + }, + "vacuum": { + "pause": "Pauza", + "return_home": "Návrat domov", + "start": "Štart", + "start_pause": "Štart/Pouza", + "stop": "Stop" } }, "more_info_settings": { diff --git a/translations/ru.json b/translations/ru.json index 724f1e7ec9..b9fda8af8e 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -492,7 +492,7 @@ "vacuum": { "actions": { "resume_cleaning": "Продолжить уборку", - "return_to_base": "Вернуться к док-станции", + "return_to_base": "Вернуть к док-станции", "start_cleaning": "Начать уборку", "turn_off": "Выключить", "turn_on": "Включить" @@ -659,6 +659,18 @@ }, "updater": { "title": "Инструкция по обновлению" + }, + "vacuum": { + "clean_spot": "Местная уборка", + "commands": "Команды:", + "fan_speed": "Мощность всасывания", + "locate": "Найти", + "pause": "Пауза", + "return_home": "Вернуть к док-станции", + "start": "Запуск", + "start_pause": "Запуск/Пауза", + "status": "Состояние", + "stop": "Остановить" } }, "more_info_settings": { @@ -1496,8 +1508,8 @@ "automation": "Перезагрузить автоматизации", "core": "Обновить местоположение и кастомизацию", "group": "Перезагрузить группы", - "heading": "Перезагрузка конфигурации", - "introduction": "Некоторые компоненты Home Assistant можно перезагрузить без необходимости перезапуска всей системы. Перезагрузка выгружает текущую конфигурацию и загружает новую.", + "heading": "Перезагрузка конфигурации YAML", + "introduction": "Некоторые компоненты Home Assistant можно перезагрузить без необходимости перезапуска всей системы. Перезагрузка выгружает текущую конфигурацию YAML и загружает новую.", "person": "Перезагрузить персоны", "scene": "Перезагрузить сцены", "script": "Перезагрузить сценарии", diff --git a/translations/sl.json b/translations/sl.json index 61533f7715..6a7944c954 100644 --- a/translations/sl.json +++ b/translations/sl.json @@ -478,6 +478,9 @@ "script": { "execute": "Izvedi" }, + "service": { + "run": "Poženi" + }, "timer": { "actions": { "cancel": "Prekliči", @@ -541,10 +544,24 @@ "yes": "Da" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Dodaj", + "failed_create_area": "Ni bilo mogoče ustvariti območja.", + "name": "Ime", + "text": "Vnesite ime novega območja.", + "title": "Dodajte novo območje" + }, + "add_new": "Dodaj novo območje …", + "area": "Območje", + "clear": "Počisti", + "show_areas": "Pokaži cone" + }, "device-picker": { "clear": "Počisti", "device": "Naprava", - "show_devices": "Pokažite naprave" + "show_devices": "Pokažite naprave", + "toggle": "Preklopite" }, "entity": { "entity-picker": { @@ -558,7 +575,14 @@ "no_history_found": "Ni najdene zgodovine stanj." }, "related-items": { - "area": "Območje" + "area": "Območje", + "automation": "Del naslednjih avtomatizacij", + "device": "Naprava", + "entity": "Sorodne entitete", + "group": "Del naslednjih skupin", + "integration": "Integracija", + "scene": "Del naslednjih prizorov", + "script": "Del naslednjih skript" }, "relative_time": { "duration": { @@ -591,10 +615,31 @@ "title": "Preklopi domene" }, "entity_registry": { - "dismiss": "Opusti" + "control": "Nadzor", + "dismiss": "Opusti", + "editor": { + "confirm_delete": "Ali ste prepričani, da želite izbrisati ta vnos?", + "delete": "BRISANJE", + "enabled_cause": "Onemogočeno zaradi {cause}.", + "enabled_description": "Onemogočeni subjekti ne bodo dodani v Home Assistant-a.", + "enabled_label": "Omogoči entiteto", + "entity_id": "ID subjekta", + "name": "Preglasitev imena", + "note": "Opomba: to morda še ne deluje z vsemi integracijami.", + "unavailable": "Ta entiteta trenutno ni na voljo.", + "update": "POSODOBITEV" + }, + "related": "Povezano", + "settings": "Nastavitve" + }, + "generic": { + "cancel": "Prekliči", + "default_confirmation_title": "Ste prepričani?", + "ok": "OK" }, "more_info_control": { "dismiss": "Opusti pogovorno okno", + "edit": "Uredi entiteto", "restored": { "confirm_remove_text": "Ali ste prepričani, da želite odstraniti to entiteto?", "confirm_remove_title": "Ali želite odstraniti entiteto?", @@ -603,7 +648,8 @@ "remove_intro": "Če entiteta ni več v uporabi, jo lahko očistite tako, da jo odstranite." }, "script": { - "last_action": "Zadnje Dejanje" + "last_action": "Zadnje Dejanje", + "last_triggered": "Nazadnje sproženo" }, "settings": "Nastavitve entitete", "sun": { @@ -613,6 +659,18 @@ }, "updater": { "title": "Navodila za posodabitev" + }, + "vacuum": { + "clean_spot": "Očisti točko", + "commands": "Ukazi sesalnika:", + "fan_speed": "Hitrost ventilatorja", + "locate": "Poiščite", + "pause": "Premor", + "return_home": "Vrni se domov", + "start": "Zagon", + "start_pause": "Začetek/Premor", + "status": "Stanje", + "stop": "Ustavi" } }, "more_info_settings": { @@ -643,6 +701,9 @@ "reconfigure": "Ponovno konfigurirajte napravo", "remove": "Odstranite napravo" }, + "confirmations": { + "remove": "Ali ste prepričani, da želite odstraniti napravo?" + }, "last_seen": "Nazadnje viden", "manuf": "naredil: {manufacturer}", "no_area": "Brez območja", @@ -1177,14 +1238,19 @@ "actions": { "caption": "Ko se nekaj sproži ..." }, + "automations": "Avtomatizacije", "conditions": { "caption": "Naredite nekaj, samo če ..." }, + "create": "Ustvarjanje avtomatizacije z napravo", + "no_automations": "Ni avtomatizacij", + "no_device_automations": "Za to napravo ni na voljo nobenih avtomatizacij.", "triggers": { "caption": "Naredi nekaj, ko ..." } }, "automations": "Avtomatizacije", + "cant_edit": "Urejate lahko samo elemente, ki so ustvarjeni v uporabniškem vmesniku.", "caption": "Naprave", "confirm_rename_entity_ids": "Ali želite preimenovati tudi ID entitete vaših entitet?", "data_table": { @@ -1204,8 +1270,22 @@ "none": "Ta naprava nima entitet" }, "info": "Informacije o napravi", + "name": "Ime", + "scene": { + "create": "Ustvarjanje scen z napravo", + "no_scenes": "Ni scen", + "scenes": "Scene" + }, + "scenes": "Scene", + "script": { + "create": "Ustvarjanje skript z napravo", + "no_scripts": "Ni skript", + "scripts": "Skripte" + }, + "scripts": "Skripte", "unknown_error": "Neznana napaka", - "unnamed_device": "Neimenovana naprava" + "unnamed_device": "Neimenovana naprava", + "update": "Posodobite" }, "entities": { "caption": "Entitete", @@ -1218,6 +1298,8 @@ "enabled_cause": "Onemogočeno zaradi {cause}.", "enabled_description": "Onemogočeni subjekti ne bodo dodani v Home Assistant-a.", "enabled_label": "Omogoči entiteto", + "entity_id": "ID subjekta", + "name": "Preglasitev imena", "note": "Opomba: to morda še ne deluje z vsemi integracijami.", "unavailable": "Ta entiteta trenutno ni na voljo.", "update": "POSODOBITEV" @@ -1250,7 +1332,9 @@ "introduction": "Home Assistant vodi register vseh entitet, ki jih je kdajkoli videl in jih je mogoče enolično identificirati. Vsak od teh entitet ima dodeljen ID entitete, ki bo rezerviran samo za to entiteto.", "introduction2": "Z registrom entitet preglasite ime, spremenite ID entitete ali odstranite vnos iz Home Assistent-a. Opomba, odstranitev vnosa registra entitet ne bo odstranila entitete. Če želite to narediti, sledite spodnji povezavi in jo odstranite s strani za integracijo.", "remove_selected": { - "button": "Odstrani izbrane" + "button": "Odstrani izbrane", + "confirm_text": "Entitete je mogoče odstraniti le, če jih integracija več ne zagotavlja.", + "confirm_title": "Ali želite odstraniti {number} entiteto-i/e?" }, "selected": "{številka} izbrana/ih", "show_disabled": "Pokaži onemogočene subjekte", @@ -1288,6 +1372,7 @@ "area_picker_label": "Območje", "close": "Zapri", "created_config": "Ustvarjena konfiguracija za {name}.", + "dismiss": "Opusti pogovorno okno", "error_saving_area": "Napaka pri shranjevanju območja: {error}", "external_step": { "description": "Ta korak zahteva, da za končanje obiščete zunanjo spletno stran.", @@ -1425,8 +1510,10 @@ "group": "Ponovno naloži skupine", "heading": "Ponovno nalaganje konfiguracije", "introduction": "Nekateri deli Home Assistanta se lahko znova naložijo brez potrebe po ponovnem zagonu. S pritiskom na \"ponovno naloži\" se bo naložila nova konfiguracija", + "person": "Ponovno naloži osebe", "scene": "Ponovno naloži scene", - "script": "Ponovno naloži skripte" + "script": "Ponovno naloži skripte", + "zone": "Ponovno naloži območja" }, "server_management": { "confirm_restart": "Ali ste prepričani, da želite znova zagnati Home Assistant-a?", @@ -1486,6 +1573,10 @@ "search_again": "Ponovno iskanje", "spinner": "Iskanje ZHA Zigbee naprav..." }, + "add": { + "caption": "Dodajte naprave", + "description": "Dodajte naprave v omrežje Zigbee" + }, "caption": "ZHA", "cluster_attributes": { "attributes_of_cluster": "Atributi izbrane gruče", @@ -1505,7 +1596,9 @@ "issue_zigbee_command": "Izdajte ukaz Zigbee" }, "clusters": { - "help_cluster_dropdown": "Izberite gručo, če si želite ogledati njene atribute in ukaze." + "header": "Gruče", + "help_cluster_dropdown": "Izberite gručo, če si želite ogledati njene atribute in ukaze.", + "introduction": "Gruče so sestavni del funkcionalnosti Zigbee. Funkcionalnost ločijo na logične enote. Obstajajo vrste odjemalcev in strežnikov, ki jih sestavljajo atributi in ukazi." }, "common": { "add_devices": "Dodajte naprave", @@ -1520,10 +1613,49 @@ "device_name_placeholder": "Ime, ki ga je dodelil uporabnik", "update_name_button": "Posodobi ime" }, - "groups": { - "caption": "Skupine", - "create": "Ustvari skupino" + "devices": { + "header": "ZigBee Home Automation-naprava" }, + "group_binding": { + "bind_button_help": "Povežite izbrano skupino z izbranimi gručami naprave.", + "bind_button_label": "Združi skupino", + "cluster_selection_help": "Izberite gruče, ki se vežejo na izbrano skupino.", + "group_picker_help": "Izberite skupino, ki bo izdala ukaz vezanja.", + "group_picker_label": "Skupine za povezovanje", + "header": "Vezava skupin", + "introduction": "Povežite in razvezujte skupine.", + "unbind_button_help": "Odvežite izbrano skupino iz izbranih gruč naprav.", + "unbind_button_label": "Razdruži skupino" + }, + "groups": { + "add_members": "Dodajte člane", + "adding_members": "Dodajanje članov", + "caption": "Skupine", + "create": "Ustvari skupino", + "create_group": "Zigbee Home Automation - Ustvari skupino", + "create_group_details": "Da ustvarite novo skupino Zigbee vnesite zahtevane podrobnosti.", + "creating_group": "Ustvarjanje skupine", + "description": "Ustvarjajte in spreminjajte skupine Zigbee", + "group_details": "Tu so vse podrobnosti za izbrano skupino Zigbee.", + "group_id": "ID skupine", + "group_info": "Informacije o skupini", + "group_name_placeholder": "Ime skupine", + "group_not_found": "Skupine ni mogoče najti!", + "group-header": "Zigbee Home Automation - Podrobnosti o skupini", + "groups": "Skupine", + "groups-header": "ZigBee Home Automation-upravljanje skupin", + "header": "ZigBee Home Automation-upravljanje skupin", + "introduction": "Ustvarite in spreminjajte skupine Zigbee", + "manage_groups": "Upravljajte zigbee skupine", + "members": "Člani", + "remove_groups": "Odstrani skupine", + "remove_members": "Odstranite člane", + "removing_groups": "Odstranjevanje skupin", + "removing_members": "Odstranjevanje članov", + "zha_zigbee_groups": "ZHA Zigbee Skupine" + }, + "header": "Konfigurirajte Zigbee Home Automation", + "introduction": "Tu je možno konfigurirati komponento ZHA. Iz uporabniškega vmesnika še ni mogoče konfigurirati vsega, vendar delamo na tem.", "network_management": { "header": "Upravljanje omrežja", "introduction": "Ukazi, ki vplivajo na celotno omrežje" @@ -1539,16 +1671,34 @@ "reconfigure": "Ponovno konfigurirajte napravo ZHA (\"pozdravite\" napravo). To uporabite, če imate z njo težave. Če ta naprava deluje na baterije, se prepričajte, da je budna in sprejema ukaze pri uporabi te storitve.", "remove": "Odstranite napravo iz omrežja ZigBee.", "updateDeviceName": "Nastavite ime po meri za to napravo v registru naprav." - } + }, + "title": "Zigbee Home Automation" }, "zone": { + "add_zone": "Dodaj območje", + "caption": "Območja", + "configured_in_yaml": "Območij, konfiguriranih prek config.yaml, ni mogoče urejati prek uporabniškega vmesnika.", + "confirm_delete": "Ali ste prepričani, da želite izbrisati to območje?", + "create_zone": "Ustvari območje", + "description": "Upravljajte območja, v katerih želite slediti osebam.", "detail": { "create": "Ustvari", "delete": "Izbriši", "icon": "Ikona", + "icon_error_msg": "Ikona mora biti v obliki predpona:ime ikone, na primer: mdi:home", + "latitude": "Zemljepisna širina", + "longitude": "Zemljepisna dolžina", + "name": "Ime", + "new_zone": "Novo območje", + "passive": "Pasivno", + "passive_note": "Pasivna območja so skrita v \"frontendu\" in jih ne uporabljamo za sledenje naprav. Koristna so, če jih želite uporabiti samo za avtomatizacijo.", "radius": "Polmer", + "required_error_msg": "To polje je obvezno", "update": "Posodobite" - } + }, + "edit_home_zone": "Lokacijo vašega doma lahko spremenite v splošni konfiguraciji.", + "introduction": "Območja omogočajo določitev določenih regij. Ko je oseba znotraj tega območja, bo stanje prevzelo njegovo ime. Območja se lahko uporabljajo tudi kot sprožilec ali pogoj v avtomatizacijah.", + "no_zones_created_yet": "Izgleda, da še niste ustvarili nobenih con." }, "zwave": { "caption": "Z-Wave", @@ -1731,7 +1881,9 @@ }, "lovelace": { "add_entities": { - "saving_failed": "Shranjevanje nastavitve uporabniškega vmesnika Lovelace ni uspelo." + "generated_unsupported": "To funkcijo lahko uporabite le, ko ste prevzeli nadzor nad uporabniškim vmesnikom Lovelace.", + "saving_failed": "Shranjevanje nastavitve uporabniškega vmesnika Lovelace ni uspelo.", + "yaml_unsupported": "Te funkcije ne morete uporabljati pri uporabi uporabniškega vmesnika Lovelace v načinu YAML." }, "cards": { "confirm_delete": "Ali ste prepričani, da želite izbrisati to kartico?", @@ -1740,6 +1892,9 @@ "no_devices": "Ta stran vam omogoča nadzor nad napravami, vendar je videti, da še niste nastavili nobenih naprav. Pojdite na stran za integracije, da začnete.", "title": "Dobrodošli Doma" }, + "entities": { + "never_triggered": "Nikoli sprožen" + }, "picture-elements": { "call_service": "Kličite storitev {name}", "hold": "Pridržite:", @@ -1870,6 +2025,7 @@ "name": "Senzor" }, "shopping-list": { + "integration_not_loaded": "Ta kartica zahteva nastavitev integracije `shopping_list`.", "name": "Nakupovalni seznam" }, "thermostat": { @@ -1922,10 +2078,13 @@ "para_no_id": "Ta element nima ID-ja. Prosimo, dodajte ID tega elementa v 'ui-lovelace.yaml'." }, "raw_editor": { + "confirm_remove_config_text": "Samodejno bomo ustvarili vaše poglede uporabniškega vmesnika Lovelace z vašimi območji in napravami, če odstranite konfiguracijo uporabniškega vmesnika Lovelace.", + "confirm_remove_config_title": "Ali ste prepričani, da želite odstraniti konfiguracijo uporabniškega vmesnika Lovelace? Samodejno bomo ustvarili vaše poglede uporabniškega vmesnika Lovelace z vašimi območji in napravami.", "confirm_unsaved_changes": "Imate neshranjene spremembe, ali ste prepričani, da želite zapreti?", "confirm_unsaved_comments": "Vaša konfiguracija vsebuje komentarje, ti ne bodo shranjeni. Ali želite nadaljevati?", "error_invalid_config": "Vaš konfiguracija ni veljavna: {error}", "error_parse_yaml": "Ni mogoče razčleniti YAML: {error}", + "error_remove": "Konfiguracije ni mogoče odstraniti: {error}", "error_save_yaml": "YAML-a ni mogoče shraniti: {error}", "header": "Uredi nastavitve", "save": "Shrani", @@ -1941,7 +2100,8 @@ }, "suggest_card": { "add": "Dodaj v uporabniški vmesnik Lovelace", - "create_own": "Izberite drugačno karto" + "create_own": "Izberite drugačno karto", + "header": "Za vas smo ustvarili predlog" }, "view": { "panel_mode": { @@ -2157,6 +2317,7 @@ "profile": { "advanced_mode": { "description": "Home Assistant privzeto skrije napredne funkcije in možnosti. Do teh funkcij lahko dostopate tako, da vklopite to stikalo. To je uporabniško določena nastavitev, ki ne vpliva na druge uporabnike.", + "link_promo": "Preberite več", "title": "Napredni način" }, "change_password": { @@ -2179,6 +2340,7 @@ "link_promo": "Pomagajte pri prevodu" }, "logout": "Odjava", + "logout_text": "Ali ste prepričani, da se želite odjaviti?", "logout_title": "Odjava?", "long_lived_access_tokens": { "confirm_delete": "Ali ste prepričani, da želite izbrisati žeton za dostop za {name} ?", diff --git a/translations/sv.json b/translations/sv.json index 32efdc874c..b8c0ed9b6e 100644 --- a/translations/sv.json +++ b/translations/sv.json @@ -659,6 +659,18 @@ }, "updater": { "title": "Uppdateringsanvisningar" + }, + "vacuum": { + "clean_spot": "Rengör plats", + "commands": "Dammsugarkommandon:", + "fan_speed": "Fläkthastighet", + "locate": "Lokalisera", + "pause": "Pausa", + "return_home": "Återvänd hem", + "start": "Starta", + "start_pause": "Starta/Pausa", + "status": "Status", + "stop": "Stoppa" } }, "more_info_settings": { @@ -1496,7 +1508,7 @@ "automation": "Ladda om automationer", "core": "Ladda om plats & anpassningar", "group": "Ladda om grupper", - "heading": "Konfigurationen laddas om", + "heading": "YAML-konfiguration laddas om", "introduction": "Vissa delar av Home Assistant kan laddas om utan att en omstart krävs. Att trycka på \"ladda om\" innebär att den nuvarande konfiguration inaktiveras och den nya laddas.", "person": "Ladda om personer", "scene": "Ladda om scenarier", @@ -1679,12 +1691,12 @@ "name": "Namn", "new_zone": "Ny Zon", "passive": "Passiv", - "passive_note": "Passiva zoner är dolda i frontend och används inte som plats för enhetsspårare. Detta är användbart om du bara vill använda den för automatiseringar.", + "passive_note": "Passiva zoner är dolda i frontend och används inte som plats för enhetsspårare. Detta är användbart om du bara vill använda det för automatiseringar.", "radius": "Radie", "required_error_msg": "Det här fältet krävs", "update": "Uppdatera" }, - "edit_home_zone": "Platsen för ditt hem kan ändras i general config.", + "edit_home_zone": "Platsen för ditt hem kan ändras i den allmänna konfigurationen.", "introduction": "Med zoner kan du ange vissa regioner på jorden. När en person befinner sig i en zon tar tillståndet namnet från zonen. Zoner kan också användas som utlösare eller villkor i automatiseringsinställningar.", "no_zones_created_yet": "Det verkar som om du inte har skapat några zoner ännu." }, diff --git a/translations/uk.json b/translations/uk.json index 69974623b4..235cca3453 100644 --- a/translations/uk.json +++ b/translations/uk.json @@ -600,6 +600,10 @@ }, "updater": { "title": "Інструкції по оновленню" + }, + "vacuum": { + "start_pause": "Початок/Пауза", + "stop": "Зупинити" } }, "more_info_settings": { @@ -1178,6 +1182,8 @@ "details": "Тут ви знайдете всі деталі вашого пристрою.", "device_not_found": "Пристрій не знайдено", "info": "Інформація про пристрій", + "scenes": "Сцени", + "scripts": "Скрипти", "unknown_error": "Невідома помилка", "unnamed_device": "Пристрій без імені" }, From ec046bc9259a38c15608d65aaacd15acdefacff4 Mon Sep 17 00:00:00 2001 From: Ruslan Sayfutdinov Date: Thu, 13 Feb 2020 04:36:29 +0000 Subject: [PATCH 03/31] [history] fix dropdown animation (#4858) --- src/panels/history/ha-panel-history.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/panels/history/ha-panel-history.js b/src/panels/history/ha-panel-history.js index fcee278b61..70f8ee2d03 100644 --- a/src/panels/history/ha-panel-history.js +++ b/src/panels/history/ha-panel-history.js @@ -51,6 +51,7 @@ class HaPanelHistory extends LocalizeMixin(PolymerElement) { paper-item { cursor: pointer; + white-space: nowrap; } From f45785fafece9921e1d2d8053c7c1325e09a604b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 13 Feb 2020 05:43:44 +0100 Subject: [PATCH 04/31] Change defaults of automations to device (#4843) * Change defaults of automations to device * Script too * Update device_automation.ts * Update device_automation.ts --- src/data/device_automation.ts | 40 ++++++++++++------- .../automation/action/ha-automation-action.ts | 4 +- .../condition/ha-automation-condition.ts | 6 +-- .../config/automation/ha-automation-editor.ts | 8 ++-- .../trigger/ha-automation-trigger.ts | 6 +-- src/panels/config/script/ha-script-editor.ts | 3 +- 6 files changed, 41 insertions(+), 26 deletions(-) diff --git a/src/data/device_automation.ts b/src/data/device_automation.ts index 03c5a6870e..f23222f2ac 100644 --- a/src/data/device_automation.ts +++ b/src/data/device_automation.ts @@ -99,7 +99,7 @@ export const deviceAutomationsEqual = ( export const localizeDeviceAutomationAction = ( hass: HomeAssistant, action: DeviceAction -) => { +): string => { const state = action.entity_id ? hass.states[action.entity_id] : undefined; return ( hass.localize( @@ -107,17 +107,19 @@ export const localizeDeviceAutomationAction = ( "entity_name", state ? computeStateName(state) : action.entity_id || "", "subtype", - hass.localize( - `component.${action.domain}.device_automation.action_subtype.${action.subtype}` - ) || action.subtype - ) || `"${action.subtype}" ${action.type}` + action.subtype + ? hass.localize( + `component.${action.domain}.device_automation.action_subtype.${action.subtype}` + ) || action.subtype + : "" + ) || (action.subtype ? `"${action.subtype}" ${action.type}` : action.type!) ); }; export const localizeDeviceAutomationCondition = ( hass: HomeAssistant, condition: DeviceCondition -) => { +): string => { const state = condition.entity_id ? hass.states[condition.entity_id] : undefined; @@ -127,17 +129,22 @@ export const localizeDeviceAutomationCondition = ( "entity_name", state ? computeStateName(state) : condition.entity_id || "", "subtype", - hass.localize( - `component.${condition.domain}.device_automation.condition_subtype.${condition.subtype}` - ) || condition.subtype - ) || `"${condition.subtype}" ${condition.type}` + condition.subtype + ? hass.localize( + `component.${condition.domain}.device_automation.condition_subtype.${condition.subtype}` + ) || condition.subtype + : "" + ) || + (condition.subtype + ? `"${condition.subtype}" ${condition.type}` + : condition.type!) ); }; export const localizeDeviceAutomationTrigger = ( hass: HomeAssistant, trigger: DeviceTrigger -) => { +): string => { const state = trigger.entity_id ? hass.states[trigger.entity_id] : undefined; return ( hass.localize( @@ -145,9 +152,12 @@ export const localizeDeviceAutomationTrigger = ( "entity_name", state ? computeStateName(state) : trigger.entity_id || "", "subtype", - hass.localize( - `component.${trigger.domain}.device_automation.trigger_subtype.${trigger.subtype}` - ) || trigger.subtype - ) || `"${trigger.subtype}" ${trigger.type}` + trigger.subtype + ? hass.localize( + `component.${trigger.domain}.device_automation.trigger_subtype.${trigger.subtype}` + ) || trigger.subtype + : "" + ) || + (trigger.subtype ? `"${trigger.subtype}" ${trigger.type}` : trigger.type!) ); }; diff --git a/src/panels/config/automation/action/ha-automation-action.ts b/src/panels/config/automation/action/ha-automation-action.ts index ac2e45ff10..0be017cf98 100644 --- a/src/panels/config/automation/action/ha-automation-action.ts +++ b/src/panels/config/automation/action/ha-automation-action.ts @@ -13,6 +13,8 @@ import { Action } from "../../../../data/script"; import { HomeAssistant } from "../../../../types"; import "./ha-automation-action-row"; +import { HaDeviceAction } from "./types/ha-automation-action-device_id"; + @customElement("ha-automation-action") export default class HaAutomationAction extends LitElement { @property() public hass!: HomeAssistant; @@ -46,7 +48,7 @@ export default class HaAutomationAction extends LitElement { private _addAction() { const actions = this.actions.concat({ - service: "", + ...HaDeviceAction.defaultConfig, }); fireEvent(this, "value-changed", { value: actions }); diff --git a/src/panels/config/automation/condition/ha-automation-condition.ts b/src/panels/config/automation/condition/ha-automation-condition.ts index 4a25aa36ab..db368c4864 100644 --- a/src/panels/config/automation/condition/ha-automation-condition.ts +++ b/src/panels/config/automation/condition/ha-automation-condition.ts @@ -9,7 +9,7 @@ import { import "@material/mwc-button"; import "../../../../components/ha-card"; -import { HaStateCondition } from "./types/ha-automation-condition-state"; +import { HaDeviceCondition } from "./types/ha-automation-condition-device"; import { fireEvent } from "../../../../common/dom/fire_event"; import { HomeAssistant } from "../../../../types"; @@ -48,8 +48,8 @@ export default class HaAutomationCondition extends LitElement { private _addCondition() { const conditions = this.conditions.concat({ - condition: "state", - ...HaStateCondition.defaultConfig, + condition: "device", + ...HaDeviceCondition.defaultConfig, }); fireEvent(this, "value-changed", { value: conditions }); diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts index 968f92af24..4b883b1282 100644 --- a/src/panels/config/automation/ha-automation-editor.ts +++ b/src/panels/config/automation/ha-automation-editor.ts @@ -36,6 +36,8 @@ import "./condition/ha-automation-condition"; import "./trigger/ha-automation-trigger"; import "../../../layouts/hass-tabs-subpage"; import { configSections } from "../ha-panel-config"; +import { HaDeviceAction } from "./action/types/ha-automation-action-device_id"; +import { HaDeviceTrigger } from "./trigger/types/ha-automation-trigger-device"; export class HaAutomationEditor extends LitElement { @property() public hass!: HomeAssistant; @@ -75,7 +77,7 @@ export class HaAutomationEditor extends LitElement { ` : ""}
@@ -273,9 +275,9 @@ export class HaAutomationEditor extends LitElement { "ui.panel.config.automation.editor.default_name" ), description: "", - trigger: [{ platform: "state" }], + trigger: [{ platform: "device", ...HaDeviceTrigger.defaultConfig }], condition: [], - action: [{ service: "" }], + action: [{ ...HaDeviceAction.defaultConfig }], ...initData, }; } diff --git a/src/panels/config/automation/trigger/ha-automation-trigger.ts b/src/panels/config/automation/trigger/ha-automation-trigger.ts index 71f2e303fd..407b495743 100644 --- a/src/panels/config/automation/trigger/ha-automation-trigger.ts +++ b/src/panels/config/automation/trigger/ha-automation-trigger.ts @@ -13,7 +13,7 @@ import { fireEvent } from "../../../../common/dom/fire_event"; import { HomeAssistant } from "../../../../types"; import "./ha-automation-trigger-row"; -import { HaStateTrigger } from "./types/ha-automation-trigger-state"; +import { HaDeviceTrigger } from "./types/ha-automation-trigger-device"; import { Trigger } from "../../../../data/automation"; @customElement("ha-automation-trigger") @@ -47,8 +47,8 @@ export default class HaAutomationTrigger extends LitElement { private _addTrigger() { const triggers = this.triggers.concat({ - platform: "state", - ...HaStateTrigger.defaultConfig, + platform: "device", + ...HaDeviceTrigger.defaultConfig, }); fireEvent(this, "value-changed", { value: triggers }); diff --git a/src/panels/config/script/ha-script-editor.ts b/src/panels/config/script/ha-script-editor.ts index b6134d7de3..a27b1a73c3 100644 --- a/src/panels/config/script/ha-script-editor.ts +++ b/src/panels/config/script/ha-script-editor.ts @@ -29,6 +29,7 @@ import { HomeAssistant, Route } from "../../../types"; import "../automation/action/ha-automation-action"; import { computeObjectId } from "../../../common/entity/compute_object_id"; import { configSections } from "../ha-panel-config"; +import { HaDeviceAction } from "../automation/action/types/ha-automation-action-device_id"; export class HaScriptEditor extends LitElement { @property() public hass!: HomeAssistant; @@ -193,7 +194,7 @@ export class HaScriptEditor extends LitElement { this._dirty = initData ? true : false; this._config = { alias: this.hass.localize("ui.panel.config.script.editor.default_name"), - sequence: [{ service: "" }], + sequence: [{ ...HaDeviceAction.defaultConfig }], ...initData, }; } From 6feaf64c90a20578ab7f70c4cf9d38d15fc0d6fa Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 13 Feb 2020 17:22:41 +0100 Subject: [PATCH 05/31] Fix display of arrays/objects in attributes (#4836) * Fix display of arrays/objects in attributes * async import js-yaml --- src/components/ha-attributes.ts | 30 +++++++++++++++---- .../state/developer-tools-state.js | 18 +++++++---- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/components/ha-attributes.ts b/src/components/ha-attributes.ts index c0c14faca8..42f5cbead8 100644 --- a/src/components/ha-attributes.ts +++ b/src/components/ha-attributes.ts @@ -10,6 +10,9 @@ import { import { HassEntity } from "home-assistant-js-websocket"; import hassAttributeUtil from "../util/hass-attributes-util"; +import { until } from "lit-html/directives/until"; + +let jsYamlPromise: Promise; @customElement("ha-attributes") class HaAttributes extends LitElement { @@ -32,7 +35,7 @@ class HaAttributes extends LitElement {
${attribute.replace(/_/g, " ")}
- ${this.formatAttributeValue(attribute)} + ${this.formatAttribute(attribute)}
` @@ -63,6 +66,10 @@ class HaAttributes extends LitElement { color: var(--secondary-text-color); text-align: right; } + pre { + font-family: inherit; + font-size: inherit; + } `; } @@ -75,18 +82,31 @@ class HaAttributes extends LitElement { }); } - private formatAttributeValue(attribute: string): string { + private formatAttribute(attribute: string): string | TemplateResult { if (!this.stateObj) { return "-"; } const value = this.stateObj.attributes[attribute]; + return this.formatAttributeValue(value); + } + + private formatAttributeValue(value: any): string | TemplateResult { if (value === null) { return "-"; } - if (Array.isArray(value)) { - return value.join(", "); + if ( + (Array.isArray(value) && value.some((val) => val instanceof Object)) || + (!Array.isArray(value) && value instanceof Object) + ) { + if (!jsYamlPromise) { + jsYamlPromise = import(/* webpackChunkName: "js-yaml" */ "js-yaml"); + } + const yaml = jsYamlPromise.then((jsYaml) => jsYaml.safeDump(value)); + return html` +
${until(yaml, "")}
+ `; } - return value instanceof Object ? JSON.stringify(value, null, 2) : value; + return Array.isArray(value) ? value.join(", ") : value; } } diff --git a/src/panels/developer-tools/state/developer-tools-state.js b/src/panels/developer-tools/state/developer-tools-state.js index 9cc5fb6bc8..f1f56b963a 100644 --- a/src/panels/developer-tools/state/developer-tools-state.js +++ b/src/panels/developer-tools/state/developer-tools-state.js @@ -357,16 +357,22 @@ class HaPanelDevState extends EventsMixin(LocalizeMixin(PolymerElement)) { for (i = 0, keys = Object.keys(entity.attributes); i < keys.length; i++) { key = keys[i]; - value = entity.attributes[key]; - if (!Array.isArray(value) && value instanceof Object) { - value = JSON.stringify(value, null, " "); - } - output += key + ": " + value + "\n"; + value = this.formatAttributeValue(entity.attributes[key]); + output += `${key}: ${value}\n`; } - return output; } + formatAttributeValue(value) { + if ( + (Array.isArray(value) && value.some((val) => val instanceof Object)) || + (!Array.isArray(value) && value instanceof Object) + ) { + return `\n${safeDump(value)}`; + } + return Array.isArray(value) ? value.join(", ") : value; + } + _computeParsedStateAttributes(stateAttributes) { try { return stateAttributes.trim() ? safeLoad(stateAttributes) : {}; From 485e2fde25431bb55bc3ccd5f0dbe2c49688e256 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 13 Feb 2020 17:41:51 +0100 Subject: [PATCH 06/31] Update hui-thermostat-card.ts (#4863) --- src/panels/lovelace/cards/hui-thermostat-card.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/panels/lovelace/cards/hui-thermostat-card.ts b/src/panels/lovelace/cards/hui-thermostat-card.ts index 4fba096404..fa099fefdc 100644 --- a/src/panels/lovelace/cards/hui-thermostat-card.ts +++ b/src/panels/lovelace/cards/hui-thermostat-card.ts @@ -269,7 +269,11 @@ export class HuiThermostatCard extends LitElement implements LovelaceCard { applyThemesOnElement(this, this.hass.themes, this._config.theme); } - this._setTemp = this._getSetTemp(this.hass!.states[this._config!.entity]); + const stateObj = this.hass!.states[this._config!.entity]; + if (!stateObj) { + return; + } + this._setTemp = this._getSetTemp(stateObj); this.rescale_svg(); } From e261fafdb3d97dd2115942940eed20c51778d53c Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 13 Feb 2020 18:06:14 +0100 Subject: [PATCH 07/31] Allow enabling/disabling automation from edit screen (#4846) * Allow enabling/disabling automation from edit screen * Comments --- src/data/automation.ts | 6 +++ .../controls/more-info-automation.ts | 5 +-- .../config/automation/ha-automation-editor.ts | 30 ++++++++++++++ src/resources/styles.ts | 41 +++++++++++++++++++ src/translations/en.json | 1 + 5 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/data/automation.ts b/src/data/automation.ts index 6359264eac..cdb751040a 100644 --- a/src/data/automation.ts +++ b/src/data/automation.ts @@ -173,6 +173,12 @@ export type Condition = | DeviceCondition | LogicalCondition; +export const triggerAutomation = (hass: HomeAssistant, entityId: string) => { + hass.callService("automation", "trigger", { + entity_id: entityId, + }); +}; + export const deleteAutomation = (hass: HomeAssistant, id: string) => hass.callApi("DELETE", `config/automation/config/${id}`); diff --git a/src/dialogs/more-info/controls/more-info-automation.ts b/src/dialogs/more-info/controls/more-info-automation.ts index 62dc5cd7c6..08b53b17cf 100644 --- a/src/dialogs/more-info/controls/more-info-automation.ts +++ b/src/dialogs/more-info/controls/more-info-automation.ts @@ -13,6 +13,7 @@ import "@material/mwc-button"; import "../../../components/ha-relative-time"; import { HomeAssistant } from "../../../types"; +import { triggerAutomation } from "../../../data/automation"; @customElement("more-info-automation") class MoreInfoAutomation extends LitElement { @@ -42,9 +43,7 @@ class MoreInfoAutomation extends LitElement { } private handleAction() { - this.hass.callService("automation", "trigger", { - entity_id: this.stateObj!.entity_id, - }); + triggerAutomation(this.hass, this.stateObj!.entity_id); } static get styles(): CSSResult { diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts index 4b883b1282..221f5ec6ad 100644 --- a/src/panels/config/automation/ha-automation-editor.ts +++ b/src/panels/config/automation/ha-automation-editor.ts @@ -22,6 +22,7 @@ import { deleteAutomation, getAutomationEditorInitData, Trigger, + triggerAutomation, } from "../../../data/automation"; import { Action } from "../../../data/script"; import { @@ -113,6 +114,28 @@ export class HaAutomationEditor extends LitElement { @value-changed=${this._valueChanged} >
+ ${this.creatingNew + ? "" + : html` +
+
+ + ${this.hass.localize( + "ui.panel.config.automation.editor.enable_disable" + )} +
+ + ${this.hass.localize( + "ui.card.automation.trigger" + )} + +
+ `} @@ -319,6 +342,10 @@ export class HaAutomationEditor extends LitElement { this._dirty = true; } + private _excuteAutomation() { + triggerAutomation(this.hass, this.automation.entity_id); + } + private _backTapped(): void { if (this._dirty) { showConfirmationDialog(this, { @@ -391,6 +418,9 @@ export class HaAutomationEditor extends LitElement { span[slot="introduction"] a { color: var(--primary-color); } + ha-entity-toggle { + margin-right: 8px; + } ha-fab { position: fixed; bottom: 16px; diff --git a/src/resources/styles.ts b/src/resources/styles.ts index 5a5c0cb837..38ab554d39 100644 --- a/src/resources/styles.ts +++ b/src/resources/styles.ts @@ -94,6 +94,47 @@ export const haStyle = css` .card-actions .warning { --mdc-theme-primary: var(--google-red-500); } + + .layout.horizontal, + .layout.vertical { + display: flex; + } + .layout.inline { + display: inline-flex; + } + .layout.horizontal { + flex-direction: row; + } + .layout.vertical { + flex-direction: column; + } + .layout.wrap { + flex-wrap: wrap; + } + .layout.no-wrap { + flex-wrap: nowrap; + } + .layout.center, + .layout.center-center { + align-items: center; + } + .layout.center-justified, + .layout.center-center { + justify-content: center; + } + .flex { + flex: 1; + flex-basis: 0.000000001px; + } + .flex-auto { + flex: 1 1 auto; + } + .flex-none { + flex: none; + } + .layout.justified { + justify-content: space-between; + } `; export const haStyleDialog = css` diff --git a/src/translations/en.json b/src/translations/en.json index 80916a9c1e..1efb96a42a 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -847,6 +847,7 @@ "delete_confirm": "Are you sure you want to delete this automation?" }, "editor": { + "enable_disable": "Enable/Disable automation", "introduction": "Use automations to bring your home alive.", "default_name": "New Automation", "load_error_not_editable": "Only automations in automations.yaml are editable.", From c93e1b012329ea925afddbabc72945c992131d0a Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 13 Feb 2020 18:06:52 +0100 Subject: [PATCH 08/31] Add more info for Person (#4848) * Add more info for Person * Update src/dialogs/more-info/controls/more-info-vacuum.ts Co-Authored-By: Paulus Schoutsen Co-authored-by: Paulus Schoutsen --- src/common/const.ts | 1 + src/components/map/ha-map.ts | 311 ++++++++++++++++++ src/data/zone.ts | 17 + .../more-info/controls/more-info-content.ts | 1 + .../more-info/controls/more-info-person.ts | 85 +++++ .../more-info/controls/more-info-vacuum.ts | 13 +- src/panels/config/zone/dialog-zone-detail.ts | 24 +- src/panels/config/zone/ha-config-zone.ts | 5 + src/translations/en.json | 3 + 9 files changed, 446 insertions(+), 14 deletions(-) create mode 100644 src/components/map/ha-map.ts create mode 100644 src/dialogs/more-info/controls/more-info-person.ts diff --git a/src/common/const.ts b/src/common/const.ts index 3abe76e91b..a2dc5412f7 100644 --- a/src/common/const.ts +++ b/src/common/const.ts @@ -44,6 +44,7 @@ export const DOMAINS_WITH_MORE_INFO = [ "light", "lock", "media_player", + "person", "script", "sun", "timer", diff --git a/src/components/map/ha-map.ts b/src/components/map/ha-map.ts new file mode 100644 index 0000000000..d86a9e7c51 --- /dev/null +++ b/src/components/map/ha-map.ts @@ -0,0 +1,311 @@ +import "@polymer/paper-icon-button/paper-icon-button"; +import { Circle, Layer, Map, Marker } from "leaflet"; +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + PropertyValues, + TemplateResult, +} from "lit-element"; +import { + LeafletModuleType, + setupLeafletMap, +} from "../../common/dom/setup-leaflet-map"; +import { computeStateDomain } from "../../common/entity/compute_state_domain"; +import { computeStateName } from "../../common/entity/compute_state_name"; +import { debounce } from "../../common/util/debounce"; +import { HomeAssistant } from "../../types"; +import "../../panels/map/ha-entity-marker"; + +@customElement("ha-map") +class HaMap extends LitElement { + @property() public hass?: HomeAssistant; + + @property() public entities?: string[]; + @property() public darkMode = false; + @property() public zoom?: number; + // tslint:disable-next-line + private Leaflet?: LeafletModuleType; + private _leafletMap?: Map; + // @ts-ignore + private _resizeObserver?: ResizeObserver; + private _debouncedResizeListener = debounce( + () => { + if (!this._leafletMap) { + return; + } + this._leafletMap.invalidateSize(); + }, + 100, + false + ); + private _mapItems: Array = []; + private _mapZones: Array = []; + private _connected = false; + + public connectedCallback(): void { + super.connectedCallback(); + this._connected = true; + if (this.hasUpdated) { + this.loadMap(); + this._attachObserver(); + } + } + + public disconnectedCallback(): void { + super.disconnectedCallback(); + this._connected = false; + + if (this._leafletMap) { + this._leafletMap.remove(); + this._leafletMap = undefined; + this.Leaflet = undefined; + } + + if (this._resizeObserver) { + this._resizeObserver.unobserve(this._mapEl); + } else { + window.removeEventListener("resize", this._debouncedResizeListener); + } + } + + protected render(): TemplateResult { + if (!this.entities) { + return html``; + } + return html` +
+ `; + } + + protected firstUpdated(changedProps: PropertyValues): void { + super.firstUpdated(changedProps); + this.loadMap(); + + if (this._connected) { + this._attachObserver(); + } + } + + protected updated(changedProps: PropertyValues): void { + if (changedProps.has("hass")) { + this._drawEntities(); + this._fitMap(); + } + } + + private get _mapEl(): HTMLDivElement { + return this.shadowRoot!.getElementById("map") as HTMLDivElement; + } + + private async loadMap(): Promise { + [this._leafletMap, this.Leaflet] = await setupLeafletMap( + this._mapEl, + this.darkMode + ); + this._drawEntities(); + this._leafletMap.invalidateSize(); + this._fitMap(); + } + + private _fitMap(): void { + if (!this._leafletMap || !this.Leaflet || !this.hass) { + return; + } + if (this._mapItems.length === 0) { + this._leafletMap.setView( + new this.Leaflet.LatLng( + this.hass.config.latitude, + this.hass.config.longitude + ), + this.zoom || 14 + ); + return; + } + + const bounds = this.Leaflet.latLngBounds( + this._mapItems ? this._mapItems.map((item) => item.getLatLng()) : [] + ); + this._leafletMap.fitBounds(bounds.pad(0.5)); + + if (this.zoom && this._leafletMap.getZoom() > this.zoom) { + this._leafletMap.setZoom(this.zoom); + } + } + + private _drawEntities(): void { + const hass = this.hass; + const map = this._leafletMap; + const Leaflet = this.Leaflet; + if (!hass || !map || !Leaflet) { + return; + } + + if (this._mapItems) { + this._mapItems.forEach((marker) => marker.remove()); + } + const mapItems: Layer[] = (this._mapItems = []); + + if (this._mapZones) { + this._mapZones.forEach((marker) => marker.remove()); + } + const mapZones: Layer[] = (this._mapZones = []); + + const allEntities = this.entities!.concat(); + + for (const entity of allEntities) { + const entityId = entity; + const stateObj = hass.states[entityId]; + if (!stateObj) { + continue; + } + const title = computeStateName(stateObj); + const { + latitude, + longitude, + passive, + icon, + radius, + entity_picture: entityPicture, + gps_accuracy: gpsAccuracy, + } = stateObj.attributes; + + if (!(latitude && longitude)) { + continue; + } + + if (computeStateDomain(stateObj) === "zone") { + // DRAW ZONE + if (passive) { + continue; + } + + // create icon + let iconHTML = ""; + if (icon) { + const el = document.createElement("ha-icon"); + el.setAttribute("icon", icon); + iconHTML = el.outerHTML; + } else { + const el = document.createElement("span"); + el.innerHTML = title; + iconHTML = el.outerHTML; + } + + // create marker with the icon + mapZones.push( + Leaflet.marker([latitude, longitude], { + icon: Leaflet.divIcon({ + html: iconHTML, + iconSize: [24, 24], + className: this.darkMode ? "dark" : "light", + }), + interactive: false, + title, + }) + ); + + // create circle around it + mapZones.push( + Leaflet.circle([latitude, longitude], { + interactive: false, + color: "#FF9800", + radius, + }) + ); + + continue; + } + + // DRAW ENTITY + // create icon + const entityName = title + .split(" ") + .map((part) => part[0]) + .join("") + .substr(0, 3); + + // create market with the icon + mapItems.push( + Leaflet.marker([latitude, longitude], { + icon: Leaflet.divIcon({ + // Leaflet clones this element before adding it to the map. This messes up + // our Polymer object and we can't pass data through. Thus we hack like this. + html: ` + + `, + iconSize: [48, 48], + className: "", + }), + title: computeStateName(stateObj), + }) + ); + + // create circle around if entity has accuracy + if (gpsAccuracy) { + mapItems.push( + Leaflet.circle([latitude, longitude], { + interactive: false, + color: "#0288D1", + radius: gpsAccuracy, + }) + ); + } + } + + this._mapItems.forEach((marker) => map.addLayer(marker)); + this._mapZones.forEach((marker) => map.addLayer(marker)); + } + + private _attachObserver(): void { + // Observe changes to map size and invalidate to prevent broken rendering + // Uses ResizeObserver in Chrome, otherwise window resize event + + // @ts-ignore + if (typeof ResizeObserver === "function") { + // @ts-ignore + this._resizeObserver = new ResizeObserver(() => + this._debouncedResizeListener() + ); + this._resizeObserver.observe(this._mapEl); + } else { + window.addEventListener("resize", this._debouncedResizeListener); + } + } + + static get styles(): CSSResult { + return css` + :host { + display: block; + height: 300px; + } + #map { + height: 100%; + } + #map.dark { + background: #090909; + } + + .dark { + color: #ffffff; + } + + .light { + color: #000000; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-map": HaMap; + } +} diff --git a/src/data/zone.ts b/src/data/zone.ts index 85464a975b..d7d2306457 100644 --- a/src/data/zone.ts +++ b/src/data/zone.ts @@ -1,4 +1,5 @@ import { HomeAssistant } from "../types"; +import { navigate } from "../common/navigate"; export const defaultRadiusColor = "#FF9800"; export const homeRadiusColor: string = "#03a9f4"; @@ -48,3 +49,19 @@ export const deleteZone = (hass: HomeAssistant, zoneId: string) => type: "zone/delete", zone_id: zoneId, }); + +let inititialZoneEditorData: Partial | undefined; + +export const showZoneEditor = ( + el: HTMLElement, + data?: Partial +) => { + inititialZoneEditorData = data; + navigate(el, "/config/zone/new"); +}; + +export const getZoneEditorInitData = () => { + const data = inititialZoneEditorData; + inititialZoneEditorData = undefined; + return data; +}; diff --git a/src/dialogs/more-info/controls/more-info-content.ts b/src/dialogs/more-info/controls/more-info-content.ts index c84f4a5156..c86b52b9dd 100644 --- a/src/dialogs/more-info/controls/more-info-content.ts +++ b/src/dialogs/more-info/controls/more-info-content.ts @@ -16,6 +16,7 @@ import "./more-info-input_datetime"; import "./more-info-light"; import "./more-info-lock"; import "./more-info-media_player"; +import "./more-info-person"; import "./more-info-script"; import "./more-info-sun"; import "./more-info-timer"; diff --git a/src/dialogs/more-info/controls/more-info-person.ts b/src/dialogs/more-info/controls/more-info-person.ts new file mode 100644 index 0000000000..4e5ae33c32 --- /dev/null +++ b/src/dialogs/more-info/controls/more-info-person.ts @@ -0,0 +1,85 @@ +import { + LitElement, + html, + TemplateResult, + CSSResult, + css, + property, + customElement, +} from "lit-element"; +import { HassEntity } from "home-assistant-js-websocket"; +import "@material/mwc-button"; + +import "../../../components/map/ha-map"; + +import { HomeAssistant } from "../../../types"; +import { showZoneEditor } from "../../../data/zone"; +import { fireEvent } from "../../../common/dom/fire_event"; + +@customElement("more-info-person") +class MoreInfoPerson extends LitElement { + @property() public hass!: HomeAssistant; + @property() public stateObj?: HassEntity; + + protected render(): TemplateResult { + if (!this.hass || !this.stateObj) { + return html``; + } + + return html` + + ${this.stateObj.attributes.latitude && this.stateObj.attributes.longitude + ? html` + + ` + : ""} + ${this.hass.user?.is_admin && + this.stateObj.state === "not_home" && + this.stateObj.attributes.latitude && + this.stateObj.attributes.longitude + ? html` +
+ + ${this.hass.localize( + "ui.dialogs.more_info_control.person.create_zone" + )} + +
+ ` + : ""} + `; + } + + private _handleAction() { + showZoneEditor(this, { + latitude: this.stateObj!.attributes.latitude, + longitude: this.stateObj!.attributes.longitude, + }); + fireEvent(this, "hass-more-info", { entityId: null }); + } + + static get styles(): CSSResult { + return css` + .flex { + display: flex; + justify-content: space-between; + } + .actions { + margin: 36px 0 8px 0; + text-align: right; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "more-info-person": MoreInfoPerson; + } +} diff --git a/src/dialogs/more-info/controls/more-info-vacuum.ts b/src/dialogs/more-info/controls/more-info-vacuum.ts index 4d6d1c362f..ce1c5a30ae 100644 --- a/src/dialogs/more-info/controls/more-info-vacuum.ts +++ b/src/dialogs/more-info/controls/more-info-vacuum.ts @@ -123,12 +123,15 @@ class MoreInfoVacuum extends LitElement { : ""} ${supportsFeature(stateObj, VACUUM_SUPPORT_BATTERY) ? html` - +
- - ${stateObj.attributes.battery_level} % - -
` + + ${stateObj.attributes.battery_level}% + + + ` : ""} diff --git a/src/panels/config/zone/dialog-zone-detail.ts b/src/panels/config/zone/dialog-zone-detail.ts index 850b78133b..984b42623e 100644 --- a/src/panels/config/zone/dialog-zone-detail.ts +++ b/src/panels/config/zone/dialog-zone-detail.ts @@ -20,6 +20,7 @@ import { ZoneMutableParams, passiveRadiusColor, defaultRadiusColor, + getZoneEditorInitData, } from "../../../data/zone"; import { addDistanceToCoord } from "../../../common/location/add_distance_to_coord"; @@ -47,15 +48,20 @@ class DialogZoneDetail extends LitElement { this._passive = this._params.entry.passive || false; this._radius = this._params.entry.radius || 100; } else { - const movedHomeLocation = addDistanceToCoord( - [this.hass.config.latitude, this.hass.config.longitude], - 500, - 500 - ); - this._name = ""; - this._icon = "mdi:map-marker"; - this._latitude = movedHomeLocation[0]; - this._longitude = movedHomeLocation[1]; + const initConfig = getZoneEditorInitData(); + let movedHomeLocation; + if (!initConfig?.latitude || !initConfig?.longitude) { + movedHomeLocation = addDistanceToCoord( + [this.hass.config.latitude, this.hass.config.longitude], + Math.random() * 500 * (Math.random() < 0.5 ? -1 : 1), + Math.random() * 500 * (Math.random() < 0.5 ? -1 : 1) + ); + } + this._latitude = initConfig?.latitude || movedHomeLocation[0]; + this._longitude = initConfig?.longitude || movedHomeLocation[1]; + this._name = initConfig?.name || ""; + this._icon = initConfig?.icon || "mdi:map-marker"; + this._passive = false; this._radius = 100; } diff --git a/src/panels/config/zone/ha-config-zone.ts b/src/panels/config/zone/ha-config-zone.ts index 52a734ab04..e015af15ac 100644 --- a/src/panels/config/zone/ha-config-zone.ts +++ b/src/panels/config/zone/ha-config-zone.ts @@ -46,6 +46,7 @@ import memoizeOne from "memoize-one"; import { SubscribeMixin } from "../../../mixins/subscribe-mixin"; import { subscribeEntityRegistry } from "../../../data/entity_registry"; import { configSections } from "../ha-panel-config"; +import { navigate } from "../../../common/navigate"; @customElement("ha-config-zone") export class HaConfigZone extends SubscribeMixin(LitElement) { @@ -234,6 +235,10 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); this._fetchData(); + if (this.route.path === "/new") { + navigate(this, "/config/zone", true); + this._createZone(); + } } protected updated(changedProps: PropertyValues) { diff --git a/src/translations/en.json b/src/translations/en.json index 1efb96a42a..9aab1d472e 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -630,6 +630,9 @@ "locate": "Locate", "return_home": "Return home", "start_pause": "Start/Pause" + }, + "person": { + "create_zone": "Create zone from current location" } }, "entity_registry": { From 7903541689144478e5e0498ff8db10ef26c453df Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 13 Feb 2020 19:53:48 +0100 Subject: [PATCH 09/31] Add toolbars and mobile headers + layout tweaks (#4803) * Add toolbars and mobile headers + layout tweaks * Comments --- src/common/search/search-input.ts | 24 +- src/components/data-table/ha-data-table.ts | 215 +++++++------ .../device/ha-area-devices-picker.ts | 2 +- src/components/device/ha-device-picker.ts | 2 +- src/data/device_registry.ts | 4 + src/layouts/hass-tabs-subpage-data-table.ts | 157 +++++++++ src/layouts/hass-tabs-subpage.ts | 10 +- .../config/automation/ha-automation-editor.ts | 277 ++++++++-------- .../config/devices/ha-config-device-page.ts | 20 +- .../devices/ha-config-devices-dashboard.ts | 233 +++++++++++++- .../config/devices/ha-devices-data-table.ts | 5 +- .../config/entities/ha-config-entities.ts | 297 +++++++++--------- src/panels/config/scene/ha-scene-editor.ts | 27 +- src/panels/config/script/ha-script-editor.ts | 12 +- 14 files changed, 855 insertions(+), 430 deletions(-) create mode 100644 src/layouts/hass-tabs-subpage-data-table.ts diff --git a/src/common/search/search-input.ts b/src/common/search/search-input.ts index b1654a3fe6..e0e5065075 100644 --- a/src/common/search/search-input.ts +++ b/src/common/search/search-input.ts @@ -7,14 +7,18 @@ import { property, } from "lit-element"; import { fireEvent } from "../dom/fire_event"; -import "@polymer/iron-icon/iron-icon"; import "@polymer/paper-input/paper-input"; import "@polymer/paper-icon-button/paper-icon-button"; -import "@material/mwc-button"; +import "../../components/ha-icon"; +import { classMap } from "lit-html/directives/class-map"; @customElement("search-input") class SearchInput extends LitElement { @property() public filter?: string; + @property({ type: Boolean, attribute: "no-label-float" }) + public noLabelFloat? = false; + @property({ type: Boolean, attribute: "no-underline" }) + public noUnderline = false; public focus() { this.shadowRoot!.querySelector("paper-input")!.focus(); @@ -22,18 +26,24 @@ class SearchInput extends LitElement { protected render(): TemplateResult { return html` +
- + ${this.filter && html` - + ${this._filterable ? html`
@@ -181,112 +183,114 @@ export class HaDataTable extends BaseElement { ` : ""} - - - - ${this.selectable - ? html` +
+
+ + + ${this.selectable + ? html` + + ` + : ""} + ${Object.entries(this.columns).map((columnEntry) => { + const [key, column] = columnEntry; + const sorted = key === this._sortColumn; + const classes = { + "mdc-data-table__header-cell--numeric": Boolean( + column.type && column.type === "numeric" + ), + "mdc-data-table__header-cell--icon": Boolean( + column.type && column.type === "icon" + ), + sortable: Boolean(column.sortable), + "not-sorted": Boolean(column.sortable && !sorted), + }; + return html` - ` - : ""} - ${Object.entries(this.columns).map((columnEntry) => { - const [key, column] = columnEntry; - const sorted = key === this._sortColumn; - const classes = { - "mdc-data-table__header-cell--numeric": Boolean( - column.type && column.type === "numeric" - ), - "mdc-data-table__header-cell--icon": Boolean( - column.type && column.type === "icon" - ), - sortable: Boolean(column.sortable), - "not-sorted": Boolean(column.sortable && !sorted), - }; - return html` - + + ${repeat( + this._filteredData!, + (row: DataTableRowData) => row[this.id], + (row: DataTableRowData) => html` + - ${column.sortable + ${this.selectable ? html` - + ` : ""} - ${column.title} - - `; - })} - - - - ${repeat( - this._filteredData!, - (row: DataTableRowData) => row[this.id], - (row: DataTableRowData) => html` - - ${this.selectable - ? html` + ${Object.entries(this.columns).map((columnEntry) => { + const [key, column] = columnEntry; + return html` - ` - : ""} - ${Object.entries(this.columns).map((columnEntry) => { - const [key, column] = columnEntry; - return html` - - `; - })} - - ` - )} - -
+ + + - - + ${column.sortable + ? html` + + ` + : ""} + ${column.title} +
+ + +
- - + ${column.template + ? column.template(row[key], row) + : row[key]} - ${column.template - ? column.template(row[key], row) - : row[key]} -
+ `; + })} + + ` + )} + + +
`; } @@ -434,6 +438,11 @@ export class HaDataTable extends BaseElement { this._debounceSearch(ev.detail.value); } + private async _calcScrollHeight() { + await this.updateComplete; + this._scroller.style.maxHeight = `calc(100% - ${this._header.clientHeight}px)`; + } + static get styles(): CSSResult { return css` /* default mdc styles, colors changed, without checkbox styles */ @@ -584,8 +593,14 @@ export class HaDataTable extends BaseElement { /* custom from here */ + :host { + display: block; + } + .mdc-data-table { display: block; + border-width: var(--data-table-border-width, 1px); + height: 100%; } .mdc-data-table__header-cell { overflow: hidden; @@ -614,6 +629,16 @@ export class HaDataTable extends BaseElement { .table-header { border-bottom: 1px solid rgba(var(--rgb-primary-text-color), 0.12); } + search-input { + position: relative; + top: 2px; + } + .scroller { + overflow: auto; + } + slot[name="header"] { + display: block; + } `; } } diff --git a/src/components/device/ha-area-devices-picker.ts b/src/components/device/ha-area-devices-picker.ts index c6195d7b93..8e691a2388 100644 --- a/src/components/device/ha-area-devices-picker.ts +++ b/src/components/device/ha-area-devices-picker.ts @@ -23,6 +23,7 @@ import { fireEvent } from "../../common/dom/fire_event"; import { DeviceRegistryEntry, subscribeDeviceRegistry, + DeviceEntityLookup, } from "../../data/device_registry"; import { compare } from "../../common/string/compare"; import { PolymerChangedEvent } from "../../polymer-types"; @@ -30,7 +31,6 @@ import { AreaRegistryEntry, subscribeAreaRegistry, } from "../../data/area_registry"; -import { DeviceEntityLookup } from "../../panels/config/devices/ha-devices-data-table"; import { EntityRegistryEntry, subscribeEntityRegistry, diff --git a/src/components/device/ha-device-picker.ts b/src/components/device/ha-device-picker.ts index 4463bb7b80..c232393e4c 100644 --- a/src/components/device/ha-device-picker.ts +++ b/src/components/device/ha-device-picker.ts @@ -22,6 +22,7 @@ import { DeviceRegistryEntry, subscribeDeviceRegistry, computeDeviceName, + DeviceEntityLookup, } from "../../data/device_registry"; import { compare } from "../../common/string/compare"; import { PolymerChangedEvent } from "../../polymer-types"; @@ -29,7 +30,6 @@ import { AreaRegistryEntry, subscribeAreaRegistry, } from "../../data/area_registry"; -import { DeviceEntityLookup } from "../../panels/config/devices/ha-devices-data-table"; import { EntityRegistryEntry, subscribeEntityRegistry, diff --git a/src/data/device_registry.ts b/src/data/device_registry.ts index cdd8052b1a..fabfe7da26 100644 --- a/src/data/device_registry.ts +++ b/src/data/device_registry.ts @@ -17,6 +17,10 @@ export interface DeviceRegistryEntry { name_by_user?: string; } +export interface DeviceEntityLookup { + [deviceId: string]: EntityRegistryEntry[]; +} + export interface DeviceRegistryEntryMutableParams { area_id?: string | null; name_by_user?: string | null; diff --git a/src/layouts/hass-tabs-subpage-data-table.ts b/src/layouts/hass-tabs-subpage-data-table.ts new file mode 100644 index 0000000000..c24cdfccf1 --- /dev/null +++ b/src/layouts/hass-tabs-subpage-data-table.ts @@ -0,0 +1,157 @@ +import { + css, + CSSResult, + customElement, + html, + LitElement, + property, + query, + TemplateResult, +} from "lit-element"; +import "../components/data-table/ha-data-table"; +// tslint:disable-next-line +import { + HaDataTable, + DataTableColumnContainer, + DataTableRowData, +} from "../components/data-table/ha-data-table"; +import "./hass-tabs-subpage"; +import { HomeAssistant, Route } from "../types"; +// tslint:disable-next-line +import { PageNavigation } from "./hass-tabs-subpage"; + +@customElement("hass-tabs-subpage-data-table") +export class HaTabsSubpageDataTable extends LitElement { + @property() public hass!: HomeAssistant; + @property() public isWide!: boolean; + @property({ type: Boolean, reflect: true }) public narrow!: boolean; + /** + * Object with the columns. + * @type {Object} + */ + @property({ type: Object }) public columns: DataTableColumnContainer = {}; + /** + * Data to show in the table. + * @type {Array} + */ + @property({ type: Array }) public data: DataTableRowData[] = []; + /** + * Should rows be selectable. + * @type {Boolean} + */ + @property({ type: Boolean }) public selectable = false; + /** + * Field with a unique id per entry in data. + * @type {String} + */ + @property({ type: String }) public id = "id"; + /** + * String to filter the data in the data table on. + * @type {String} + */ + @property({ type: String }) public filter = ""; + /** + * What path to use when the back button is pressed. + * @type {String} + * @attr back-path + */ + @property({ type: String, attribute: "back-path" }) public backPath?: string; + /** + * Function to call when the back button is pressed. + * @type {() => void} + */ + @property() public backCallback?: () => void; + @property() public route!: Route; + /** + * Array of tabs to show on the page. + * @type {Array} + */ + @property() public tabs!: PageNavigation[]; + @query("ha-data-table") private _dataTable!: HaDataTable; + + public clearSelection() { + this._dataTable.clearSelection(); + } + + protected render(): TemplateResult { + return html` + + ${this.narrow + ? html` +
+ +
+ +
+
+
+ ` + : ""} + + ${!this.narrow + ? html` +
+ + +
+
+
+ ` + : html` +
+ `} +
+
+ `; + } + + private _handleSearchChange(ev: CustomEvent) { + this.filter = ev.detail.value; + } + + static get styles(): CSSResult { + return css` + ha-data-table { + width: 100%; + --data-table-border-width: 0; + } + :host(:not([narrow])) ha-data-table { + height: calc(100vh - 65px); + display: block; + } + .table-header { + border-bottom: 1px solid rgba(var(--rgb-primary-text-color), 0.12); + } + .search-toolbar { + margin-left: -24px; + color: var(--secondary-text-color); + } + search-input { + position: relative; + top: 2px; + } + `; + } +} diff --git a/src/layouts/hass-tabs-subpage.ts b/src/layouts/hass-tabs-subpage.ts index fc2b689f9e..a3130916df 100644 --- a/src/layouts/hass-tabs-subpage.ts +++ b/src/layouts/hass-tabs-subpage.ts @@ -56,6 +56,11 @@ class HassTabsSubpage extends LitElement { .hassio=${this.hassio} @click=${this._backTapped} > + ${this.narrow + ? html` +
+ ` + : ""}
${this.tabs.map((page, index) => (!page.component || @@ -138,11 +143,6 @@ class HassTabsSubpage extends LitElement { box-sizing: border-box; } - :host([narrow]) .toolbar { - background-color: var(--primary-background-color); - border-bottom: none; - } - #tabbar { display: flex; font-size: 14px; diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts index 221f5ec6ad..9685340d59 100644 --- a/src/panels/config/automation/ha-automation-editor.ts +++ b/src/panels/config/automation/ha-automation-editor.ts @@ -77,154 +77,155 @@ export class HaAutomationEditor extends LitElement {
${this._errors}
` : ""} -
- ${this._config - ? html` - - ${this._config.alias} - - ${this.hass.localize( - "ui.panel.config.automation.editor.introduction" - )} - - -
- - - -
- ${this.creatingNew - ? "" - : html` -
-
- - ${this.hass.localize( - "ui.panel.config.automation.editor.enable_disable" - )} -
- - ${this.hass.localize( - "ui.card.automation.trigger" - )} - + ${this._config + ? html` + ${this.narrow + ? html` + ${this._config?.alias} + ` + : ""} + + ${!this.narrow + ? html` + ${this._config.alias} + ` + : ""} + + ${this.hass.localize( + "ui.panel.config.automation.editor.introduction" + )} + + +
+ + + +
+ ${this.creatingNew + ? "" + : html` +
+
+ + ${this.hass.localize( + "ui.panel.config.automation.editor.enable_disable" + )}
- `} - - + + ${this.hass.localize("ui.card.automation.trigger")} + +
+ `} +
+
- - + + + ${this.hass.localize( + "ui.panel.config.automation.editor.triggers.header" + )} + + +

${this.hass.localize( - "ui.panel.config.automation.editor.triggers.header" + "ui.panel.config.automation.editor.triggers.introduction" )} - - -

- ${this.hass.localize( - "ui.panel.config.automation.editor.triggers.introduction" - )} -

- - ${this.hass.localize( - "ui.panel.config.automation.editor.triggers.learn_more" - )} - -
- -
+

+ + ${this.hass.localize( + "ui.panel.config.automation.editor.triggers.learn_more" + )} + +
+ +
- - + + + ${this.hass.localize( + "ui.panel.config.automation.editor.conditions.header" + )} + + +

${this.hass.localize( - "ui.panel.config.automation.editor.conditions.header" + "ui.panel.config.automation.editor.conditions.introduction" )} - - -

- ${this.hass.localize( - "ui.panel.config.automation.editor.conditions.introduction" - )} -

- - ${this.hass.localize( - "ui.panel.config.automation.editor.conditions.learn_more" - )} - -
- -
+

+ + ${this.hass.localize( + "ui.panel.config.automation.editor.conditions.learn_more" + )} + +
+ +
- - + + + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.header" + )} + + +

${this.hass.localize( - "ui.panel.config.automation.editor.actions.header" + "ui.panel.config.automation.editor.actions.introduction" )} - - -

- ${this.hass.localize( - "ui.panel.config.automation.editor.actions.introduction" - )} -

- - ${this.hass.localize( - "ui.panel.config.automation.editor.actions.learn_more" - )} - -
- -
- ` - : ""} -
+

+ + ${this.hass.localize( + "ui.panel.config.automation.editor.actions.learn_more" + )} + + + +
+ ` + : ""} + ${ + this.narrow + ? html` + ${device.name_by_user || device.name} + ` + : "" + } +
-

${device.name_by_user || device.name}

+ ${ + this.narrow + ? "" + : html` +

${device.name_by_user || device.name}

+ ` + } *:first-child { + padding-top: 0; + } + :host([narrow]) .container { margin-top: 0; } diff --git a/src/panels/config/devices/ha-config-devices-dashboard.ts b/src/panels/config/devices/ha-config-devices-dashboard.ts index e60b990e92..27b40308a5 100644 --- a/src/panels/config/devices/ha-config-devices-dashboard.ts +++ b/src/panels/config/devices/ha-config-devices-dashboard.ts @@ -1,5 +1,4 @@ -import "../../../layouts/hass-tabs-subpage"; -import "./ha-devices-data-table"; +import "../../../layouts/hass-tabs-subpage-data-table"; import { LitElement, @@ -11,11 +10,24 @@ import { css, } from "lit-element"; import { HomeAssistant, Route } from "../../../types"; -import { DeviceRegistryEntry } from "../../../data/device_registry"; +import { + DeviceRegistryEntry, + computeDeviceName, + DeviceEntityLookup, +} from "../../../data/device_registry"; import { EntityRegistryEntry } from "../../../data/entity_registry"; import { ConfigEntry } from "../../../data/config_entries"; import { AreaRegistryEntry } from "../../../data/area_registry"; import { configSections } from "../ha-panel-config"; +import memoizeOne from "memoize-one"; +import { LocalizeFunc } from "../../../common/translations/localize"; +import { DeviceRowData } from "./ha-devices-data-table"; +import { + DataTableColumnContainer, + DataTableRowData, + RowClickedEvent, +} from "../../../components/data-table/ha-data-table"; +import { navigate } from "../../../common/navigate"; @customElement("ha-config-devices-dashboard") export class HaConfigDeviceDashboard extends LitElement { @@ -29,30 +41,219 @@ export class HaConfigDeviceDashboard extends LitElement { @property() public domain!: string; @property() public route!: Route; + private _devices = memoizeOne( + ( + devices: DeviceRegistryEntry[], + entries: ConfigEntry[], + entities: EntityRegistryEntry[], + areas: AreaRegistryEntry[], + domain: string, + localize: LocalizeFunc + ) => { + // Some older installations might have devices pointing at invalid entryIDs + // So we guard for that. + + let outputDevices: DeviceRowData[] = devices; + + const deviceLookup: { [deviceId: string]: DeviceRegistryEntry } = {}; + for (const device of devices) { + deviceLookup[device.id] = device; + } + + const deviceEntityLookup: DeviceEntityLookup = {}; + for (const entity of entities) { + if (!entity.device_id) { + continue; + } + if (!(entity.device_id in deviceEntityLookup)) { + deviceEntityLookup[entity.device_id] = []; + } + deviceEntityLookup[entity.device_id].push(entity); + } + + const entryLookup: { [entryId: string]: ConfigEntry } = {}; + for (const entry of entries) { + entryLookup[entry.entry_id] = entry; + } + + const areaLookup: { [areaId: string]: AreaRegistryEntry } = {}; + for (const area of areas) { + areaLookup[area.area_id] = area; + } + + if (domain) { + outputDevices = outputDevices.filter((device) => + device.config_entries.find( + (entryId) => + entryId in entryLookup && entryLookup[entryId].domain === domain + ) + ); + } + + outputDevices = outputDevices.map((device) => { + return { + ...device, + name: computeDeviceName( + device, + this.hass, + deviceEntityLookup[device.id] + ), + model: device.model || "", + manufacturer: device.manufacturer || "", + area: device.area_id ? areaLookup[device.area_id].name : "No area", + integration: device.config_entries.length + ? device.config_entries + .filter((entId) => entId in entryLookup) + .map( + (entId) => + localize( + `component.${entryLookup[entId].domain}.config.title` + ) || entryLookup[entId].domain + ) + .join(", ") + : "No integration", + battery_entity: this._batteryEntity(device.id, deviceEntityLookup), + }; + }); + + return outputDevices; + } + ); + + private _columns = memoizeOne( + (narrow: boolean): DataTableColumnContainer => + narrow + ? { + name: { + title: "Device", + sortable: true, + filterable: true, + direction: "asc", + template: (name, device: DataTableRowData) => { + const battery = device.battery_entity + ? this.hass.states[device.battery_entity] + : undefined; + // Have to work on a nice layout for mobile + return html` + ${name}
+ ${device.area} | ${device.integration}
+ ${battery && !isNaN(battery.state as any) + ? html` + ${battery.state}% + + ` + : ""} + `; + }, + }, + } + : { + name: { + title: this.hass.localize( + "ui.panel.config.devices.data_table.device" + ), + sortable: true, + filterable: true, + direction: "asc", + }, + manufacturer: { + title: this.hass.localize( + "ui.panel.config.devices.data_table.manufacturer" + ), + sortable: true, + filterable: true, + }, + model: { + title: this.hass.localize( + "ui.panel.config.devices.data_table.model" + ), + sortable: true, + filterable: true, + }, + area: { + title: this.hass.localize( + "ui.panel.config.devices.data_table.area" + ), + sortable: true, + filterable: true, + }, + integration: { + title: this.hass.localize( + "ui.panel.config.devices.data_table.integration" + ), + sortable: true, + filterable: true, + }, + battery_entity: { + title: this.hass.localize( + "ui.panel.config.devices.data_table.battery" + ), + sortable: true, + type: "numeric", + template: (batteryEntity: string) => { + const battery = batteryEntity + ? this.hass.states[batteryEntity] + : undefined; + return battery && !isNaN(battery.state as any) + ? html` + ${battery.state}% + + ` + : html` + - + `; + }, + }, + } + ); + protected render(): TemplateResult { return html` - -
- -
-
+ `; } + private _batteryEntity( + deviceId: string, + deviceEntityLookup: DeviceEntityLookup + ): string | undefined { + const batteryEntity = (deviceEntityLookup[deviceId] || []).find( + (entity) => + this.hass.states[entity.entity_id] && + this.hass.states[entity.entity_id].attributes.device_class === "battery" + ); + + return batteryEntity ? batteryEntity.entity_id : undefined; + } + + private _handleRowClicked(ev: CustomEvent) { + const deviceId = (ev.detail as RowClickedEvent).id; + navigate(this, `/config/devices/device/${deviceId}`); + } + static get styles(): CSSResult { return css` .content { diff --git a/src/panels/config/devices/ha-devices-data-table.ts b/src/panels/config/devices/ha-devices-data-table.ts index fbed2b5365..8a05bd1f95 100644 --- a/src/panels/config/devices/ha-devices-data-table.ts +++ b/src/panels/config/devices/ha-devices-data-table.ts @@ -21,6 +21,7 @@ import { import { DeviceRegistryEntry, computeDeviceName, + DeviceEntityLookup, } from "../../../data/device_registry"; import { EntityRegistryEntry } from "../../../data/entity_registry"; import { ConfigEntry } from "../../../data/config_entries"; @@ -35,10 +36,6 @@ export interface DeviceRowData extends DeviceRegistryEntry { battery_entity?: string; } -export interface DeviceEntityLookup { - [deviceId: string]: EntityRegistryEntry[]; -} - @customElement("ha-devices-data-table") export class HaDevicesDataTable extends LitElement { @property() public hass!: HomeAssistant; diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index f16cfd5fb2..77282d6f94 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -19,8 +19,6 @@ import memoize from "memoize-one"; import { computeDomain } from "../../../common/entity/compute_domain"; import { domainIcon } from "../../../common/entity/domain_icon"; import { stateIcon } from "../../../common/entity/state_icon"; -import "../../../components/data-table/ha-data-table"; -// tslint:disable-next-line import { DataTableColumnContainer, DataTableColumnData, @@ -29,6 +27,7 @@ import { SelectionChangedEvent, } from "../../../components/data-table/ha-data-table"; import "../../../components/ha-icon"; +import "../../../common/search/search-input"; import { computeEntityRegistryName, EntityRegistryEntry, @@ -38,7 +37,7 @@ import { } from "../../../data/entity_registry"; import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; import "../../../layouts/hass-loading-screen"; -import "../../../layouts/hass-tabs-subpage"; +import "../../../layouts/hass-tabs-subpage-data-table"; import { SubscribeMixin } from "../../../mixins/subscribe-mixin"; import { HomeAssistant, Route } from "../../../types"; import { DialogEntityRegistryDetail } from "./dialog-entity-registry-detail"; @@ -47,6 +46,7 @@ import { showEntityRegistryDetailDialog, } from "./show-dialog-entity-registry-detail"; import { configSections } from "../ha-panel-config"; +import { classMap } from "lit-html/directives/class-map"; @customElement("ha-config-entities") export class HaConfigEntities extends SubscribeMixin(LitElement) { @@ -223,154 +223,136 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { `; } + const headerToolbar = this._selectedEntities.length + ? html` +

+ ${this.hass.localize( + "ui.panel.config.entities.picker.selected", + "number", + this._selectedEntities.length + )} +

+
+ ${!this.narrow + ? html` + ${this.hass.localize( + "ui.panel.config.entities.picker.enable_selected.button" + )} + ${this.hass.localize( + "ui.panel.config.entities.picker.disable_selected.button" + )} + ${this.hass.localize( + "ui.panel.config.entities.picker.remove_selected.button" + )} + ` + : html` + + + ${this.hass.localize( + "ui.panel.config.entities.picker.enable_selected.button" + )} + + + + ${this.hass.localize( + "ui.panel.config.entities.picker.disable_selected.button" + )} + + + + ${this.hass.localize( + "ui.panel.config.entities.picker.remove_selected.button" + )} + + `} +
+ ` + : html` + + + + + + + ${this.hass!.localize( + "ui.panel.config.entities.picker.filter.show_disabled" + )} + + + + ${this.hass!.localize( + "ui.panel.config.entities.picker.filter.show_unavailable" + )} + + + + `; + return html` - -
-
-

- ${this.hass.localize("ui.panel.config.entities.picker.header")} -

-

- ${this.hass.localize( - "ui.panel.config.entities.picker.introduction" - )} -

- -

- ${this.hass.localize( - "ui.panel.config.entities.picker.introduction2" - )} -

- - ${this.hass.localize( - "ui.panel.config.entities.picker.integrations_page" - )} - -
- -
- ${this._selectedEntities.length - ? html` -

- ${this.hass.localize( - "ui.panel.config.entities.picker.selected", - "number", - this._selectedEntities.length - )} -

-
- ${!this.narrow - ? html` - ${this.hass.localize( - "ui.panel.config.entities.picker.enable_selected.button" - )} - ${this.hass.localize( - "ui.panel.config.entities.picker.disable_selected.button" - )} - ${this.hass.localize( - "ui.panel.config.entities.picker.remove_selected.button" - )} - ` - : html` - - - ${this.hass.localize( - "ui.panel.config.entities.picker.enable_selected.button" - )} - - - - ${this.hass.localize( - "ui.panel.config.entities.picker.disable_selected.button" - )} - - - - ${this.hass.localize( - "ui.panel.config.entities.picker.remove_selected.button" - )} - - `} -
- ` - : html` - - - - - - - ${this.hass!.localize( - "ui.panel.config.entities.picker.filter.show_disabled" - )} - - - - ${this.hass!.localize( - "ui.panel.config.entities.picker.filter.show_unavailable" - )} - - - - `} -
-
-
-
+
+ ${headerToolbar} +
+ + `; } @@ -520,14 +502,13 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { font-weight: var(--paper-font-subhead_-_font-weight); line-height: var(--paper-font-subhead_-_line-height); } - .intro { - padding: 24px 16px; - } - .content { - padding: 4px; - } ha-data-table { width: 100%; + --data-table-border-width: 0; + } + :host(:not([narrow])) ha-data-table { + height: calc(100vh - 65px); + display: block; } ha-switch { margin-top: 16px; @@ -540,12 +521,26 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { } search-input { flex-grow: 1; + position: relative; + top: 2px; + } + .search-toolbar { + display: flex; + justify-content: space-between; + align-items: flex-end; + margin-left: -24px; + color: var(--secondary-text-color); } .selected-txt { font-weight: bold; - margin-top: 38px; padding-left: 16px; } + .table-header .selected-txt { + margin-top: 20px; + } + .search-toolbar .selected-txt { + font-size: 16px; + } .header-btns > mwc-button, .header-btns > paper-icon-button { margin: 8px; diff --git a/src/panels/config/scene/ha-scene-editor.ts b/src/panels/config/scene/ha-scene-editor.ts index 283195e62a..a7a7254b08 100644 --- a/src/panels/config/scene/ha-scene-editor.ts +++ b/src/panels/config/scene/ha-scene-editor.ts @@ -160,6 +160,10 @@ export class HaSceneEditor extends SubscribeMixin(LitElement) { this._deviceEntityLookup, this._deviceRegistryEntries ); + const name = this.scene + ? computeStateName(this.scene) + : this.hass.localize("ui.panel.config.scene.editor.default_name"); + return html` ${name} + ` + : "" + }
-
- ${ - this.scene - ? computeStateName(this.scene) - : this.hass.localize( - "ui.panel.config.scene.editor.default_name" - ) - } -
+ ${ + !this.narrow + ? html` + ${name} + ` + : "" + }
${this.hass.localize( "ui.panel.config.scene.editor.introduction" diff --git a/src/panels/config/script/ha-script-editor.ts b/src/panels/config/script/ha-script-editor.ts index a27b1a73c3..f98c2997a4 100644 --- a/src/panels/config/script/ha-script-editor.ts +++ b/src/panels/config/script/ha-script-editor.ts @@ -63,7 +63,11 @@ export class HaScriptEditor extends LitElement { @click=${this._deleteConfirm} > `} - + ${this.narrow + ? html` + ${this._config?.alias} + ` + : ""}
${this._errors ? html` @@ -78,7 +82,11 @@ export class HaScriptEditor extends LitElement { ${this._config ? html` - ${this._config.alias} + ${!this.narrow + ? html` + ${this._config.alias} + ` + : ""} ${this.hass.localize( "ui.panel.config.script.editor.introduction" From c62a5a6dcdcf9abac4aab109aa5c517c55c877f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Fri, 14 Feb 2020 01:18:15 +0100 Subject: [PATCH 10/31] Freeze lovelace configuration on load (#4862) * Freeze lovelace configuration on load * Clone only when necessary * Make cloning badges really work * Freeze after checking * Don't doublefreeze --- package.json | 1 + src/panels/lovelace/ha-panel-lovelace.ts | 18 +++++++++++++----- yarn.lock | 5 +++++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9f1686c7b4..ac6116e3e6 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "codemirror": "^5.49.0", "cpx": "^1.5.0", "deep-clone-simple": "^1.1.1", + "deep-freeze": "^0.0.1", "es6-object-assign": "^1.1.0", "fecha": "^3.0.2", "fuse.js": "^3.4.4", diff --git a/src/panels/lovelace/ha-panel-lovelace.ts b/src/panels/lovelace/ha-panel-lovelace.ts index f6bd26fb61..d31014fc74 100644 --- a/src/panels/lovelace/ha-panel-lovelace.ts +++ b/src/panels/lovelace/ha-panel-lovelace.ts @@ -1,4 +1,5 @@ import "@material/mwc-button"; +import * as deepFreeze from "deep-freeze"; import { fetchConfig, @@ -263,15 +264,22 @@ class LovelacePanel extends LitElement { private _checkLovelaceConfig(config: LovelaceConfig) { // Somehow there can be badges with value null, we remove those - config.views.forEach((view) => { - if (view.badges) { - view.badges = view.badges.filter(Boolean); + let checkedConfig; + config.views.forEach((view, index) => { + if (view.badges && !view.badges.every(Boolean)) { + checkedConfig = checkedConfig || { + ...config, + views: [...config.views], + }; + checkedConfig.views[index] = { ...view }; + checkedConfig.views[index].badges = view.badges.filter(Boolean); } }); + return checkedConfig ? deepFreeze(checkedConfig) : config; } private _setLovelaceConfig(config: LovelaceConfig, mode: Lovelace["mode"]) { - this._checkLovelaceConfig(config); + config = this._checkLovelaceConfig(config); this.lovelace = { config, mode, @@ -295,7 +303,7 @@ class LovelacePanel extends LitElement { }, saveConfig: async (newConfig: LovelaceConfig): Promise => { const { config: previousConfig, mode: previousMode } = this.lovelace!; - this._checkLovelaceConfig(newConfig); + newConfig = this._checkLovelaceConfig(newConfig); try { // Optimistic update this._updateLovelace({ diff --git a/yarn.lock b/yarn.lock index 7e8b1d0c0a..f296ec0fe6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5403,6 +5403,11 @@ deep-extend@^0.6.0, deep-extend@~0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-freeze@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" + integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= + deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" From 46cc2aec9437ae51e4406dc813b0407bafaf14c0 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Fri, 14 Feb 2020 00:32:50 +0000 Subject: [PATCH 11/31] [ci skip] Translation update --- translations/de.json | 13 +++++++++++- translations/en.json | 42 +++++++++++++++++++++------------------ translations/es.json | 3 ++- translations/fr.json | 3 ++- translations/hu.json | 3 ++- translations/ko.json | 11 +++++----- translations/lb.json | 15 +++++++++++++- translations/nb.json | 17 ++++++++++++++-- translations/ru.json | 3 ++- translations/sv.json | 3 ++- translations/zh-Hant.json | 19 +++++++++++++++--- 11 files changed, 96 insertions(+), 36 deletions(-) diff --git a/translations/de.json b/translations/de.json index 0bea979e8c..d8a3b0a00d 100644 --- a/translations/de.json +++ b/translations/de.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Wenn deaktiviert werden neu erkannte Entitäten für {integration} nicht automatisch zu Home Assistant hinzugefügt.", "enable_new_entities_label": "Neu hinzugefügte Entitäten aktivieren.", - "title": "Einstellungen für {integration}" + "title": "Einstellungen für {integration}", + "update": "Aktualisieren" }, "confirmation": { "cancel": "Abbrechen", @@ -659,6 +660,16 @@ }, "updater": { "title": "Update-Anweisungen" + }, + "vacuum": { + "commands": "Staubsaugerbefehle:", + "fan_speed": "Lüftergeschwindigkeit", + "locate": "Lokalisieren", + "pause": "Pause", + "start": "Start", + "start_pause": "Start/Pause", + "status": "Status", + "stop": "Stoppen" } }, "more_info_settings": { diff --git a/translations/en.json b/translations/en.json index b30b619c7a..8949ac36df 100644 --- a/translations/en.json +++ b/translations/en.json @@ -641,6 +641,9 @@ "more_info_control": { "dismiss": "Dismiss dialog", "edit": "Edit entity", + "person": { + "create_zone": "Create zone from current location" + }, "restored": { "confirm_remove_text": "Are you sure you want to remove this entity?", "confirm_remove_title": "Remove entity?", @@ -892,6 +895,7 @@ }, "edit_ui": "Edit with UI", "edit_yaml": "Edit as YAML", + "enable_disable": "Enable/Disable automation", "introduction": "Use automations to bring your home alive.", "load_error_not_editable": "Only automations in automations.yaml are editable.", "load_error_unknown": "Error loading automation ({err_no}).", @@ -1006,7 +1010,7 @@ "cloud": { "account": { "alexa": { - "config_documentation": "Config documentation", + "config_documentation": "Configuration documentation", "disable": "disable", "enable": "enable", "enable_ha_skill": "Enable the Home Assistant skill for Alexa", @@ -1023,7 +1027,7 @@ "connection_status": "Cloud connection status", "fetching_subscription": "Fetching subscription…", "google": { - "config_documentation": "Config documentation", + "config_documentation": "Configuration documentation", "devices_pin": "Security Devices Pin", "enable_ha_skill": "Activate the Home Assistant skill for Google Assistant", "enable_state_reporting": "Enable State Reporting", @@ -1372,7 +1376,7 @@ "add_area": "Add Area", "area_picker_label": "Area", "close": "Close", - "created_config": "Created config for {name}.", + "created_config": "Created configuration for {name}.", "dismiss": "Dismiss dialog", "error_saving_area": "Error saving area: {error}", "external_step": { @@ -1525,7 +1529,7 @@ "stop": "Stop" }, "validation": { - "check_config": "Check config", + "check_config": "Check configuration", "heading": "Configuration validation", "introduction": "Validate your configuration if you recently made some changes to your configuration and want to make sure that it is all valid", "invalid": "Configuration invalid", @@ -1697,7 +1701,7 @@ "required_error_msg": "This field is required", "update": "Update" }, - "edit_home_zone": "The location of your home can be changed in the general config.", + "edit_home_zone": "The location of your home can be changed in the general configuration.", "introduction": "Zones allow you to specify certain regions on earth. When a person is within a zone, the state will take the name from the zone. Zones can also be used as a trigger or condition inside automation setups.", "no_zones_created_yet": "Looks like you have not created any zones yet." }, @@ -1725,12 +1729,12 @@ "network_stopped": "Z-Wave Network Stopped" }, "node_config": { - "config_parameter": "Config Parameter", - "config_value": "Config Value", + "config_parameter": "Configuration Parameter", + "config_value": "Configuration Value", "false": "False", - "header": "Node Config Options", + "header": "Node Configuration Options", "seconds": "seconds", - "set_config_parameter": "Set Config Parameter", + "set_config_parameter": "Set Configuration Parameter", "set_wakeup": "Set Wakeup Interval", "true": "True" }, @@ -1744,7 +1748,7 @@ "cancel_command": "Cancel Command", "heal_network": "Heal Network", "remove_node": "Remove Node", - "save_config": "Save Config", + "save_config": "Save Configuration", "soft_reset": "Soft Reset", "start_network": "Start Network", "stop_network": "Stop Network", @@ -1883,7 +1887,7 @@ "lovelace": { "add_entities": { "generated_unsupported": "You can only use this function when you have taken control of the Lovelace UI.", - "saving_failed": "Saving Lovelace UI config failed.", + "saving_failed": "Saving Lovelace UI configuration failed.", "yaml_unsupported": "You can not use this function when using Lovelace UI in YAML mode." }, "cards": { @@ -2070,24 +2074,24 @@ "header": "Edit UI", "menu": { "open": "Open Lovelace UI menu", - "raw_editor": "Raw config editor" + "raw_editor": "Raw configuration editor" }, "migrate": { "header": "Configuration Incompatible", - "migrate": "Migrate config", - "para_migrate": "Home Assistant can add ID's to all your cards and views automatically for you by pressing the 'Migrate config' button.", + "migrate": "Migrate configuration", + "para_migrate": "Home Assistant can add ID's to all your cards and views automatically for you by pressing the 'Migrate configuration' button.", "para_no_id": "This element doesn't have an ID. Please add an ID to this element in 'ui-lovelace.yaml'." }, "raw_editor": { "confirm_remove_config_text": "We will automatically generate your Lovelace UI views with your areas and devices if you remove your Lovelace UI configuration.", "confirm_remove_config_title": "Are you sure you want to remove your Lovelace UI configuration? We will automatically generate your Lovelace UI views with your areas and devices.", "confirm_unsaved_changes": "You have unsaved changes, are you sure you want to exit?", - "confirm_unsaved_comments": "Your config contains comment(s), these will not be saved. Do you want to continue?", - "error_invalid_config": "Your config is not valid: {error}", + "confirm_unsaved_comments": "Your configuration contains comment(s), these will not be saved. Do you want to continue?", + "error_invalid_config": "Your configuration is not valid: {error}", "error_parse_yaml": "Unable to parse YAML: {error}", - "error_remove": "Unable to remove config: {error}", + "error_remove": "Unable to remove configuration: {error}", "error_save_yaml": "Unable to save YAML: {error}", - "header": "Edit Config", + "header": "Edit Configuration", "save": "Save", "saved": "Saved", "unsaved_changes": "Unsaved changes" @@ -2209,7 +2213,7 @@ "data": { "password": "API Password" }, - "description": "Please input the API password in your http config:" + "description": "Please input the API password in your HTTP configuration:" }, "mfa": { "data": { diff --git a/translations/es.json b/translations/es.json index 2feb96fff9..a9dc2a3cc9 100644 --- a/translations/es.json +++ b/translations/es.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Si está deshabilitada, las nuevas entidades que se descubran para {integration} no se añadirán automáticamente a Home Assistant.", "enable_new_entities_label": "Activar entidades recién añadidas.", - "title": "Opciones del sistema para {integration}" + "title": "Opciones del sistema para {integration}", + "update": "Actualizar" }, "confirmation": { "cancel": "Cancelar", diff --git a/translations/fr.json b/translations/fr.json index 9803bacee0..5d5b8c5c69 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Si désactivé, les nouvelles entités découvertes pour {integration} ne seront pas ajoutées automatiquement à Home Assistant.", "enable_new_entities_label": "Activer les entités nouvellement ajoutées.", - "title": "Options système pour {integration}" + "title": "Options système pour {integration}", + "update": "Mise à jour" }, "confirmation": { "cancel": "Annuler", diff --git a/translations/hu.json b/translations/hu.json index 847f36899f..c5bf4f0216 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Ha le van tiltva, akkor az újonnan felfedezett {integration} entitások nem lesznek automatikusan hozzáadva a Home Assistant-hoz.", "enable_new_entities_label": "Újonnan hozzáadott entitások engedélyezése.", - "title": "{integration} rendszerbeállításai" + "title": "{integration} rendszerbeállításai", + "update": "Frissítés" }, "confirmation": { "cancel": "Mégse", diff --git a/translations/ko.json b/translations/ko.json index 96dfd34192..d436d64e91 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -576,13 +576,13 @@ }, "related-items": { "area": "영역", - "automation": "다음 자동화의 일부", + "automation": "관련된 자동화", "device": "기기", "entity": "관련된 구성요소", - "group": "다음 그룹의 일부", + "group": "관련된 그룹", "integration": "통합 구성요소", - "scene": "다음 씬의 일부", - "script": "다음 스크립트의 일부" + "scene": "관련된 씬", + "script": "관련된 스크립트" }, "relative_time": { "duration": { @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "비활성화한 경우 새로 발견된 {integration} 구성요소는 Home Assistant 에 자동으로 추가되지 않습니다.", "enable_new_entities_label": "새로 추가된 구성요소를 활성화합니다.", - "title": "{integration} 시스템 옵션" + "title": "{integration} 시스템 옵션", + "update": "업데이트" }, "confirmation": { "cancel": "취소", diff --git a/translations/lb.json b/translations/lb.json index f76a2c15e9..f16abd0b64 100644 --- a/translations/lb.json +++ b/translations/lb.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Falls desaktivéiert, ginn nei entdeckten Entitéiten net automatesch zu Home Assistant dobäigesat.", "enable_new_entities_label": "Aktivéiert nei dobäigesate Entitéiten.", - "title": "System Optiounen" + "title": "System Optiounen", + "update": "Aktualiséieren" }, "confirmation": { "cancel": "Ofbriechen", @@ -659,6 +660,18 @@ }, "updater": { "title": "Instruktioune fir d'Mise à jour" + }, + "vacuum": { + "clean_spot": "Plaz botzen", + "commands": "Staubsauger Kommandoen:", + "fan_speed": "Vitesse vum Ventilator", + "locate": "Lokaliséieren", + "pause": "Pause", + "return_home": "Zeréck zur Statioun", + "start": "Start", + "start_pause": "Start/Pause", + "status": "Status", + "stop": "Stop" } }, "more_info_settings": { diff --git a/translations/nb.json b/translations/nb.json index f43f22ddd1..78137ddff5 100644 --- a/translations/nb.json +++ b/translations/nb.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Hvis den er deaktivert, blir ikke nyoppdagede entiteter for {integration} automatisk lagt til i Home Assistant.", "enable_new_entities_label": "Aktiver enheter som nylig er lagt til.", - "title": "Systemalternativer for {integration}" + "title": "Systemalternativer for {integration}", + "update": "Oppdater" }, "confirmation": { "cancel": "Avbryt", @@ -659,6 +660,18 @@ }, "updater": { "title": "Oppdateringsanvisning" + }, + "vacuum": { + "clean_spot": "Rent sted", + "commands": "Støvsugerkommandoer:", + "fan_speed": "Viftehastighet", + "locate": "Lokaliser", + "pause": "Pause", + "return_home": "Vende hjem", + "start": "Start", + "start_pause": "Start / Pause", + "status": "Status", + "stop": "Stopp" } }, "more_info_settings": { @@ -1496,7 +1509,7 @@ "automation": "Last inn automasjoner på nytt", "core": "Last inn lokasjon og spesialtilpassinger på nytt", "group": "Last inn grupper på nytt", - "heading": "Konfigurasjon lastes på nytt", + "heading": "YAML -Konfigurasjon lastes på nytt", "introduction": "Noen deler av Home Assistant kan laste inn uten å kreve omstart. Hvis du trykker last på nytt, vil du bytte den nåværende konfigurasjonen med den nye.", "person": "Last inn personer på nytt", "scene": "Last inn scener på nytt", diff --git a/translations/ru.json b/translations/ru.json index b9fda8af8e..365d9c3c56 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "{integration} будет автоматически добавлять в Home Assistant вновь обнаруженные объекты", "enable_new_entities_label": "Добавлять новые объекты", - "title": "{integration}" + "title": "{integration}", + "update": "Обновить" }, "confirmation": { "cancel": "Отменить", diff --git a/translations/sv.json b/translations/sv.json index b8c0ed9b6e..dc501ebdbf 100644 --- a/translations/sv.json +++ b/translations/sv.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Nyupptäckta entiteter kommer ej läggas till automatiskt i Home Assistant om de är inaktiverade.", "enable_new_entities_label": "Aktivera nyligen tillagda enheter.", - "title": "Systeminställningar för {integration}" + "title": "Systeminställningar för {integration}", + "update": "Uppdatera" }, "confirmation": { "cancel": "Avbryt", diff --git a/translations/zh-Hant.json b/translations/zh-Hant.json index 264e7289db..e6ff369da0 100644 --- a/translations/zh-Hant.json +++ b/translations/zh-Hant.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "關閉後,{integration} 新發現的物件將不會自動新增至 Home Assistant。", "enable_new_entities_label": "啟用新增物件", - "title": "{integration} 系統選項" + "title": "{integration} 系統選項", + "update": "更新" }, "confirmation": { "cancel": "取消", @@ -659,6 +660,18 @@ }, "updater": { "title": "更新說明" + }, + "vacuum": { + "clean_spot": "區部清掃", + "commands": "吸塵器清掃指令:", + "fan_speed": "風速", + "locate": "尋找", + "pause": "暫停", + "return_home": "回充", + "start": "開始清掃", + "start_pause": "開始/暫停", + "status": "狀態", + "stop": "停止清掃" } }, "more_info_settings": { @@ -1496,8 +1509,8 @@ "automation": "重新載入自動化", "core": "重新載入座標與自訂化", "group": "重新載入群組", - "heading": "正在重新載入設定", - "introduction": "Home Assistant 中部分設定無須重啟即可重新載入生效。點選重新載入按鈕,即可重新載入最新設定。", + "heading": "YAML 設定新載入中", + "introduction": "Home Assistant 中部分設定無須重啟即可重新載入生效。點選重新載入按鈕,即可解除目前 YAML 設定,並重新載入最新設定。", "person": "重新載入人員", "scene": "重新載入場景", "script": "重新載入腳本", From f5384e8bc8d9b345d65c6f11f98fe6aa783d95a1 Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Thu, 13 Feb 2020 23:13:29 -0600 Subject: [PATCH 12/31] add create helper functions for custom cards (#4853) * add create helper functions for custom cards * address comments --- src/panels/lovelace/custom-card-helpers.ts | 5 +++++ src/panels/lovelace/ha-panel-lovelace.ts | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 src/panels/lovelace/custom-card-helpers.ts diff --git a/src/panels/lovelace/custom-card-helpers.ts b/src/panels/lovelace/custom-card-helpers.ts new file mode 100644 index 0000000000..0de17cc064 --- /dev/null +++ b/src/panels/lovelace/custom-card-helpers.ts @@ -0,0 +1,5 @@ +export { createRowElement } from "./create-element/create-row-element"; +export { createCardElement } from "./create-element/create-card-element"; +export { createBadgeElement } from "./create-element/create-badge-element"; +export { createHeaderFooterElement } from "./create-element/create-header-footer-element"; +export { createHuiElement } from "./create-element/create-hui-element"; diff --git a/src/panels/lovelace/ha-panel-lovelace.ts b/src/panels/lovelace/ha-panel-lovelace.ts index d31014fc74..ffea13db6a 100644 --- a/src/panels/lovelace/ha-panel-lovelace.ts +++ b/src/panels/lovelace/ha-panel-lovelace.ts @@ -25,6 +25,8 @@ import { showSaveDialog } from "./editor/show-save-config-dialog"; import { generateLovelaceConfigFromHass } from "./common/generate-lovelace-config"; import { showToast } from "../../util/toast"; +(window as any).loadCardHelpers = () => import("./custom-card-helpers"); + interface LovelacePanelConfig { mode: "yaml" | "storage"; } From b2243f480cfa3a0e1bae80e6503fc25c113aeef8 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 13 Feb 2020 21:13:48 -0800 Subject: [PATCH 13/31] Add option to lazy load cards (#4857) * Add option to lazy load cards * Lazy load header/footer elements * Lazy load rows * Clean up params * Rename last var --- .../create-element/create-badge-element.ts | 15 +++- .../create-element/create-card-element.ts | 55 +++++++------ .../create-element/create-element-base.ts | 78 ++++++++++++------- .../create-header-footer-element.ts | 16 +++- .../create-element/create-hui-element.ts | 4 +- .../create-element/create-row-element.ts | 56 +++++++------ 6 files changed, 134 insertions(+), 90 deletions(-) diff --git a/src/panels/lovelace/create-element/create-badge-element.ts b/src/panels/lovelace/create-element/create-badge-element.ts index 9fb4bc3b21..120a51b98e 100644 --- a/src/panels/lovelace/create-element/create-badge-element.ts +++ b/src/panels/lovelace/create-element/create-badge-element.ts @@ -1,10 +1,19 @@ -import "../badges/hui-entity-filter-badge"; import "../badges/hui-state-label-badge"; import { LovelaceBadgeConfig } from "../../../data/lovelace"; import { createLovelaceElement } from "./create-element-base"; -const BADGE_TYPES = new Set(["entity-filter", "error", "state-label"]); +const ALWAYS_LOADED_TYPES = new Set(["error", "state-label"]); +const LAZY_LOAD_TYPES = { + "entity-filter": () => import("../badges/hui-entity-filter-badge"), +}; export const createBadgeElement = (config: LovelaceBadgeConfig) => - createLovelaceElement("badge", config, BADGE_TYPES, undefined, "state-label"); + createLovelaceElement( + "badge", + config, + ALWAYS_LOADED_TYPES, + LAZY_LOAD_TYPES, + undefined, + "state-label" + ); diff --git a/src/panels/lovelace/create-element/create-card-element.ts b/src/panels/lovelace/create-element/create-card-element.ts index acfd982613..6692a1ea3d 100644 --- a/src/panels/lovelace/create-element/create-card-element.ts +++ b/src/panels/lovelace/create-element/create-card-element.ts @@ -1,57 +1,54 @@ -import "../cards/hui-alarm-panel-card"; -import "../cards/hui-conditional-card"; import "../cards/hui-entities-card"; import "../cards/hui-entity-button-card"; -import "../cards/hui-entity-filter-card"; import "../cards/hui-glance-card"; import "../cards/hui-history-graph-card"; import "../cards/hui-horizontal-stack-card"; -import "../cards/hui-iframe-card"; import "../cards/hui-light-card"; -import "../cards/hui-map-card"; -import "../cards/hui-markdown-card"; import "../cards/hui-media-control-card"; -import "../cards/hui-picture-card"; -import "../cards/hui-picture-elements-card"; -import "../cards/hui-picture-entity-card"; -import "../cards/hui-picture-glance-card"; -import "../cards/hui-plant-status-card"; import "../cards/hui-sensor-card"; -import "../cards/hui-vertical-stack-card"; -import "../cards/hui-shopping-list-card"; import "../cards/hui-thermostat-card"; +import "../cards/hui-vertical-stack-card"; import "../cards/hui-weather-forecast-card"; -import "../cards/hui-gauge-card"; import { LovelaceCardConfig } from "../../../data/lovelace"; import { createLovelaceElement } from "./create-element-base"; -const CARD_TYPES = new Set([ - "alarm-panel", - "conditional", +const ALWAYS_LOADED_TYPES = new Set([ "entities", "entity-button", - "entity-filter", "error", - "gauge", "glance", "history-graph", "horizontal-stack", - "iframe", "light", - "map", - "markdown", "media-control", - "picture", - "picture-elements", - "picture-entity", - "picture-glance", - "plant-status", "sensor", - "shopping-list", "thermostat", "vertical-stack", "weather-forecast", ]); +const LAZY_LOAD_TYPES = { + "alarm-panel": () => import("../cards/hui-alarm-panel-card"), + "entity-filter": () => import("../cards/hui-entity-filter-card"), + "picture-elements": () => import("../cards/hui-picture-elements-card"), + "picture-entity": () => import("../cards/hui-picture-entity-card"), + "picture-glance": () => import("../cards/hui-picture-glance-card"), + "plant-status": () => import("../cards/hui-plant-status-card"), + "shopping-list": () => import("../cards/hui-shopping-list-card"), + conditional: () => import("../cards/hui-conditional-card"), + gauge: () => import("../cards/hui-gauge-card"), + iframe: () => import("../cards/hui-iframe-card"), + map: () => import("../cards/hui-map-card"), + markdown: () => import("../cards/hui-markdown-card"), + picture: () => import("../cards/hui-picture-card"), +}; + export const createCardElement = (config: LovelaceCardConfig) => - createLovelaceElement("card", config, CARD_TYPES); + createLovelaceElement( + "card", + config, + ALWAYS_LOADED_TYPES, + LAZY_LOAD_TYPES, + undefined, + undefined + ); diff --git a/src/panels/lovelace/create-element/create-element-base.ts b/src/panels/lovelace/create-element/create-element-base.ts index 0650e0a450..61f1b6a432 100644 --- a/src/panels/lovelace/create-element/create-element-base.ts +++ b/src/panels/lovelace/create-element/create-element-base.ts @@ -50,10 +50,36 @@ const _createErrorElement = ( config: CreateElementConfigTypes[T]["config"] ): HuiErrorCard => createErrorCardElement(createErrorCardConfig(error, config)); +const _maybeCreate = ( + tag: string, + config: CreateElementConfigTypes[T]["config"] +) => { + if (customElements.get(tag)) { + return _createElement(tag, config); + } + + const element = _createErrorElement( + `Custom element doesn't exist: ${tag}.`, + config + ); + element.style.display = "None"; + const timer = window.setTimeout(() => { + element.style.display = ""; + }, TIMEOUT); + + customElements.whenDefined(tag).then(() => { + clearTimeout(timer); + fireEvent(element, "ll-rebuild"); + }); + + return element; +}; + export const createLovelaceElement = ( tagSuffix: T, config: CreateElementConfigTypes[T]["config"], - elementTypes: Set, + alwaysLoadTypes?: Set, + lazyLoadTypes?: { [domain: string]: () => unknown }, // 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. @@ -73,43 +99,35 @@ export const createLovelaceElement = ( } if (config.type && config.type.startsWith(CUSTOM_TYPE_PREFIX)) { - const tag = config.type.substr(CUSTOM_TYPE_PREFIX.length); - - if (customElements.get(tag)) { - return _createElement(tag, config); - } - const element = _createErrorElement( - `Custom element doesn't exist: ${tag}.`, - config - ); - element.style.display = "None"; - const timer = window.setTimeout(() => { - element.style.display = ""; - }, TIMEOUT); - - customElements.whenDefined(tag).then(() => { - clearTimeout(timer); - fireEvent(element, "ll-rebuild"); - }); - - return element; + return _maybeCreate(config.type.substr(CUSTOM_TYPE_PREFIX.length), config); } + let type: string | undefined; + // config.type has priority over config.entity, but defaultType has not. // @ts-ignore if (domainTypes && !config.type && config.entity) { // @ts-ignore const domain = config.entity.split(".", 1)[0]; - return _createElement( - `hui-${domainTypes![domain] || - domainTypes!._domain_not_found}-entity-${tagSuffix}`, - config - ); + type = `${domainTypes![domain] || domainTypes!._domain_not_found}-entity`; + } else { + type = config.type || defaultType; } - const type = config.type || defaultType; + if (type === undefined) { + return _createErrorElement(`No type specified`, config); + } - return type !== undefined && elementTypes.has(type) - ? _createElement(`hui-${type}-${tagSuffix}`, config) - : _createErrorElement(`Unknown type encountered: ${type}.`, config); + const tag = `hui-${type}-${tagSuffix}`; + + if (lazyLoadTypes && type in lazyLoadTypes) { + lazyLoadTypes[type](); + return _maybeCreate(tag, config); + } + + if (alwaysLoadTypes && alwaysLoadTypes.has(type)) { + return _createElement(tag, config); + } + + return _createErrorElement(`Unknown type encountered: ${type}.`, config); }; diff --git a/src/panels/lovelace/create-element/create-header-footer-element.ts b/src/panels/lovelace/create-element/create-header-footer-element.ts index 28d74d148b..f2e2859f3c 100644 --- a/src/panels/lovelace/create-element/create-header-footer-element.ts +++ b/src/panels/lovelace/create-element/create-header-footer-element.ts @@ -1,9 +1,17 @@ -import "../header-footer/hui-picture-header-footer"; -import "../header-footer/hui-buttons-header-footer"; import { LovelaceHeaderFooterConfig } from "../header-footer/types"; import { createLovelaceElement } from "./create-element-base"; -const SPECIAL_TYPES = new Set(["picture", "buttons"]); +const LAZY_LOAD_TYPES = { + picture: () => import("../header-footer/hui-picture-header-footer"), + buttons: () => import("../header-footer/hui-buttons-header-footer"), +}; export const createHeaderFooterElement = (config: LovelaceHeaderFooterConfig) => - createLovelaceElement("header-footer", config, SPECIAL_TYPES); + createLovelaceElement( + "header-footer", + config, + undefined, + LAZY_LOAD_TYPES, + undefined, + undefined + ); diff --git a/src/panels/lovelace/create-element/create-hui-element.ts b/src/panels/lovelace/create-element/create-hui-element.ts index 1645737bbb..d61546046a 100644 --- a/src/panels/lovelace/create-element/create-hui-element.ts +++ b/src/panels/lovelace/create-element/create-hui-element.ts @@ -9,7 +9,7 @@ import "../elements/hui-state-label-element"; import { LovelaceElementConfig } from "../elements/types"; import { createLovelaceElement } from "./create-element-base"; -const ELEMENT_TYPES = new Set([ +const ALWAYS_LOADED_TYPES = new Set([ "conditional", "icon", "image", @@ -20,4 +20,4 @@ const ELEMENT_TYPES = new Set([ ]); export const createHuiElement = (config: LovelaceElementConfig) => - createLovelaceElement("element", config, ELEMENT_TYPES); + createLovelaceElement("element", config, ALWAYS_LOADED_TYPES); diff --git a/src/panels/lovelace/create-element/create-row-element.ts b/src/panels/lovelace/create-element/create-row-element.ts index 207c250c2e..b33b419667 100644 --- a/src/panels/lovelace/create-element/create-row-element.ts +++ b/src/panels/lovelace/create-element/create-row-element.ts @@ -1,36 +1,41 @@ -import "../entity-rows/hui-climate-entity-row"; -import "../entity-rows/hui-cover-entity-row"; -import "../entity-rows/hui-group-entity-row"; -import "../entity-rows/hui-input-datetime-entity-row"; -import "../entity-rows/hui-input-number-entity-row"; -import "../entity-rows/hui-input-select-entity-row"; -import "../entity-rows/hui-input-text-entity-row"; -import "../entity-rows/hui-lock-entity-row"; import "../entity-rows/hui-media-player-entity-row"; import "../entity-rows/hui-scene-entity-row"; import "../entity-rows/hui-script-entity-row"; import "../entity-rows/hui-sensor-entity-row"; import "../entity-rows/hui-text-entity-row"; -import "../entity-rows/hui-timer-entity-row"; import "../entity-rows/hui-toggle-entity-row"; import "../special-rows/hui-call-service-row"; -import "../special-rows/hui-conditional-row"; -import "../special-rows/hui-divider-row"; -import "../special-rows/hui-section-row"; -import "../special-rows/hui-weblink-row"; -import "../special-rows/hui-cast-row"; import { EntityConfig } from "../entity-rows/types"; import { createLovelaceElement } from "./create-element-base"; -const SPECIAL_TYPES = new Set([ +const ALWAYS_LOADED_TYPES = new Set([ + "media-player-entity", + "scene-entity", + "script-entity", + "sensor-entity", + "text-entity", + "toggle-entity", "call-service", - "cast", - "conditional", - "divider", - "section", - "select", - "weblink", ]); +const LAZY_LOAD_TYPES = { + "climate-entity": () => import("../entity-rows/hui-climate-entity-row"), + "cover-entity": () => import("../entity-rows/hui-cover-entity-row"), + "group-entity": () => import("../entity-rows/hui-group-entity-row"), + "input-datetime-entity": () => + import("../entity-rows/hui-input-datetime-entity-row"), + "input-number-entity": () => + import("../entity-rows/hui-input-number-entity-row"), + "input-select-entity": () => + import("../entity-rows/hui-input-select-entity-row"), + "input-text-entity": () => import("../entity-rows/hui-input-text-entity-row"), + "lock-entity": () => import("../entity-rows/hui-lock-entity-row"), + "timer-entity": () => import("../entity-rows/hui-timer-entity-row"), + conditional: () => import("../special-rows/hui-conditional-row"), + divider: () => import("../special-rows/hui-divider-row"), + section: () => import("../special-rows/hui-section-row"), + weblink: () => import("../special-rows/hui-weblink-row"), + cast: () => import("../special-rows/hui-cast-row"), +}; const DOMAIN_TO_ELEMENT_TYPE = { _domain_not_found: "text", alert: "toggle", @@ -60,4 +65,11 @@ const DOMAIN_TO_ELEMENT_TYPE = { }; export const createRowElement = (config: EntityConfig) => - createLovelaceElement("row", config, SPECIAL_TYPES, DOMAIN_TO_ELEMENT_TYPE); + createLovelaceElement( + "row", + config, + ALWAYS_LOADED_TYPES, + LAZY_LOAD_TYPES, + DOMAIN_TO_ELEMENT_TYPE, + undefined + ); From 3f7c29a6f604bae3efc7ccbf579bb2b6d6203942 Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Fri, 14 Feb 2020 03:56:08 -0600 Subject: [PATCH 14/31] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20change=20entity-butt?= =?UTF-8?q?on=20to=20button=20card=20(#4581)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ♻️ change entity-button to button card * maintain separate entity-button class --- demo/src/configs/teachingbirds/lovelace.ts | 20 +- .../src/demos/demo-hui-entity-button-card.ts | 18 +- src/panels/lovelace/cards/hui-button-card.ts | 256 ++++++++++++++++++ .../lovelace/cards/hui-entity-button-card.ts | 243 +---------------- src/panels/lovelace/cards/types.ts | 4 +- .../create-element/create-card-element.ts | 2 + .../editor/card-editor/hui-card-picker.ts | 2 +- ...rd-editor.ts => hui-button-card-editor.ts} | 14 +- src/translations/en.json | 4 +- 9 files changed, 292 insertions(+), 271 deletions(-) create mode 100644 src/panels/lovelace/cards/hui-button-card.ts rename src/panels/lovelace/editor/config-elements/{hui-entity-button-card-editor.ts => hui-button-card-editor.ts} (94%) diff --git a/demo/src/configs/teachingbirds/lovelace.ts b/demo/src/configs/teachingbirds/lovelace.ts index 45443fddcc..5fbe14ff0a 100644 --- a/demo/src/configs/teachingbirds/lovelace.ts +++ b/demo/src/configs/teachingbirds/lovelace.ts @@ -395,7 +395,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ cards: [ { entity: "script.air_cleaner_quiet", - type: "entity-button", + type: "button", name: "AC bed", tap_action: { action: "call-service", @@ -408,7 +408,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ }, { entity: "script.air_cleaner_auto", - type: "entity-button", + type: "button", name: "AC bed", tap_action: { action: "call-service", @@ -421,7 +421,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ }, { entity: "script.air_cleaner_turbo", - type: "entity-button", + type: "button", name: "AC bed", tap_action: { action: "call-service", @@ -434,7 +434,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ }, { entity: "script.ac_off", - type: "entity-button", + type: "button", name: "AC", tap_action: { action: "call-service", @@ -447,7 +447,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ }, { entity: "script.ac_on", - type: "entity-button", + type: "button", name: "AC", tap_action: { action: "call-service", @@ -658,7 +658,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ action: "call-service", service: "script.goodnight", }, - type: "entity-button", + type: "button", icon: "mdi:weather-night", }, { @@ -670,7 +670,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ }, service: "scene.turn_on", }, - type: "entity-button", + type: "button", icon: "mdi:coffee-outline", }, { @@ -682,7 +682,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ }, service: "scene.turn_on", }, - type: "entity-button", + type: "button", icon: "mdi:television-classic", }, ], @@ -743,7 +743,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ }, service: "light.toggle", }, - type: "entity-button", + type: "button", icon: "mdi:page-layout-footer", }, { @@ -755,7 +755,7 @@ export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({ }, service: "light.toggle", }, - type: "entity-button", + type: "button", icon: "mdi:page-layout-header", }, ], diff --git a/gallery/src/demos/demo-hui-entity-button-card.ts b/gallery/src/demos/demo-hui-entity-button-card.ts index f5d877fe73..254dc3f006 100644 --- a/gallery/src/demos/demo-hui-entity-button-card.ts +++ b/gallery/src/demos/demo-hui-entity-button-card.ts @@ -15,14 +15,14 @@ const CONFIGS = [ { heading: "Basic example", config: ` -- type: entity-button +- type: button entity: light.bed_light `, }, { heading: "With Name", config: ` -- type: entity-button +- type: button name: Bedroom entity: light.bed_light `, @@ -30,7 +30,7 @@ const CONFIGS = [ { heading: "With Icon", config: ` -- type: entity-button +- type: button entity: light.bed_light icon: mdi:hotel `, @@ -38,7 +38,7 @@ const CONFIGS = [ { heading: "Without State", config: ` -- type: entity-button +- type: button entity: light.bed_light show_state: false `, @@ -46,7 +46,7 @@ const CONFIGS = [ { heading: "Custom Tap Action (toggle)", config: ` -- type: entity-button +- type: button entity: light.bed_light tap_action: action: toggle @@ -55,7 +55,7 @@ const CONFIGS = [ { heading: "Running Service", config: ` -- type: entity-button +- type: button entity: light.bed_light service: light.toggle `, @@ -63,13 +63,13 @@ const CONFIGS = [ { heading: "Invalid Entity", config: ` -- type: entity-button +- type: button entity: sensor.invalid_entity `, }, ]; -class DemoEntityButtonEntity extends PolymerElement { +class DemoButtonEntity extends PolymerElement { static get template() { return html` { + await import( + /* webpackChunkName: "hui-button-card-editor" */ "../editor/config-elements/hui-button-card-editor" + ); + return document.createElement("hui-button-card-editor"); + } + + public static getStubConfig(): object { + return { + tap_action: { action: "toggle" }, + hold_action: { action: "more-info" }, + show_icon: true, + show_name: true, + }; + } + + @property() public hass?: HomeAssistant; + + @property() private _config?: ButtonCardConfig; + + public getCardSize(): number { + return 2; + } + + public setConfig(config: ButtonCardConfig): void { + if (config.entity && !isValidEntityId(config.entity)) { + throw new Error("Invalid Entity"); + } + + this._config = { + theme: "default", + hold_action: { action: "more-info" }, + double_tap_action: { action: "none" }, + show_icon: true, + show_name: true, + ...config, + }; + + if (config.entity && DOMAINS_TOGGLE.has(computeDomain(config.entity))) { + this._config = { + tap_action: { + action: "toggle", + }, + ...this._config, + }; + } else { + this._config = { + tap_action: { + action: "more-info", + }, + ...this._config, + }; + } + } + + protected shouldUpdate(changedProps: PropertyValues): boolean { + if (changedProps.has("_config")) { + return true; + } + + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; + + if ( + !oldHass || + oldHass.themes !== this.hass!.themes || + oldHass.language !== this.hass!.language + ) { + return true; + } + + return ( + Boolean(this._config!.entity) && + oldHass.states[this._config!.entity!] !== + this.hass!.states[this._config!.entity!] + ); + } + + protected render(): TemplateResult { + if (!this._config || !this.hass) { + return html``; + } + const stateObj = this._config.entity + ? this.hass.states[this._config.entity] + : undefined; + + if (this._config.entity && !stateObj) { + return html` + ${this.hass.localize( + "ui.panel.lovelace.warning.entity_not_found", + "entity", + this._config.entity + )} + `; + } + + return html` + + ${this._config.show_icon + ? html` + + ` + : ""} + ${this._config.show_name + ? html` + + ${this._config.name || + (stateObj ? computeStateName(stateObj) : "")} + + ` + : ""} + + + `; + } + + protected updated(changedProps: PropertyValues): void { + super.updated(changedProps); + if (!this._config || !this.hass) { + return; + } + const oldHass = changedProps.get("hass") as HomeAssistant | undefined; + const oldConfig = changedProps.get("_config") as + | ButtonCardConfig + | undefined; + + if ( + !oldHass || + !oldConfig || + oldHass.themes !== this.hass.themes || + oldConfig.theme !== this._config.theme + ) { + applyThemesOnElement(this, this.hass.themes, this._config.theme); + } + } + + static get styles(): CSSResult { + return css` + ha-card { + cursor: pointer; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: 4% 0; + font-size: 1.2rem; + } + + ha-card:focus { + outline: none; + background: var(--divider-color); + } + + ha-icon { + width: 40%; + height: auto; + color: var(--paper-item-icon-color, #44739e); + } + + ${iconColorCSS} + `; + } + + private _computeBrightness(stateObj: HassEntity | LightEntity): string { + if (!stateObj.attributes.brightness) { + return ""; + } + const brightness = stateObj.attributes.brightness; + return `brightness(${(brightness + 245) / 5}%)`; + } + + private _computeColor(stateObj: HassEntity | LightEntity): string { + if (!stateObj.attributes.hs_color) { + return ""; + } + const [hue, sat] = stateObj.attributes.hs_color; + if (sat <= 10) { + return ""; + } + return `hsl(${hue}, 100%, ${100 - sat / 2}%)`; + } + + private _handleAction(ev: ActionHandlerEvent) { + handleAction(this, this.hass!, this._config!, ev.detail.action!); + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-button-card": HuiButtonCard; + } +} diff --git a/src/panels/lovelace/cards/hui-entity-button-card.ts b/src/panels/lovelace/cards/hui-entity-button-card.ts index 707e4f60ed..e062d189a2 100644 --- a/src/panels/lovelace/cards/hui-entity-button-card.ts +++ b/src/panels/lovelace/cards/hui-entity-button-card.ts @@ -1,246 +1,9 @@ -import { - html, - LitElement, - PropertyValues, - TemplateResult, - CSSResult, - css, - customElement, - property, -} from "lit-element"; -import { HassEntity } from "home-assistant-js-websocket"; -import { styleMap } from "lit-html/directives/style-map"; -import { ifDefined } from "lit-html/directives/if-defined"; -import "@material/mwc-ripple"; +import { customElement } from "lit-element"; -import "../../../components/ha-card"; -import "../components/hui-warning"; - -import { isValidEntityId } from "../../../common/entity/valid_entity_id"; -import { stateIcon } from "../../../common/entity/state_icon"; -import { computeStateDomain } from "../../../common/entity/compute_state_domain"; -import { computeStateName } from "../../../common/entity/compute_state_name"; -import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element"; -import { computeDomain } from "../../../common/entity/compute_domain"; - -import { HomeAssistant, LightEntity } from "../../../types"; -import { LovelaceCard, LovelaceCardEditor } from "../types"; -import { DOMAINS_TOGGLE } from "../../../common/const"; -import { EntityButtonCardConfig } from "./types"; -import { actionHandler } from "../common/directives/action-handler-directive"; -import { hasAction } from "../common/has-action"; -import { handleAction } from "../common/handle-action"; -import { ActionHandlerEvent } from "../../../data/lovelace"; -import { computeActiveState } from "../../../common/entity/compute_active_state"; -import { iconColorCSS } from "../../../common/style/icon_color_css"; +import { HuiButtonCard } from "./hui-button-card"; @customElement("hui-entity-button-card") -class HuiEntityButtonCard extends LitElement implements LovelaceCard { - public static async getConfigElement(): Promise { - await import( - /* webpackChunkName: "hui-entity-button-card-editor" */ "../editor/config-elements/hui-entity-button-card-editor" - ); - return document.createElement("hui-entity-button-card-editor"); - } - - public static getStubConfig(): object { - return { - tap_action: { action: "toggle" }, - hold_action: { action: "more-info" }, - show_icon: true, - show_name: true, - }; - } - - @property() public hass?: HomeAssistant; - - @property() private _config?: EntityButtonCardConfig; - - public getCardSize(): number { - return 2; - } - - public setConfig(config: EntityButtonCardConfig): void { - if (!isValidEntityId(config.entity)) { - throw new Error("Invalid Entity"); - } - - this._config = { - theme: "default", - hold_action: { action: "more-info" }, - double_tap_action: { action: "none" }, - show_icon: true, - show_name: true, - ...config, - }; - - if (DOMAINS_TOGGLE.has(computeDomain(config.entity))) { - this._config = { - tap_action: { - action: "toggle", - }, - ...this._config, - }; - } else { - this._config = { - tap_action: { - action: "more-info", - }, - ...this._config, - }; - } - } - - protected shouldUpdate(changedProps: PropertyValues): boolean { - if (changedProps.has("_config")) { - return true; - } - - const oldHass = changedProps.get("hass") as HomeAssistant | undefined; - - if ( - !oldHass || - oldHass.themes !== this.hass!.themes || - oldHass.language !== this.hass!.language - ) { - return true; - } - - return ( - oldHass.states[this._config!.entity] !== - this.hass!.states[this._config!.entity] - ); - } - - protected render(): TemplateResult { - if (!this._config || !this.hass) { - return html``; - } - const stateObj = this.hass.states[this._config.entity]; - - if (!stateObj) { - return html` - ${this.hass.localize( - "ui.panel.lovelace.warning.entity_not_found", - "entity", - this._config.entity - )} - `; - } - - return html` - - ${this._config.show_icon - ? html` - - ` - : ""} - ${this._config.show_name - ? html` - - ${this._config.name || computeStateName(stateObj)} - - ` - : ""} - - - `; - } - - protected updated(changedProps: PropertyValues): void { - super.updated(changedProps); - if (!this._config || !this.hass) { - return; - } - const oldHass = changedProps.get("hass") as HomeAssistant | undefined; - const oldConfig = changedProps.get("_config") as - | EntityButtonCardConfig - | undefined; - - if ( - !oldHass || - !oldConfig || - oldHass.themes !== this.hass.themes || - oldConfig.theme !== this._config.theme - ) { - applyThemesOnElement(this, this.hass.themes, this._config.theme); - } - } - - static get styles(): CSSResult { - return css` - ha-card { - cursor: pointer; - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - padding: 4% 0; - font-size: 1.2rem; - } - - ha-card:focus { - outline: none; - } - - ha-icon { - width: 40%; - height: auto; - color: var(--paper-item-icon-color, #44739e); - } - - ${iconColorCSS} - `; - } - - private _computeBrightness(stateObj: HassEntity | LightEntity): string { - if (!stateObj.attributes.brightness) { - return ""; - } - const brightness = stateObj.attributes.brightness; - return `brightness(${(brightness + 245) / 5}%)`; - } - - private _computeColor(stateObj: HassEntity | LightEntity): string { - if (!stateObj.attributes.hs_color) { - return ""; - } - const [hue, sat] = stateObj.attributes.hs_color; - if (sat <= 10) { - return ""; - } - return `hsl(${hue}, 100%, ${100 - sat / 2}%)`; - } - - private _handleAction(ev: ActionHandlerEvent) { - handleAction(this, this.hass!, this._config!, ev.detail.action!); - } -} +class HuiEntityButtonCard extends HuiButtonCard {} declare global { interface HTMLElementTagNameMap { diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index b90f11e9f8..ffc361e64d 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -47,8 +47,8 @@ export interface EntitiesCardConfig extends LovelaceCardConfig { state_color?: boolean; } -export interface EntityButtonCardConfig extends LovelaceCardConfig { - entity: string; +export interface ButtonCardConfig extends LovelaceCardConfig { + entity?: string; name?: string; show_name?: boolean; icon?: string; diff --git a/src/panels/lovelace/create-element/create-card-element.ts b/src/panels/lovelace/create-element/create-card-element.ts index 6692a1ea3d..74f171580f 100644 --- a/src/panels/lovelace/create-element/create-card-element.ts +++ b/src/panels/lovelace/create-element/create-card-element.ts @@ -1,4 +1,5 @@ import "../cards/hui-entities-card"; +import "../cards/hui-button-card"; import "../cards/hui-entity-button-card"; import "../cards/hui-glance-card"; import "../cards/hui-history-graph-card"; @@ -14,6 +15,7 @@ import { createLovelaceElement } from "./create-element-base"; const ALWAYS_LOADED_TYPES = new Set([ "entities", + "button", "entity-button", "error", "glance", 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 45315fb8f9..422e24d86b 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -18,7 +18,7 @@ const cards: string[] = [ "alarm-panel", "conditional", "entities", - "entity-button", + "button", "entity-filter", "gauge", "glance", diff --git a/src/panels/lovelace/editor/config-elements/hui-entity-button-card-editor.ts b/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts similarity index 94% rename from src/panels/lovelace/editor/config-elements/hui-entity-button-card-editor.ts rename to src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts index 8cf5027a6c..c4d760094d 100644 --- a/src/panels/lovelace/editor/config-elements/hui-entity-button-card-editor.ts +++ b/src/panels/lovelace/editor/config-elements/hui-button-card-editor.ts @@ -22,7 +22,7 @@ import { LovelaceCardEditor } from "../../types"; import { fireEvent } from "../../../../common/dom/fire_event"; import { configElementStyle } from "./config-elements-style"; import { ActionConfig } from "../../../../data/lovelace"; -import { EntityButtonCardConfig } from "../../cards/types"; +import { ButtonCardConfig } from "../../cards/types"; const cardConfigStruct = struct({ type: "string", @@ -37,14 +37,14 @@ const cardConfigStruct = struct({ theme: "string?", }); -@customElement("hui-entity-button-card-editor") -export class HuiEntityButtonCardEditor extends LitElement +@customElement("hui-button-card-editor") +export class HuiButtonCardEditor extends LitElement implements LovelaceCardEditor { @property() public hass?: HomeAssistant; - @property() private _config?: EntityButtonCardConfig; + @property() private _config?: ButtonCardConfig; - public setConfig(config: EntityButtonCardConfig): void { + public setConfig(config: ButtonCardConfig): void { config = cardConfigStruct(config); this._config = config; } @@ -108,7 +108,7 @@ export class HuiEntityButtonCardEditor extends LitElement .label="${this.hass.localize( "ui.panel.lovelace.editor.card.generic.entity" )} (${this.hass.localize( - "ui.panel.lovelace.editor.card.config.required" + "ui.panel.lovelace.editor.card.config.optional" )})" .hass="${this.hass}" .value="${this._entity}" @@ -250,6 +250,6 @@ export class HuiEntityButtonCardEditor extends LitElement declare global { interface HTMLElementTagNameMap { - "hui-entity-button-card-editor": HuiEntityButtonCardEditor; + "hui-button-card-editor": HuiButtonCardEditor; } } diff --git a/src/translations/en.json b/src/translations/en.json index 9aab1d472e..771ac55b29 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1811,8 +1811,8 @@ "show_header_toggle": "Show Header Toggle?", "toggle": "Toggle entities." }, - "entity-button": { - "name": "Entity Button" + "button": { + "name": "Button" }, "entity-filter": { "name": "Entity Filter" From c60033027df06dfd13491d0320ff62a7f202a55b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 15 Feb 2020 01:08:30 +0100 Subject: [PATCH 15/31] Update material elements (#4877) * Update material elements * Update ha-checkbox.ts --- package.json | 28 +- src/components/ha-checkbox.ts | 2 +- .../ha-device-automation-dialog.ts | 2 +- .../config/person/dialog-person-detail.ts | 2 +- src/panels/config/zone/dialog-zone-detail.ts | 2 +- yarn.lock | 571 +++++++----------- 6 files changed, 251 insertions(+), 356 deletions(-) diff --git a/package.json b/package.json index ac6116e3e6..531edba17d 100644 --- a/package.json +++ b/package.json @@ -18,15 +18,15 @@ "author": "Paulus Schoutsen (http://paulusschoutsen.nl)", "license": "Apache-2.0", "dependencies": { - "@material/chips": "^3.2.0", - "@material/data-table": "^3.2.0", - "@material/mwc-base": "^0.10.0", - "@material/mwc-button": "^0.10.0", - "@material/mwc-checkbox": "^0.10.0", - "@material/mwc-dialog": "^0.10.0", - "@material/mwc-fab": "^0.10.0", - "@material/mwc-ripple": "^0.10.0", - "@material/mwc-switch": "^0.10.0", + "@material/chips": "^5.0.0", + "@material/data-table": "^5.0.0", + "@material/mwc-base": "^0.13.0", + "@material/mwc-button": "^0.13.0", + "@material/mwc-checkbox": "^0.13.0", + "@material/mwc-dialog": "^0.13.0", + "@material/mwc-fab": "^0.13.0", + "@material/mwc-ripple": "^0.13.0", + "@material/mwc-switch": "^0.13.0", "@mdi/svg": "4.9.95", "@polymer/app-layout": "^3.0.2", "@polymer/app-localize-behavior": "^3.0.1", @@ -186,7 +186,15 @@ "resolutions": { "@webcomponents/webcomponentsjs": "^2.2.10", "@polymer/polymer": "3.1.0", - "lit-html": "^1.1.2" + "lit-html": "^1.1.2", + "@material/button": "^5.0.0", + "@material/checkbox": "^5.0.0", + "@material/dialog": "^5.0.0", + "@material/fab": "^5.0.0", + "@material/switch": "^5.0.0", + "@material/ripple": "^5.0.0", + "@material/dom": "^5.0.0", + "@material/touch-target": "^5.0.0" }, "main": "src/home-assistant.js", "husky": { diff --git a/src/components/ha-checkbox.ts b/src/components/ha-checkbox.ts index 232d663b13..85362d134e 100644 --- a/src/components/ha-checkbox.ts +++ b/src/components/ha-checkbox.ts @@ -9,7 +9,7 @@ const MwcCheckbox = customElements.get("mwc-checkbox") as Constructor; @customElement("ha-checkbox") export class HaCheckbox extends MwcCheckbox { - protected firstUpdated() { + public firstUpdated() { super.firstUpdated(); this.style.setProperty("--mdc-theme-secondary", "var(--primary-color)"); } diff --git a/src/panels/config/devices/device-detail/ha-device-automation-dialog.ts b/src/panels/config/devices/device-detail/ha-device-automation-dialog.ts index fee2977eee..c0a3cfe91c 100644 --- a/src/panels/config/devices/device-detail/ha-device-automation-dialog.ts +++ b/src/panels/config/devices/device-detail/ha-device-automation-dialog.ts @@ -76,7 +76,7 @@ export class DialogDeviceAutomation extends LitElement {
${this._error diff --git a/src/panels/config/zone/dialog-zone-detail.ts b/src/panels/config/zone/dialog-zone-detail.ts index 984b42623e..24242c6822 100644 --- a/src/panels/config/zone/dialog-zone-detail.ts +++ b/src/panels/config/zone/dialog-zone-detail.ts @@ -100,7 +100,7 @@ class DialogZoneDetail extends LitElement { @closing="${this._close}" scrimClickAction="" escapeKeyAction="" - .title=${title} + .heading=${title} >
${this._error diff --git a/yarn.lock b/yarn.lock index f296ec0fe6..098c8a3a50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1259,408 +1259,313 @@ dependencies: base64-js "^1.3.0" -"@material/animation@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@material/animation/-/animation-3.1.0.tgz#ab04e7c2e92ab370a2b28d12af1b88538d23014f" - integrity sha512-ZfP95awrPBLhpaCTPNx+xKYPp2D88fzf5p5YNVp6diUAGRpq3g12Aq7qJfIHDXAFo5CtrYhgOKRqIKxUVcFisQ== +"@material/animation@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/animation/-/animation-5.0.0.tgz#55924a02587173e5af6570bcb375dada17f7cf68" + integrity sha512-z/l0i8eElEj9FJ/2UVqgSmwhvfbu+im64lDi3M5Giu3mhGAkN1A0galOTmckP9VudAvY75PUDFDCGealy3U7DQ== dependencies: tslib "^1.9.3" -"@material/animation@^4.0.0", "@material/animation@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/animation/-/animation-4.0.0.tgz#19eaf377809f20978f8452a4237d27867d3ffd1d" - integrity sha512-IfzXzstWdtKQcsNWu+s2Hpz5dBwkTHtgtzoesr+FC7TqENH+SJdsF1ntnZI1XVi2C9ZlBf7f4BSmXpWHD0MIlw== +"@material/base@=5.0.0-canary.a1a0deb3e.0": + version "5.0.0-canary.a1a0deb3e.0" + resolved "https://registry.yarnpkg.com/@material/base/-/base-5.0.0-canary.a1a0deb3e.0.tgz#fbdf14e16e388d4d6c0cf93debe26700694fffa8" + integrity sha512-l3MMqLNdzv67EVjBZi33vDlrhU+mzHn6OzaiaX9Q08WS+tX5Co1WfdQtHhcYEPslS5aYv6kaU9FQL96Hb6fbpw== dependencies: tslib "^1.9.3" -"@material/base@=4.0.0-canary.e851d4f40.0": - version "4.0.0-canary.e851d4f40.0" - resolved "https://registry.yarnpkg.com/@material/base/-/base-4.0.0-canary.e851d4f40.0.tgz#c7feb82a319865e0ce9619120d6dc5eaebeb8ac4" - integrity sha512-MpFAsiPNMYmSINpVSibD0qKBjTI3ZhzAgKbg1WqIUmsC5EEKIBwiaS5w+y7cZrXTtSB2qtR7gaV4ySY4bSKkcA== +"@material/base@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/base/-/base-5.0.0.tgz#bcc096871e8fe97150825db5737456d016c565f0" + integrity sha512-1GO2xEBwpAZtXh5BhCIKsYSmpCbh2RZ7YEF3mD/2cPkoveqvlpwiqzLT9iiTtHawj2dbVp0IlAxkLQxgdwSMFQ== dependencies: tslib "^1.9.3" -"@material/base@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@material/base/-/base-3.1.0.tgz#ab933896ab6390d4e1d2f9797b74a90f47db272a" - integrity sha512-pWEBHyPrMV3rdnjqWWH96h5t3MxQI6V1J9jOor+UBG7bXQtr6InTabTqhz5CLY7r+qZU8YvNh2OKIy8heP0cyQ== +"@material/button@=5.0.0-canary.a1a0deb3e.0", "@material/button@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/button/-/button-5.0.0.tgz#ac9341a42e9b4bf893ec57ff7ceaa270c1c179f5" + integrity sha512-ttKafOMIeFgDvEoOjMxENQg8y9uvtvY4z6FxEfDjZrGkyfQj2p6U5Z5IXCfhH+GIZDmxq4mMG9I9YuZNoRv5bg== dependencies: + "@material/density" "^5.0.0" + "@material/elevation" "^5.0.0" + "@material/feature-targeting" "^5.0.0" + "@material/ripple" "^5.0.0" + "@material/rtl" "^5.0.0" + "@material/shape" "^5.0.0" + "@material/theme" "^5.0.0" + "@material/touch-target" "^5.0.0" + "@material/typography" "^5.0.0" + +"@material/checkbox@=5.0.0-canary.a1a0deb3e.0", "@material/checkbox@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-5.0.0.tgz#6c84012e91dbd52631fc422eca48fa54c0dc38d4" + integrity sha512-tCjLYo59Dyjh9Ai/DNPmC/+QbCBNvhquhv4YKKUj1rUrY+Y+OKJxUVeh4trCMBSOgizKqdAOTEqM4tEm4K2GYQ== + dependencies: + "@material/animation" "^5.0.0" + "@material/base" "^5.0.0" + "@material/density" "^5.0.0" + "@material/dom" "^5.0.0" + "@material/feature-targeting" "^5.0.0" + "@material/ripple" "^5.0.0" + "@material/theme" "^5.0.0" + "@material/touch-target" "^5.0.0" tslib "^1.9.3" -"@material/base@^4.0.0", "@material/base@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/base/-/base-4.0.0.tgz#535574d0b63c18892cfb70e88b27bc8f8090677a" - integrity sha512-vHm7fkqXzjdfxifXvlmaZColoIfKuWmO+1rvdzDORTWP+A8Dq70cgKd2I1SBqxzDGjOasMzHbQI6f9MISQf2vQ== +"@material/chips@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/chips/-/chips-5.0.0.tgz#13d88fb7f319cc13782783917a57caebe52c1703" + integrity sha512-xDCnPPfVkGbixQUxO/EDQgbzCxscpMWe3/ewdVbBgTaHPqsFf+OBNqb7T3C+rLfCIqewQ0s+74fajCQUi/A11g== dependencies: + "@material/animation" "^5.0.0" + "@material/base" "^5.0.0" + "@material/checkbox" "^5.0.0" + "@material/density" "^5.0.0" + "@material/dom" "^5.0.0" + "@material/elevation" "^5.0.0" + "@material/feature-targeting" "^5.0.0" + "@material/ripple" "^5.0.0" + "@material/rtl" "^5.0.0" + "@material/shape" "^5.0.0" + "@material/theme" "^5.0.0" + "@material/touch-target" "^5.0.0" + "@material/typography" "^5.0.0" tslib "^1.9.3" -"@material/button@=4.0.0-canary.e851d4f40.0": - version "4.0.0-canary.e851d4f40.0" - resolved "https://registry.yarnpkg.com/@material/button/-/button-4.0.0-canary.e851d4f40.0.tgz#d21b037b573b7c2d5260496b2364281fbe65db9f" - integrity sha512-bdVVviEqZ1RUBAulyfij72hD7ct3TulKr8JE3Yr8IaZefCc0ijqdqkktoNOA2bX7MikT3CdauEP8DCG8WwYUig== +"@material/data-table@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-5.0.0.tgz#441f4bde8f4206273cbc304baf26d003cac4ea8d" + integrity sha512-h7GHVGwStqeBigkWrr+5/VWX6iqCG1eXWoD/my7YfBZzOOcJ3xvSfF+jNPchK0bRPSzX06jhaNRvGOmu3HCAzg== dependencies: - "@material/density" "^4.0.0-canary.e851d4f40.0" - "@material/elevation" "^4.0.0-canary.e851d4f40.0" - "@material/feature-targeting" "^4.0.0-canary.e851d4f40.0" - "@material/ripple" "^4.0.0-canary.e851d4f40.0" - "@material/rtl" "^4.0.0-canary.e851d4f40.0" - "@material/shape" "^4.0.0-canary.e851d4f40.0" - "@material/theme" "^4.0.0-canary.e851d4f40.0" - "@material/typography" "^4.0.0-canary.e851d4f40.0" - -"@material/checkbox@=4.0.0-canary.e851d4f40.0": - version "4.0.0-canary.e851d4f40.0" - resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-4.0.0-canary.e851d4f40.0.tgz#4f227fbd66dfc2088d927e23c222569b6c6685b9" - integrity sha512-VGzOOIOEPjAJyNXXGc62CDJbbduaAvKLs7s2FTZrSHXcGxl6wM8Nd7Hq7TVgresZFq9xA0hbncsbxAV86WbKYw== - dependencies: - "@material/animation" "^4.0.0-canary.e851d4f40.0" - "@material/base" "^4.0.0-canary.e851d4f40.0" - "@material/density" "^4.0.0-canary.e851d4f40.0" - "@material/dom" "^4.0.0-canary.e851d4f40.0" - "@material/feature-targeting" "^4.0.0-canary.e851d4f40.0" - "@material/ripple" "^4.0.0-canary.e851d4f40.0" - "@material/rtl" "^4.0.0-canary.e851d4f40.0" - "@material/theme" "^4.0.0-canary.e851d4f40.0" - tslib "^1.9.3" - -"@material/checkbox@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-3.2.0.tgz#168d4e16e160bec17948d06416935250fa10fac5" - integrity sha512-4XgQ4sM40j60n4RN43BxXtkFVvyFQgo/vc0W5hf9Qz2uwEah46Shg1nHMYZNvcNW+FXRm96gH8zz3qFgEf1ytA== - dependencies: - "@material/animation" "^3.1.0" - "@material/base" "^3.1.0" - "@material/dom" "^3.1.0" - "@material/feature-targeting" "^3.1.0" - "@material/ripple" "^3.2.0" - "@material/rtl" "^3.2.0" - "@material/theme" "^3.1.0" - tslib "^1.9.3" - -"@material/chips@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@material/chips/-/chips-3.2.0.tgz#29973a0b92b99f6d30fdcc086ec13f1a06d27663" - integrity sha512-XPm2RkqPFRog7hCMBTP4lM8AH9fqysXDMqf0ZomeJbFj4mkyalKsp45zrCR384gYjymwu99EHpcIs8L+gjVsrQ== - dependencies: - "@material/animation" "^3.1.0" - "@material/base" "^3.1.0" - "@material/checkbox" "^3.2.0" - "@material/elevation" "^3.1.0" - "@material/feature-targeting" "^3.1.0" - "@material/ripple" "^3.2.0" - "@material/shape" "^3.1.0" - "@material/theme" "^3.1.0" - "@material/typography" "^3.1.0" - tslib "^1.9.3" - -"@material/data-table@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-3.2.0.tgz#4751a83bc4f01252ba7aa908e78dd389f452ed83" - integrity sha512-67Bjo4B3kiB2zPEhd1OyHGWCNyQtoFTLNmOAPDFAxbmfaBquvjzAEYos2/cJpvzP8yUCIMJlOYaP0uvv94n2og== - dependencies: - "@material/animation" "^3.1.0" - "@material/base" "^3.1.0" - "@material/checkbox" "^3.2.0" - "@material/dom" "^3.1.0" - "@material/elevation" "^3.1.0" - "@material/feature-targeting" "^3.1.0" - "@material/ripple" "^3.2.0" - "@material/rtl" "^3.2.0" - "@material/shape" "^3.1.0" - "@material/theme" "^3.1.0" - "@material/typography" "^3.1.0" + "@material/animation" "^5.0.0" + "@material/base" "^5.0.0" + "@material/checkbox" "^5.0.0" + "@material/density" "^5.0.0" + "@material/dom" "^5.0.0" + "@material/elevation" "^5.0.0" + "@material/feature-targeting" "^5.0.0" + "@material/rtl" "^5.0.0" + "@material/shape" "^5.0.0" + "@material/theme" "^5.0.0" + "@material/typography" "^5.0.0" tslib "^1.10.0" -"@material/density@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/density/-/density-4.0.0.tgz#5bc4bba6c1232f6e075c88295357e6ebdee4353f" - integrity sha512-PuOCPCXlWjimTq+OuCS8biAb1JE9aXCZwT1dRG9REAIAK7bN8KeeTzkeJp6jTj+ggZjWphwKF0lKeX6Gv+e/lw== +"@material/density@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/density/-/density-5.0.0.tgz#643d9bd1a5d89b3985d48fd1d6572f73d05fb2e9" + integrity sha512-K2TnVrSjS7muxcy3gxKsYsCFlZI3qGbG39jPziqHUcnJKCpilspBHRiUvRDyLeUPO/0KbWHJmVjdVsQbgY61hg== -"@material/dialog@=4.0.0-canary.e851d4f40.0": - version "4.0.0-canary.e851d4f40.0" - resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-4.0.0-canary.e851d4f40.0.tgz#855840d4d307f921e8192c746a33c716204aa164" - integrity sha512-7OpHySKluZmJAt/S/wFiAttR2vcLDCDqURXNQ6z04JmUkZqyxI8zzoO+cAqYRTSUDbvGI9Ni3aeWFe4VRUCifQ== +"@material/dialog@=5.0.0-canary.a1a0deb3e.0", "@material/dialog@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-5.0.0.tgz#1b902ade3956d6ddc6d96c9d6bf261735a53ae17" + integrity sha512-9dZ++5v2LJR3dwWe3enBJ15HmZcUc/IdH3X4uKU8jfp6PjjkAA6s9+FDJEkw9cwOXb+m1fXPt/dkiy9yT46+ug== dependencies: - "@material/animation" "^4.0.0-canary.e851d4f40.0" - "@material/base" "^4.0.0-canary.e851d4f40.0" - "@material/dom" "^4.0.0-canary.e851d4f40.0" - "@material/elevation" "^4.0.0-canary.e851d4f40.0" - "@material/feature-targeting" "^4.0.0-canary.e851d4f40.0" - "@material/ripple" "^4.0.0-canary.e851d4f40.0" - "@material/rtl" "^4.0.0-canary.e851d4f40.0" - "@material/shape" "^4.0.0-canary.e851d4f40.0" - "@material/theme" "^4.0.0-canary.e851d4f40.0" - "@material/typography" "^4.0.0-canary.e851d4f40.0" - focus-trap "^5.0.0" + "@material/animation" "^5.0.0" + "@material/base" "^5.0.0" + "@material/button" "^5.0.0" + "@material/dom" "^5.0.0" + "@material/elevation" "^5.0.0" + "@material/feature-targeting" "^5.0.0" + "@material/ripple" "^5.0.0" + "@material/rtl" "^5.0.0" + "@material/shape" "^5.0.0" + "@material/theme" "^5.0.0" + "@material/touch-target" "^5.0.0" + "@material/typography" "^5.0.0" tslib "^1.9.3" -"@material/dom@=4.0.0-canary.e851d4f40.0": - version "4.0.0-canary.e851d4f40.0" - resolved "https://registry.yarnpkg.com/@material/dom/-/dom-4.0.0-canary.e851d4f40.0.tgz#52e7ff65c43c391702e23f93daa6a030b3bda019" - integrity sha512-6fSE4jckJ/rZ448wCmktdWX2RdPLTUUM67wWWPjPklt1JG/ZWMtgijqcgOTI4i0imJcVkV/buQNR56t5tkBFrA== +"@material/dom@=5.0.0-canary.a1a0deb3e.0", "@material/dom@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/dom/-/dom-5.0.0.tgz#966f7b9d8fd2c7fc176452bb355ce41f81444797" + integrity sha512-Mhpt3Ib5l5pYEUjmKQ/sXIcdVdJPhM+uhcqbXha4UgXmD+qc/GrmnDE9GDTQq/WJ3nBjs9O4nIFuqwQTmUQjmQ== dependencies: tslib "^1.9.3" -"@material/dom@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@material/dom/-/dom-3.1.0.tgz#1e58cad0cd5e1d9d6f6cb07422e327ad34a9d405" - integrity sha512-RtBLSkrBjMfHwknaGBifAIC8cBWF9pXjz2IYqfI2braB6SfQI4vhdJviwyiA5BmA/psn3cKpBUZbHI0ym0O0SQ== +"@material/elevation@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-5.0.0.tgz#ee61fc5b7e50714765a923a081d4d186cd478a3a" + integrity sha512-56TEn4L4mku8LN408PJfYpSW22RfyrtZbGwJDVXX+HXKg5Ubm7Y01E9xn+XXQHgSgJqww6IumGOncMwtsJ+MuA== dependencies: - tslib "^1.9.3" + "@material/animation" "^5.0.0" + "@material/base" "^5.0.0" + "@material/feature-targeting" "^5.0.0" + "@material/theme" "^5.0.0" -"@material/dom@^4.0.0", "@material/dom@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/dom/-/dom-4.0.0.tgz#f0e68c4429e555040304c958bb3e11614276fdfa" - integrity sha512-GRCJT9+PGWqygZwGf1XLTrbmzP35YWG7+T0hpfhoIJO8VDiMTeyfvhJXFuA2wh9pD0noEjte0lmbdBlykrbWZw== +"@material/fab@=5.0.0-canary.a1a0deb3e.0", "@material/fab@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/fab/-/fab-5.0.0.tgz#3b21801e07b5ec055a33a641d17786d8d468614b" + integrity sha512-4bRTTgYTRA1AINetsM6DPdTrOabA/MP1n0HgmyoNQ2koujVEZxpP5Aj/40tcJ0NdvsEAX8IlLZgfaeIpfxl0Lw== dependencies: - tslib "^1.9.3" + "@material/animation" "^5.0.0" + "@material/elevation" "^5.0.0" + "@material/feature-targeting" "^5.0.0" + "@material/ripple" "^5.0.0" + "@material/rtl" "^5.0.0" + "@material/shape" "^5.0.0" + "@material/theme" "^5.0.0" + "@material/touch-target" "^5.0.0" + "@material/typography" "^5.0.0" -"@material/elevation@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-3.1.0.tgz#2fcbde47653cc115519a39acc2d04b34e4cff12b" - integrity sha512-e45LqiG6LfbR1M52YkSLA7pQPeYJOuOVzLp27xy2072TnLuJexMxhEaG4O1novEIjsTtMjqfrfJ/koODU5vEew== +"@material/feature-targeting@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-5.0.0.tgz#5a6c392e61a1d96bf7082999b40c3298ef76cfc7" + integrity sha512-6XSuTdrjA7XNqEChpDI4+9aSNzoxvuaTFIAMykH7B9wpykvlINI972m9keVF5GW2+pIGmSIAtwv9z5L+sjnS1g== + +"@material/mwc-base@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@material/mwc-base/-/mwc-base-0.13.0.tgz#b2881c01333cca18a57cd2199b398416723321c6" + integrity sha512-r9TT6pz5JafRNaljwrDku/UifFNGl/htZ+o9NNfO8v+z/qqGMBFzz3xS2Neim27Qb5yiSS3uKrfdwWAymj8XDg== dependencies: - "@material/animation" "^3.1.0" - "@material/feature-targeting" "^3.1.0" - "@material/theme" "^3.1.0" - -"@material/elevation@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-4.0.0.tgz#58ba81c8c9efd0b5d3bfed7fa915d4930d814b97" - integrity sha512-wKffoZcqkwAMWYbfGJJ95RDeOFz/IMvF7ye4VamjUwLb1iPiKxUZKUcd40XpuEvsn794HSIEWfGDsRq7BxJAMQ== - dependencies: - "@material/animation" "^4.0.0" - "@material/feature-targeting" "^4.0.0" - "@material/theme" "^4.0.0" - -"@material/fab@=4.0.0-canary.e851d4f40.0": - version "4.0.0-canary.e851d4f40.0" - resolved "https://registry.yarnpkg.com/@material/fab/-/fab-4.0.0-canary.e851d4f40.0.tgz#c5d56bc7d9fade87716866599b199c29123520c3" - integrity sha512-9Zsbv92u7twg2RxCKQhoWwT94Ps772f6daK4uZeIqsMCYplEbR/955WxpmqXlU+htX5hT9bUP0VhWJDqXQTrNw== - dependencies: - "@material/animation" "^4.0.0-canary.e851d4f40.0" - "@material/elevation" "^4.0.0-canary.e851d4f40.0" - "@material/feature-targeting" "^4.0.0-canary.e851d4f40.0" - "@material/ripple" "^4.0.0-canary.e851d4f40.0" - "@material/rtl" "^4.0.0-canary.e851d4f40.0" - "@material/shape" "^4.0.0-canary.e851d4f40.0" - "@material/theme" "^4.0.0-canary.e851d4f40.0" - "@material/typography" "^4.0.0-canary.e851d4f40.0" - -"@material/feature-targeting@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-3.1.0.tgz#a6f6cacd1e0c9b60dc82f2f3bb2de8cfd472252b" - integrity sha512-aXAa1Pv6w32URacE9LfMsl9zI6hFwx1K0Lp3Xpyf4rAkmaAB6z0gOkhicOrVFc0f64YheJgHjE7hJFieVenQdw== - -"@material/feature-targeting@^4.0.0", "@material/feature-targeting@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-4.0.0.tgz#8d9d1470801a1fd166773731613d9fa89e0fd85e" - integrity sha512-0gk+f151vqmEdWkrQ9ocPlQRU9aUtSGsVBhletqIbsthLUsZIz9qk25FHjV1wHd/bGHknd9NH+T8ENprv3KLFg== - -"@material/mwc-base@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@material/mwc-base/-/mwc-base-0.10.0.tgz#00ce97e4df18f29b91838399761ded2102f27cdd" - integrity sha512-/zEKGsVKU8XYJ0w8xeaDamiNUap5daLoyadMD0icYfAqvUTDmv9Ick/5OTBLX7xxlUIOkuKIObhuY2nLi0rDPQ== - dependencies: - "@material/base" "=4.0.0-canary.e851d4f40.0" - "@material/dom" "=4.0.0-canary.e851d4f40.0" - "@material/ripple" "=4.0.0-canary.e851d4f40.0" + "@material/base" "=5.0.0-canary.a1a0deb3e.0" + "@material/dom" "=5.0.0-canary.a1a0deb3e.0" + "@material/ripple" "=5.0.0-canary.a1a0deb3e.0" lit-element "^2.2.1" tslib "^1.10.0" -"@material/mwc-button@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@material/mwc-button/-/mwc-button-0.10.0.tgz#6379bbe7fc2efd2bfaabf24a8fbf99a495589dd7" - integrity sha512-pCwxCUcR7IsAXZisvwATPG0pyKzo9fZeHCG6UFXxVTl8nMVAN7mtSdwFbtM3RE1AZIAUZwKZ9GzhA6C40NfSdA== +"@material/mwc-button@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@material/mwc-button/-/mwc-button-0.13.0.tgz#750da7b519663daaf42809cb7674e6b1372b614b" + integrity sha512-2ru+nkt9zHFZdtEBseba51BjPL3k1CHnn+px0YYy6o7CY5tJgJMysMVQL7L9cVbE0WyxVr59bgEN4lMedFi0/Q== dependencies: - "@material/button" "=4.0.0-canary.e851d4f40.0" - "@material/mwc-base" "^0.10.0" - "@material/mwc-icon" "^0.10.0" - "@material/mwc-ripple" "^0.10.0" + "@material/button" "=5.0.0-canary.a1a0deb3e.0" + "@material/mwc-base" "^0.13.0" + "@material/mwc-icon" "^0.13.0" + "@material/mwc-ripple" "^0.13.0" lit-element "^2.2.1" lit-html "^1.1.2" tslib "^1.10.0" -"@material/mwc-checkbox@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@material/mwc-checkbox/-/mwc-checkbox-0.10.0.tgz#95323b3acb8018915caf1204f4d9cfa72effad19" - integrity sha512-InaKWCruNt0laW+y0ZeYTncJnRMDnoSaOoPBZndeXFGGLRtlgxBgqhStsFnAu82TvGsT8kzak86KMvYpQ63aSw== +"@material/mwc-checkbox@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@material/mwc-checkbox/-/mwc-checkbox-0.13.0.tgz#45d63a8ee23664955267eb0bd8e9369e0f1d20f0" + integrity sha512-HCtTBos/iQqmukkNJggM4WWWmsZ4z4nm8VVNu+VxfMX0KYivIMfml6SZZZR/kT7MutRRn+E7TiROPV9aFIQvSA== dependencies: - "@material/checkbox" "=4.0.0-canary.e851d4f40.0" - "@material/mwc-base" "^0.10.0" - "@material/mwc-ripple" "^0.10.0" + "@material/checkbox" "=5.0.0-canary.a1a0deb3e.0" + "@material/mwc-base" "^0.13.0" + "@material/mwc-ripple" "^0.13.0" lit-element "^2.2.1" tslib "^1.10.0" -"@material/mwc-dialog@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@material/mwc-dialog/-/mwc-dialog-0.10.0.tgz#e186832b0f01072d8925500ccb9dde37dec4e88a" - integrity sha512-36f9I0Re4/6nQlruOjUtVpk7gwpqBOle1UIaNdmZ/rHuQItWrVo4+pLG6HsJik+a59/5tGg3+17KmohIGRMgCw== +"@material/mwc-dialog@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@material/mwc-dialog/-/mwc-dialog-0.13.0.tgz#290d37c7a1c455786001b4e8c23c57b5eea9b804" + integrity sha512-D2Blab0fuKvhpT90aKsDxPAdPmcaV/zqUoUHUqTHdZdifyFH0CJcAkrH1HzRjptEdXcPtfMSY3XT9TCIqcMUiQ== dependencies: - "@material/dialog" "=4.0.0-canary.e851d4f40.0" - "@material/dom" "=4.0.0-canary.e851d4f40.0" - "@material/mwc-base" "^0.10.0" - "@material/touch-target" "=4.0.0-canary.e851d4f40.0" + "@material/dialog" "=5.0.0-canary.a1a0deb3e.0" + "@material/dom" "=5.0.0-canary.a1a0deb3e.0" + "@material/mwc-base" "^0.13.0" + "@material/touch-target" "=5.0.0-canary.a1a0deb3e.0" blocking-elements "^0.1.0" lit-element "^2.2.1" lit-html "^1.1.2" tslib "^1.10.0" wicg-inert "^3.0.0" -"@material/mwc-fab@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@material/mwc-fab/-/mwc-fab-0.10.0.tgz#f94553e1b8a7ba3cde9c508f130b3df01defb32d" - integrity sha512-TrzIsdPxqz2M3tmzw6XjoVfUaJZbzmW2yTfL6/ADdHWqUubHPh8ng44Sv6uQag8x0jUZM6xI9lRwrHetgkuJUQ== +"@material/mwc-fab@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@material/mwc-fab/-/mwc-fab-0.13.0.tgz#42ac18dfe78f37153ab2a786eca2ff28ea58a563" + integrity sha512-wHTUkl8FQuXFw3WVAWuIESwj9GIGyzuBLYBsOVL+gUPTWBMI446GPl+MF7eidJ7MmevZmVAxXZCtJEwUG0/04Q== dependencies: - "@material/fab" "=4.0.0-canary.e851d4f40.0" - "@material/mwc-base" "^0.10.0" - "@material/mwc-icon" "^0.10.0" - "@material/mwc-ripple" "^0.10.0" + "@material/fab" "=5.0.0-canary.a1a0deb3e.0" + "@material/mwc-base" "^0.13.0" + "@material/mwc-icon" "^0.13.0" + "@material/mwc-ripple" "^0.13.0" lit-element "^2.2.1" lit-html "^1.1.2" tslib "^1.10.0" -"@material/mwc-icon@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@material/mwc-icon/-/mwc-icon-0.10.0.tgz#aa2995f0c49fddbf66aded47f51033de7c2bb624" - integrity sha512-iccXVkr8EyjfH0Yln99jyEB9a9fn26UVnWwvcplDhUKHaUL58Jvc9RKWXEqvHZ22d6BssvpAVv2uiKlYqDgr7w== +"@material/mwc-icon@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@material/mwc-icon/-/mwc-icon-0.13.0.tgz#3472caf99de1f28f5607a3ef56ad33c7a8dfe0bc" + integrity sha512-eqLb6xuuOvdLg+VuAI+RgWKfI45EMwAE5TtAS99CppTa1Ppex2Xvhz8oHXQyf47obvSX3oA3cDarZf2SOz0e0g== dependencies: - "@material/mwc-base" "^0.10.0" + "@material/mwc-base" "^0.13.0" lit-element "^2.2.1" tslib "^1.10.0" -"@material/mwc-ripple@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@material/mwc-ripple/-/mwc-ripple-0.10.0.tgz#b77005d8e884000c95ee7d2fb60427e1d39e1d04" - integrity sha512-EP+qQaTm3CTY8sin9m6n4NWLtReTOwhD3lwrmNuwHCTVtnzzUV3bUzl4J68tlJatJz+nXgvpz/3PWEGbngDgvQ== +"@material/mwc-ripple@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@material/mwc-ripple/-/mwc-ripple-0.13.0.tgz#f4089cfb30928af950a94bcc28128194d93e40b4" + integrity sha512-c4UWmoAkareL5BCcitJDw/H2+DafTgxw7XuRYQYw/WOPIXD3ILraBydHs/ukapgYa9lRCpP77mOBDTyAMZeEMA== dependencies: - "@material/dom" "=4.0.0-canary.e851d4f40.0" - "@material/mwc-base" "^0.10.0" - "@material/ripple" "=4.0.0-canary.e851d4f40.0" + "@material/dom" "=5.0.0-canary.a1a0deb3e.0" + "@material/mwc-base" "^0.13.0" + "@material/ripple" "=5.0.0-canary.a1a0deb3e.0" lit-element "^2.2.1" lit-html "^1.1.2" tslib "^1.10.0" -"@material/mwc-switch@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@material/mwc-switch/-/mwc-switch-0.10.0.tgz#789ba8ad9062db93121948cc34d38a277c25d996" - integrity sha512-0B+b8HOH+WPJkI8Qz3Oh+uU+vL7Bp5p5CrUAT3gOZ6D52s8ozF0k+ARqzkyIUoB0awl3fyAj2AfTFs2tjD7fZg== +"@material/mwc-switch@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@material/mwc-switch/-/mwc-switch-0.13.0.tgz#dc5f28c1df108c66b322c382793797da2468d120" + integrity sha512-Oi5GhVRCae690Ja6Bf5kzpj3qFYpY12YOu2jVjPm6fgNEQ1hBmjk+aPWvn6NyTE1sW5uYfBkASqUPnpnuFBAtw== dependencies: - "@material/mwc-base" "^0.10.0" - "@material/mwc-ripple" "^0.10.0" - "@material/switch" "=4.0.0-canary.e851d4f40.0" + "@material/mwc-base" "^0.13.0" + "@material/mwc-ripple" "^0.13.0" + "@material/switch" "=5.0.0-canary.a1a0deb3e.0" lit-element "^2.2.1" tslib "^1.10.0" -"@material/ripple@=4.0.0-canary.e851d4f40.0": - version "4.0.0-canary.e851d4f40.0" - resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-4.0.0-canary.e851d4f40.0.tgz#509e487066cb73f2d9f311c18c3b82a945a40ed8" - integrity sha512-NYiDfxea/L7pM9uA6h8FogOCWm7qDjUHzfzmR3nnGL0I2RCXOYuKkbpjqBhlarX3xBz8SKmq+3Jl/UEoc6C9Aw== +"@material/ripple@=5.0.0-canary.a1a0deb3e.0", "@material/ripple@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-5.0.0.tgz#78beaf2066806955b311195d30b116d32e719247" + integrity sha512-92kMA2FeXm/bX0vY/SH3DLtE88ARelxtjqZq01whzsqo3ngEiZDUqr0+tJ1WvsXSiJ50VI5mtz3wxjnd0hzhwA== dependencies: - "@material/animation" "^4.0.0-canary.e851d4f40.0" - "@material/base" "^4.0.0-canary.e851d4f40.0" - "@material/dom" "^4.0.0-canary.e851d4f40.0" - "@material/feature-targeting" "^4.0.0-canary.e851d4f40.0" - "@material/theme" "^4.0.0-canary.e851d4f40.0" + "@material/animation" "^5.0.0" + "@material/base" "^5.0.0" + "@material/dom" "^5.0.0" + "@material/feature-targeting" "^5.0.0" + "@material/theme" "^5.0.0" tslib "^1.9.3" -"@material/ripple@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-3.2.0.tgz#f4b714834b73b793b280024d4ebcca01018df3bd" - integrity sha512-GtwkfNakALmfGLs6TpdFIVeAWjRqbyT7WfEw9aU7elUokABfHES+O0KoSKQSMQiSQ8Vjl90MONzNsN1Evi/1YQ== +"@material/rtl@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-5.0.0.tgz#50b1b2d7b9df6d117d56ff7ede7f7802f321b123" + integrity sha512-TyZWiQc7wNWWCSl56rGSbkzxXGYq76gjtDA95P6SgEGxge6Pqe1d1o5Dl2dRaszESGGGSC/XTuMZaAYu7fk4Eg== + +"@material/shape@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/shape/-/shape-5.0.0.tgz#55974611adc6452e6091d23c06d7dec28f860e77" + integrity sha512-Qo3nzYfPtEBiU3ijseRDypbhMQroxws4OxwKiyyTeu8K/z1iGPNH2323S/LSmyUuLtkhLFvwAQM2N4ZPAxofRw== dependencies: - "@material/animation" "^3.1.0" - "@material/base" "^3.1.0" - "@material/dom" "^3.1.0" - "@material/feature-targeting" "^3.1.0" - "@material/theme" "^3.1.0" + "@material/feature-targeting" "^5.0.0" + "@material/rtl" "^5.0.0" + +"@material/switch@=5.0.0-canary.a1a0deb3e.0", "@material/switch@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/switch/-/switch-5.0.0.tgz#4e5cb4bda46ca17a5135b30bdd892d1c6e27fa0b" + integrity sha512-OFLOzdCp6a4NlL6tKbqf8/9Iniy+EjO3NT4i63y0xDPgIrBPxOgWUvxlpF2ysZNghx1QcMzwgsDp4oBRrVwMRg== + dependencies: + "@material/animation" "^5.0.0" + "@material/base" "^5.0.0" + "@material/density" "^5.0.0" + "@material/dom" "^5.0.0" + "@material/elevation" "^5.0.0" + "@material/feature-targeting" "^5.0.0" + "@material/ripple" "^5.0.0" + "@material/rtl" "^5.0.0" + "@material/theme" "^5.0.0" tslib "^1.9.3" -"@material/ripple@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-4.0.0.tgz#906ba421a3e6c68651d829d44c50a95060aa1e75" - integrity sha512-9BLIOvyCP5sM+fQpLlcJZWyrHguusJq8E5A1pxg0wQwputOyaPBM7recHhYkJmVjzRpTcPgf1PkvkpN6DKGcNg== +"@material/theme@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/theme/-/theme-5.0.0.tgz#ff8498d883b083f91f53d0d340e31c78ea34cc8d" + integrity sha512-YBHxiAvT2ACIQ2VM6zeZ4mhq+lgYFAxB0CUX54o7/mqO4E/uZzyzPsyU85KtCeNuEJCP+a0cxN/aqIgLF9/BRA== dependencies: - "@material/animation" "^4.0.0" - "@material/base" "^4.0.0" - "@material/dom" "^4.0.0" - "@material/feature-targeting" "^4.0.0" - "@material/theme" "^4.0.0" - tslib "^1.9.3" + "@material/feature-targeting" "^5.0.0" -"@material/rtl@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-3.2.0.tgz#0b2f7321463100674dfbf4507b54ccd052f05378" - integrity sha512-L/w9m9Yx1ceOw/VjEfeJoqD4rW9QP3IBb9MamXAg3qUi/zsztoXD/FUw179pxkLn4huFFNlVYZ4Y1y6BpM0PMA== - -"@material/rtl@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-4.0.0.tgz#bc07e0a7c47174b2542862c252b0e35b44329c47" - integrity sha512-AP8zByVDEWAJVJoxByVccUbH+BX24IeG7ol+L6Qd8JjzPpz1fzPVJ4BeDNaF0a6sXtHsRmj2zN5dsx/BGC3IHg== - -"@material/shape@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@material/shape/-/shape-3.1.0.tgz#7ccac6606d0ae45b779b3e52b8921c09c2b2f429" - integrity sha512-Oyvs7YjHfByA0e9IVVp7ojAlPwgSu3Bl0cioiE0OdkidkAaNu0izM2ryRzMBDH5o8+lRD0kpZoT+9CVVCdaYIg== +"@material/touch-target@=5.0.0-canary.a1a0deb3e.0", "@material/touch-target@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-5.0.0.tgz#ec7ce930550446d80b588f9bdbe883e3b7f15028" + integrity sha512-TtoalBYgUosHVG1kc+oai+MWvD5MknLg28mpXIx3IAqigVFpsnoAhy5o9Z3kgOqb+hqK7CP6UXVQsdbgzQrgfQ== dependencies: - "@material/feature-targeting" "^3.1.0" + "@material/base" "^5.0.0" + "@material/feature-targeting" "^5.0.0" -"@material/shape@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/shape/-/shape-4.0.0.tgz#ddf4dcbfd290d367f80b26014fee0a1f490dc3cb" - integrity sha512-wmr05YBrEL462QPiJ+t9xh5RqxzylXYo/8DVZnb/1WA9GZ6m38UK/8Awtip1cZAN34pzD/9p5AydyywlQVoI+g== +"@material/typography@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@material/typography/-/typography-5.0.0.tgz#afdab61aa548f51c5b95000262f46d183b66f5c9" + integrity sha512-8lBDc8LNjhN5NwRIpOHUNpNhMtWXYThb8FS8z477Omv1i2EbMeGWxg+nXHLFIQM4daym2qeeRc2YlfMVkBdd1w== dependencies: - "@material/feature-targeting" "^4.0.0" - -"@material/switch@=4.0.0-canary.e851d4f40.0": - version "4.0.0-canary.e851d4f40.0" - resolved "https://registry.yarnpkg.com/@material/switch/-/switch-4.0.0-canary.e851d4f40.0.tgz#29a0fc0c98f78c5771df9b80d9b1bfb270e4fff5" - integrity sha512-l8uROVIJEhInlxbQr/7FYsK+vWkvz6yCSgax4zqlsa8FqTkjE8M1+mJDrmPIDZJnt5tUTbWkQfg2ck89syzTbw== - dependencies: - "@material/animation" "^4.0.0-canary.e851d4f40.0" - "@material/base" "^4.0.0-canary.e851d4f40.0" - "@material/dom" "^4.0.0-canary.e851d4f40.0" - "@material/elevation" "^4.0.0-canary.e851d4f40.0" - "@material/feature-targeting" "^4.0.0-canary.e851d4f40.0" - "@material/ripple" "^4.0.0-canary.e851d4f40.0" - "@material/rtl" "^4.0.0-canary.e851d4f40.0" - "@material/theme" "^4.0.0-canary.e851d4f40.0" - tslib "^1.9.3" - -"@material/theme@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@material/theme/-/theme-3.1.0.tgz#d31147bbc9e20bdaa3e322c9e898e4fc98807d8c" - integrity sha512-N4JX+akOwg1faAvFvIEhDcwW4cZfUpwEn8lct6Vs3WczjLF6/KdIoLVaYh+eVl1bzfsoIuWvx56j0B1PjXZw9g== - dependencies: - "@material/feature-targeting" "^3.1.0" - -"@material/theme@^4.0.0", "@material/theme@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/theme/-/theme-4.0.0.tgz#8de388fcdbae20fd09b02a3bdef3049bf2f623a8" - integrity sha512-vS4G4rusJTatTH50kSYO1U3UGN8EY9kGRvPaFsEFKikJBOqcR6KWK9H9/wCLqqd6nDNifEj9H2sdWw1AV4NA6Q== - dependencies: - "@material/feature-targeting" "^4.0.0" - -"@material/touch-target@=4.0.0-canary.e851d4f40.0": - version "4.0.0-canary.e851d4f40.0" - resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-4.0.0-canary.e851d4f40.0.tgz#ebf711b5bdd0a97ec9fcb195eaca0d7d08179d9d" - integrity sha512-uU+K1Xc07II6iHekQir1XxNlBI0yT0b5bMz0EhED5xmS7FMZCn5wCc3QEEBQru4vOwTtl3LhckVfbxiXYRz1aw== - dependencies: - "@material/feature-targeting" "^4.0.0-canary.e851d4f40.0" - -"@material/typography@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@material/typography/-/typography-3.1.0.tgz#5a3aee31f49f6b8c87ebc91b77c5b896b280c492" - integrity sha512-aSNBQvVxIH1kORSYdLGuSTivx6oJ1MSOSTUAsUwhXPQLQlvbdFeZaqUp7xgn+EvRsHGRFhWk5YGuiBds9+7zQg== - dependencies: - "@material/feature-targeting" "^3.1.0" - -"@material/typography@^4.0.0-canary.e851d4f40.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@material/typography/-/typography-4.0.0.tgz#57be7ac8b819f2ae29d48c9443b113d2f5585ecc" - integrity sha512-lUG4yjG9fl1ryNX4OVnOmi+EjhiV4WsWcYt4yzffHrFg1RfKuCAV59j7TtmlMfZIkNDwqK5jvk3oOpTRDFpL8Q== - dependencies: - "@material/feature-targeting" "^4.0.0" + "@material/feature-targeting" "^5.0.0" "@mdi/svg@4.9.95": version "4.9.95" @@ -6779,14 +6684,6 @@ fn-name@~2.0.1: resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" integrity sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc= -focus-trap@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-5.1.0.tgz#64a0bfabd95c382103397dbc96bfef3a3cf8e5ad" - integrity sha512-CkB/nrO55069QAUjWFBpX6oc+9V90Qhgpe6fBWApzruMq5gnlh90Oo7iSSDK7pKiV5ugG6OY2AXM5mxcmL3lwQ== - dependencies: - tabbable "^4.0.0" - xtend "^4.0.1" - follow-redirects@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" @@ -12760,11 +12657,6 @@ synchronous-promise@^2.0.5: resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.7.tgz#3574b3d2fae86b145356a4b89103e1577f646fe3" integrity sha512-16GbgwTmFMYFyQMLvtQjvNWh30dsFe1cAW5Fg1wm5+dg84L9Pe36mftsIRU95/W2YsISxsz/xq4VB23sqpgb/A== -tabbable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-4.0.0.tgz#5bff1d1135df1482cf0f0206434f15eadbeb9261" - integrity sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ== - table-layout@^0.4.3: version "0.4.4" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-0.4.4.tgz#bc5398b2a05e58b67b05dd9238354b89ef27be0f" @@ -14336,11 +14228,6 @@ xss@^1.0.6: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - xtend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" From 7d37dc6cdeaf53b9fd3e4a973cf872dd0b589aaf Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 15 Feb 2020 01:08:44 +0100 Subject: [PATCH 16/31] Bump vaadin elements (#4878) --- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 531edba17d..68c073154d 100644 --- a/package.json +++ b/package.json @@ -70,8 +70,8 @@ "@polymer/paper-tooltip": "^3.0.1", "@polymer/polymer": "3.1.0", "@thomasloven/round-slider": "0.3.7", - "@vaadin/vaadin-combo-box": "^5.0.6", - "@vaadin/vaadin-date-picker": "^4.0.3", + "@vaadin/vaadin-combo-box": "^5.0.10", + "@vaadin/vaadin-date-picker": "^4.0.7", "@webcomponents/shadycss": "^1.9.0", "@webcomponents/webcomponentsjs": "^2.2.7", "chart.js": "~2.8.0", diff --git a/yarn.lock b/yarn.lock index 098c8a3a50..312109c75a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2580,10 +2580,10 @@ "@vaadin/vaadin-material-styles" "^1.2.0" "@vaadin/vaadin-themable-mixin" "^1.2.1" -"@vaadin/vaadin-combo-box@^5.0.6": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@vaadin/vaadin-combo-box/-/vaadin-combo-box-5.0.6.tgz#cb9973f941546b2069243c3be87d5375d74c0f85" - integrity sha512-05LjG2Uiv65t4pLTQL6V6tiWLR4JMcxI+yfMdH24Q2145Tpz18+8mFtFP6PeOE0S7h9QoFptbJCu+7/iy5xOcQ== +"@vaadin/vaadin-combo-box@^5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@vaadin/vaadin-combo-box/-/vaadin-combo-box-5.0.10.tgz#ed7876b26db83070c3b5e3a08e2624ebc5efcfea" + integrity sha512-+9RI1Rj1G8VOk8+CoGJunc0NKVgZij4FXkBtmCh2NFHpzk31eNUUp9/0KZZa9SPIJmYVGi0qpcIuABTCAHdiJQ== dependencies: "@polymer/iron-a11y-announcer" "^3.0.0" "@polymer/iron-a11y-keys-behavior" "^3.0.0" @@ -2606,10 +2606,10 @@ dependencies: "@polymer/polymer" "^3.0.0" -"@vaadin/vaadin-date-picker@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@vaadin/vaadin-date-picker/-/vaadin-date-picker-4.0.3.tgz#aa66f427e5ebed597745e03a3d41d602de26dcff" - integrity sha512-UGStIQ/4SQkyXPBdVKdgE0vtCUOCKXbXbxiOikZyQrOfAY9y+dHZhJh2KTdtZSVGIYHBKE/CbufjU0F3uUN37Q== +"@vaadin/vaadin-date-picker@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@vaadin/vaadin-date-picker/-/vaadin-date-picker-4.0.7.tgz#487b1ef56ba1dba5012d67969ba84d2d98e1b515" + integrity sha512-7FHB9/yAwJe9Im9JQOl2TNbkmEkQlM0ziMnZF6OiVKwd6SjNlmzZ+PaPQaiR7Q1OvJ7tOE5K2rtUDZNg18EzYg== dependencies: "@polymer/iron-a11y-announcer" "^3.0.0" "@polymer/iron-a11y-keys-behavior" "^3.0.0" From 2d018fff6c49498539821f0b90df625a8fe9c238 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sat, 15 Feb 2020 01:09:21 +0100 Subject: [PATCH 17/31] Update babel en disable ES5 builds on dev (#4876) --- build-scripts/babel.js | 1 + build-scripts/gulp/webpack.js | 2 +- package.json | 21 +- yarn.lock | 1220 ++++++++++++++++++--------------- 4 files changed, 667 insertions(+), 577 deletions(-) diff --git a/build-scripts/babel.js b/build-scripts/babel.js index f17e55b584..d6324be464 100644 --- a/build-scripts/babel.js +++ b/build-scripts/babel.js @@ -34,6 +34,7 @@ module.exports.babelLoaderConfig = ({ latestBuild }) => { }, ], "@babel/plugin-proposal-optional-chaining", + "@babel/plugin-proposal-nullish-coalescing-operator", [ require("@babel/plugin-proposal-decorators").default, { decoratorsBeforeExport: true }, diff --git a/build-scripts/gulp/webpack.js b/build-scripts/gulp/webpack.js index 46a114540b..b6730f699d 100644 --- a/build-scripts/gulp/webpack.js +++ b/build-scripts/gulp/webpack.js @@ -57,7 +57,7 @@ const handler = (done) => (err, stats) => { gulp.task("webpack-watch-app", () => { // we are not calling done, so this command will run forever - webpack(bothBuilds(createAppConfig, { isProdBuild: false })).watch( + webpack(createAppConfig({ isProdBuild: false, latestBuild: true })).watch( {}, handler() ); diff --git a/package.json b/package.json index 68c073154d..8336c0692c 100644 --- a/package.json +++ b/package.json @@ -109,16 +109,17 @@ "xss": "^1.0.6" }, "devDependencies": { - "@babel/core": "^7.7.4", - "@babel/plugin-external-helpers": "^7.7.4", - "@babel/plugin-proposal-class-properties": "^7.7.4", - "@babel/plugin-proposal-decorators": "^7.7.4", - "@babel/plugin-proposal-object-rest-spread": "^7.7.4", - "@babel/plugin-proposal-optional-chaining": "^7.7.4", - "@babel/plugin-syntax-dynamic-import": "^7.7.4", - "@babel/plugin-transform-react-jsx": "^7.7.4", - "@babel/preset-env": "^7.7.4", - "@babel/preset-typescript": "^7.7.4", + "@babel/core": "^7.8.4", + "@babel/plugin-external-helpers": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-react-jsx": "^7.8.3", + "@babel/preset-env": "^7.8.4", + "@babel/preset-typescript": "^7.8.3", "@types/chai": "^4.1.7", "@types/chromecast-caf-receiver": "^3.0.12", "@types/chromecast-caf-sender": "^1.0.1", diff --git a/yarn.lock b/yarn.lock index 312109c75a..ec59e6c0d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,6 +16,22 @@ dependencies: "@babel/highlight" "^7.0.0" +"@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + +"@babel/compat-data@^7.8.4": + version "7.8.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.5.tgz#d28ce872778c23551cbb9432fc68d28495b613b9" + integrity sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg== + dependencies: + browserslist "^4.8.5" + invariant "^2.2.4" + semver "^5.5.0" + "@babel/core@^7.0.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.0.tgz#9b00f73554edd67bebc86df8303ef678be3d7b48" @@ -36,20 +52,21 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.4.tgz#37e864532200cb6b50ee9a4045f5f817840166ab" - integrity sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ== +"@babel/core@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" + integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.4" - "@babel/helpers" "^7.7.4" - "@babel/parser" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.4" + "@babel/helpers" "^7.8.4" + "@babel/parser" "^7.8.4" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.4" + "@babel/types" "^7.8.3" convert-source-map "^1.7.0" debug "^4.1.0" + gensync "^1.0.0-beta.1" json5 "^2.1.0" lodash "^4.17.13" resolve "^1.3.2" @@ -78,12 +95,12 @@ source-map "^0.5.0" trim-right "^1.0.1" -"@babel/generator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369" - integrity sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg== +"@babel/generator@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e" + integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -95,12 +112,12 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-annotate-as-pure@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce" - integrity sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og== +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" "@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": version "7.1.0" @@ -110,20 +127,20 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" - integrity sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503" + integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-explode-assignable-expression" "^7.8.3" + "@babel/types" "^7.8.3" -"@babel/helper-builder-react-jsx@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz#da188d247508b65375b2c30cf59de187be6b0c66" - integrity sha512-kvbfHJNN9dg4rkEM4xn1s8d1/h6TYNvajy9L1wx4qLn9HFg0IkTsQi4rfBe92nxrPUFcMsHoMV+8rU7MJb3fCA== +"@babel/helper-builder-react-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6" + integrity sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" esutils "^2.0.0" "@babel/helper-call-delegate@^7.4.4": @@ -135,33 +152,44 @@ "@babel/traverse" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/helper-call-delegate@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801" - integrity sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA== +"@babel/helper-call-delegate@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692" + integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A== dependencies: - "@babel/helper-hoist-variables" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" -"@babel/helper-create-class-features-plugin@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d" - integrity sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA== +"@babel/helper-compilation-targets@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz#03d7ecd454b7ebe19a254f76617e61770aed2c88" + integrity sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg== dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-member-expression-to-functions" "^7.7.4" - "@babel/helper-optimise-call-expression" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/compat-data" "^7.8.4" + browserslist "^4.8.5" + invariant "^2.2.4" + levenary "^1.1.1" + semver "^5.5.0" -"@babel/helper-create-regexp-features-plugin@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz#6d5762359fd34f4da1500e4cff9955b5299aaf59" - integrity sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A== +"@babel/helper-create-class-features-plugin@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397" + integrity sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA== dependencies: - "@babel/helper-regex" "^7.4.4" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + +"@babel/helper-create-regexp-features-plugin@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79" + integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q== + dependencies: + "@babel/helper-regex" "^7.8.3" regexpu-core "^4.6.0" "@babel/helper-define-map@^7.5.5": @@ -173,13 +201,13 @@ "@babel/types" "^7.5.5" lodash "^4.17.13" -"@babel/helper-define-map@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz#2841bf92eb8bd9c906851546fe6b9d45e162f176" - integrity sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg== +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" lodash "^4.17.13" "@babel/helper-explode-assignable-expression@^7.1.0": @@ -190,13 +218,13 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-explode-assignable-expression@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84" - integrity sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg== +"@babel/helper-explode-assignable-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982" + integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw== dependencies: - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" "@babel/helper-function-name@^7.1.0": version "7.1.0" @@ -207,14 +235,14 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-function-name@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz#ab6e041e7135d436d8f0a3eca15de5b67a341a2e" - integrity sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ== +"@babel/helper-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" + integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== dependencies: - "@babel/helper-get-function-arity" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" @@ -223,12 +251,12 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-get-function-arity@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz#cb46348d2f8808e632f0ab048172130e636005f0" - integrity sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA== +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" "@babel/helper-hoist-variables@^7.4.4": version "7.4.4" @@ -237,12 +265,12 @@ dependencies: "@babel/types" "^7.4.4" -"@babel/helper-hoist-variables@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz#612384e3d823fdfaaf9fce31550fe5d4db0f3d12" - integrity sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ== +"@babel/helper-hoist-variables@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134" + integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" "@babel/helper-member-expression-to-functions@^7.5.5": version "7.5.5" @@ -251,12 +279,12 @@ dependencies: "@babel/types" "^7.5.5" -"@babel/helper-member-expression-to-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" - integrity sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw== +"@babel/helper-member-expression-to-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" + integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" "@babel/helper-module-imports@^7.0.0": version "7.0.0" @@ -265,12 +293,12 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-module-imports@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" - integrity sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ== +"@babel/helper-module-imports@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" + integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" "@babel/helper-module-transforms@^7.1.0": version "7.5.5" @@ -284,16 +312,16 @@ "@babel/types" "^7.5.5" lodash "^4.17.13" -"@babel/helper-module-transforms@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.4.tgz#8d7cdb1e1f8ea3d8c38b067345924ac4f8e0879a" - integrity sha512-ehGBu4mXrhs0FxAqN8tWkzF8GSIGAiEumu4ONZ/hD9M88uHcD+Yu2ttKfOCgwzoesJOJrtQh7trI5YPbRtMmnA== +"@babel/helper-module-transforms@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590" + integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q== dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-simple-access" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" lodash "^4.17.13" "@babel/helper-optimise-call-expression@^7.0.0": @@ -303,18 +331,23 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-optimise-call-expression@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" - integrity sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg== +"@babel/helper-optimise-call-expression@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" + integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== +"@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" + integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== + "@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.5.5.tgz#0aa6824f7100a2e0e89c1527c23936c152cab351" @@ -322,6 +355,13 @@ dependencies: lodash "^4.17.13" +"@babel/helper-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965" + integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ== + dependencies: + lodash "^4.17.13" + "@babel/helper-remap-async-to-generator@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" @@ -333,16 +373,16 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-remap-async-to-generator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz#c68c2407350d9af0e061ed6726afb4fff16d0234" - integrity sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw== +"@babel/helper-remap-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86" + integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA== dependencies: - "@babel/helper-annotate-as-pure" "^7.7.4" - "@babel/helper-wrap-function" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-wrap-function" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" "@babel/helper-replace-supers@^7.5.5": version "7.5.5" @@ -354,15 +394,15 @@ "@babel/traverse" "^7.5.5" "@babel/types" "^7.5.5" -"@babel/helper-replace-supers@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" - integrity sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg== +"@babel/helper-replace-supers@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc" + integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA== dependencies: - "@babel/helper-member-expression-to-functions" "^7.7.4" - "@babel/helper-optimise-call-expression" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-member-expression-to-functions" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" "@babel/helper-simple-access@^7.1.0": version "7.1.0" @@ -372,13 +412,13 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-simple-access@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" - integrity sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A== +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== dependencies: - "@babel/template" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" "@babel/helper-split-export-declaration@^7.4.4": version "7.4.4" @@ -387,12 +427,12 @@ dependencies: "@babel/types" "^7.4.4" -"@babel/helper-split-export-declaration@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" - integrity sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug== +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== dependencies: - "@babel/types" "^7.7.4" + "@babel/types" "^7.8.3" "@babel/helper-wrap-function@^7.1.0": version "7.2.0" @@ -404,15 +444,15 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helper-wrap-function@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz#37ab7fed5150e22d9d7266e830072c0cdd8baace" - integrity sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg== +"@babel/helper-wrap-function@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610" + integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ== dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/helper-function-name" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.3" + "@babel/types" "^7.8.3" "@babel/helpers@^7.6.0": version "7.6.0" @@ -423,14 +463,14 @@ "@babel/traverse" "^7.6.0" "@babel/types" "^7.6.0" -"@babel/helpers@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" - integrity sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg== +"@babel/helpers@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" + integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== dependencies: - "@babel/template" "^7.7.4" - "@babel/traverse" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/template" "^7.8.3" + "@babel/traverse" "^7.8.4" + "@babel/types" "^7.8.3" "@babel/highlight@^7.0.0": version "7.0.0" @@ -441,15 +481,24 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@babel/highlight@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" + integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + "@babel/parser@^7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.0.tgz#3e05d0647432a8326cb28d0de03895ae5a57f39b" integrity sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ== -"@babel/parser@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb" - integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g== +"@babel/parser@^7.8.3", "@babel/parser@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" + integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== "@babel/plugin-external-helpers@^7.0.0": version "7.2.0" @@ -458,12 +507,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-external-helpers@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.7.4.tgz#8aa7aa402f0e2ecb924611cbf30942a497dfd17e" - integrity sha512-RVGNajLaFlknbZLutaP/uv7Q+xmVs2LMlEWFXbcjLnwtBdPqAVpV3nzYIAJqri/VjJCUrhG5nALijtg0aND+XA== +"@babel/plugin-external-helpers@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.8.3.tgz#5a94164d9af393b2820a3cdc407e28ebf237de4b" + integrity sha512-mx0WXDDiIl5DwzMtzWGRSPugXi9BxROS05GQrhLNbEamhBiicgn994ibwkyiBH+6png7bm/yA7AUsvHyCXi4Vw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.2.0" @@ -474,47 +523,55 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-async-generator-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" - integrity sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw== +"@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f" + integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.4" - "@babel/plugin-syntax-async-generators" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz#2f964f0cb18b948450362742e33e15211e77c2ba" - integrity sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw== +"@babel/plugin-proposal-class-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" + integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-proposal-decorators@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.4.tgz#58c1e21d21ea12f9f5f0a757e46e687b94a7ab2b" - integrity sha512-GftcVDcLCwVdzKmwOBDjATd548+IE+mBo7ttgatqNDR7VG7GqIuZPtRWlMLHbhTXhcnFZiGER8iIYl1n/imtsg== +"@babel/plugin-proposal-decorators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e" + integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-decorators" "^7.7.4" + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-decorators" "^7.8.3" -"@babel/plugin-proposal-dynamic-import@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d" - integrity sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ== +"@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054" + integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-json-strings@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz#7700a6bfda771d8dc81973249eac416c6b4c697d" - integrity sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw== +"@babel/plugin-proposal-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b" + integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-json-strings" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" + integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" "@babel/plugin-proposal-object-rest-spread@^7.0.0": version "7.5.5" @@ -524,37 +581,37 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71" - integrity sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ== +"@babel/plugin-proposal-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb" + integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" -"@babel/plugin-proposal-optional-catch-binding@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz#ec21e8aeb09ec6711bc0a39ca49520abee1de379" - integrity sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w== +"@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9" + integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.4.tgz#3f04c2de1a942cbd3008324df8144b9cbc0ca0ba" - integrity sha512-JmgaS+ygAWDR/STPe3/7y0lNlHgS+19qZ9aC06nYLwQ/XB7c0q5Xs+ksFU3EDnp9EiEsO0dnRAOKeyLHTZuW3A== +"@babel/plugin-proposal-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" + integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-optional-chaining" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-unicode-property-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz#7c239ccaf09470dbe1d453d50057460e84517ebb" - integrity sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA== +"@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f" + integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-async-generators@^7.0.0", "@babel/plugin-syntax-async-generators@^7.2.0": version "7.2.0" @@ -563,19 +620,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-async-generators@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz#331aaf310a10c80c44a66b238b6e49132bd3c889" - integrity sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g== +"@babel/plugin-syntax-async-generators@^7.8.0": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-decorators@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.7.4.tgz#3c91cfee2a111663ff3ac21b851140f5a52a4e0b" - integrity sha512-0oNLWNH4k5ZbBVfAwiTU53rKFWIeTh6ZlaWOXWJc4ywxs0tjz5fc3uZ6jKAnZSxN98eXVgg7bJIuzjX+3SXY+A== +"@babel/plugin-syntax-decorators@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda" + integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-dynamic-import@^7.0.0": version "7.2.0" @@ -584,12 +641,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-dynamic-import@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz#29ca3b4415abfe4a5ec381e903862ad1a54c3aec" - integrity sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg== +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-import-meta@^7.0.0": version "7.2.0" @@ -598,19 +655,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-json-strings@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc" - integrity sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg== +"@babel/plugin-syntax-json-strings@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz#dab2b56a36fb6c3c222a1fbc71f7bf97f327a9ec" - integrity sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg== +"@babel/plugin-syntax-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" + integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": version "7.2.0" @@ -619,40 +683,40 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-object-rest-spread@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" - integrity sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg== +"@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-catch-binding@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz#a3e38f59f4b6233867b4a92dcb0ee05b2c334aa6" - integrity sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ== +"@babel/plugin-syntax-optional-catch-binding@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.7.4.tgz#c91fdde6de85d2eb8906daea7b21944c3610c901" - integrity sha512-2MqYD5WjZSbJdUagnJvIdSfkb/ucOC9/1fRJxm7GAxY6YQLWlUvkfxoNbUPcPLHJyetKUDQ4+yyuUyAoc0HriA== +"@babel/plugin-syntax-optional-chaining@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" - integrity sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg== +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391" + integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-typescript@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.7.4.tgz#5d037ffa10f3b25a16f32570ebbe7a8c2efa304b" - integrity sha512-77blgY18Hud4NM1ggTA8xVT/dBENQf17OpiToSa2jSmEY3fWXD2jwrdVlO4kq5yzUTeF15WSQ6b4fByNvJcjpQ== +"@babel/plugin-syntax-typescript@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz#c1f659dda97711a569cef75275f7e15dcaa6cabc" + integrity sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-arrow-functions@^7.0.0": version "7.2.0" @@ -661,12 +725,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-arrow-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz#76309bd578addd8aee3b379d809c802305a98a12" - integrity sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA== +"@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-async-to-generator@^7.0.0": version "7.5.0" @@ -677,14 +741,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.1.0" -"@babel/plugin-transform-async-to-generator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz#694cbeae6d613a34ef0292713fa42fb45c4470ba" - integrity sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg== +"@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086" + integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ== dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.7.4" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-remap-async-to-generator" "^7.8.3" "@babel/plugin-transform-block-scoped-functions@^7.0.0": version "7.2.0" @@ -693,12 +757,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoped-functions@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" - integrity sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ== +"@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-block-scoping@^7.0.0": version "7.6.0" @@ -708,12 +772,12 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" -"@babel/plugin-transform-block-scoping@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" - integrity sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg== +"@babel/plugin-transform-block-scoping@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a" + integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" lodash "^4.17.13" "@babel/plugin-transform-classes@^7.0.0": @@ -730,18 +794,18 @@ "@babel/helper-split-export-declaration" "^7.4.4" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" - integrity sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg== +"@babel/plugin-transform-classes@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8" + integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w== dependencies: - "@babel/helper-annotate-as-pure" "^7.7.4" - "@babel/helper-define-map" "^7.7.4" - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-optimise-call-expression" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.0.0": @@ -751,12 +815,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-computed-properties@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" - integrity sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ== +"@babel/plugin-transform-computed-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-destructuring@^7.0.0": version "7.6.0" @@ -765,20 +829,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" - integrity sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA== +"@babel/plugin-transform-destructuring@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b" + integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-dotall-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz#f7ccda61118c5b7a2599a72d5e3210884a021e96" - integrity sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw== +"@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e" + integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-duplicate-keys@^7.0.0": version "7.5.0" @@ -787,12 +851,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-duplicate-keys@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz#3d21731a42e3f598a73835299dd0169c3b90ac91" - integrity sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA== +"@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1" + integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-exponentiation-operator@^7.0.0": version "7.2.0" @@ -802,13 +866,13 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-exponentiation-operator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz#dd30c0191e3a1ba19bcc7e389bdfddc0729d5db9" - integrity sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ== +"@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7" + integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-for-of@^7.0.0": version "7.4.4" @@ -817,12 +881,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-for-of@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc" - integrity sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA== +"@babel/plugin-transform-for-of@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz#6fe8eae5d6875086ee185dd0b098a8513783b47d" + integrity sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-function-name@^7.0.0": version "7.4.4" @@ -832,13 +896,13 @@ "@babel/helper-function-name" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" - integrity sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g== +"@babel/plugin-transform-function-name@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-instanceof@^7.0.0": version "7.2.0" @@ -854,19 +918,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" - integrity sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw== +"@babel/plugin-transform-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-member-expression-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" - integrity sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA== +"@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-modules-amd@^7.0.0": version "7.5.0" @@ -877,55 +941,56 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-amd@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz#276b3845ca2b228f2995e453adc2e6f54d72fb71" - integrity sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ== +"@babel/plugin-transform-modules-amd@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5" + integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ== dependencies: - "@babel/helper-module-transforms" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz#bee4386e550446343dd52a571eda47851ff857a3" - integrity sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA== +"@babel/plugin-transform-modules-commonjs@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5" + integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg== dependencies: - "@babel/helper-module-transforms" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.7.4" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz#cd98152339d3e763dfe838b7d4273edaf520bb30" - integrity sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw== +"@babel/plugin-transform-modules-systemjs@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420" + integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg== dependencies: - "@babel/helper-hoist-variables" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-hoist-variables" "^7.8.3" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-umd@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz#1027c355a118de0aae9fee00ad7813c584d9061f" - integrity sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw== +"@babel/plugin-transform-modules-umd@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a" + integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw== dependencies: - "@babel/helper-module-transforms" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-module-transforms" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-named-capturing-groups-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz#fb3bcc4ee4198e7385805007373d6b6f42c98220" - integrity sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c" + integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" + "@babel/helper-create-regexp-features-plugin" "^7.8.3" -"@babel/plugin-transform-new-target@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz#4a0753d2d60639437be07b592a9e58ee00720167" - integrity sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg== +"@babel/plugin-transform-new-target@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43" + integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-object-super@^7.0.0": version "7.5.5" @@ -935,13 +1000,13 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.5.5" -"@babel/plugin-transform-object-super@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" - integrity sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg== +"@babel/plugin-transform-object-super@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" "@babel/plugin-transform-parameters@^7.0.0": version "7.4.4" @@ -952,30 +1017,30 @@ "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-parameters@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz#da4555c97f39b51ac089d31c7380f03bca4075ce" - integrity sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw== +"@babel/plugin-transform-parameters@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz#1d5155de0b65db0ccf9971165745d3bb990d77d3" + integrity sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA== dependencies: - "@babel/helper-call-delegate" "^7.7.4" - "@babel/helper-get-function-arity" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-call-delegate" "^7.8.3" + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-property-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" - integrity sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ== +"@babel/plugin-transform-property-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-jsx@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.4.tgz#d91205717fae4e2f84d020cd3057ec02a10f11da" - integrity sha512-LixU4BS95ZTEAZdPaIuyg/k8FiiqN9laQ0dMHB4MlpydHY53uQdWCUrwjLr5o6ilS6fAgZey4Q14XBjl5tL6xw== +"@babel/plugin-transform-react-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz#4220349c0390fdefa505365f68c103562ab2fc4a" + integrity sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g== dependencies: - "@babel/helper-builder-react-jsx" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.7.4" + "@babel/helper-builder-react-jsx" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" "@babel/plugin-transform-regenerator@^7.0.0": version "7.4.5" @@ -984,19 +1049,19 @@ dependencies: regenerator-transform "^0.14.0" -"@babel/plugin-transform-regenerator@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz#d18eac0312a70152d7d914cbed2dc3999601cfc0" - integrity sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw== +"@babel/plugin-transform-regenerator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8" + integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA== dependencies: regenerator-transform "^0.14.0" -"@babel/plugin-transform-reserved-words@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz#6a7cf123ad175bb5c69aec8f6f0770387ed3f1eb" - integrity sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ== +"@babel/plugin-transform-reserved-words@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5" + integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-shorthand-properties@^7.0.0": version "7.2.0" @@ -1005,12 +1070,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-shorthand-properties@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" - integrity sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q== +"@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-spread@^7.0.0": version "7.2.2" @@ -1019,12 +1084,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-spread@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" - integrity sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q== +"@babel/plugin-transform-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8" + integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-sticky-regex@^7.0.0": version "7.2.0" @@ -1034,13 +1099,13 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" -"@babel/plugin-transform-sticky-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz#ffb68c05090c30732076b1285dc1401b404a123c" - integrity sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A== +"@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100" + integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-regex" "^7.8.3" "@babel/plugin-transform-template-literals@^7.0.0": version "7.4.4" @@ -1050,13 +1115,13 @@ "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-template-literals@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" - integrity sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ== +"@babel/plugin-transform-template-literals@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-typeof-symbol@^7.0.0": version "7.2.0" @@ -1065,21 +1130,21 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typeof-symbol@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz#3174626214f2d6de322882e498a38e8371b2140e" - integrity sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg== +"@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412" + integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-typescript@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.4.tgz#2974fd05f4e85c695acaf497f432342de9fc0636" - integrity sha512-X8e3tcPEKnwwPVG+vP/vSqEShkwODOEeyQGod82qrIuidwIrfnsGn11qPM1jBLF4MqguTXXYzm58d0dY+/wdpg== +"@babel/plugin-transform-typescript@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz#be6f01a7ef423be68e65ace1f04fc407e6d88917" + integrity sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript" "^7.7.4" + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-typescript" "^7.8.3" "@babel/plugin-transform-unicode-regex@^7.0.0": version "7.4.4" @@ -1090,78 +1155,84 @@ "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" -"@babel/plugin-transform-unicode-regex@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" - integrity sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw== +"@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" + integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-create-regexp-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/preset-env@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.4.tgz#ccaf309ae8d1ee2409c85a4e2b5e280ceee830f8" - integrity sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g== +"@babel/preset-env@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.4.tgz#9dac6df5f423015d3d49b6e9e5fa3413e4a72c4e" + integrity sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w== dependencies: - "@babel/helper-module-imports" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-async-generator-functions" "^7.7.4" - "@babel/plugin-proposal-dynamic-import" "^7.7.4" - "@babel/plugin-proposal-json-strings" "^7.7.4" - "@babel/plugin-proposal-object-rest-spread" "^7.7.4" - "@babel/plugin-proposal-optional-catch-binding" "^7.7.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.7.4" - "@babel/plugin-syntax-async-generators" "^7.7.4" - "@babel/plugin-syntax-dynamic-import" "^7.7.4" - "@babel/plugin-syntax-json-strings" "^7.7.4" - "@babel/plugin-syntax-object-rest-spread" "^7.7.4" - "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" - "@babel/plugin-syntax-top-level-await" "^7.7.4" - "@babel/plugin-transform-arrow-functions" "^7.7.4" - "@babel/plugin-transform-async-to-generator" "^7.7.4" - "@babel/plugin-transform-block-scoped-functions" "^7.7.4" - "@babel/plugin-transform-block-scoping" "^7.7.4" - "@babel/plugin-transform-classes" "^7.7.4" - "@babel/plugin-transform-computed-properties" "^7.7.4" - "@babel/plugin-transform-destructuring" "^7.7.4" - "@babel/plugin-transform-dotall-regex" "^7.7.4" - "@babel/plugin-transform-duplicate-keys" "^7.7.4" - "@babel/plugin-transform-exponentiation-operator" "^7.7.4" - "@babel/plugin-transform-for-of" "^7.7.4" - "@babel/plugin-transform-function-name" "^7.7.4" - "@babel/plugin-transform-literals" "^7.7.4" - "@babel/plugin-transform-member-expression-literals" "^7.7.4" - "@babel/plugin-transform-modules-amd" "^7.7.4" - "@babel/plugin-transform-modules-commonjs" "^7.7.4" - "@babel/plugin-transform-modules-systemjs" "^7.7.4" - "@babel/plugin-transform-modules-umd" "^7.7.4" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4" - "@babel/plugin-transform-new-target" "^7.7.4" - "@babel/plugin-transform-object-super" "^7.7.4" - "@babel/plugin-transform-parameters" "^7.7.4" - "@babel/plugin-transform-property-literals" "^7.7.4" - "@babel/plugin-transform-regenerator" "^7.7.4" - "@babel/plugin-transform-reserved-words" "^7.7.4" - "@babel/plugin-transform-shorthand-properties" "^7.7.4" - "@babel/plugin-transform-spread" "^7.7.4" - "@babel/plugin-transform-sticky-regex" "^7.7.4" - "@babel/plugin-transform-template-literals" "^7.7.4" - "@babel/plugin-transform-typeof-symbol" "^7.7.4" - "@babel/plugin-transform-unicode-regex" "^7.7.4" - "@babel/types" "^7.7.4" - browserslist "^4.6.0" - core-js-compat "^3.1.1" + "@babel/compat-data" "^7.8.4" + "@babel/helper-compilation-targets" "^7.8.4" + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-proposal-async-generator-functions" "^7.8.3" + "@babel/plugin-proposal-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-json-strings" "^7.8.3" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-object-rest-spread" "^7.8.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-transform-arrow-functions" "^7.8.3" + "@babel/plugin-transform-async-to-generator" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions" "^7.8.3" + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@babel/plugin-transform-classes" "^7.8.3" + "@babel/plugin-transform-computed-properties" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-dotall-regex" "^7.8.3" + "@babel/plugin-transform-duplicate-keys" "^7.8.3" + "@babel/plugin-transform-exponentiation-operator" "^7.8.3" + "@babel/plugin-transform-for-of" "^7.8.4" + "@babel/plugin-transform-function-name" "^7.8.3" + "@babel/plugin-transform-literals" "^7.8.3" + "@babel/plugin-transform-member-expression-literals" "^7.8.3" + "@babel/plugin-transform-modules-amd" "^7.8.3" + "@babel/plugin-transform-modules-commonjs" "^7.8.3" + "@babel/plugin-transform-modules-systemjs" "^7.8.3" + "@babel/plugin-transform-modules-umd" "^7.8.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" + "@babel/plugin-transform-new-target" "^7.8.3" + "@babel/plugin-transform-object-super" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.8.4" + "@babel/plugin-transform-property-literals" "^7.8.3" + "@babel/plugin-transform-regenerator" "^7.8.3" + "@babel/plugin-transform-reserved-words" "^7.8.3" + "@babel/plugin-transform-shorthand-properties" "^7.8.3" + "@babel/plugin-transform-spread" "^7.8.3" + "@babel/plugin-transform-sticky-regex" "^7.8.3" + "@babel/plugin-transform-template-literals" "^7.8.3" + "@babel/plugin-transform-typeof-symbol" "^7.8.4" + "@babel/plugin-transform-unicode-regex" "^7.8.3" + "@babel/types" "^7.8.3" + browserslist "^4.8.5" + core-js-compat "^3.6.2" invariant "^2.2.2" - js-levenshtein "^1.1.3" + levenary "^1.1.1" semver "^5.5.0" -"@babel/preset-typescript@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.7.4.tgz#780059a78e6fa7f7a4c87f027292a86b31ce080a" - integrity sha512-rqrjxfdiHPsnuPur0jKrIIGQCIgoTWMTjlbWE69G4QJ6TIOVnnRnIJhUxNTL/VwDmEAVX08Tq3B1nirer5341w== +"@babel/preset-typescript@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz#90af8690121beecd9a75d0cc26c6be39d1595d13" + integrity sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.7.4" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-typescript" "^7.8.3" "@babel/runtime@7.0.0": version "7.0.0" @@ -1186,14 +1257,14 @@ "@babel/parser" "^7.6.0" "@babel/types" "^7.6.0" -"@babel/template@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" - integrity sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw== +"@babel/template@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" + integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.3" + "@babel/types" "^7.8.3" "@babel/traverse@^7.0.0", "@babel/traverse@^7.0.0-beta.42", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.0": version "7.6.0" @@ -1210,17 +1281,17 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/traverse@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.4.tgz#9c1e7c60fb679fe4fcfaa42500833333c2058558" - integrity sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw== +"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c" + integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg== dependencies: - "@babel/code-frame" "^7.5.5" - "@babel/generator" "^7.7.4" - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - "@babel/parser" "^7.7.4" - "@babel/types" "^7.7.4" + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.8.4" + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.8.4" + "@babel/types" "^7.8.3" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" @@ -1243,10 +1314,10 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193" - integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA== +"@babel/types@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -4121,14 +4192,14 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.6.0, browserslist@^4.6.6: - version "4.7.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17" - integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== +browserslist@^4.8.3, browserslist@^4.8.5: + version "4.8.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.7.tgz#ec8301ff415e6a42c949d0e66b405eb539c532d0" + integrity sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA== dependencies: - caniuse-lite "^1.0.30000989" - electron-to-chromium "^1.3.247" - node-releases "^1.1.29" + caniuse-lite "^1.0.30001027" + electron-to-chromium "^1.3.349" + node-releases "^1.1.49" browserstack@^1.2.0: version "1.5.2" @@ -4353,10 +4424,10 @@ cancel-token@^0.1.1: dependencies: "@types/node" "^4.0.30" -caniuse-lite@^1.0.30000989: - version "1.0.30000989" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" - integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== +caniuse-lite@^1.0.30001027: + version "1.0.30001027" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001027.tgz#283e2ef17d94889cc216a22c6f85303d78ca852d" + integrity sha512-7xvKeErvXZFtUItTHgNtLgS9RJpVnwBlWX8jSo/BO8VsF6deszemZSkJJJA1KOKrXuzZH4WALpAJdq5EyfgMLg== capture-stack-trace@^1.0.0: version "1.0.1" @@ -5005,13 +5076,13 @@ copy-webpack-plugin@^5.0.2: serialize-javascript "^1.4.0" webpack-log "^2.0.0" -core-js-compat@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150" - integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A== +core-js-compat@^3.6.2: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" + integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== dependencies: - browserslist "^4.6.6" - semver "^6.3.0" + browserslist "^4.8.3" + semver "7.0.0" core-js@^2.4.0: version "2.6.5" @@ -5697,10 +5768,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.247: - version "1.3.264" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.264.tgz#ed837f44524d0601a7b2b7b6efd86e35753d0e27" - integrity sha512-z8E7WkrrquCuGYv+kKyybuZIbdms+4PeHp7Zm2uIgEhAigP0bOwqXILItwj0YO73o+QyHY/7XtEfP5DsHOWQgQ== +electron-to-chromium@^1.3.349: + version "1.3.349" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.349.tgz#663f26a69d348a462df47b4d7ab162a2f29bbcb7" + integrity sha512-uEb2zs6EJ6OZIqaMsCSliYVgzE/f7/s1fLWqtvRtHg/v5KBF2xds974fUnyatfxIDgkqzQVwFtam5KExqywx0Q== elegant-spinner@^1.0.1: version "1.0.1" @@ -6870,6 +6941,11 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -8312,11 +8388,6 @@ joi@^14.3.1: isemail "3.x.x" topo "3.x.x" -js-levenshtein@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -8575,6 +8646,18 @@ leaflet@^1.4.0: resolved "https://registry.yarnpkg.com/leaflet/-/leaflet-1.4.0.tgz#d5f56eeb2aa32787c24011e8be4c77e362ae171b" integrity sha512-x9j9tGY1+PDLN9pcWTx9/y6C5nezoTMB8BLK5jTakx+H7bPlnbCHfi9Hjg+Qt36sgDz/cb9lrSpNQXmk45Tvhw== +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -9833,12 +9916,12 @@ node-pre-gyp@^0.12.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.29: - version "1.1.32" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.32.tgz#485b35c1bf9b4d8baa105d782f8ca731e518276e" - integrity sha512-VhVknkitq8dqtWoluagsGPn3dxTvN9fwgR59fV3D7sLBHe0JfDramsMI8n8mY//ccq/Kkrf8ZRHRpsyVZ3qw1A== +node-releases@^1.1.49: + version "1.1.49" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.49.tgz#67ba5a3fac2319262675ef864ed56798bb33b93e" + integrity sha512-xH8t0LS0disN0mtRCh+eByxFPie+msJUBL/lJDBuap53QGiYPa9joh83K4pCZgWJ+2L4b9h88vCVdXQ60NO2bg== dependencies: - semver "^5.3.0" + semver "^6.3.0" nomnom@^1.8.1: version "1.8.1" @@ -11802,6 +11885,11 @@ semver-greatest-satisfied-range@^1.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" From d8ae3439deac57b045f109c2945241810afee072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Sat, 15 Feb 2020 01:11:25 +0100 Subject: [PATCH 18/31] Make sure config is always frozen. Not just on error (#4871) --- src/panels/lovelace/ha-panel-lovelace.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/lovelace/ha-panel-lovelace.ts b/src/panels/lovelace/ha-panel-lovelace.ts index ffea13db6a..fcaa54af6c 100644 --- a/src/panels/lovelace/ha-panel-lovelace.ts +++ b/src/panels/lovelace/ha-panel-lovelace.ts @@ -266,7 +266,7 @@ class LovelacePanel extends LitElement { private _checkLovelaceConfig(config: LovelaceConfig) { // Somehow there can be badges with value null, we remove those - let checkedConfig; + let checkedConfig = !Object.isFrozen(config) ? config : undefined; config.views.forEach((view, index) => { if (view.badges && !view.badges.every(Boolean)) { checkedConfig = checkedConfig || { From 91bdb8f7424577da83de3fc57b99c6b4e20c3343 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sat, 15 Feb 2020 00:32:38 +0000 Subject: [PATCH 19/31] [ci skip] Translation update --- translations/da.json | 15 ++++++++++----- translations/en.json | 3 +++ translations/es.json | 10 +++++++--- translations/ko.json | 4 ++++ translations/nb.json | 4 ++++ translations/pl.json | 7 ++++++- translations/ru.json | 4 ++++ translations/zh-Hant.json | 4 ++++ 8 files changed, 42 insertions(+), 9 deletions(-) diff --git a/translations/da.json b/translations/da.json index d50ed6ae22..5fb0f7decf 100644 --- a/translations/da.json +++ b/translations/da.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Hvis deaktiveret, tilføjes nyligt opdagede entiteter fra {integration} ikke automatisk til Home Assistant.", "enable_new_entities_label": "Aktivér nyligt tilføjede entiteter.", - "title": "Systemindstillinger for {integration}" + "title": "Systemindstillinger for {integration}", + "update": "Opdater" }, "confirmation": { "cancel": "Annuller", @@ -640,6 +641,9 @@ "more_info_control": { "dismiss": "Afvis dialog", "edit": "Rediger entitet", + "person": { + "create_zone": "Opret zone fra den aktuelle lokalitet" + }, "restored": { "confirm_remove_text": "Er du sikker på, at du vil fjerne denne entitet?", "confirm_remove_title": "Fjern entitet?", @@ -891,6 +895,7 @@ }, "edit_ui": "Rediger brugerflade", "edit_yaml": "Rediger med YAML", + "enable_disable": "Aktiver/deaktiver automatisering", "introduction": "Brug automatiseringer til at vække dit hjem til live.", "load_error_not_editable": "Kun automatiseringer i 'automations.yaml' kan redigeres.", "load_error_unknown": "Fejl ved indlæsning af automatisering ({err_no}).", @@ -1371,7 +1376,7 @@ "add_area": "Tilføj område", "area_picker_label": "Område", "close": "Luk", - "created_config": "Oprettede konfiguration til {name}.", + "created_config": "Oprettede konfiguration for {name}.", "dismiss": "Afvis dialog", "error_saving_area": "Fejl ved lagring af område: {error}", "external_step": { @@ -1508,8 +1513,8 @@ "automation": "Genindlæs automatiseringer", "core": "Genindlæs lokalitet og tilpasninger", "group": "Genindlæs grupper", - "heading": "Genindlæser konfiguration", - "introduction": "Nogle dele af Home Assistant kan genindlæses uden en genstart. Tryk på genindlæs for at aflæse den nuværende konfiguration og indlæse den nye.", + "heading": "YAML-konfiguration genindlæses", + "introduction": "Nogle dele af Home Assistant kan genindlæses uden en genstart. Tryk på genindlæs for at aflæse den nuværende YAML-konfiguration og indlæse den nye.", "person": "Genindlæs personer", "scene": "Genindlæs scener", "script": "Genindlæs scripts", @@ -2074,7 +2079,7 @@ "migrate": { "header": "Konfigurationen er ikke kompatibel", "migrate": "Migrer opsætning", - "para_migrate": "Home Assistant kan tilføje id'er til alle dine kort og oversigter automatisk for dig ved at trykke på knappen 'Migrer opsætning'.", + "para_migrate": "Home Assistant kan tilføje id'er til alle dine kort og visninger automatisk for dig ved at trykke på knappen 'Migrer opsætning'.", "para_no_id": "Dette element har ikke et id. Tilføj venligst et id til dette element i 'ui-lovelace.yaml'." }, "raw_editor": { diff --git a/translations/en.json b/translations/en.json index 8949ac36df..0fd6358577 100644 --- a/translations/en.json +++ b/translations/en.json @@ -1928,6 +1928,9 @@ "available_states": "Available States", "name": "Alarm Panel" }, + "button": { + "name": "Button" + }, "conditional": { "name": "Conditional" }, diff --git a/translations/es.json b/translations/es.json index a9dc2a3cc9..03ef68f0db 100644 --- a/translations/es.json +++ b/translations/es.json @@ -641,6 +641,9 @@ "more_info_control": { "dismiss": "Descartar diálogo", "edit": "Editar entidad", + "person": { + "create_zone": "Crear zona a partir de la ubicación actual" + }, "restored": { "confirm_remove_text": "¿Estás seguro de que deseas eliminar esta entidad?", "confirm_remove_title": "¿Eliminar entidad?", @@ -892,6 +895,7 @@ }, "edit_ui": "Editar con la interfaz de usuario", "edit_yaml": "Editar como YAML", + "enable_disable": "Activar/Desactivar automatización", "introduction": "Utiliza automatizaciones para darle vida a tu hogar.", "load_error_not_editable": "Solo las automatizaciones en automations.yaml son editables.", "load_error_unknown": "Error al cargar la automatización ({err_no}).", @@ -1525,7 +1529,7 @@ "stop": "Detener" }, "validation": { - "check_config": "Verificar la configuración", + "check_config": "Verificar configuración", "heading": "Validación de la configuración", "introduction": "Valida tu configuración si has realizado cambios recientemente y quieres asegurarte de que son correctos", "invalid": "Configuración no válida", @@ -2075,7 +2079,7 @@ "migrate": { "header": "Configuración incompatible", "migrate": "Migrar configuración", - "para_migrate": "Home Assistant puede añadir ID's a todas tus tarjetas y vistas automáticamente pulsando el botón 'Migrar configuración'.", + "para_migrate": "Home Assistant puede añadir IDs a todas tus tarjetas y vistas automáticamente pulsando el botón 'Migrar configuración'.", "para_no_id": "Este elemento no tiene un ID. Por favor añade uno a este elemento en 'ui-lovelace.yaml'." }, "raw_editor": { @@ -2209,7 +2213,7 @@ "data": { "password": "Contraseña de API" }, - "description": "Introduce la contraseña de la API en tu configuración http:" + "description": "Introduce la contraseña de la API en tu configuración HTTP:" }, "mfa": { "data": { diff --git a/translations/ko.json b/translations/ko.json index d436d64e91..3cb9d2ab6b 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -641,6 +641,9 @@ "more_info_control": { "dismiss": "대화창 닫기", "edit": "구성요소 편집", + "person": { + "create_zone": "현재 위치로 지역 만들기" + }, "restored": { "confirm_remove_text": "이 구성요소를 제거하시겠습니까?", "confirm_remove_title": "구성요소를 제거하시겠습니까?", @@ -892,6 +895,7 @@ }, "edit_ui": "UI 로 편집", "edit_yaml": "YAML 로 편집", + "enable_disable": "자동화 활성화 / 비활성화", "introduction": "자동화를 사용하여 집에 생기를 불어넣으세요", "load_error_not_editable": "automations.yaml 의 자동화만 편집할 수 있습니다.", "load_error_unknown": "자동화를 읽어오는 도중 오류가 발생했습니다 ({err_no}).", diff --git a/translations/nb.json b/translations/nb.json index 78137ddff5..c12e2f2a23 100644 --- a/translations/nb.json +++ b/translations/nb.json @@ -641,6 +641,9 @@ "more_info_control": { "dismiss": "Avvis dialogboksen", "edit": "Redigér entitet", + "person": { + "create_zone": "Opprett sone fra gjeldende plassering" + }, "restored": { "confirm_remove_text": "Er du sikker på at du vil fjerne denne entiteten?", "confirm_remove_title": "Vil du fjerne entiteten?", @@ -892,6 +895,7 @@ }, "edit_ui": "Rediger med UI", "edit_yaml": "Rediger som YAML", + "enable_disable": "Aktivere/deaktivere automatisering", "introduction": "Bruk automasjon for å få liv i hjemmet ditt", "load_error_not_editable": "Kun automasjoner i automations.yaml kan redigeres.", "load_error_unknown": "Feil ved lasting av automasjon ({err_no}).", diff --git a/translations/pl.json b/translations/pl.json index 7998bfb47e..7256313f13 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Jeśli wyłączone, nowo wykryte encje nie będą automatycznie dodawane do Home Assistant'a.", "enable_new_entities_label": "Włącz dodawanie nowych encji.", - "title": "Opcje systemowe dla {integration}" + "title": "Opcje systemowe dla {integration}", + "update": "Aktualizuj" }, "confirmation": { "cancel": "Anuluj", @@ -640,6 +641,9 @@ "more_info_control": { "dismiss": "Zamknij okno dialogowe", "edit": "Edytuj encję", + "person": { + "create_zone": "Utwórz strefę z bieżącej lokalizacji" + }, "restored": { "confirm_remove_text": "Czy na pewno chcesz usunąć tę encję?", "confirm_remove_title": "Usunąć encję?", @@ -891,6 +895,7 @@ }, "edit_ui": "Edytuj za pomocą interfejsu użytkownika", "edit_yaml": "Edycja jako YAML", + "enable_disable": "Włącz/wyłącz automatyzację", "introduction": "Użyj automatyzacji, aby ożywić swój dom", "load_error_not_editable": "Tylko automatyzacje zdefiniowane w pliku automations.yaml są edytowalne.", "load_error_unknown": "Wystąpił błąd podczas ładowania automatyzacji ({err_no}).", diff --git a/translations/ru.json b/translations/ru.json index 365d9c3c56..952ffd9c38 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -641,6 +641,9 @@ "more_info_control": { "dismiss": "Закрыть диалог", "edit": "Изменить объект", + "person": { + "create_zone": "Создать зону из текущего местоположения" + }, "restored": { "confirm_remove_text": "Вы уверены, что хотите удалить этот объект?", "confirm_remove_title": "Удалить объект?", @@ -892,6 +895,7 @@ }, "edit_ui": "Форма ввода", "edit_yaml": "Текстовый редактор", + "enable_disable": "Включение или отключение правила автоматизации", "introduction": "Используйте автоматизацию, чтобы оживить Ваш дом.", "load_error_not_editable": "Доступны для редактирования только автоматизации из automations.yaml.", "load_error_unknown": "Ошибка загрузки автоматизации ({err_no}).", diff --git a/translations/zh-Hant.json b/translations/zh-Hant.json index e6ff369da0..19f38d2114 100644 --- a/translations/zh-Hant.json +++ b/translations/zh-Hant.json @@ -641,6 +641,9 @@ "more_info_control": { "dismiss": "忽略對話", "edit": "編輯物件", + "person": { + "create_zone": "使用目前位置新增區域" + }, "restored": { "confirm_remove_text": "確定要移除此物件?", "confirm_remove_title": "移除物件?", @@ -892,6 +895,7 @@ }, "edit_ui": "以 UI 編輯", "edit_yaml": "以 YAML 編輯", + "enable_disable": "開啟/關閉自動化", "introduction": "使用自動化來讓你的智能家居更有魅力吧。", "load_error_not_editable": "僅有 automations.yaml 內的自動化方能編輯。", "load_error_unknown": "載入自動化錯誤({err_no})。", From 9ec75531a813bed910678ef6d404656faa00f85b Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Sun, 16 Feb 2020 00:32:37 +0000 Subject: [PATCH 20/31] [ci skip] Translation update --- translations/ca.json | 7 +- translations/fr.json | 7 ++ translations/hu.json | 7 ++ translations/ko.json | 3 + translations/nb.json | 3 + translations/nl.json | 16 +++-- translations/nn.json | 143 +++++++++++++++++++++++++++++++++++++- translations/ru.json | 9 ++- translations/tr.json | 92 ++++++++++++++++++++++-- translations/zh-Hans.json | 22 +++++- translations/zh-Hant.json | 3 + 11 files changed, 293 insertions(+), 19 deletions(-) diff --git a/translations/ca.json b/translations/ca.json index 69490b2f6f..95463299f6 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Si està desactivat, les entitats recentment descobertes per a {integration} no s’afegiran automàticament a Home Assistant.", "enable_new_entities_label": "Activa entitats afegides recentment.", - "title": "Opcions del sistema per a {integration}" + "title": "Opcions del sistema per a {integration}", + "update": "Actualitza" }, "confirmation": { "cancel": "Cancel·la", @@ -888,6 +889,7 @@ }, "edit_ui": "Edita a través d'interfície", "edit_yaml": "Edita com a YAML", + "enable_disable": "Activa/desactiva automatització", "introduction": "Utilitza les automatitzacions per donar més vida a la teva casa", "load_error_not_editable": "Només es poden editar les automatitzacions de l'arxiu automations.yaml.", "load_error_unknown": "Error en carregar l’automatització ({err_no}).", @@ -1918,6 +1920,9 @@ "available_states": "Estats disponibles", "name": "Panell d'alarma" }, + "button": { + "name": "Botó" + }, "conditional": { "name": "Condicional" }, diff --git a/translations/fr.json b/translations/fr.json index 5d5b8c5c69..91de2771c8 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -641,6 +641,9 @@ "more_info_control": { "dismiss": "Fermer la fenêtre de dialogue", "edit": "Modifier l'entité", + "person": { + "create_zone": "Créer une zone à partir de l'emplacement actuel" + }, "restored": { "confirm_remove_text": "Voulez-vous vraiment supprimer cette entité ?", "confirm_remove_title": "Supprimer l'entité ?", @@ -892,6 +895,7 @@ }, "edit_ui": "Modifier avec l'interface utilisateur", "edit_yaml": "Modifier en tant que YAML", + "enable_disable": "Activer/Désactiver l'automatisation", "introduction": "Utilisez les automatisations pour donner vie à votre maison", "load_error_not_editable": "Seules les automations dans automations.yaml sont modifiables.", "load_error_unknown": "Erreur lors du chargement de l'automation ( {err_no} ).", @@ -1924,6 +1928,9 @@ "available_states": "États disponibles", "name": "Panneau d'alarme" }, + "button": { + "name": "Bouton" + }, "conditional": { "name": "Conditionnel" }, diff --git a/translations/hu.json b/translations/hu.json index c5bf4f0216..2ebc091b6a 100644 --- a/translations/hu.json +++ b/translations/hu.json @@ -641,6 +641,9 @@ "more_info_control": { "dismiss": "Párbeszédpanel elvetése", "edit": "Entitás szerkesztése", + "person": { + "create_zone": "Zóna létrehozása az aktuális helyről" + }, "restored": { "confirm_remove_text": "Biztosan el szeretnéd távolítani ezt az entitást?", "confirm_remove_title": "Eltávolítod az entitást?", @@ -892,6 +895,7 @@ }, "edit_ui": "Szerkesztés a felhasználói felületen", "edit_yaml": "Szerkesztés YAML-ként", + "enable_disable": "Automatizálás engedélyezése/letiltása", "introduction": "Használj automatizálásokat otthonod életre keltéséhez", "load_error_not_editable": "Csak az automations.yaml fájlban megadott automatizálások szerkeszthetők.", "load_error_unknown": "Hiba az automatizálás betöltésekor ({err_no}).", @@ -1924,6 +1928,9 @@ "available_states": "Rendelkezésre álló állapotok", "name": "Riasztópanel" }, + "button": { + "name": "Gomb" + }, "conditional": { "name": "Feltételes" }, diff --git a/translations/ko.json b/translations/ko.json index 3cb9d2ab6b..74beb11640 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -1928,6 +1928,9 @@ "available_states": "사용 가능한 상태요소", "name": "알람 패널" }, + "button": { + "name": "버튼" + }, "conditional": { "name": "조건부" }, diff --git a/translations/nb.json b/translations/nb.json index c12e2f2a23..304a56fc0e 100644 --- a/translations/nb.json +++ b/translations/nb.json @@ -1928,6 +1928,9 @@ "available_states": "Tilgjengelige tilstander", "name": "Alarmpanel" }, + "button": { + "name": "Knapp" + }, "conditional": { "name": "Betinget" }, diff --git a/translations/nl.json b/translations/nl.json index 35f3646f9d..6368353608 100644 --- a/translations/nl.json +++ b/translations/nl.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Indien uitgeschakeld, worden nieuwe entiteiten van {integration} niet automatisch aan Home Assistant toegevoegd.", "enable_new_entities_label": "Voeg nieuwe entiteiten automatisch toe", - "title": "Systeeminstellingen voor {integration}" + "title": "Systeeminstellingen voor {integration}", + "update": "Bijwerken" }, "confirmation": { "cancel": "Annuleren", @@ -640,6 +641,9 @@ "more_info_control": { "dismiss": "Dialoogvenster sluiten", "edit": "Entiteit bewerken", + "person": { + "create_zone": "Creëer zone van huidige locatie" + }, "restored": { "confirm_remove_text": "Weet u zeker dat u dit item wilt verwijderen?", "confirm_remove_title": "Entiteit verwijderen?", @@ -891,6 +895,7 @@ }, "edit_ui": "Bewerken met UI", "edit_yaml": "Bewerken als YAML", + "enable_disable": "Schakel automatisering in/uit", "introduction": "Gebruik automatiseringen om je huis tot leven te brengen.", "load_error_not_editable": "Alleen automatiseringen in automations.yaml kunnen worden bewerkt.", "load_error_unknown": "Fout bij laden van automatisering ({err_no}).", @@ -1696,7 +1701,7 @@ "required_error_msg": "Dit veld is verplicht", "update": "Bijwerken" }, - "edit_home_zone": "De locatie van je huis kan worden gewijzigd bij de algemene configuratie", + "edit_home_zone": "De locatie van je huis kan worden gewijzigd bij de algemene instellingen.", "introduction": "Met zones kunt u bepaalde regio's op aarde opgeven. Wanneer een persoon zich in een zone bevindt, dan wordt de staat de naam uit de zone. Zones kunnen ook worden gebruikt als trigger of voorwaarde in automatiseringen.", "no_zones_created_yet": "Het lijkt erop dat je nog geen zones hebt aangemaakt." }, @@ -1923,6 +1928,9 @@ "available_states": "Beschikbare statussen", "name": "Alarm paneel" }, + "button": { + "name": "Knop" + }, "conditional": { "name": "Conditioneel" }, @@ -2069,7 +2077,7 @@ "header": "Bewerk UI", "menu": { "open": "Open het Lovelace-menu", - "raw_editor": "Platte configuratie-editor" + "raw_editor": "Ruwe configuratie-editor" }, "migrate": { "header": "Configuratie incompatibel", @@ -2081,7 +2089,7 @@ "confirm_remove_config_text": "We zullen je Lovelace gebruikersinterface automatisch genereren met je gebieden en apparaten als je de huidige Lovelace gebruikersinterface verwijdert.", "confirm_remove_config_title": "Weet je zeker dat je de huidige Lovelace gebruikersinterface wilt verwijderen? We zullen automatisch een nieuwe Lovelace gebruikersinterface genereren op basis van je gebieden en apparaten.", "confirm_unsaved_changes": "Er zijn nog niet-opgeslagen wijzigingen, weet u zeker dat u wilt afsluiten?", - "confirm_unsaved_comments": "Uw configuratie bevat commentaren, deze worden niet opgeslagen. Wil je doorgaan?", + "confirm_unsaved_comments": "Uw configuratie bevat opmerkingen, deze worden niet opgeslagen. Wil je doorgaan?", "error_invalid_config": "Uw configuratie is niet geldig: {error}", "error_parse_yaml": "Kan YAML niet parseren: {error}", "error_remove": "Kan configuratie niet verwijderen: {error}", diff --git a/translations/nn.json b/translations/nn.json index e26b6849bc..46a83270ea 100644 --- a/translations/nn.json +++ b/translations/nn.json @@ -464,6 +464,9 @@ "script": { "execute": "Utfør" }, + "service": { + "run": "Køyr" + }, "timer": { "actions": { "cancel": "avbryt", @@ -524,8 +527,22 @@ "successfully_saved": "Vellukka lagring" }, "components": { + "area-picker": { + "add_dialog": { + "add": "Legg til", + "failed_create_area": "Klarte ikkje å opprette område.", + "name": "Namn", + "text": "Legg til namnet til det nye området.", + "title": "Legg til nytt område " + }, + "add_new": "Legg til nytt område...", + "area": "Område", + "clear": "Klar ", + "show_areas": "Vis områda" + }, "device-picker": { - "device": "Enhet" + "device": "Enhet", + "toggle": "Veksl " }, "entity": { "entity-picker": { @@ -536,6 +553,11 @@ "loading_history": "Lastar tilstandshistoria...", "no_history_found": "Inga tilstandshistorie funne" }, + "related-items": { + "area": "Område", + "device": "Eining", + "integration": "Integrasjon" + }, "relative_time": { "duration": { "day": "{count} {count, plural,\none {dag}\nother {dagar}\n}", @@ -556,9 +578,33 @@ "config_entry_system_options": { "enable_new_entities_description": "Dersom denne er deaktivert, kjem ikkje nyoppdaga oppføringar til å bli automatisk lagt til i Home Assistant.", "enable_new_entities_label": "Aktiver nyleg tillagde oppføringar.", - "title": "Systemval" + "title": "Systemval", + "update": "Oppdater" + }, + "entity_registry": { + "editor": { + "confirm_delete": "Er du sikker på at du vil slette denne oppføringa?", + "delete": "SLETT", + "enabled_cause": "Deaktivert av {cause}.", + "enabled_description": "Dekativere oppføringar kjem ikkje til å bli lagt til i Home Assistant", + "enabled_label": "Aktiver oppføringa", + "entity_id": "Oppførings-ID", + "name": "Namnoverskriding", + "note": "Merk: dette fungerer kanskje ikkje med alle integrasjonane.", + "unavailable": "Denne eininga er for augeblinken ikkje tilgjengeleg.", + "update": "OPPDATER" + } + }, + "generic": { + "cancel": "Avbryt", + "default_confirmation_title": "Er du sikker?", + "ok": "OK" }, "more_info_control": { + "edit": "Rediger oppføringa", + "person": { + "create_zone": "Opprett sone frå gjeldande stad" + }, "script": { "last_action": "Siste handling" }, @@ -569,6 +615,18 @@ }, "updater": { "title": "Oppdater instruksane" + }, + "vacuum": { + "clean_spot": "Reingjer området", + "commands": "Støvsugarkommandoar", + "fan_speed": "Viftefart", + "locate": "Lokaliser", + "pause": "Sett på pause", + "return_home": "Returner heim ", + "start": "Start ", + "start_pause": "Start/Sett på pause", + "status": "Status", + "stop": "Stopp " } }, "more_info_settings": { @@ -585,6 +643,9 @@ } }, "zha_device_info": { + "confirmations": { + "remove": "Er du sikker på at du vil fjerne eininga?" + }, "manuf": "av {manufacturer}", "no_area": "Inga område", "services": { @@ -739,6 +800,7 @@ "unsupported_condition": "Ikkje støtta føresetnad: {condition}" }, "default_name": "Ny automasjon", + "enable_disable": "Aktiver/Deaktiver automasjon", "introduction": "Bruk automasjonar til å gi liv til heimen din", "load_error_not_editable": "Berre automasjonar i automations.yaml kan redigerast.", "load_error_unknown": "Feil ved lasting av automasjon ({err_no}).", @@ -857,6 +919,7 @@ "core_config": { "edit_requires_storage": "Redigeringsverkty deaktivert sidan konfigurasjonener lagra i configuration.yaml", "elevation": "Høgde", + "elevation_feet": "fot", "elevation_meters": "Meter", "imperial_example": "Fahrenheit, pound", "latitude": "Breiddegrad", @@ -907,6 +970,13 @@ }, "devices": { "area_picker_label": "Område", + "automation": { + "automations": "Automasjonar", + "create": "Lag automasjon med eininga", + "no_automations": "Ingen automasjonar", + "no_device_automations": "Ingen tilgjenglege automasjonar for denne eininga." + }, + "cant_edit": "Du kan berre redigere element som er laga i brukargrensesnittet.", "caption": "Einingar", "data_table": { "area": "Område", @@ -915,7 +985,21 @@ "model": "Modell" }, "description": "Administrer tilkopla einingar", - "info": "Enhetsinformasjon" + "info": "Enhetsinformasjon", + "name": "Namn", + "scene": { + "create": "Lag ei scene med denne eininga", + "no_scenes": "Ingen scener", + "scenes": "Scener" + }, + "scenes": "Scener", + "script": { + "create": "Lag skript med eininga", + "no_scripts": "Ingen skript ", + "scripts": "Skript " + }, + "scripts": "Skript ", + "update": "Oppdater" }, "entities": { "caption": "Oppføringsregister", @@ -955,6 +1039,7 @@ }, "config_flow": { "close": "Lukk", + "dismiss": "Avvis dialogboksa", "external_step": { "description": "Ei ekstern nettside må besøkast for å fullføre dette steget.", "open_site": "Opne nettside" @@ -1042,19 +1127,57 @@ "header": "ZigBee heimeautomasjon - Legg til eining", "spinner": "Leitar etter ZHA Zigbee-apparat..." }, + "add": { + "caption": "Legg til eining ", + "description": "Legg til eining i Zigbee-nettverket" + }, "caption": "ZHA", + "clusters": { + "header": "Klynger", + "introduction": "Klynger er byggesteinane for Zigbee-funksjonaliteten. Dei sepererar funksjonaliteten i logiske einingar. Det er klient- og servertyper, som består av attributtar og kommandoar." + }, "description": "Zigbee heimeautomasjon nettverksadministrering", "device_card": { "area_picker_label": "Område", "device_name_placeholder": "Brukarnamn", "update_name_button": "Oppdater namn" }, + "devices": { + "header": "Zigbee Home Automation - Eininga" + }, + "group_binding": { + "bind_button_help": "Huk den merka gruppa til den merka einingsklynga.", + "bind_button_label": "Huk gruppa", + "cluster_selection_help": "Vel klynga som skal bindast til den valde gruppa.", + "group_picker_help": "Vel ei gruppe for å sende bindekommandoen til.", + "group_picker_label": "Grupper som kan bindast", + "header": "Gruppebinding", + "introduction": "Huk og huk av grupper.", + "unbind_button_help": "Huk av den merka gruppa frå den merka einingsklynga.", + "unbind_button_label": "Huk av gruppa" + }, + "groups": { + "caption": "Grupper", + "description": "Lag og modifiser Zigbee-grupper", + "group-header": "Zigbee Home Automation - Gruppedetaljer", + "groups-header": "Zigbee Home Automation - Gruppehandtering" + }, "services": { "reconfigure": "Konfigurer ZHA-eininga (heal device) på nytt. Bruk dette om du har problem med eininga. Dersom eining går på batteri, ver sikker på at den er vaken og tek i mot kommandar når du brukar denne tenesta.", "remove": "Fjern einhet frå Zigbee nettverk", "updateDeviceName": "Gje einheten eit eige namn i einhetsregistret." } }, + "zone": { + "configured_in_yaml": "Sonene defingert i configuration.yaml, kan ikkje redigerast via brukargrensesnittet.", + "detail": { + "create": "Lag", + "delete": "Slett", + "required_error_msg": "Dette feltet obligatorisk", + "update": "Oppdater" + }, + "edit_home_zone": "Plasseringa av heimen din kan endrast i den generelle konfigurasjonen." + }, "zwave": { "caption": "Z-Wave", "common": { @@ -1144,6 +1267,9 @@ "no_devices": "Denne sida let deg ta kontroll på einingane dine, men det ser ut til at du ikkje har sett opp noko endå. Gå til integrasjonssida for å setje i gang.", "title": "Velkommen heim" }, + "entities": { + "never_triggered": "Aldri utløyst" + }, "picture-elements": { "call_service": "Tilkall teneste {name}", "hold": "Hald:", @@ -1164,11 +1290,17 @@ }, "editor": { "card": { + "button": { + "name": "Knapp" + }, "generic": { "name": "Namn" }, "iframe": { "name": "iFrame" + }, + "shopping-list": { + "integration_not_loaded": "Dette kortet krev at \"shopping_list\"-integrasjonen er sett opp." } }, "edit_card": { @@ -1408,6 +1540,9 @@ } }, "profile": { + "advanced_mode": { + "link_promo": "Lær meir" + }, "change_password": { "confirm_new_password": "Stadfest nytt passord", "current_password": "Noverande passord", @@ -1428,6 +1563,8 @@ "link_promo": "Hjelp å oversette" }, "logout": "Logg ut", + "logout_text": "Er du sikker på at du vil logge ut?", + "logout_title": "Logg ut?", "long_lived_access_tokens": { "confirm_delete": "Er du sikker på at du vil slette tilgangstoken for {name}?", "create": "Lag token", diff --git a/translations/ru.json b/translations/ru.json index 952ffd9c38..5163b93721 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -608,7 +608,7 @@ "update": "Обновить" }, "confirmation": { - "cancel": "Отменить", + "cancel": "Отмена", "ok": "Да", "title": "Вы уверены?" }, @@ -1921,6 +1921,9 @@ "available_states": "Доступные состояния", "name": "Панель сигнализации" }, + "button": { + "name": "Кнопка" + }, "conditional": { "name": "Conditional" }, @@ -2080,7 +2083,7 @@ "confirm_remove_config_title": "Вы уверены, что хотите очистить конфигурацию пользовательского интерфейса?", "confirm_unsaved_changes": "У вас есть несохраненные изменения. Вы уверены, что хотите выйти?", "confirm_unsaved_comments": "Ваша конфигурация содержит комментарии, они не будут сохранены. Вы хотите продолжить?", - "error_invalid_config": "Ваша конфигурация недействительна: {error}", + "error_invalid_config": "Конфигурация недействительна: {error}", "error_parse_yaml": "Ошибка при разборе синтаксиса YAML: {error}", "error_remove": "Не удалось удалить конфигурацию: {error}", "error_save_yaml": "Не удалось сохранить YAML: {error}", @@ -2097,7 +2100,7 @@ "save": "Получить контроль" }, "suggest_card": { - "add": "Добавить", + "add": "Подтвердить", "create_own": "Изменить", "header": "Вариант отображения в пользовательском интерфейсе" }, diff --git a/translations/tr.json b/translations/tr.json index 4c35fc216d..ebc6aaee80 100644 --- a/translations/tr.json +++ b/translations/tr.json @@ -59,6 +59,7 @@ }, "groups": { "system-admin": "Yöneticiler", + "system-read-only": "Salt Okunur Kullanıcılar", "system-users": "Kullanıcılar" }, "panel": { @@ -366,6 +367,7 @@ "cloudy": "Bulutlu", "exceptional": "Olağanüstü", "fog": "Sis", + "hail": "Selam", "lightning": "Yıldırım", "lightning-rainy": "Yıldırım, yağmurlu", "partlycloudy": "Parçalı bulutlu", @@ -575,7 +577,10 @@ "automation": "Aşağıdaki otomasyonların bir parçası", "device": "Cihaz", "entity": "İlgili varlıklar", - "integration": "Entegrasyon" + "group": "Aşağıdaki grupların bir parçası", + "integration": "Entegrasyon", + "scene": "Aşağıdaki sahnelerin bir parçası", + "script": "Aşağıdaki komut dosyalarının bir parçası" }, "relative_time": { "duration": { @@ -596,7 +601,8 @@ "dialogs": { "config_entry_system_options": { "enable_new_entities_label": "Yeni eklenen varlıkları etkinleştir.", - "title": "{integration} için Sistem Seçenekleri" + "title": "{integration} için Sistem Seçenekleri", + "update": "Güncelle" }, "confirmation": { "cancel": "İptal", @@ -617,6 +623,7 @@ "enabled_label": "Varlığı etkinleştir", "entity_id": "Varlık kimliği", "name": "Ad Geçersiz Kılma", + "note": "Not: bu henüz tüm entegrasyonlarla çalışmayabilir.", "unavailable": "Bu varlık şu anda kullanılamıyor.", "update": "GÜNCELLE" }, @@ -631,6 +638,9 @@ "more_info_control": { "dismiss": "İletişim kutusunu kapat", "edit": "Varlığı düzenle", + "person": { + "create_zone": "Geçerli konumdan bölge oluşturma" + }, "restored": { "confirm_remove_text": "Bu varlığı kaldırmak istediğinizden emin misiniz?", "confirm_remove_title": "Varlık kaldırılsın mı?", @@ -649,6 +659,18 @@ }, "updater": { "title": "Talimatları Güncelle" + }, + "vacuum": { + "clean_spot": "Noktayı temizle", + "commands": "Elektrikli süpürge komutları:", + "fan_speed": "Pervane hızı", + "locate": "Yeri tespit et", + "pause": "Duraklat", + "return_home": "Başlangıç Sayfası", + "start": "Başlat", + "start_pause": "Başlat/Duraklat", + "status": "Durum", + "stop": "Durdur" } }, "more_info_settings": { @@ -679,13 +701,17 @@ "reconfigure": "Cihazı Yeniden Yapılandır", "remove": "Cihazı Kaldır" }, + "confirmations": { + "remove": "Cihazı kaldırmak istediğinize emin misiniz?" + }, "last_seen": "Son görülen", "manuf": "{manufacturer} tarafından", "no_area": "Alan Yok", "power_source": "Güç kaynağı", "quirk": "Orijinal", "services": { - "remove": "Bir cihazı Zigbee ağından kaldır." + "remove": "Bir cihazı Zigbee ağından kaldır.", + "updateDeviceName": "Aygıt kayıt defterinde bu aygıt için özel bir ad ayarlayın." }, "unknown": "Bilinmeyen", "zha_device_card": { @@ -755,6 +781,7 @@ "delete_confirm": "Silmek istediğinize emin misiniz?", "duplicate": "Kopya", "header": "Aksiyonlar", + "introduction": "İşlemler, otomasyon tetiklendiğinde Home Assistant'ın yapacağı işlemlerdir.", "learn_more": "İşlemler hakkında daha fazla bilgi edinin", "name": "Aksiyon", "type_select": "Aksiyon türü", @@ -799,6 +826,7 @@ "delete_confirm": "Silmek istediğinizden emin misiniz?", "duplicate": "Kopya", "header": "Koşullar", + "introduction": "Koşullar isteğe bağlıdır ve tüm koşullar yerine getirilmediği sürece daha fazla yürütmeyi engeller.", "learn_more": "Koşullar hakkında daha fazla bilgi edinin", "name": "Şart", "type_select": "Koşul türü", @@ -860,6 +888,7 @@ }, "edit_ui": "UI ile düzenle", "edit_yaml": "YAML olarak düzenle", + "enable_disable": "Otomasyonu etkinleştirme / devre dışı bırakma", "introduction": "Evinizi canlandırmak için otomasyonları kullanın", "load_error_not_editable": "Yalnızca automations.yaml içindeki otomasyonlar düzenlenebilir.", "load_error_unknown": "Otomasyon yüklenirken hata oluştu ( {err_no} ).", @@ -870,6 +899,7 @@ "delete_confirm": "Silmek istediğinizden emin misiniz?", "duplicate": "Yedekle", "header": "Tetikleyiciler", + "introduction": "Tetikleyiciler, bir otomasyon kuralının işlenmesini başlatan şeydir. Aynı kural için birden çok tetikleyici belirtmek mümkündür. Bir tetikleyici başladıktan sonra, Home Assistant varsa koşulları doğrular ve eylemi çağırır.", "learn_more": "Tetikleyiciler hakkında daha fazla bilgi edinin", "name": "Tetik", "type_select": "Tetikleyici tipi", @@ -962,6 +992,7 @@ "delete_confirm": "Bu otomasyonu silmek istediğinizden emin misin?", "edit_automation": "Otomasyonu düzenle", "header": "Otomasyon Düzenleyici", + "introduction": "Otomasyon editörü, otomasyonlar oluşturmanıza ve düzenlemenize izin verir. Home Assistant'ı doğru yapılandırdığınızdan emin olmak için lütfen aşağıdaki bağlantıyı takip edin.", "learn_more": "Otomasyonlar hakkında daha fazla bilgi edinin", "no_automations": "Düzenlenebilir otomasyon bulamadık", "only_editable": "Yalnızca automations.yaml dosyasında tanımlanan otomasyonlar düzenlenebilir.", @@ -1116,6 +1147,7 @@ "elevation": "Yükseklik", "elevation_feet": "Ayak", "elevation_meters": "metre", + "imperial_example": "Fahrenheit, pound", "latitude": "Enlem", "location_name": "Home Assistant kurulumunuzun adı", "longitude": "Boylam", @@ -1224,7 +1256,9 @@ }, "entities": { "caption": "Varlıklar", + "description": "Bilinen tüm varlıklara genel bakış.", "editor": { + "confirm_delete": "Bu girişi silmek istediğinizden emin misiniz?", "default_name": "Alan Ekle ", "delete": "SİL", "enabled_cause": "{Neden} tarafından devre dışı bırakılmış.", @@ -1233,6 +1267,7 @@ "entity_id": "Varlık kimliği", "name": "Ad Geçersiz Kılma", "note": "Not: bu henüz tüm entegrasyonlarla çalışmayabilir.", + "unavailable": "Bu varlık şu anda kullanılamıyor.", "update": "GÜNCELLEme" }, "picker": { @@ -1264,6 +1299,7 @@ "confirm_title": "{number} varlığı kaldırmak istiyor musunuz?" }, "selected": "{number} seçildi", + "show_disabled": "Devre dışı bırakılan varlıkları göster", "status": { "disabled": "Devre dışı", "ok": "Tamam", @@ -1416,6 +1452,7 @@ }, "server_control": { "caption": "Server Kontrolleri", + "description": "Home Assistant sunucusunu yeniden başlatın veya durdurun", "section": { "reloading": { "automation": "Otomasyonları yeniden yükle", @@ -1432,6 +1469,7 @@ "confirm_restart": "Home Assistant'ı yeniden başlatmak istediğinizden emin misin?", "confirm_stop": "Home Assistant'ı durdurmak istediğinizden emin misin?", "heading": "Sunucu yönetimi", + "introduction": "Home Assistant sunucunuzu kontrol edin.. Home Assistant üzerinden", "restart": "Yeniden başlat", "stop": "Durdur" }, @@ -1517,6 +1555,11 @@ "group_binding": { "bind_button_help": "Seçilen grubu seçilen aygıt kümelerine bağlayın.", "bind_button_label": "Grupla", + "cluster_selection_help": "Seçili gruba bağlaşacak kümeleri seçin.", + "group_picker_help": "Bağlama komutu vermek için bir grup seçin.", + "group_picker_label": "Bağlanabilir Gruplar", + "header": "Grup Bağlama", + "introduction": "Grupları bağlama ve çözme.", "unbind_button_label": "Grubu Çöz" }, "groups": { @@ -1528,6 +1571,7 @@ "create_group_details": "Yeni bir zigbee grubu oluşturmak için gerekli ayrıntıları girin", "creating_group": "Grup Oluşturma", "description": "Zigbee grupları oluşturma ve değiştirme", + "group_details": "İşte seçilen Zigbee grubu için tüm detaylar.", "group_id": "Grup kimliği", "group_info": "Grup Bilgisi", "group_name_placeholder": "Grup Adı", @@ -1535,13 +1579,15 @@ "group-header": "Zigbee Ev Otomasyonu - Grup Detayları", "groups": "Gruplar", "groups-header": "Zigbee Ev Otomasyonu - Grup Yönetimi", + "header": "Zigbee Ev Otomasyonu - Grup Yönetimi", "introduction": "Zigbee grupları oluşturma ve değiştirme", "manage_groups": "Zigbee Gruplarını Yönetin", "members": "Üyeler", "remove_groups": "Grupları Kaldır", "remove_members": "Üyeleri Kaldır", "removing_groups": "Grupları Kaldırma", - "removing_members": "Üyeleri Kaldırma" + "removing_members": "Üyeleri Kaldırma", + "zha_zigbee_groups": "ZHA Zigbee Grupları" }, "header": "Zigbee Ev Otomasyonunu Yapılandırma", "introduction": "Burada ZHA bileşenini yapılandırmak mümkündür. Kullanıcı arayüzünden henüz her şey yapılandırılamıyor, ancak üzerinde çalışıyoruz.", @@ -1552,13 +1598,19 @@ "header": "Cihaz yönetimi", "hint_wakeup": "Xiaomi sensörleri gibi bazı cihazlarda, onlarla etkileşime girerken cihazları uyanık tutan ~ 5 saniyelik aralıklarla basabileceğiniz bir uyanma düğmesi bulunur." }, + "services": { + "remove": "Bir cihazı ZigBee ağından kaldırın.", + "updateDeviceName": "Aygıt kayıt defterinde bu aygıt için özel bir ad ayarlayın." + }, "title": "Zigbee Ev Otomasyonu" }, "zone": { "add_zone": "Bölge Ekle", "caption": "bölgeler", + "configured_in_yaml": "Configuration.yaml aracılığıyla yapılandırılan bölgeler kullanıcı arayüzü aracılığıyla düzenlenemez.", "confirm_delete": "Bu bölgeyi silmek istediğinizden emin misiniz?", "create_zone": "Bölge Oluştur", + "description": "Kişileri izlemek istediğiniz bölgeleri yönetin.", "detail": { "create": "Oluştur", "delete": "Sil", @@ -1573,7 +1625,8 @@ "required_error_msg": "Bu alan gereklidir", "update": "Güncelle" }, - "edit_home_zone": "Evinizin konumu genel konfigürasyonda değiştirilebilir." + "edit_home_zone": "Evinizin konumu genel konfigürasyonda değiştirilebilir.", + "no_zones_created_yet": "Görünüşe göre henüz herhangi bir bölge oluşturmadınız." }, "zwave": { "caption": "Z-Wave", @@ -1585,22 +1638,38 @@ }, "description": "Z-Wave ağınızı yönetin", "learn_more": "Z-Wave hakkında daha fazla bilgi edinin", + "network_management": { + "header": "Z-Wave Ağ Yönetimi" + }, + "network_status": { + "network_started": "Z-Wave Ağı Başlatıldı", + "network_started_note_all_queried": "Tüm düğümler sorgulandı.", + "network_starting": "Z-Wave Ağı başlatılıyor ...", + "network_stopped": "Z-Wave Ağı Durduruldu" + }, "node_config": { "config_parameter": "Yapılandırma Parametresi", "config_value": "Yapılandırma Değeri", "false": "Yanlış", + "header": "Düğüm Yapılandırma Seçenekleri", "seconds": "Saniye", "set_config_parameter": "Yapılandırma parametresini belirle", "set_wakeup": "Uyandırma Aralığı Ayarla", "true": "Doğru" }, "services": { + "add_node": "Düğüm Ekle", + "add_node_secure": "Güvenli Düğüm Ekle", "cancel_command": "Komutu İptal Et", "heal_network": "Ağı İyileştir", + "remove_node": "Düğümü Kaldır", "save_config": "Config'i Kaydet", "start_network": "Ağı Başlat", "stop_network": "Ağı Durdur", "test_network": "Test Ağı" + }, + "values": { + "header": "Düğüm Değerleri" } } }, @@ -1656,7 +1725,8 @@ "multiple_messages": "ileti ilk önce {time} meydana geldi ve {counter} kez gösterildi", "no_errors": "Herhangi bir hata rapor edilmiştir.", "no_issues": "Yeni bir sorun yok!", - "refresh": "Yenile" + "refresh": "Yenile", + "title": "Günlük" }, "mqtt": { "description_listen": "Bir konuyu dinle", @@ -1752,6 +1822,7 @@ } }, "changed_toast": { + "message": "Lovelace UI yapılandırması güncellendi, değişiklikleri görmek için yenilensin mi?", "refresh": "Yenile" }, "editor": { @@ -1763,6 +1834,9 @@ "available_states": "Mevcut Durumlar", "name": "Alarm Paneli" }, + "button": { + "name": "Düğme" + }, "conditional": { "name": "Koşullu" }, @@ -1874,7 +1948,8 @@ "toggle_editor": "Düzenleyiciye Geçiş" }, "edit_lovelace": { - "edit_title": "Başlığı düzenle" + "edit_title": "Başlığı düzenle", + "header": "Lovelace kullanıcı arayüzünüzün başlığı" }, "edit_view": { "add": "Görünüm ekle", @@ -1956,6 +2031,7 @@ }, "page-authorize": { "abort_intro": "Giriş iptal edildi", + "authorizing_client": "{clientId}'ye Home Assistant erişim izni vermek üzeresiniz.", "form": { "providers": { "command_line": { @@ -2172,6 +2248,7 @@ "push_notifications": { "description": "Bu cihaza bildirimler gönder", "error_load_platform": "Notify.html5'i yapılandırın.", + "error_use_https": "Önyüz için SSL'nin etkinleştirilmesini gerektirir.", "header": "Bildirimleri", "link_promo": "Daha fazla bilgi edinin", "push_notifications": "Bildirimleri" @@ -2180,6 +2257,7 @@ "confirm_delete": "{name} için yenileme anahtarını silmek istediğinizden emin misiniz?", "created_at": "{date} tarihinde oluşturuldu", "current_token_tooltip": "Geçerli yenileme anahtarı silinemedi", + "delete_failed": "Yenileme anahtarı silinemedi.", "description": "Her yenileme jetonu bir oturum açma oturumunu temsil eder. Yenileme jetonları, çıkış yapmak istediğinizde otomatik olarak kaldırılacaktır. Aşağıdaki yenileme jetonları hesabınız için şu anda aktif.", "header": "Yenileme Anahtarları", "last_used": "En son {date} tarihinde {location} konumundan kullanıldı", diff --git a/translations/zh-Hans.json b/translations/zh-Hans.json index 21fe8ec15d..37ff0c2ca3 100644 --- a/translations/zh-Hans.json +++ b/translations/zh-Hans.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "如果禁用,从 {integration} 新发现的实体将不会自动添加到 Home Assistant。", "enable_new_entities_label": "启用新添加的实体。", - "title": "{integration}的系统选项" + "title": "{integration}的系统选项", + "update": "更新" }, "confirmation": { "cancel": "取消", @@ -640,6 +641,9 @@ "more_info_control": { "dismiss": "关闭对话", "edit": "编辑实体", + "person": { + "create_zone": "从当前位置创建地点" + }, "restored": { "confirm_remove_text": "您确定要删除此实体吗?", "confirm_remove_title": "是否删除实体?", @@ -659,6 +663,18 @@ }, "updater": { "title": "更新说明" + }, + "vacuum": { + "clean_spot": "清理污渍", + "commands": "扫地机指令:", + "fan_speed": "风扇转速", + "locate": "定位", + "pause": "暂停", + "return_home": "返回底座", + "start": "启动", + "start_pause": "启动/暂停", + "status": "状态", + "stop": "停止" } }, "more_info_settings": { @@ -879,6 +895,7 @@ }, "edit_ui": "以图形界面编辑", "edit_yaml": "以 YAML 编辑", + "enable_disable": "启用/禁用自动化", "introduction": "使用自动化让你的家聪明起来", "load_error_not_editable": "只能编辑 automations.yaml 中的自动化。", "load_error_unknown": "加载自动化错误 ({err_no})。", @@ -1871,6 +1888,9 @@ "available_states": "可用状态", "name": "报警面板" }, + "button": { + "name": "按钮" + }, "conditional": { "name": "有条件的" }, diff --git a/translations/zh-Hant.json b/translations/zh-Hant.json index 19f38d2114..108f9ee2da 100644 --- a/translations/zh-Hant.json +++ b/translations/zh-Hant.json @@ -1928,6 +1928,9 @@ "available_states": "可用狀態", "name": "警報器面板" }, + "button": { + "name": "按鈕" + }, "conditional": { "name": "條件式面板" }, From 9d2a0c0502088a5c425f8a05cd5bdd366ebff167 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 15 Feb 2020 21:40:28 -0800 Subject: [PATCH 21/31] Reduce size of floorplan pic Arsaboo (#4886) --- .../public/assets/arsaboo/floorplans/main.png | Bin 69878 -> 20605 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/demo/public/assets/arsaboo/floorplans/main.png b/demo/public/assets/arsaboo/floorplans/main.png index 1cdcd78ad17c67da787d5c598c9094c454e35b1c..859842ea444b46be25141efa78b4833cd996126b 100644 GIT binary patch literal 20605 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 Qxc~qF07*qoM6N<$f=`3!H2?qr literal 69878 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 n99Ei Date: Sat, 15 Feb 2020 21:57:56 -0800 Subject: [PATCH 22/31] Sensor card hugging (#4887) --- src/panels/lovelace/cards/hui-sensor-card.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/panels/lovelace/cards/hui-sensor-card.ts b/src/panels/lovelace/cards/hui-sensor-card.ts index 3c6656bd04..9c5575c31d 100644 --- a/src/panels/lovelace/cards/hui-sensor-card.ts +++ b/src/panels/lovelace/cards/hui-sensor-card.ts @@ -255,11 +255,11 @@ class HuiSensorCard extends LitElement implements LovelaceCard { @@ -438,7 +438,7 @@ class HuiSensorCard extends LitElement implements LovelaceCard { .info { flex-wrap: wrap; - margin: 16px; + margin: 0 16px 16px; } #value { From f4eb3380b4e7c98f70750e9be9d63394988b0bea Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 15 Feb 2020 22:39:03 -0800 Subject: [PATCH 23/31] Less whitespace around icon (#4888) --- src/panels/lovelace/cards/hui-sensor-card.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/panels/lovelace/cards/hui-sensor-card.ts b/src/panels/lovelace/cards/hui-sensor-card.ts index 9c5575c31d..800b0d98e2 100644 --- a/src/panels/lovelace/cards/hui-sensor-card.ts +++ b/src/panels/lovelace/cards/hui-sensor-card.ts @@ -428,12 +428,7 @@ class HuiSensorCard extends LitElement implements LovelaceCard { .icon { color: var(--paper-item-icon-color, #44739e); - display: inline-block; - flex: 0 0 40px; line-height: 40px; - position: relative; - text-align: center; - width: 40px; } .info { From 363f548f132b7f330e91782bfcd7ba1273e34ad0 Mon Sep 17 00:00:00 2001 From: Zack Arnett Date: Sun, 16 Feb 2020 18:19:28 -0500 Subject: [PATCH 24/31] fix error (#4885) --- src/panels/lovelace/cards/hui-sensor-card.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/lovelace/cards/hui-sensor-card.ts b/src/panels/lovelace/cards/hui-sensor-card.ts index 800b0d98e2..7452cdb845 100644 --- a/src/panels/lovelace/cards/hui-sensor-card.ts +++ b/src/panels/lovelace/cards/hui-sensor-card.ts @@ -90,7 +90,7 @@ const calcPoints = ( let last = [average(first), lastValue(first)]; const getCoords = (item, i, offset = 0, depth = 1) => { - if (depth > 1) { + if (depth > 1 && item) { return item.forEach((subItem, index) => getCoords(subItem, i, index, depth - 1) ); From 1c86bd2f8b1d8457a185ecd5e2e2743389280594 Mon Sep 17 00:00:00 2001 From: HomeAssistant Azure Date: Mon, 17 Feb 2020 00:32:55 +0000 Subject: [PATCH 25/31] [ci skip] Translation update --- translations/ca.json | 31 +++++++++++++++++++++---------- translations/da.json | 3 +++ translations/de.json | 21 +++++++++++++++------ translations/es.json | 3 +++ translations/fi.json | 18 +++++++++++++++++- translations/fr.json | 2 +- translations/it.json | 44 ++++++++++++++++++++++++++++++++------------ translations/ko.json | 30 +++++++++++++++--------------- translations/pl.json | 3 +++ translations/pt.json | 17 ++++++++++++++++- 10 files changed, 126 insertions(+), 46 deletions(-) diff --git a/translations/ca.json b/translations/ca.json index 95463299f6..0bbc7cdf2d 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -52,7 +52,7 @@ "switch": "Interruptors", "system_health": "Estat del Sistema", "updater": "Actualitzador", - "vacuum": "Aspiradora", + "vacuum": "Aspirador", "weblink": "Enllaços web", "zha": "ZHA", "zwave": "Z-Wave" @@ -354,12 +354,12 @@ }, "vacuum": { "cleaning": "Netejant", - "docked": "Aparcada", + "docked": "Aparcat", "error": "Error", "idle": "Inactiu", - "off": "Apagada", - "on": "Encesa", - "paused": "Pausada", + "off": "Apagat", + "on": "Encès", + "paused": "Pausat", "returning": "Retornant a la base" }, "weather": { @@ -492,10 +492,10 @@ "vacuum": { "actions": { "resume_cleaning": "Reprendre neteja", - "return_to_base": "Retornar a la base", - "start_cleaning": "Començar neteja", - "turn_off": "Apagar", - "turn_on": "Encendre" + "return_to_base": "Retorna a la base", + "start_cleaning": "Comença neteja", + "turn_off": "Apaga", + "turn_on": "Encén" } }, "water_heater": { @@ -641,9 +641,13 @@ "more_info_control": { "dismiss": "Desestimar el diàleg", "edit": "Edita entitat", + "person": { + "create_zone": "Crea una zona a partir de la ubicació actual" + }, "restored": { "confirm_remove_text": "Estàs segur que vols eliminar aquesta entitat?", "confirm_remove_title": "Eliminar l'entitat?", + "not_provided": "Actualment aquesta entitat no està disponible, prové d'una integració o dispositiu eliminat, modificat o que no funciona.", "remove_action": "Elimina entitat", "remove_intro": "Si l'entitat ja no s'utilitza, pots borrar-la eliminant-la." }, @@ -661,10 +665,12 @@ "title": "Instruccions d'actualització" }, "vacuum": { + "clean_spot": "Zona neta", "commands": "Comandes de l’aspirador:", "fan_speed": "Velocitat del ventilador", "locate": "Localitza", "pause": "Pausa", + "return_home": "Torna a casa", "start": "Inici", "start_pause": "Inicia/Pausa", "status": "Estat", @@ -1033,6 +1039,7 @@ "manage_entities": "Gestió d'entitats", "security_devices": "Dispositius de seguretat", "sync_entities": "Sincronitza les entitats amb Google", + "sync_entities_404_message": "No s'han pogut sincronitzar les entitats amb Google, digues \"Hey Google, sincronitza els meus dispositius\" per sincronitzar-les.", "title": "Google Assistant" }, "integrations": "Integracions", @@ -1653,6 +1660,7 @@ "zha_zigbee_groups": "Grups ZHA Zigbee" }, "header": "Configuració domòtica Zigbee (ZHA)", + "introduction": "Des d'aquí pots configurar el component ZHA. Encara no és possible configurar-ho tot des de la interfície d'usuari, però hi estem treballant.", "network_management": { "header": "Gestió de la xarxa", "introduction": "Comandes que afecten tota la xarxa" @@ -2078,6 +2086,8 @@ "para_no_id": "Aquest element no té ID. Afegeix un ID per aquest element a 'ui-lovelace.yaml'." }, "raw_editor": { + "confirm_remove_config_text": "Si elimines la configuració de la interfície d'usuari Lovelace es generaran automàticament les visualitzacions de Lovelace amb les teves àrees i dispositius.", + "confirm_remove_config_title": "Estàs segur que vols eliminar la configuració de la interfície d'usuari Lovelace? Es generaran automàticament les visualitzacions de Lovelace amb les teves àrees i dispositius.", "confirm_unsaved_changes": "Hi han canvis no desats. Segur que vols sortir?", "confirm_unsaved_comments": "La configuració conté comentaris que es descartaran. Vols continuar?", "error_invalid_config": "La configuració no és vàlida: {error}", @@ -2098,7 +2108,8 @@ }, "suggest_card": { "add": "Afegeix a la UI Lovelace", - "create_own": "Crea la teva" + "create_own": "Crea la teva", + "header": "T'hem creat un suggeriment" }, "view": { "panel_mode": { diff --git a/translations/da.json b/translations/da.json index 5fb0f7decf..9eb2871e59 100644 --- a/translations/da.json +++ b/translations/da.json @@ -1928,6 +1928,9 @@ "available_states": "Tilgængelige tilstande", "name": "Alarmpanel" }, + "button": { + "name": "Knap" + }, "conditional": { "name": "Betinget" }, diff --git a/translations/de.json b/translations/de.json index d8a3b0a00d..c284fb2a9f 100644 --- a/translations/de.json +++ b/translations/de.json @@ -610,7 +610,7 @@ "confirmation": { "cancel": "Abbrechen", "ok": "OK", - "title": "Bist Sie sicher?" + "title": "Sind Sie sicher?" }, "domain_toggler": { "title": "Domänen umschalten" @@ -641,6 +641,9 @@ "more_info_control": { "dismiss": "Dialog ausblenden", "edit": "Entität bearbeiten", + "person": { + "create_zone": "Zone vom aktuellen Standort erstellen" + }, "restored": { "confirm_remove_text": "Sind Sie sicher, dass Sie diese Entität löschen möchten?", "confirm_remove_title": "Entität entfernen?", @@ -662,10 +665,12 @@ "title": "Update-Anweisungen" }, "vacuum": { + "clean_spot": "Stelle säubern", "commands": "Staubsaugerbefehle:", "fan_speed": "Lüftergeschwindigkeit", "locate": "Lokalisieren", "pause": "Pause", + "return_home": "Zum Hub zurückkehren", "start": "Start", "start_pause": "Start/Pause", "status": "Status", @@ -890,6 +895,7 @@ }, "edit_ui": "Bearbeiten Sie mit der Benutzeroberfläche", "edit_yaml": "Als YAML bearbeiten", + "enable_disable": "Automatisierung aktivieren / deaktivieren", "introduction": "Benutze Automatisierungen, um deinem Zuhause Leben einzuhauchen", "load_error_not_editable": "Nur Automatisierungen in automations.yaml sind editierbar.", "load_error_unknown": "Fehler beim Laden der Automatisierung ({err_no}).", @@ -1090,7 +1096,7 @@ "close": "Schließen", "confirm_disable": "Möchten Sie diesen Webhook wirklich deaktivieren?", "copied_to_clipboard": "In die Zwischenablage kopiert", - "info_disable_webhook": "Wenn Sie diesen Webhook nicht mehr nutzen wollen, können Sie ", + "info_disable_webhook": "Wenn Sie diesen Webhook nicht mehr nutzen wollen, können Sie", "link_disable_webhook": "deaktiviere es", "managed_by_integration": "Dieser Webhook wird von einer Integration verwaltet und kann nicht deaktiviert werden.", "view_documentation": "Dokumentation anzeigen", @@ -1204,7 +1210,7 @@ "validation": { "check_config": "Konfiguration prüfen", "heading": "Konfiguration überprüfen", - "introduction": "Überprüfen der Konfiguration, wenn Sie kürzlich Änderungen vorgenommen haben und sicherstellen möchten, dass alles ordnungsgemäß ist", + "introduction": "Überprüfen der Konfiguration, wenn Sie kürzlich Änderungen vorgenommen haben und sicherstellen möchten, dass alles ordnungsgemäß ist", "invalid": "Konfiguration fehlerhaft", "valid": "Konfiguration in Ordnung" } @@ -1426,7 +1432,7 @@ "name": "Name", "name_error_msg": "Name erforderlich", "new_person": "Neue Person", - "no_device_tracker_available_intro": "Wenn Sie Geräte haben, die die Anwesenheit einer Person anzeigen, können Sie diese hier einer Person zuordnen. Sie können Ihr erstes Gerät hinzufügen, indem Sie eine Integration zur Anwesenheitserkennung auf der Integrationsseite hinzufügen.", + "no_device_tracker_available_intro": "Wenn Sie Geräte haben, die die Anwesenheit einer Person anzeigen, können Sie diese hier einer Person zuordnen. Sie können Ihr erstes Gerät hinzufügen, indem Sie eine Integration zur Anwesenheitserkennung auf der Integrationsseite hinzufügen.", "update": "Aktualisieren" }, "introduction": "Hier können Sie jede Person von Interesse in Home Assistant definieren.", @@ -1667,7 +1673,7 @@ "introduction": "ZHA-Befehle ausführen, die sich auf ein einzelnes Gerät auswirken. Wählen Sie ein Gerät aus, um eine Liste der verfügbaren Befehle anzuzeigen." }, "services": { - "reconfigure": "Rekonfigurieren des ZHA-Geräts (Gerät heilen). Benutzen Sie dies, wenn Sie Probleme mit dem Gerät haben. Wenn es sich bei dem betroffenden Gerät um ein batteriebetriebenes Gerät handelt, stellen Sie sicher, dass es wach ist und Kommandos akzeptiert, wenn Sie diesen Dienst benutzen.", + "reconfigure": "Rekonfigurieren des ZHA-Geräts (Gerät heilen). Benutzen Sie dies, wenn Sie Probleme mit dem Gerät haben. Wenn es sich bei dem betroffenden Gerät um ein batteriebetriebenes Gerät handelt, stellen Sie sicher, dass es wach ist und Kommandos akzeptiert, wenn Sie diesen Dienst benutzen.", "remove": "Entferne ein Gerät aus dem Zigbee-Netzwerk.", "updateDeviceName": "Lege einen benutzerdefinierten Namen für dieses Gerät in der Geräteregistrierung fest." }, @@ -1922,6 +1928,9 @@ "available_states": "Verfügbare Zustände", "name": "Alarmpanel" }, + "button": { + "name": "Schaltfläche" + }, "conditional": { "name": "Bedingte Elemente" }, @@ -2078,7 +2087,7 @@ }, "raw_editor": { "confirm_remove_config_text": "Wir generieren automatisch deine Lovelace-Ansichten mit deinen Bereichen und Geräten, wenn Sie Ihre Lovelace-Konfiguration entfernen.", - "confirm_remove_config_title": "Bist Ssie sicher, dass Sie Ihre deine Lovelace-Konfiguration entfernen ollen? Wir generieren automatisch Ihre Lovelace-Ansichten mit Ihren Bereichen und Geräten.", + "confirm_remove_config_title": "Sind Sie sicher, dass Sie Ihre Lovelace-Konfiguration entfernen wollen? Wir generieren automatisch Ihre Lovelace-Ansichten mit Ihren Bereichen und Geräten.", "confirm_unsaved_changes": "Sie haben ungespeicherte Änderungen, sind Sie sicher, dass Sie beenden willen?", "confirm_unsaved_comments": "Ihre Konfiguration enthält einen oder mehrere Kommentare, diese werden nicht gespeichert. Möchten Sie fortfahren?", "error_invalid_config": "Deine Konfiguration ist ungültig: {error}", diff --git a/translations/es.json b/translations/es.json index 03ef68f0db..9244228cb1 100644 --- a/translations/es.json +++ b/translations/es.json @@ -1928,6 +1928,9 @@ "available_states": "Estados disponibles", "name": "Panel de alarma" }, + "button": { + "name": "Botón" + }, "conditional": { "name": "Condicional" }, diff --git a/translations/fi.json b/translations/fi.json index 4da340fee3..5f1008c65e 100644 --- a/translations/fi.json +++ b/translations/fi.json @@ -873,6 +873,7 @@ "cloud": { "account": { "alexa": { + "config_documentation": "Asetusten dokumentaatio.", "disable": "Poista käytöstä", "enable": "Ota käyttöön", "info": "Alexa Integraatio Home Assistant Cloudille mahdollistaa Home Assistant laitteiden ohjaamisen miltä tahansa Alexa laitteelta.", @@ -883,6 +884,7 @@ }, "connected": "Yhdistetty", "google": { + "config_documentation": "Asetusten dokumentaatio.", "enter_pin_error": "PIN-koodin tallentaminen ei onnistu:", "enter_pin_hint": "Anna PIN-koodi turvalaitteiden käyttämistä varten", "info": "Google Assistant Integraatio Home Assistant Cloudille mahdollistaa Home Assistant laitteiden ohjaamisen miltä tahansa Google Assistant laitteelta.", @@ -1125,6 +1127,7 @@ "add_area": "Lisää alue", "area_picker_label": "Alue", "close": "Sulje", + "created_config": "Asetus luotu {name}", "external_step": { "description": "Tämä vaihe edellyttää, että vierailet ulkopuolisella verkkosivustolla.", "open_site": "Avaa verkkosivusto" @@ -1224,6 +1227,7 @@ "core": "Lataa ydin uudelleen", "group": "Lataa ryhmät uudelleen", "heading": "Asetusten uudelleenlataus", + "introduction": "Jotkut kotiassistentin osat voidaan ladata uudelleen ilman, että tarvitaan uudelleenkäynnistystä. Painamalla uudelleenlatausta uudet asetukset luetaan yaml tiedostosta.", "scene": "Lataa tilanteet uudelleen", "script": "Lataa skriptit uudelleen" }, @@ -1330,6 +1334,12 @@ "updateDeviceName": "Määritä laitteelle mukautettu nimeä laiterekisteriin." } }, + "zone": { + "detail": { + "passive_note": "Passiiviset vyöhykkeet on piilotetaan käyttöliittymässä, eikä niitä käytetä laitteiden paikannuksen sijaintina. Tämä on hyödyllistä, jos haluat käyttää vain automaatioihin." + }, + "edit_home_zone": "Voit asettaa kotisi sijainnin kohdasta Asetukset>Yleinen." + }, "zwave": { "caption": "Z-Wave", "common": { @@ -1359,7 +1369,7 @@ "false": "Epätosi", "header": "Solmun määritysasetukset", "seconds": "sekuntia", - "set_config_parameter": "Aseta asetusparametri", + "set_config_parameter": "Aseta parametri", "set_wakeup": "Aseta herätysväli", "true": "Tosi" }, @@ -1447,6 +1457,9 @@ "showing_entries": "Näytetään kirjaukset ajalta" }, "lovelace": { + "add_entities": { + "saving_failed": "Lovelacen käyttöliittymän asetusten tallennus epäonnistui." + }, "cards": { "confirm_delete": "Oletko varma, että haluat poistaa tämän kortin?", "empty_state": { @@ -1620,6 +1633,9 @@ "confirm_remove_config_text": "Lovelace käyttöliittymän näkymät luodaan automaattisesti alueistasi ja laitteistasi, jos poistat nykyisen määrityksen.", "confirm_remove_config_title": "Haluatko varmasti poistaa Lovelace-käyttöliittymän asetukset? Lovelace käyttöliittymän asetukset luodaan automaattisesti alueistasi ja laitteistasi.", "confirm_unsaved_changes": "Sinulla on tallentamattomia muutoksia. Haluatko varmasti poistua?", + "confirm_unsaved_comments": "Asetuksesi sisältää kommentoituja rivejä. Kommentoituja rivejä ei tallenneta. Haluatko jatkaa?", + "error_invalid_config": "Asetuksesi ovat virheelliset: {error}", + "error_remove": "Asetusta ei voida poistaa: {error}", "header": "Muokkaa asetuksia", "save": "Tallenna", "saved": "Tallennettu", diff --git a/translations/fr.json b/translations/fr.json index 91de2771c8..2a83688e88 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -1887,7 +1887,7 @@ "lovelace": { "add_entities": { "generated_unsupported": "Vous ne pouvez utiliser cette fonction que lorsque vous avez pris le contrôle de Lovelace UI.", - "saving_failed": "La sauvegarde de la configuration de Lovelace UI a échouée.", + "saving_failed": "La sauvegarde de la configuration de Lovelace UI a échoué.", "yaml_unsupported": "Vous ne pouvez pas utiliser cette fonction lorsque vous utilisé Lovelace UI en mode YAML." }, "cards": { diff --git a/translations/it.json b/translations/it.json index bdccf787ae..c6102e88c9 100644 --- a/translations/it.json +++ b/translations/it.json @@ -604,7 +604,8 @@ "config_entry_system_options": { "enable_new_entities_description": "Se disabilitato, le entità appena individuate per {integration} non verranno automaticamente aggiunte a Home Assistant.", "enable_new_entities_label": "Abilita nuove entità aggiunte.", - "title": "Opzioni di sistema per {integration}" + "title": "Opzioni di sistema per {integration}", + "update": "Aggiornamento" }, "confirmation": { "cancel": "Annulla", @@ -640,6 +641,9 @@ "more_info_control": { "dismiss": "Chiudi finestra di dialogo", "edit": "Modifica entità", + "person": { + "create_zone": "Crea zona dalla posizione corrente" + }, "restored": { "confirm_remove_text": "Sei sicuro di voler rimuovere questa entità?", "confirm_remove_title": "Rimuovere l'entità?", @@ -659,6 +663,18 @@ }, "updater": { "title": "Istruzioni per l'aggiornamento" + }, + "vacuum": { + "clean_spot": "Posto pulito", + "commands": "Comandi dell'aspirapolvere:", + "fan_speed": "Velocità della ventola", + "locate": "Individuare", + "pause": "Pausa", + "return_home": "Ritorna alla base", + "start": "Avvio", + "start_pause": "Avvio/Pausa", + "status": "Stato", + "stop": "Stop" } }, "more_info_settings": { @@ -879,6 +895,7 @@ }, "edit_ui": "Modifica con l'Interfaccia Utente", "edit_yaml": "Modifica come YAML", + "enable_disable": "Abilitare/Disabilitare l'automazione", "introduction": "Usa le automazioni per dare vita alla tua casa.", "load_error_not_editable": "Solo le Automazioni in automations.yaml sono modificabili.", "load_error_unknown": "Errore durante il caricamento dell'Automazione ({err_no}).", @@ -1496,8 +1513,8 @@ "automation": "Ricarica le Automazioni", "core": "Ricarica la Posizione e le Personalizzazioni", "group": "Ricarica i Gruppi", - "heading": "Aggiornamento della Configurazione", - "introduction": "Alcune parti di Home Assistant possono essere aggiornate senza richiedere un riavvio. Premendo su Ricarica si rimuoverà la loro configurazione attuale e si caricherà la versione aggiornata.", + "heading": "Ricarica Configurazione YAML", + "introduction": "Alcune parti di Home Assistant possono essere ricaricate senza richiedere un riavvio. Premendo su Ricarica si rimuoverà la loro Configurazione YAML attuale e si caricherà la versione aggiornata.", "person": "Ricarica persone", "scene": "Ricarica le Scene", "script": "Ricarica gli Script", @@ -1512,7 +1529,7 @@ "stop": "Arrestare" }, "validation": { - "check_config": "Controlla la configurazione", + "check_config": "Verifica Configurazione", "heading": "Convalida della configurazione", "introduction": "Convalidare la configurazione se di recente sono state apportate alcune modifiche alla configurazione e si desidera assicurarsi che sia tutto valido", "invalid": "Configurazione non valida", @@ -1679,7 +1696,7 @@ "name": "Nome", "new_zone": "Nuova zona", "passive": "Passivo", - "passive_note": "Le zone passive sono nascoste nel frontend e non vengono utilizzate come posizione per i tracker dei dispositivi. Ciò è utile se si desidera utilizzarlo solo per le automazioni.", + "passive_note": "Le zone passive sono nascoste nel frontend e non vengono utilizzate come posizione per i tracker dei dispositivi. Ciò è utile solamente se si desidera utilizzarle per le automazioni.", "radius": "Raggio", "required_error_msg": "Questo campo è obbligatorio", "update": "Aggiorna" @@ -1715,7 +1732,7 @@ "config_parameter": "Parametro di configurazione", "config_value": "Valore di configurazione", "false": "Falso", - "header": "Opzioni di configurazione del nodo", + "header": "Opzioni Configurazione Nodo", "seconds": "secondi", "set_config_parameter": "Imposta parametro di configurazione", "set_wakeup": "Imposta intervallo di riattivazione", @@ -1731,7 +1748,7 @@ "cancel_command": "Annulla Comando", "heal_network": "Testa la rete", "remove_node": "Rimuovi nodo", - "save_config": "Salva configurazione", + "save_config": "Salva Configurazione", "soft_reset": "Soft Reset", "start_network": "Avvia la rete", "stop_network": "Ferma la rete", @@ -1911,6 +1928,9 @@ "available_states": "Stati disponibili", "name": "Pannello di allarme" }, + "button": { + "name": "Pulsante" + }, "conditional": { "name": "Condizionale" }, @@ -2061,8 +2081,8 @@ }, "migrate": { "header": "Configurazione incompatibile", - "migrate": "Esporta configurazione", - "para_migrate": "Home Assistant può aggiungere automaticamente gli ID a tutte le tue schede e visualizzazioni automaticamente premendo il pulsante \"Eporta configurazione\".", + "migrate": "Esporta Configurazione", + "para_migrate": "Home Assistant può aggiungere automaticamente gli ID a tutte le tue schede e viste in maniera automatica premendo il pulsante \"Esporta Configurazione\".", "para_no_id": "Questo elemento non ha un ID. Aggiungi un ID a questo elemento in 'ui-lovelace.yaml'." }, "raw_editor": { @@ -2072,9 +2092,9 @@ "confirm_unsaved_comments": "La tua configurazione contiene commenti, questi non verranno salvati. Vuoi continuare?", "error_invalid_config": "La tua configurazione non è valida: {error}", "error_parse_yaml": "Impossibile analizzare YAML: {error}", - "error_remove": "Impossibile rimuovere config: {error}", + "error_remove": "Impossibile rimuovere la configurazione: {error}", "error_save_yaml": "Impossibile salvare YAML: {error}", - "header": "Modifica le impostazioni", + "header": "Modifica Configurazione", "save": "Salva", "saved": "Salvato", "unsaved_changes": "Modifiche non salvate" @@ -2196,7 +2216,7 @@ "data": { "password": "Password API" }, - "description": "Inserisci l'API password nella configurazione http:" + "description": "Inserire la password API nella configurazione HTTP:" }, "mfa": { "data": { diff --git a/translations/ko.json b/translations/ko.json index 74beb11640..102689e56b 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -906,7 +906,7 @@ "delete_confirm": "정말 삭제하시겠습니까?", "duplicate": "복제", "header": "트리거", - "introduction": "트리거는 자동화 규칙을 처리하는 시작점 입니다. 같은 자동화 규칙에 여러 개의 트리거를 지정할 수 있습니다. 트리거가 발동되면 Home Assistant 는 조건을 확인하고 동작을 호출합니다.", + "introduction": "트리거는 자동화 규칙을 처리하는 시작점입니다. 같은 자동화 규칙에 여러 개의 트리거를 지정할 수 있습니다. 트리거가 발동되면 Home Assistant 는 조건을 확인하고 동작을 호출합니다.", "learn_more": "트리거에 대해 더 알아보기", "name": "트리거", "type_select": "트리거 유형", @@ -1010,7 +1010,7 @@ "cloud": { "account": { "alexa": { - "config_documentation": "설정 문서 보기", + "config_documentation": "구성 문서", "disable": "비활성화", "enable": "활성화", "enable_ha_skill": "Alexa 에 Home Assistant 스킬 사용하기", @@ -1027,7 +1027,7 @@ "connection_status": "클라우드 연결 상태", "fetching_subscription": "구독 정보를 가져오는 중…", "google": { - "config_documentation": "설정 문서 보기", + "config_documentation": "구성 문서", "devices_pin": "보안 기기 PIN", "enable_ha_skill": "Google 어시스턴트에 Home Assistant 스킬 사용하기", "enable_state_reporting": "상태 보고 활성화", @@ -1424,7 +1424,7 @@ "create": "만들기", "delete": "삭제", "device_tracker_intro": "이 구성원에게 속한 기기를 선택해주세요.", - "device_tracker_pick": "추적 할 기기 선택", + "device_tracker_pick": "추적 대상 기기 선택", "device_tracker_picked": "추적 대상 기기", "link_integrations_page": "통합 구성요소 페이지", "link_presence_detection_integrations": "재실 감지 통합 구성요소", @@ -1435,7 +1435,7 @@ "no_device_tracker_available_intro": "구성원의 재실 여부를 알려주는 기기가 있다면 구성원을 해당 기기에 할당할 수 있습니다. 통합 구성요소 페이지에서 재실 감지 통합 구성요소를 추가해서 기기를 구성해보세요.", "update": "업데이트" }, - "introduction": "Home Assistant 에서 추적 할 구성원을 정의 할 수 있습니다.", + "introduction": "Home Assistant 에서 추적할 구성원을 정의할 수 있습니다.", "no_persons_created_yet": "아직 생성된 구성원이 없는 것 같습니다.", "note_about_persons_configured_in_yaml": "참고: configuration.yaml 에서 구성된 구성원은 UI 에서 편집 할 수 없습니다." }, @@ -1513,8 +1513,8 @@ "automation": "자동화 새로고침", "core": "위치 및 사용자화 새로고침", "group": "그룹 새로고침", - "heading": "구성 내용 새로고침", - "introduction": "Home Assistant 의 일부 구성 내용은 재시작 없이 다시 읽어들일 수 있습니다. 새로고침을 누르면 현재 구성 내용을 내리고 새로운 구성 내용을 읽어들입니다.", + "heading": "YAML 구성 다시 읽어오기", + "introduction": "Home Assistant 의 일부 구성 내용은 재시작 없이 다시 읽어 들일 수 있습니다. 새로고침을 누르면 현재 사용 중인 YAML 구성 내용을 내리고 새로운 구성 내용을 읽어 들입니다.", "person": "구성원 새로고침", "scene": "씬 다시읽기", "script": "스크립트 새로고침", @@ -1748,7 +1748,7 @@ "cancel_command": "명령 취소", "heal_network": "네트워크 새로고침", "remove_node": "노드 제거", - "save_config": "설정 저장", + "save_config": "구성 저장", "soft_reset": "소프트 리셋", "start_network": "네트워크 시작", "stop_network": "네트워크 중지", @@ -1894,7 +1894,7 @@ "confirm_delete": "이 카드를 삭제하시겠습니까?", "empty_state": { "go_to_integrations_page": "통합 페이지로 이동하기.", - "no_devices": "이 페이지에서 기기를 제어 할 수 있지만, 기기가 아직 설정되지 않은 것 같습니다. 시작하려면 통합 페이지로 이동해주세요.", + "no_devices": "이 페이지에서 기기를 제어할 수 있지만, 기기가 아직 설정되지 않은 것 같습니다. 시작하려면 통합 페이지로 이동해주세요.", "title": "집에 오신 것을 환영합니다" }, "entities": { @@ -2081,8 +2081,8 @@ }, "migrate": { "header": "구성 내용이 호환되지 않습니다", - "migrate": "설정 마이그레이션", - "para_migrate": "Home Assistant 는 '설정 마이그레이션' 버튼을 눌러 자동으로 모든 카드와 보기에 ID를 추가 할 수 있습니다.", + "migrate": "구성 마이그레이션", + "para_migrate": "Home Assistant 는 '구성 마이그레이션' 버튼을 눌러 자동으로 모든 카드와 뷰에 ID를 추가할 수 있습니다.", "para_no_id": "이 구성요소에는 ID가 없습니다. 'ui-lovelace.yaml' 에 구성요소의 ID를 추가해주세요." }, "raw_editor": { @@ -2216,7 +2216,7 @@ "data": { "password": "API 비밀번호" }, - "description": "configuration.yaml 에 설정한 api_password 를 입력해주세요:" + "description": "HTTP 구성에 API 비밀번호를 입력해주세요:" }, "mfa": { "data": { @@ -2324,7 +2324,7 @@ }, "profile": { "advanced_mode": { - "description": "Home Assistant 의 고급 기능과 옵션은 기본적으로 숨겨져 있으며 토글을 활성화하여 이러한 기능을 사용하실 수 있습니다. 이 설정은 사용자별 설정이며 Home Assistant 를 사용하는 다른 사용자에게 영향을 미치지 않습니다.", + "description": "고급 기능을 활성화합니다.", "link_promo": "더 알아보기", "title": "고급 모드" }, @@ -2341,7 +2341,7 @@ "description": "모바일 환경과 마찬가지로 기본적으로 사이드 바가 숨겨집니다.", "header": "항상 사이드바 숨기기" }, - "is_owner": "관리자 계정 입니다.", + "is_owner": "관리자 계정입니다.", "language": { "dropdown_label": "언어", "header": "언어", @@ -2404,7 +2404,7 @@ "link_promo": "테마에 대해 더 알아보기" }, "vibrate": { - "description": "기기를 제어 할 때 이 기기에서 진동을 활성화 또는 비활성화합니다.", + "description": "기기를 제어할 때 이 기기에서 진동을 활성화 또는 비활성화합니다.", "header": "진동효과" } }, diff --git a/translations/pl.json b/translations/pl.json index 7256313f13..b72707c08f 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -1928,6 +1928,9 @@ "available_states": "Dostępne stany", "name": "Panel alarmu" }, + "button": { + "name": "Przycisk" + }, "conditional": { "name": "Warunkowa" }, diff --git a/translations/pt.json b/translations/pt.json index ba75e049ab..2199e30abf 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -576,13 +576,19 @@ "config_entry_system_options": { "enable_new_entities_description": "Se desativado, novas entidades descobertas por {integration} não serão automaticamente adicionadas ao Home Assistant.", "enable_new_entities_label": "Ativar novas entidades adicionadas.", - "title": "Opções de sistema para {integration}" + "title": "Opções de sistema para {integration}", + "update": "Actualizar" }, "confirmation": { "cancel": "Cancelar", "ok": "", "title": "Tem a certeza?" }, + "generic": { + "cancel": "Cancelar", + "default_confirmation_title": "Tem a certeza?", + "ok": "OK" + }, "more_info_control": { "script": { "last_action": "Última ocorrência" @@ -594,6 +600,12 @@ }, "updater": { "title": "Instruções para atualização" + }, + "vacuum": { + "pause": "Pausa", + "start": "Iniciar", + "start_pause": "Iniciar / Pausar", + "stop": "Parar" } }, "more_info_settings": { @@ -1548,6 +1560,9 @@ "available_states": "Estados Disponíveis", "name": "Painel de alarme" }, + "button": { + "name": "Botão" + }, "conditional": { "name": "Condicional" }, From 24e4b0b77290aa99ec9fd152dee7cd8bcd7c2d9c Mon Sep 17 00:00:00 2001 From: Ruslan Sayfutdinov Date: Mon, 17 Feb 2020 04:23:25 +0000 Subject: [PATCH 26/31] [sidebar] set max-width for item-text (#4893) --- src/components/ha-sidebar.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index 339724056d..0e93596464 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -597,6 +597,7 @@ class HaSidebar extends LitElement { paper-icon-item .item-text { display: none; + max-width: calc(100% - 56px); } :host([expanded]) paper-icon-item .item-text { display: block; From 8f9a6bd544f3939316fa973f8078522e5d6413e0 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 17 Feb 2020 14:13:09 +0100 Subject: [PATCH 27/31] Add multi select component to ha-form (#4247) * Add multi select component * Apply suggestions from code review Co-Authored-By: Ian Richardson * Comments * update * Fix * Refactor to dropdown menu Co-authored-by: Ian Richardson --- .../ha-form/ha-form-multi_select.ts | 157 ++++++++++++++++++ src/components/ha-form/ha-form-select.ts | 22 ++- src/components/ha-form/ha-form.ts | 11 +- src/data/data_entry_flow.ts | 10 +- .../show-dialog-data-entry-flow.ts | 4 +- src/dialogs/config-flow/step-flow-form.ts | 6 +- 6 files changed, 193 insertions(+), 17 deletions(-) create mode 100644 src/components/ha-form/ha-form-multi_select.ts diff --git a/src/components/ha-form/ha-form-multi_select.ts b/src/components/ha-form/ha-form-multi_select.ts new file mode 100644 index 0000000000..2f21740a14 --- /dev/null +++ b/src/components/ha-form/ha-form-multi_select.ts @@ -0,0 +1,157 @@ +import "@polymer/paper-checkbox/paper-checkbox"; +import "@polymer/paper-menu-button/paper-menu-button"; +import "@polymer/paper-input/paper-input"; +import "@polymer/paper-item/paper-icon-item"; +import "@polymer/paper-listbox/paper-listbox"; +import "@polymer/paper-ripple/paper-ripple"; +import { + customElement, + html, + LitElement, + property, + query, + TemplateResult, + CSSResult, + css, +} from "lit-element"; +import { fireEvent } from "../../common/dom/fire_event"; +import { + HaFormElement, + HaFormMultiSelectData, + HaFormMultiSelectSchema, +} from "./ha-form"; + +@customElement("ha-form-multi_select") +export class HaFormMultiSelect extends LitElement implements HaFormElement { + @property() public schema!: HaFormMultiSelectSchema; + @property() public data!: HaFormMultiSelectData; + @property() public label!: string; + @property() public suffix!: string; + @property() private _init = false; + @query("paper-menu-button") private _input?: HTMLElement; + + public focus(): void { + if (this._input) { + this._input.focus(); + } + } + + protected render(): TemplateResult { + const options = Array.isArray(this.schema.options) + ? this.schema.options + : Object.entries(this.schema.options!); + + return html` + + + + ${// TS doesn't work with union array types https://github.com/microsoft/TypeScript/issues/36390 + // @ts-ignore + options.map((item: string | [string, string]) => { + const value = this._optionValue(item); + return html` + + + ${this._optionLabel(item)} + + `; + })} + + + `; + } + + protected firstUpdated() { + this.updateComplete.then(() => { + const input = (this.shadowRoot?.querySelector("paper-input") + ?.inputElement as any)?.inputElement; + if (input) { + input.style.textOverflow = "ellipsis"; + } + }); + } + + private _optionValue(item: string | string[]): string { + return Array.isArray(item) ? item[0] : item; + } + + private _optionLabel(item: string | string[]): string { + return Array.isArray(item) ? item[1] || item[0] : item; + } + + private _onSelect(ev: Event) { + ev.stopPropagation(); + } + + private _valueChanged(ev: CustomEvent): void { + if (!ev.detail.value || !this._init) { + // ignore first call because that is the init of the component + this._init = true; + return; + } + + fireEvent( + this, + "value-changed", + { + value: ev.detail.value.map((element) => element.itemValue), + }, + { bubbles: false } + ); + } + + static get styles(): CSSResult { + return css` + paper-menu-button { + display: block; + padding: 0; + --paper-item-icon-width: 34px; + } + paper-ripple { + top: 12px; + left: 0px; + bottom: 8px; + right: 0px; + } + paper-input { + text-overflow: ellipsis; + } + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-form-multi_select": HaFormMultiSelect; + } +} diff --git a/src/components/ha-form/ha-form-select.ts b/src/components/ha-form/ha-form-select.ts index d0a871af01..f650ac3bfd 100644 --- a/src/components/ha-form/ha-form-select.ts +++ b/src/components/ha-form/ha-form-select.ts @@ -5,6 +5,8 @@ import { property, TemplateResult, query, + CSSResult, + css, } from "lit-element"; import { HaFormElement, HaFormSelectData, HaFormSelectSchema } from "./ha-form"; import { fireEvent } from "../../common/dom/fire_event"; @@ -36,8 +38,10 @@ export class HaFormSelect extends LitElement implements HaFormElement { .selected=${this.data} @selected-item-changed=${this._valueChanged} > - ${this.schema.options!.map( - (item) => html` + ${// TS doesn't work with union array types https://github.com/microsoft/TypeScript/issues/36390 + // @ts-ignore + this.schema.options!.map( + (item: string | [string, string]) => html` ${this._optionLabel(item)} @@ -48,12 +52,12 @@ export class HaFormSelect extends LitElement implements HaFormElement { `; } - private _optionValue(item) { + private _optionValue(item: string | [string, string]) { return Array.isArray(item) ? item[0] : item; } - private _optionLabel(item) { - return Array.isArray(item) ? item[1] : item; + private _optionLabel(item: string | [string, string]) { + return Array.isArray(item) ? item[1] || item[0] : item; } private _valueChanged(ev: CustomEvent) { @@ -64,6 +68,14 @@ export class HaFormSelect extends LitElement implements HaFormElement { value: ev.detail.value.itemValue, }); } + + static get styles(): CSSResult { + return css` + paper-dropdown-menu { + display: block; + } + `; + } } declare global { diff --git a/src/components/ha-form/ha-form.ts b/src/components/ha-form/ha-form.ts index 5925dee226..24102dff1a 100644 --- a/src/components/ha-form/ha-form.ts +++ b/src/components/ha-form/ha-form.ts @@ -12,6 +12,7 @@ import "./ha-form-integer"; import "./ha-form-float"; import "./ha-form-boolean"; import "./ha-form-select"; +import "./ha-form-multi_select"; import "./ha-form-positive_time_period_dict"; import { fireEvent } from "../../common/dom/fire_event"; import { dynamicElement } from "../../common/dom/dynamic-element-directive"; @@ -22,6 +23,7 @@ export type HaFormSchema = | HaFormFloatSchema | HaFormBooleanSchema | HaFormSelectSchema + | HaFormMultiSelectSchema | HaFormTimeSchema; export interface HaFormBaseSchema { @@ -41,7 +43,12 @@ export interface HaFormIntegerSchema extends HaFormBaseSchema { export interface HaFormSelectSchema extends HaFormBaseSchema { type: "select"; - options?: string[]; + options?: string[] | Array<[string, string]>; +} + +export interface HaFormMultiSelectSchema extends HaFormBaseSchema { + type: "multi_select"; + options?: { [key: string]: string } | string[] | Array<[string, string]>; } export interface HaFormFloatSchema extends HaFormBaseSchema { @@ -71,6 +78,7 @@ export type HaFormData = | HaFormFloatData | HaFormBooleanData | HaFormSelectData + | HaFormMultiSelectData | HaFormTimeData; export type HaFormStringData = string; @@ -78,6 +86,7 @@ export type HaFormIntegerData = number; export type HaFormFloatData = number; export type HaFormBooleanData = boolean; export type HaFormSelectData = string; +export type HaFormMultiSelectData = string[]; export interface HaFormTimeData { hours?: number; minutes?: number; diff --git a/src/data/data_entry_flow.ts b/src/data/data_entry_flow.ts index 7f2e8ab894..dd2d09363f 100644 --- a/src/data/data_entry_flow.ts +++ b/src/data/data_entry_flow.ts @@ -1,3 +1,5 @@ +import { HaFormSchema } from "../components/ha-form/ha-form"; + export interface DataEntryFlowProgressedEvent { type: "data_entry_flow_progressed"; data: { @@ -7,12 +9,6 @@ export interface DataEntryFlowProgressedEvent { }; } -export interface FieldSchema { - name: string; - default?: any; - optional: boolean; -} - export interface DataEntryFlowProgress { flow_id: string; handler: string; @@ -27,7 +23,7 @@ export interface DataEntryFlowStepForm { flow_id: string; handler: string; step_id: string; - data_schema: FieldSchema[]; + data_schema: HaFormSchema[]; errors: { [key: string]: string }; description_placeholders: { [key: string]: string }; } diff --git a/src/dialogs/config-flow/show-dialog-data-entry-flow.ts b/src/dialogs/config-flow/show-dialog-data-entry-flow.ts index 623732856a..490a6becc0 100644 --- a/src/dialogs/config-flow/show-dialog-data-entry-flow.ts +++ b/src/dialogs/config-flow/show-dialog-data-entry-flow.ts @@ -7,8 +7,8 @@ import { DataEntryFlowStepForm, DataEntryFlowStep, DataEntryFlowStepAbort, - FieldSchema, } from "../../data/data_entry_flow"; +import { HaFormSchema } from "../../components/ha-form/ha-form"; export interface FlowConfig { loadDevicesAndAreas: boolean; @@ -45,7 +45,7 @@ export interface FlowConfig { renderShowFormStepFieldLabel( hass: HomeAssistant, step: DataEntryFlowStepForm, - field: FieldSchema + field: HaFormSchema ): string; renderShowFormStepFieldError( diff --git a/src/dialogs/config-flow/step-flow-form.ts b/src/dialogs/config-flow/step-flow-form.ts index 172cf333a9..adf6a4ea5c 100644 --- a/src/dialogs/config-flow/step-flow-form.ts +++ b/src/dialogs/config-flow/step-flow-form.ts @@ -18,8 +18,10 @@ import "../../resources/ha-style"; import { HomeAssistant } from "../../types"; import { fireEvent } from "../../common/dom/fire_event"; import { configFlowContentStyles } from "./styles"; -import { DataEntryFlowStepForm, FieldSchema } from "../../data/data_entry_flow"; +import { DataEntryFlowStepForm } from "../../data/data_entry_flow"; import { FlowConfig } from "./show-dialog-data-entry-flow"; +// tslint:disable-next-line +import { HaFormSchema } from "../../components/ha-form/ha-form"; @customElement("step-flow-form") class StepFlowForm extends LitElement { @@ -176,7 +178,7 @@ class StepFlowForm extends LitElement { this._stepData = ev.detail.value; } - private _labelCallback = (field: FieldSchema): string => + private _labelCallback = (field: HaFormSchema): string => this.flowConfig.renderShowFormStepFieldLabel(this.hass, this.step, field); private _errorCallback = (error: string) => From 49b0c8d5497589efd749b5533258de5b669f1e25 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 17 Feb 2020 15:02:23 +0100 Subject: [PATCH 28/31] include entities not in entity registry in config entities (#4867) * include entities not in entity registry in config entities * Update ha-data-table.ts * Comments * Update ha-device-entities-card.ts * Comments --- src/components/data-table/ha-data-table.ts | 15 ++- src/components/ha-related-items.ts | 7 ++ .../config-flow/step-flow-pick-handler.ts | 14 ++- .../device-detail/ha-device-entities-card.ts | 1 + .../entities/dialog-entity-registry-detail.ts | 35 ++++--- .../config/entities/ha-config-entities.ts | 99 +++++++++++++++---- .../show-dialog-entity-registry-detail.ts | 7 +- src/translations/en.json | 6 +- 8 files changed, 142 insertions(+), 42 deletions(-) diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index a6a9e3a7e2..28b657cd1c 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -80,6 +80,7 @@ export interface DataTableColumnData extends DataTableSortColumnData { export interface DataTableRowData { [key: string]: any; + selectable?: boolean; } @customElement("ha-data-table") @@ -249,6 +250,7 @@ export class HaDataTable extends BaseElement { data-row-id="${row[this.id]}" @click=${this._handleRowClick} class="mdc-data-table__row" + .selectable=${row.selectable !== false} > ${this.selectable ? html` @@ -258,6 +260,7 @@ export class HaDataTable extends BaseElement { { + if (!(this.rowElements[rowIndex] as any).selectable) { + return; + } this.rowElements[rowIndex].classList.add(cssClasses); }, - getRowCount: () => this.data.length, + getRowCount: () => this.rowElements.length, getRowElements: () => this.rowElements, getRowIdAtIndex: (rowIndex: number) => this._getRowIdAtIndex(rowIndex), getRowIndexByChildElement: (el: Element) => @@ -309,7 +315,7 @@ export class HaDataTable extends BaseElement { isCheckboxAtRowIndexChecked: (rowIndex: number) => this._checkedRows.includes(this._getRowIdAtIndex(rowIndex)), isHeaderRowCheckboxChecked: () => this._headerChecked, - isRowsSelectable: () => true, + isRowsSelectable: () => this.selectable, notifyRowSelectionChanged: () => undefined, notifySelectedAll: () => undefined, notifyUnselectedAll: () => undefined, @@ -332,6 +338,9 @@ export class HaDataTable extends BaseElement { this._headerIndeterminate = indeterminate; }, setRowCheckboxCheckedAtIndex: (rowIndex: number, checked: boolean) => { + if (!(this.rowElements[rowIndex] as any).selectable) { + return; + } this._setRowChecked(this._getRowIdAtIndex(rowIndex), checked); }, }; @@ -516,6 +525,7 @@ export class HaDataTable extends BaseElement { padding-left: 16px; /* @noflip */ padding-right: 0; + width: 40px; } [dir="rtl"] .mdc-data-table__header-cell--checkbox, .mdc-data-table__header-cell--checkbox[dir="rtl"], @@ -558,6 +568,7 @@ export class HaDataTable extends BaseElement { .mdc-data-table__cell--icon { color: var(--secondary-text-color); text-align: center; + width: 24px; } .mdc-data-table__header-cell { diff --git a/src/components/ha-related-items.ts b/src/components/ha-related-items.ts index ab459ce0c4..d1b900578b 100644 --- a/src/components/ha-related-items.ts +++ b/src/components/ha-related-items.ts @@ -68,6 +68,13 @@ export class HaRelatedItems extends SubscribeMixin(LitElement) { if (!this._related) { return html``; } + if (Object.keys(this._related).length === 0) { + return html` +

+ ${this.hass.localize("ui.components.related-items.no_related_found")} +

+ `; + } return html` ${this._related.config_entry && this._entries ? this._related.config_entry.map((relatedConfigEntryId) => { diff --git a/src/dialogs/config-flow/step-flow-pick-handler.ts b/src/dialogs/config-flow/step-flow-pick-handler.ts index 8b09967cc7..a20e8de4c8 100644 --- a/src/dialogs/config-flow/step-flow-pick-handler.ts +++ b/src/dialogs/config-flow/step-flow-pick-handler.ts @@ -20,6 +20,7 @@ import "../../common/search/search-input"; import { styleMap } from "lit-html/directives/style-map"; import { FlowConfig } from "./show-dialog-data-entry-flow"; import { configFlowContentStyles } from "./styles"; +import { classMap } from "lit-html/directives/class-map"; interface HandlerObj { name: string; @@ -69,7 +70,10 @@ class StepFlowPickHandler extends LitElement { .filter=${this.filter} @value-changed=${this._filterChanged} > -
+
${handlers.map( (handler: HandlerObj) => html` @@ -143,6 +147,14 @@ class StepFlowPickHandler extends LitElement { overflow: auto; max-height: 600px; } + @media all and (max-height: 1px) { + div { + max-height: calc(100vh - 205px); + } + div.advanced { + max-height: calc(100vh - 300px); + } + } paper-item { cursor: pointer; } diff --git a/src/panels/config/devices/device-detail/ha-device-entities-card.ts b/src/panels/config/devices/device-detail/ha-device-entities-card.ts index 60c9301c51..1a35d70e35 100644 --- a/src/panels/config/devices/device-detail/ha-device-entities-card.ts +++ b/src/panels/config/devices/device-detail/ha-device-entities-card.ts @@ -152,6 +152,7 @@ export class HaDeviceEntitiesCard extends LitElement { const entry = (ev.currentTarget! as any).entry; showEntityRegistryDetailDialog(this, { entry, + entity_id: entry.entity_id, }); } diff --git a/src/panels/config/entities/dialog-entity-registry-detail.ts b/src/panels/config/entities/dialog-entity-registry-detail.ts index 440d557417..fbd9a94543 100644 --- a/src/panels/config/entities/dialog-entity-registry-detail.ts +++ b/src/panels/config/entities/dialog-entity-registry-detail.ts @@ -51,7 +51,8 @@ export class DialogEntityRegistryDetail extends LitElement { return html``; } const entry = this._params.entry; - const stateObj: HassEntity | undefined = this.hass.states[entry.entity_id]; + const entityId = this._params.entity_id; + const stateObj: HassEntity | undefined = this.hass.states[entityId]; return html`
- ${stateObj - ? computeStateName(stateObj) - : entry.name || entry.entity_id} + ${stateObj ? computeStateName(stateObj) : entry?.name || entityId}
${stateObj ? html` @@ -99,20 +98,28 @@ export class DialogEntityRegistryDetail extends LitElement { ${cache( this._curTab === "tab-settings" - ? html` - - ` + ? entry + ? html` + + ` + : html` + + ${this.hass.localize( + "ui.dialogs.entity_registry.no_unique_id" + )} + + ` : this._curTab === "tab-related" ? html` @@ -139,7 +146,7 @@ export class DialogEntityRegistryDetail extends LitElement { private _openMoreInfo(): void { fireEvent(this, "hass-more-info", { - entityId: this._params!.entry.entity_id, + entityId: this._params!.entity_id, }); this._params = undefined; } diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index 77282d6f94..7cc43a7fe1 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -3,7 +3,7 @@ import "@polymer/paper-dropdown-menu/paper-dropdown-menu"; import "@polymer/paper-item/paper-icon-item"; import "@polymer/paper-listbox/paper-listbox"; import "@polymer/paper-tooltip/paper-tooltip"; -import { UnsubscribeFunc } from "home-assistant-js-websocket"; +import { UnsubscribeFunc, HassEntities } from "home-assistant-js-websocket"; import { css, CSSResult, @@ -22,7 +22,6 @@ import { stateIcon } from "../../../common/entity/state_icon"; import { DataTableColumnContainer, DataTableColumnData, - HaDataTable, RowClickedEvent, SelectionChangedEvent, } from "../../../components/data-table/ha-data-table"; @@ -47,6 +46,20 @@ import { } from "./show-dialog-entity-registry-detail"; import { configSections } from "../ha-panel-config"; import { classMap } from "lit-html/directives/class-map"; +import { computeStateName } from "../../../common/entity/compute_state_name"; +// tslint:disable-next-line: no-duplicate-imports +import { HaTabsSubpageDataTable } from "../../../layouts/hass-tabs-subpage-data-table"; + +export interface StateEntity extends EntityRegistryEntry { + readonly?: boolean; + selectable?: boolean; +} + +export interface EntityRow extends StateEntity { + icon: string; + unavailable: boolean; + status: string; +} @customElement("ha-config-entities") export class HaConfigEntities extends SubscribeMixin(LitElement) { @@ -57,9 +70,11 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { @property() private _entities?: EntityRegistryEntry[]; @property() private _showDisabled = false; @property() private _showUnavailable = true; + @property() private _showReadOnly = true; @property() private _filter = ""; @property() private _selectedEntities: string[] = []; - @query("ha-data-table") private _dataTable!: HaDataTable; + @query("hass-tabs-subpage-data-table") + private _dataTable!: HaTabsSubpageDataTable; private getDialog?: () => DialogEntityRegistryDetail | undefined; private _columns = memoize( @@ -90,7 +105,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { sortable: true, filterable: true, template: (_status, entity: any) => - entity.unavailable || entity.disabled_by + entity.unavailable || entity.disabled_by || entity.readonly ? html`
${entity.unavailable ? this.hass.localize( "ui.panel.config.entities.picker.status.unavailable" ) - : this.hass.localize( + : entity.disabled_by + ? this.hass.localize( "ui.panel.config.entities.picker.status.disabled" + ) + : this.hass.localize( + "ui.panel.config.entities.picker.status.readonly" )}
@@ -156,21 +177,43 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { private _filteredEntities = memoize( ( entities: EntityRegistryEntry[], + states: HassEntities, showDisabled: boolean, - showUnavailable: boolean - ) => { + showUnavailable: boolean, + showReadOnly: boolean + ): EntityRow[] => { + const stateEntities: StateEntity[] = []; + if (showReadOnly) { + const regEntityIds = new Set( + entities.map((entity) => entity.entity_id) + ); + for (const entityId of Object.keys(states)) { + if (regEntityIds.has(entityId)) { + continue; + } + stateEntities.push({ + name: computeStateName(states[entityId]), + entity_id: entityId, + platform: computeDomain(entityId), + disabled_by: null, + readonly: true, + selectable: false, + }); + } + } + if (!showDisabled) { entities = entities.filter((entity) => !Boolean(entity.disabled_by)); } - return entities.reduce((result, entry) => { - const state = this.hass!.states[entry.entity_id]; + const result: EntityRow[] = []; - const unavailable = - state && (state.state === "unavailable" || state.attributes.restored); // if there is not state it is disabled + for (const entry of entities.concat(stateEntities)) { + const state = states[entry.entity_id]; + const unavailable = state?.state === "unavailable"; if (!showUnavailable && unavailable) { - return result; + continue; } result.push({ @@ -192,8 +235,9 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { ) : this.hass.localize("ui.panel.config.entities.picker.status.ok"), }); - return result; - }, [] as any); + } + + return result; } ); @@ -322,6 +366,15 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { "ui.panel.config.entities.picker.filter.show_unavailable" )} + + + ${this.hass!.localize( + "ui.panel.config.entities.picker.filter.show_readonly" + )} + `; @@ -336,8 +389,10 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { .columns=${this._columns(this.narrow, this.hass.language)} .data=${this._filteredEntities( this._entities, + this.hass.states, this._showDisabled, - this._showUnavailable + this._showUnavailable, + this._showReadOnly )} .filter=${this._filter} selectable @@ -369,6 +424,10 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { this._showUnavailable = !this._showUnavailable; } + private _showReadOnlyChanged() { + this._showReadOnly = !this._showReadOnly; + } + private _handleSearchChange(ev: CustomEvent) { this._filter = ev.detail.value; } @@ -461,15 +520,13 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { } private _openEditEntry(ev: CustomEvent): void { - const entryId = (ev.detail as RowClickedEvent).id; + const entityId = (ev.detail as RowClickedEvent).id; const entry = this._entities!.find( - (entity) => entity.entity_id === entryId + (entity) => entity.entity_id === entityId ); - if (!entry) { - return; - } this.getDialog = showEntityRegistryDetailDialog(this, { entry, + entity_id: entityId, }); } diff --git a/src/panels/config/entities/show-dialog-entity-registry-detail.ts b/src/panels/config/entities/show-dialog-entity-registry-detail.ts index 4549579af4..b4b47b26f0 100644 --- a/src/panels/config/entities/show-dialog-entity-registry-detail.ts +++ b/src/panels/config/entities/show-dialog-entity-registry-detail.ts @@ -3,7 +3,8 @@ import { EntityRegistryEntry } from "../../../data/entity_registry"; import { DialogEntityRegistryDetail } from "./dialog-entity-registry-detail"; export interface EntityRegistryDetailDialogParams { - entry: EntityRegistryEntry; + entry?: EntityRegistryEntry; + entity_id: string; } export const loadEntityRegistryDetailDialog = () => @@ -21,12 +22,12 @@ const getDialog = () => { export const showEntityRegistryDetailDialog = ( element: HTMLElement, - systemLogDetailParams: EntityRegistryDetailDialogParams + entityDetailParams: EntityRegistryDetailDialogParams ): (() => DialogEntityRegistryDetail | undefined) => { fireEvent(element, "show-dialog", { dialogTag: "dialog-entity-registry-detail", dialogImport: loadEntityRegistryDetailDialog, - dialogParams: systemLogDetailParams, + dialogParams: entityDetailParams, }); return getDialog; }; diff --git a/src/translations/en.json b/src/translations/en.json index 771ac55b29..3ffe6d3d53 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -572,6 +572,7 @@ "service": "Service" }, "related-items": { + "no_related_found": "No related items found.", "integration": "Integration", "device": "Device", "area": "Area", @@ -640,6 +641,7 @@ "control": "Control", "related": "Related", "dismiss": "Dismiss", + "no_unique_id": "This entity does not have a unique ID, therefore it's settings can not be managed from the UI.", "editor": { "name": "Name Override", "entity_id": "Entity ID", @@ -1345,11 +1347,13 @@ "filter": { "filter": "Filter", "show_disabled": "Show disabled entities", - "show_unavailable": "Show unavailable entities" + "show_unavailable": "Show unavailable entities", + "show_readonly": "Show read-only entities" }, "status": { "unavailable": "Unavailable", "disabled": "Disabled", + "readonly": "Read-only", "ok": "Ok" }, "headers": { From fb7fbf2dac778e6f331e1e58b8098bdd842f7286 Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Mon, 17 Feb 2020 08:26:45 -0600 Subject: [PATCH 29/31] add state_color option to glance, button and state-icon (#4854) * add state_color option to glance, button and state-icon * address comments * address comments --- src/panels/lovelace/cards/hui-button-card.ts | 9 ++++++--- src/panels/lovelace/cards/hui-glance-card.ts | 6 ++++-- src/panels/lovelace/cards/types.ts | 3 +++ src/panels/lovelace/elements/hui-state-icon-element.ts | 4 ++-- src/panels/lovelace/elements/types.ts | 1 + 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index af6f1efec2..feff566435 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -49,6 +49,7 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { hold_action: { action: "more-info" }, show_icon: true, show_name: true, + state_color: true, }; } @@ -148,7 +149,9 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { ? html` (config.entities); for (const entity of entities) { @@ -237,7 +237,9 @@ export class HuiGlanceCard extends LitElement implements LovelaceCard { .stateObj=${stateObj} .overrideIcon=${entityConf.icon} .overrideImage=${entityConf.image} - stateColor + .stateColor=${(entityConf.state_color === false || + entityConf.state_color) ?? + this._config!.state_color} > ` : ""} diff --git a/src/panels/lovelace/cards/types.ts b/src/panels/lovelace/cards/types.ts index ffc361e64d..141a7874a4 100644 --- a/src/panels/lovelace/cards/types.ts +++ b/src/panels/lovelace/cards/types.ts @@ -57,6 +57,7 @@ export interface ButtonCardConfig extends LovelaceCardConfig { tap_action?: ActionConfig; hold_action?: ActionConfig; double_tap_action?: ActionConfig; + state_color?: boolean; } export interface EntityFilterCardConfig extends LovelaceCardConfig { @@ -102,6 +103,7 @@ export interface GlanceConfigEntity extends ConfigEntity { show_last_changed?: boolean; image?: string; show_state?: boolean; + state_color?: boolean; } export interface GlanceCardConfig extends LovelaceCardConfig { @@ -112,6 +114,7 @@ export interface GlanceCardConfig extends LovelaceCardConfig { theme?: string; entities: ConfigEntity[]; columns?: number; + state_color?: boolean; } export interface IframeCardConfig extends LovelaceCardConfig { diff --git a/src/panels/lovelace/elements/hui-state-icon-element.ts b/src/panels/lovelace/elements/hui-state-icon-element.ts index 4420ae96c3..2c0c0bcf12 100644 --- a/src/panels/lovelace/elements/hui-state-icon-element.ts +++ b/src/panels/lovelace/elements/hui-state-icon-element.ts @@ -32,7 +32,7 @@ export class HuiStateIconElement extends LitElement implements LovelaceElement { throw Error("Invalid Configuration: 'entity' required"); } - this._config = config; + this._config = { state_color: true, ...config }; } protected shouldUpdate(changedProps: PropertyValues): boolean { @@ -71,7 +71,7 @@ export class HuiStateIconElement extends LitElement implements LovelaceElement { hasAction(this._config.tap_action) ? "0" : undefined )} .overrideIcon=${this._config.icon} - stateColor + .stateColor=${this._config.state_color} > `; } diff --git a/src/panels/lovelace/elements/types.ts b/src/panels/lovelace/elements/types.ts index 7c848c64ea..e42f689e31 100644 --- a/src/panels/lovelace/elements/types.ts +++ b/src/panels/lovelace/elements/types.ts @@ -59,6 +59,7 @@ export interface StateIconElementConfig extends LovelaceElementConfig { hold_action?: ActionConfig; double_tap_action?: ActionConfig; icon?: string; + state_color?: boolean; } export interface StateLabelElementConfig extends LovelaceElementConfig { From 7036cefa72e4bf085a794c8ff1c8e239d60eb7b1 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 17 Feb 2020 15:27:31 +0100 Subject: [PATCH 30/31] Allow to change the location of home zone in zone editor (#4849) * Allow to change the location of home zone in zone editor * Update src/translations/en.json Co-Authored-By: Paulus Schoutsen * Comment + mobile to general config * Remove dupe import Co-authored-by: Paulus Schoutsen --- src/components/map/ha-locations-editor.ts | 25 +++++---- src/panels/config/zone/ha-config-zone.ts | 62 ++++++++++++++++++++--- src/translations/en.json | 5 +- 3 files changed, 74 insertions(+), 18 deletions(-) diff --git a/src/components/map/ha-locations-editor.ts b/src/components/map/ha-locations-editor.ts index 3cb70c0f93..fcf8c2b12a 100644 --- a/src/components/map/ha-locations-editor.ts +++ b/src/components/map/ha-locations-editor.ts @@ -41,7 +41,8 @@ export interface MarkerLocation { id: string; icon?: string; radius_color?: string; - editable?: boolean; + location_editable?: boolean; + radius_editable?: boolean; } @customElement("ha-locations-editor") @@ -208,7 +209,7 @@ export class HaLocationsEditor extends LitElement { } ); circle.addTo(this._leafletMap!); - if (location.editable) { + if (location.radius_editable || location.location_editable) { // @ts-ignore circle.editing.enable(); // @ts-ignore @@ -230,19 +231,25 @@ export class HaLocationsEditor extends LitElement { // @ts-ignore (ev: MouseEvent) => this._markerClicked(ev) ); - resizeMarker.addEventListener( - "dragend", - // @ts-ignore - (ev: DragEndEvent) => this._updateRadius(ev) - ); + if (location.radius_editable) { + resizeMarker.addEventListener( + "dragend", + // @ts-ignore + (ev: DragEndEvent) => this._updateRadius(ev) + ); + } else { + resizeMarker.remove(); + } this._locationMarkers![location.id] = circle; } else { this._circles[location.id] = circle; } } - if (!location.radius || !location.editable) { + if ( + !location.radius || + (!location.radius_editable && !location.location_editable) + ) { const options: MarkerOptions = { - draggable: Boolean(location.editable), title: location.name, }; diff --git a/src/panels/config/zone/ha-config-zone.ts b/src/panels/config/zone/ha-config-zone.ts index e015af15ac..b441c09379 100644 --- a/src/panels/config/zone/ha-config-zone.ts +++ b/src/panels/config/zone/ha-config-zone.ts @@ -47,6 +47,9 @@ import { SubscribeMixin } from "../../../mixins/subscribe-mixin"; import { subscribeEntityRegistry } from "../../../data/entity_registry"; import { configSections } from "../ha-panel-config"; import { navigate } from "../../../common/navigate"; +import { saveCoreConfig } from "../../../data/core"; +import { ifDefined } from "lit-html/directives/if-defined"; +import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box"; @customElement("ha-config-zone") export class HaConfigZone extends SubscribeMixin(LitElement) { @@ -57,6 +60,7 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { @property() private _storageItems?: Zone[]; @property() private _stateItems?: HassEntity[]; @property() private _activeEntry: string = ""; + @property() private _canEditCore = false; @query("ha-locations-editor") private _map?: HaLocationsEditor; private _regEntities: string[] = []; @@ -76,14 +80,17 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { : state.attributes.passive ? passiveRadiusColor : defaultRadiusColor, - editable: false, + location_editable: + state.entity_id === "zone.home" && this._canEditCore, + radius_editable: false, }; }); const storageLocations: MarkerLocation[] = storageItems.map((zone) => { return { ...zone, radius_color: zone.passive ? passiveRadiusColor : defaultRadiusColor, - editable: true, + location_editable: true, + radius_editable: true, }; }); return storageLocations.concat(stateLocations); @@ -166,12 +173,23 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { ${state.entity_id === "zone.home" ? this.hass.localize( - "ui.panel.config.zone.edit_home_zone" + `ui.panel.config.zone.${ + this.narrow + ? "edit_home_zone_narrow" + : "edit_home_zone" + }` ) : this.hass.localize( "ui.panel.config.zone.configured_in_yaml" @@ -234,6 +252,9 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { protected firstUpdated(changedProps: PropertyValues) { super.firstUpdated(changedProps); + this._canEditCore = + Boolean(this.hass.user?.is_admin) && + ["storage", "default"].includes(this.hass.config.config_source); this._fetchData(); if (this.route.path === "/new") { navigate(this, "/config/zone", true); @@ -288,8 +309,15 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { } } - private _locationUpdated(ev: CustomEvent) { + private async _locationUpdated(ev: CustomEvent) { this._activeEntry = ev.detail.id; + if (ev.detail.id === "zone.home" && this._canEditCore) { + await saveCoreConfig(this.hass, { + latitude: ev.detail.location[0], + longitude: ev.detail.location[1], + }); + return; + } const entry = this._storageItems!.find((item) => item.id === ev.detail.id); if (!entry) { return; @@ -319,7 +347,7 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { this._openDialog(); } - private _itemClicked(ev: MouseEvent) { + private _itemClicked(ev: Event) { if (this.narrow) { this._openEditEntry(ev); return; @@ -328,7 +356,7 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { this._zoomZone(entry.id); } - private _stateItemClicked(ev: MouseEvent) { + private _stateItemClicked(ev: Event) { const entityId = (ev.currentTarget! as HTMLElement).getAttribute( "data-id" )!; @@ -339,11 +367,29 @@ export class HaConfigZone extends SubscribeMixin(LitElement) { this._map?.fitMarker(id); } - private _openEditEntry(ev: MouseEvent) { + private _openEditEntry(ev: Event) { const entry: Zone = (ev.currentTarget! as any).entry; this._openDialog(entry); } + private async _openCoreConfig(ev: Event) { + const entityId: string = (ev.currentTarget! as any).entityId; + if (entityId !== "zone.home" || !this.narrow || !this._canEditCore) { + return; + } + if ( + !(await showConfirmationDialog(this, { + title: this.hass.localize("ui.panel.config.zone.go_to_core_config"), + text: this.hass.localize("ui.panel.config.zone.home_zone_core_config"), + confirmText: this.hass!.localize("ui.common.yes"), + dismissText: this.hass!.localize("ui.common.no"), + })) + ) { + return; + } + navigate(this, "/config/core"); + } + private async _createEntry(values: ZoneMutableParams) { const created = await createZone(this.hass!, values); this._storageItems = this._storageItems!.concat( diff --git a/src/translations/en.json b/src/translations/en.json index 3ffe6d3d53..e419e3ee9d 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1415,7 +1415,10 @@ "add_zone": "Add Zone", "confirm_delete": "Are you sure you want to delete this zone?", "configured_in_yaml": "Zones configured via configuration.yaml cannot be edited via the UI.", - "edit_home_zone": "The location of your home can be changed in the general configuration.", + "edit_home_zone": "The radius of the Home zone can't be edited from the frontend yet. Drag the marker on the map to move the home zone.", + "edit_home_zone_narrow": "The radius of the Home zone can't be edited from the frontend yet. The location can be changed from the general configuration.", + "go_to_core_config": "Go to general configuration?", + "home_zone_core_config": "The location of your home zone is editable from the general configuration page. The radius of the Home zone can't be edited from the frontend yet. Do you want to go to the general configuration?", "detail": { "new_zone": "New Zone", "name": "Name", From 46a596ce3413cfaf2b6ce0f97f7b68981c28171f Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 17 Feb 2020 15:58:06 +0100 Subject: [PATCH 31/31] Bumped version to 20200217.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ea1d493ebf..4203a11a97 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="home-assistant-frontend", - version="20200212.0", + version="20200217.0", description="The Home Assistant frontend", url="https://github.com/home-assistant/home-assistant-polymer", author="The Home Assistant Authors",