From 80a48523252eefc155f53953f4c5a719422eb60c Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Thu, 31 Mar 2022 00:11:23 +0200 Subject: [PATCH 01/15] Add missing label for new statistics "adjust sum" button (#12169) --- src/translations/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/translations/en.json b/src/translations/en.json index 86bc60cbfc..b31065b7fa 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4049,7 +4049,8 @@ "update": "Update the historic statistic values from ''{metadata_unit}'' to ''{state_unit}''", "clear": "Delete all old statistic data for this entity" } - } + }, + "adjust_sum": "Adjust sum" } } }, From 0bb2767696bbc521daf1f76c32550ec133c89fa9 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Thu, 31 Mar 2022 00:11:50 +0200 Subject: [PATCH 02/15] Add missing labels to media player volume buttons (#12170) --- .../more-info/controls/more-info-media_player.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/dialogs/more-info/controls/more-info-media_player.ts b/src/dialogs/more-info/controls/more-info-media_player.ts index 6f4b88926e..8d0a135728 100644 --- a/src/dialogs/more-info/controls/more-info-media_player.ts +++ b/src/dialogs/more-info/controls/more-info-media_player.ts @@ -96,6 +96,13 @@ class MoreInfoMediaPlayer extends LitElement { .path=${stateObj.attributes.is_volume_muted ? mdiVolumeOff : mdiVolumeHigh} + .label=${this.hass.localize( + `ui.card.media_player.${ + stateObj.attributes.is_volume_muted + ? "media_volume_unmute" + : "media_volume_mute" + }` + )} @click=${this._toggleMute} > ` @@ -105,11 +112,17 @@ class MoreInfoMediaPlayer extends LitElement { ` From 4c3baa678ce375a10369b64368c07366ea5c9322 Mon Sep 17 00:00:00 2001 From: Philip Allgaier Date: Thu, 31 Mar 2022 00:12:22 +0200 Subject: [PATCH 03/15] Bump caniuse-lite (#12168) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7701804f4f..a055a2b6f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5915,9 +5915,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001259": - version: 1.0.30001261 - resolution: "caniuse-lite@npm:1.0.30001261" - checksum: d894662312ecbdd772f0a258c4a45cac93605247b127b25649052353e0b981abfd0b445f469650943b612adc236fd510ae61c1293f3e77c68af7411d1b66574a + version: 1.0.30001322 + resolution: "caniuse-lite@npm:1.0.30001322" + checksum: 48609d1808c69034a74ab6df9db8cffd847e12da6979e150f364cc8e2a4310fce1f2811382ca57b3b4111c0182f7c67edfde3cd4159c29537fc232596aecf48b languageName: node linkType: hard From bf35ee549dff6a5aec1a93645955ea0c42b3ea1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 31 Mar 2022 15:15:21 +0200 Subject: [PATCH 04/15] Only use the state to mark updates as pending (#12171) --- src/data/update.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/update.ts b/src/data/update.ts index 7482412343..9f913111fe 100644 --- a/src/data/update.ts +++ b/src/data/update.ts @@ -2,6 +2,7 @@ import type { HassEntityAttributeBase, HassEntityBase, } from "home-assistant-js-websocket"; +import { BINARY_STATE_ON } from "../common/const"; import { supportsFeature } from "../common/entity/supports-feature"; import { HomeAssistant } from "../types"; @@ -30,9 +31,8 @@ export const updateUsesProgress = (entity: UpdateEntity): boolean => typeof entity.attributes.in_progress === "number"; export const updateCanInstall = (entity: UpdateEntity): boolean => - supportsFeature(entity, UPDATE_SUPPORT_INSTALL) && - entity.attributes.latest_version !== entity.attributes.current_version && - entity.attributes.latest_version !== entity.attributes.skipped_version; + entity.state === BINARY_STATE_ON && + supportsFeature(entity, UPDATE_SUPPORT_INSTALL); export const updateIsInstalling = (entity: UpdateEntity): boolean => updateUsesProgress(entity) || !!entity.attributes.in_progress; From edc15940a26e115686294319b7b743cabe409d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 31 Mar 2022 15:16:19 +0200 Subject: [PATCH 05/15] Add icon to add-on picker (#12174) --- demo/src/stubs/hassio_supervisor.ts | 2 +- .../public/api/hassio/addons/core_zwave_js/icon | Bin 0 -> 13153 bytes src/components/ha-addon-picker.ts | 5 ++++- 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 gallery/public/api/hassio/addons/core_zwave_js/icon diff --git a/demo/src/stubs/hassio_supervisor.ts b/demo/src/stubs/hassio_supervisor.ts index 95c0d330d4..6b75b020b7 100644 --- a/demo/src/stubs/hassio_supervisor.ts +++ b/demo/src/stubs/hassio_supervisor.ts @@ -31,7 +31,7 @@ export const mockHassioSupervisor = (hass: MockHomeAssistant) => { version_latest: "3.6.2", update_available: false, repository: "a0d7b954", - icon: true, + icon: false, logo: true, }, { diff --git a/gallery/public/api/hassio/addons/core_zwave_js/icon b/gallery/public/api/hassio/addons/core_zwave_js/icon new file mode 100644 index 0000000000000000000000000000000000000000..91ac9039d90270e2117fe4acbac0d5b794e8e819 GIT binary patch literal 13153 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 E1E5(masU7T literal 0 HcmV?d00001 diff --git a/src/components/ha-addon-picker.ts b/src/components/ha-addon-picker.ts index 1dd6a11cea..7a7abf13b1 100644 --- a/src/components/ha-addon-picker.ts +++ b/src/components/ha-addon-picker.ts @@ -13,9 +13,12 @@ import { HaComboBox } from "./ha-combo-box"; const rowRenderer: ComboBoxLitRenderer = ( item -) => html` +) => html` ${item.name} ${item.slug} + ${item.icon + ? html`` + : ""} `; @customElement("ha-addon-picker") From 11696c566a78d1166c72ef24c538de653d6cce87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Thu, 31 Mar 2022 16:05:39 +0200 Subject: [PATCH 06/15] Add support for my backup links (#12172) --- src/panels/my/ha-panel-my.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/panels/my/ha-panel-my.ts b/src/panels/my/ha-panel-my.ts index c02fb74523..e2e2586732 100644 --- a/src/panels/my/ha-panel-my.ts +++ b/src/panels/my/ha-panel-my.ts @@ -117,6 +117,10 @@ const REDIRECTS: Redirects = { component: "lovelace", redirect: "/config/lovelace/resources", }, + backup: { + component: "backup", + redirect: "/config/backup", + }, people: { component: "person", redirect: "/config/person", @@ -184,6 +188,13 @@ class HaPanelMy extends LitElement { super.connectedCallback(); const path = this.route.path.substring(1); + if (path === "backup" && isComponentLoaded(this.hass, "hassio")) { + navigate("/hassio/backups", { + replace: true, + }); + return; + } + if (path.startsWith("supervisor")) { if (!isComponentLoaded(this.hass, "hassio")) { this._error = "no_supervisor"; From e6c580aadce76457480e140cf49f7a5e84e34fc7 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Thu, 31 Mar 2022 10:06:47 -0400 Subject: [PATCH 07/15] Add zwave-js node alerts to device configuration page (#12173) Co-authored-by: Bram Kragten --- src/data/zwave_js.ts | 6 ++++ .../zwave_js/zwave_js-node-config.ts | 36 +++++++++++-------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/data/zwave_js.ts b/src/data/zwave_js.ts index 1cc8653752..a1dc54f852 100644 --- a/src/data/zwave_js.ts +++ b/src/data/zwave_js.ts @@ -167,12 +167,18 @@ export interface ZwaveJSNodeMetadata { wakeup: string; reset: string; device_database_url: string; + comments: ZWaveJSNodeComment[]; } export interface ZWaveJSNodeConfigParams { [key: string]: ZWaveJSNodeConfigParam; } +export interface ZWaveJSNodeComment { + level: "info" | "warning" | "error"; + text: string; +} + export interface ZWaveJSNodeConfigParam { property: number; value: any; diff --git a/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-node-config.ts b/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-node-config.ts index 70e9d26390..bc84b9a78a 100644 --- a/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-node-config.ts +++ b/src/panels/config/integrations/integration-panels/zwave_js/zwave_js-node-config.ts @@ -19,6 +19,7 @@ import { customElement, property, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import memoizeOne from "memoize-one"; import { debounce } from "../../../../../common/util/debounce"; +import "../../../../../components/ha-alert"; import "../../../../../components/ha-card"; import "../../../../../components/ha-icon-next"; import "../../../../../components/ha-select"; @@ -130,7 +131,7 @@ class ZWaveJSNodeConfig extends SubscribeMixin(LitElement) { >`; } - if (!this._config) { + if (!this._config || !this._nodeMetadata) { return html``; } @@ -178,20 +179,27 @@ class ZWaveJSNodeConfig extends SubscribeMixin(LitElement) {

- - ${this._config - ? html` - ${Object.entries(this._config).map( - ([id, item]) => html` - ${this._generateConfigBox(id, item)} - ` + ${this._nodeMetadata.comments.length > 0 + ? html` +
+ ${this._nodeMetadata.comments.map( + (comment) => html` + ${comment.text} + ` )} - ` - : ``} +
+ ` + : ``} + + ${Object.entries(this._config).map( + ([id, item]) => html` + ${this._generateConfigBox(id, item)} + ` + )} From 8de542388fd7a9338043c63f69d3a12382f7942f Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 31 Mar 2022 17:59:20 +0200 Subject: [PATCH 08/15] Show hidden entities on device page (#12177) --- .../devices/device-detail/ha-device-entities-card.ts | 8 ++++++-- src/translations/en.json | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) 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 19e60da9ee..04209e5947 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 @@ -75,7 +75,7 @@ export class HaDeviceEntitiesCard extends LitElement { this._entityRows = []; this.entities.forEach((entry) => { - if (entry.disabled_by || entry.hidden_by) { + if (entry.disabled_by) { if (this._extDisabledEntityEntries) { hiddenEntities.push( this._extDisabledEntityEntries[entry.entity_id] || entry @@ -167,7 +167,11 @@ export class HaDeviceEntitiesCard extends LitElement { computeStateName(stateObj), this.deviceName.toLowerCase() ); - if (name) { + if (entry.hidden_by) { + config.name = `${ + name || computeStateName(stateObj) + } (${this.hass.localize("ui.panel.config.devices.entities.hidden")})`; + } else if (name) { config.name = name; } } diff --git a/src/translations/en.json b/src/translations/en.json index b31065b7fa..7a7dcc5032 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2463,7 +2463,8 @@ "add_entities_lovelace": "Add to dashboard", "none": "This device has no entities", "show_less": "Show less", - "hidden_entities": "+{count} {count, plural,\n one {entity}\n other {entities}\n} not shown" + "hidden_entities": "+{count} {count, plural,\n one {entity}\n other {entities}\n} not shown", + "hidden": "Hidden" }, "confirm_rename_entity_ids": "Do you also want to rename the entity IDs of your entities?", "confirm_rename_entity_ids_warning": "This will not change any configuration (like automations, scripts, scenes, dashboards) that is currently using these entities! You will have to update them yourself to use the new entity IDs!", From ba8b20d877bd7b91e044e2c45eab0a621283d733 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 31 Mar 2022 17:59:44 +0200 Subject: [PATCH 09/15] Fix url config when not logged in to cloud (#12176) --- src/panels/config/core/ha-config-url-form.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/config/core/ha-config-url-form.ts b/src/panels/config/core/ha-config-url-form.ts index e74546ce7b..80830d6c7a 100644 --- a/src/panels/config/core/ha-config-url-form.ts +++ b/src/panels/config/core/ha-config-url-form.ts @@ -246,8 +246,8 @@ class ConfigUrlForm extends LitElement { if (isComponentLoaded(this.hass, "cloud")) { fetchCloudStatus(this.hass).then((cloudStatus) => { + this._cloudStatus = cloudStatus; if (cloudStatus.logged_in) { - this._cloudStatus = cloudStatus; this._showCustomExternalUrl = this._externalUrlValue !== null; } }); From 419d659311b10ace1f49850e2bf17c6a8d8f60e8 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 31 Mar 2022 18:32:10 -0700 Subject: [PATCH 10/15] Guard calling input select row with bad option (#12181) --- .../lovelace/entity-rows/hui-select-entity-row.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/entity-rows/hui-select-entity-row.ts b/src/panels/lovelace/entity-rows/hui-select-entity-row.ts index 5cc2ab0ee9..a169cbe565 100644 --- a/src/panels/lovelace/entity-rows/hui-select-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-select-entity-row.ts @@ -13,6 +13,7 @@ import { computeStateName } from "../../../common/entity/compute_state_name"; import "../../../components/ha-select"; import { UNAVAILABLE } from "../../../data/entity"; import { forwardHaptic } from "../../../data/haptics"; +import type { InputSelectEntity } from "../../../data/input_select"; import { SelectEntity, setSelectOption } from "../../../data/select"; import { HomeAssistant } from "../../../types"; import { EntitiesCardEntityConfig } from "../cards/types"; @@ -106,9 +107,14 @@ class HuiSelectEntityRow extends LitElement implements LovelaceRow { } private _selectedChanged(ev): void { - const stateObj = this.hass!.states[this._config!.entity]; + const stateObj = this.hass!.states[ + this._config!.entity + ] as InputSelectEntity; const option = ev.target.value; - if (option === stateObj.state) { + if ( + option === stateObj.state || + !stateObj.attributes.options.includes(option) + ) { return; } From c68a1d21ff45f0908a7de59bbffc544551d1a401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Fri, 1 Apr 2022 14:37:18 +0200 Subject: [PATCH 11/15] Do not offer to partially backup homeassistant configuration (#12188) --- hassio/src/components/supervisor-backup-content.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/hassio/src/components/supervisor-backup-content.ts b/hassio/src/components/supervisor-backup-content.ts index 5d0b71741f..718afc3869 100644 --- a/hassio/src/components/supervisor-backup-content.ts +++ b/hassio/src/components/supervisor-backup-content.ts @@ -32,13 +32,6 @@ interface AddonCheckboxItem extends CheckboxItem { const _computeFolders = (folders): CheckboxItem[] => { const list: CheckboxItem[] = []; - if (folders.includes("homeassistant")) { - list.push({ - slug: "homeassistant", - name: "Home Assistant configuration", - checked: false, - }); - } if (folders.includes("ssl")) { list.push({ slug: "ssl", name: "SSL", checked: false }); } @@ -100,7 +93,7 @@ export class SupervisorBackupContent extends LitElement { this.folders = _computeFolders( this.backup ? this.backup.folders - : ["homeassistant", "ssl", "share", "media", "addons/local"] + : ["ssl", "share", "media", "addons/local"] ); this.addons = _computeAddons( this.backup ? this.backup.addons : this.supervisor?.supervisor.addons From 8baa0b2a9bd50017ad15b47f2ca4d03ebf136410 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Fri, 1 Apr 2022 14:37:47 +0200 Subject: [PATCH 12/15] Hide skip when auto_update is true for updates (#12184) --- gallery/src/pages/more-info/update.ts | 5 +++++ src/data/update.ts | 1 + .../more-info/controls/more-info-update.ts | 22 ++++++++++++------- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/gallery/src/pages/more-info/update.ts b/gallery/src/pages/more-info/update.ts index f23ae25780..ea531adc56 100644 --- a/gallery/src/pages/more-info/update.ts +++ b/gallery/src/pages/more-info/update.ts @@ -128,6 +128,11 @@ const ENTITIES = [ supported_features: base_attributes.supported_features + UPDATE_SUPPORT_RELEASE_NOTES, }), + getEntity("update", "update19", "on", { + ...base_attributes, + friendly_name: "Update with auto update", + auto_update: true, + }), ]; @customElement("demo-more-info-update") diff --git a/src/data/update.ts b/src/data/update.ts index 9f913111fe..f6f06da0dc 100644 --- a/src/data/update.ts +++ b/src/data/update.ts @@ -13,6 +13,7 @@ export const UPDATE_SUPPORT_BACKUP = 8; export const UPDATE_SUPPORT_RELEASE_NOTES = 16; interface UpdateEntityAttributes extends HassEntityAttributeBase { + auto_update: boolean | null; current_version: string | null; in_progress: boolean | number; latest_version: string | null; diff --git a/src/dialogs/more-info/controls/more-info-update.ts b/src/dialogs/more-info/controls/more-info-update.ts index 44d3d84840..8fe18779b2 100644 --- a/src/dialogs/more-info/controls/more-info-update.ts +++ b/src/dialogs/more-info/controls/more-info-update.ts @@ -130,14 +130,20 @@ class MoreInfoUpdate extends LitElement { : ""}
- - ${this.hass.localize("ui.dialogs.more_info_control.update.skip")} - + ${this.stateObj.attributes.auto_update + ? "" + : html` + + ${this.hass.localize( + "ui.dialogs.more_info_control.update.skip" + )} + + `} ${supportsFeature(this.stateObj, UPDATE_SUPPORT_INSTALL) ? html` Date: Fri, 1 Apr 2022 17:05:53 +0200 Subject: [PATCH 13/15] Redirect old backup links to backup integration for non supervised (#12183) --- src/panels/my/ha-panel-my.ts | 368 ++++++++++++++++++----------------- 1 file changed, 192 insertions(+), 176 deletions(-) diff --git a/src/panels/my/ha-panel-my.ts b/src/panels/my/ha-panel-my.ts index e2e2586732..14015d2629 100644 --- a/src/panels/my/ha-panel-my.ts +++ b/src/panels/my/ha-panel-my.ts @@ -12,158 +12,172 @@ import "../../layouts/hass-error-screen"; import { HomeAssistant, Route } from "../../types"; import { documentationUrl } from "../../util/documentation-url"; -const REDIRECTS: Redirects = { - developer_states: { - redirect: "/developer-tools/state", - }, - developer_services: { - redirect: "/developer-tools/service", - }, - developer_call_service: { - redirect: "/developer-tools/service", - params: { - service: "string", - }, - }, - developer_template: { - redirect: "/developer-tools/template", - }, - developer_events: { - redirect: "/developer-tools/event", - }, - developer_statistics: { - redirect: "/developer-tools/statistics", - }, - config: { - redirect: "/config", - }, - cloud: { - component: "cloud", - redirect: "/config/cloud", - }, - integrations: { - redirect: "/config/integrations", - }, - config_flow_start: { - redirect: "/config/integrations/add", - params: { - domain: "string", - }, - }, - config_mqtt: { - component: "mqtt", - redirect: "/config/mqtt", - }, - config_zha: { - component: "zha", - redirect: "/config/zha/dashboard", - }, - config_zwave_js: { - component: "zwave_js", - redirect: "/config/zwave_js/dashboard", - }, - config_energy: { - component: "energy", - redirect: "/config/energy/dashboard", - }, - devices: { - redirect: "/config/devices/dashboard", - }, - entities: { - redirect: "/config/entities", - }, - energy: { - component: "energy", - redirect: "/energy", - }, - areas: { - redirect: "/config/areas/dashboard", - }, - blueprints: { - component: "blueprint", - redirect: "/config/blueprint/dashboard", - }, - blueprint_import: { - component: "blueprint", - redirect: "/config/blueprint/dashboard/import", - params: { - blueprint_url: "url", - }, - }, - automations: { - component: "automation", - redirect: "/config/automation/dashboard", - }, - scenes: { - component: "scene", - redirect: "/config/scene/dashboard", - }, - scripts: { - component: "script", - redirect: "/config/script/dashboard", - }, - helpers: { - redirect: "/config/helpers", - }, - tags: { - component: "tag", - redirect: "/config/tags", - }, - lovelace_dashboards: { - component: "lovelace", - redirect: "/config/lovelace/dashboards", - }, - lovelace_resources: { - component: "lovelace", - redirect: "/config/lovelace/resources", - }, - backup: { - component: "backup", - redirect: "/config/backup", - }, - people: { - component: "person", - redirect: "/config/person", - }, - zones: { - component: "zone", - redirect: "/config/zone", - }, - users: { - redirect: "/config/users", - }, - general: { - redirect: "/config/core", - }, - server_controls: { - redirect: "/config/server_control", - }, - logs: { - redirect: "/config/logs", - }, - info: { - redirect: "/config/info", - }, - customize: { - // customize was removed in 2021.12, fallback to dashboard - redirect: "/config/dashboard", - }, - profile: { - redirect: "/profile/dashboard", - }, - logbook: { - component: "logbook", - redirect: "/logbook", - }, - history: { - component: "history", - redirect: "/history", - }, - media_browser: { - component: "media_source", - redirect: "/media-browser", - }, -}; +const getRedirect = ( + path: string, + hasSupervisor: boolean +): Redirect | undefined => + (( + { + developer_states: { + redirect: "/developer-tools/state", + }, + developer_services: { + redirect: "/developer-tools/service", + }, + developer_call_service: { + redirect: "/developer-tools/service", + params: { + service: "string", + }, + }, + developer_template: { + redirect: "/developer-tools/template", + }, + developer_events: { + redirect: "/developer-tools/event", + }, + developer_statistics: { + redirect: "/developer-tools/statistics", + }, + config: { + redirect: "/config", + }, + cloud: { + component: "cloud", + redirect: "/config/cloud", + }, + integrations: { + redirect: "/config/integrations", + }, + config_flow_start: { + redirect: "/config/integrations/add", + params: { + domain: "string", + }, + }, + config_mqtt: { + component: "mqtt", + redirect: "/config/mqtt", + }, + config_zha: { + component: "zha", + redirect: "/config/zha/dashboard", + }, + config_zwave_js: { + component: "zwave_js", + redirect: "/config/zwave_js/dashboard", + }, + config_energy: { + component: "energy", + redirect: "/config/energy/dashboard", + }, + devices: { + redirect: "/config/devices/dashboard", + }, + entities: { + redirect: "/config/entities", + }, + energy: { + component: "energy", + redirect: "/energy", + }, + areas: { + redirect: "/config/areas/dashboard", + }, + blueprints: { + component: "blueprint", + redirect: "/config/blueprint/dashboard", + }, + blueprint_import: { + component: "blueprint", + redirect: "/config/blueprint/dashboard/import", + params: { + blueprint_url: "url", + }, + }, + automations: { + component: "automation", + redirect: "/config/automation/dashboard", + }, + scenes: { + component: "scene", + redirect: "/config/scene/dashboard", + }, + scripts: { + component: "script", + redirect: "/config/script/dashboard", + }, + helpers: { + redirect: "/config/helpers", + }, + tags: { + component: "tag", + redirect: "/config/tags", + }, + lovelace_dashboards: { + component: "lovelace", + redirect: "/config/lovelace/dashboards", + }, + lovelace_resources: { + component: "lovelace", + redirect: "/config/lovelace/resources", + }, + people: { + component: "person", + redirect: "/config/person", + }, + zones: { + component: "zone", + redirect: "/config/zone", + }, + users: { + redirect: "/config/users", + }, + general: { + redirect: "/config/core", + }, + server_controls: { + redirect: "/config/server_control", + }, + logs: { + redirect: "/config/logs", + }, + info: { + redirect: "/config/info", + }, + customize: { + // customize was removed in 2021.12, fallback to dashboard + redirect: "/config/dashboard", + }, + profile: { + redirect: "/profile/dashboard", + }, + logbook: { + component: "logbook", + redirect: "/logbook", + }, + history: { + component: "history", + redirect: "/history", + }, + media_browser: { + component: "media_source", + redirect: "/media-browser", + }, + backup: { + component: hasSupervisor ? "hassio" : "backup", + redirect: hasSupervisor ? "/hassio/backups" : "/config/backup", + }, + supervisor_snapshots: { + component: hasSupervisor ? "hassio" : "backup", + redirect: hasSupervisor ? "/hassio/backups" : "/config/backup", + }, + supervisor_backups: { + component: hasSupervisor ? "hassio" : "backup", + redirect: hasSupervisor ? "/hassio/backups" : "/config/backup", + }, + } as Redirects + )[path]); export type ParamType = "url" | "string"; @@ -184,19 +198,17 @@ class HaPanelMy extends LitElement { @state() public _error?: string; + private _redirect?: Redirect; + connectedCallback() { super.connectedCallback(); const path = this.route.path.substring(1); + const hasSupervisor = isComponentLoaded(this.hass, "hassio"); - if (path === "backup" && isComponentLoaded(this.hass, "hassio")) { - navigate("/hassio/backups", { - replace: true, - }); - return; - } + this._redirect = getRedirect(path, hasSupervisor); - if (path.startsWith("supervisor")) { - if (!isComponentLoaded(this.hass, "hassio")) { + if (path.startsWith("supervisor") && this._redirect === undefined) { + if (!hasSupervisor) { this._error = "no_supervisor"; return; } @@ -206,16 +218,14 @@ class HaPanelMy extends LitElement { return; } - const redirect = REDIRECTS[path]; - - if (!redirect) { + if (!this._redirect) { this._error = "not_supported"; return; } if ( - redirect.component && - !isComponentLoaded(this.hass, redirect.component) + this._redirect.component && + !isComponentLoaded(this.hass, this._redirect.component) ) { this._error = "no_component"; return; @@ -223,7 +233,7 @@ class HaPanelMy extends LitElement { let url: string; try { - url = this._createRedirectUrl(redirect); + url = this._createRedirectUrl(); } catch (err: any) { this._error = "url_error"; return; @@ -254,10 +264,16 @@ class HaPanelMy extends LitElement { this.hass.localize( "ui.panel.my.component_not_loaded", "integration", - domainToName( - this.hass.localize, - REDIRECTS[this.route.path.substr(1)].component! - ) + html` + ${domainToName(this.hass.localize, this._redirect!.component!)} + ` ) || "This redirect is not supported."; break; case "no_supervisor": @@ -280,18 +296,18 @@ class HaPanelMy extends LitElement { return html``; } - private _createRedirectUrl(redirect: Redirect): string { - const params = this._createRedirectParams(redirect); - return `${redirect.redirect}${params}`; + private _createRedirectUrl(): string { + const params = this._createRedirectParams(); + return `${this._redirect!.redirect}${params}`; } - private _createRedirectParams(redirect: Redirect): string { + private _createRedirectParams(): string { const params = extractSearchParamsObject(); - if (!redirect.params && !Object.keys(params).length) { + if (!this._redirect!.params && !Object.keys(params).length) { return ""; } const resultParams = {}; - Object.entries(redirect.params || {}).forEach(([key, type]) => { + Object.entries(this._redirect!.params || {}).forEach(([key, type]) => { if (!params[key] || !this._checkParamType(type, params[key])) { throw Error(); } From b45c355c9fabffd61d467276aa36494fa4c7e06e Mon Sep 17 00:00:00 2001 From: Zack Barett Date: Fri, 1 Apr 2022 11:34:32 -0500 Subject: [PATCH 14/15] Fix for Mult enabled selectors when required (#12191) --- src/components/device/ha-devices-picker.ts | 2 +- src/components/entity/ha-entities-picker.ts | 2 +- src/components/ha-areas-picker.ts | 2 +- src/components/ha-selector/ha-selector-select.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/device/ha-devices-picker.ts b/src/components/device/ha-devices-picker.ts index 9ca65e20a5..5b2e0245b9 100644 --- a/src/components/device/ha-devices-picker.ts +++ b/src/components/device/ha-devices-picker.ts @@ -68,7 +68,7 @@ class HaDevicesPicker extends LitElement { .excludeDomains=${this.excludeDomains} .includeDeviceClasses=${this.includeDeviceClasses} .label=${this.pickDeviceLabel} - .required=${this.required} + .required=${this.required && !currentDevices.length} @value-changed=${this._addDevice} >
diff --git a/src/components/entity/ha-entities-picker.ts b/src/components/entity/ha-entities-picker.ts index 75002c51d4..f4c1a24d41 100644 --- a/src/components/entity/ha-entities-picker.ts +++ b/src/components/entity/ha-entities-picker.ts @@ -110,7 +110,7 @@ class HaEntitiesPickerLight extends LitElement { .includeUnitOfMeasurement=${this.includeUnitOfMeasurement} .entityFilter=${this._entityFilter} .label=${this.pickEntityLabel} - .required=${this.required} + .required=${this.required && !currentEntities.length} @value-changed=${this._addEntity} > diff --git a/src/components/ha-areas-picker.ts b/src/components/ha-areas-picker.ts index 24b4e4c2b0..adc8a76c7c 100644 --- a/src/components/ha-areas-picker.ts +++ b/src/components/ha-areas-picker.ts @@ -97,7 +97,7 @@ export class HaAreasPicker extends SubscribeMixin(LitElement) { .entityFilter=${this.entityFilter} .disabled=${this.disabled} .placeholder=${this.placeholder} - .required=${this.required} + .required=${this.required && !currentAreas.length} @value-changed=${this._addArea} > diff --git a/src/components/ha-selector/ha-selector-select.ts b/src/components/ha-selector/ha-selector-select.ts index 9804a79004..2f79979e90 100644 --- a/src/components/ha-selector/ha-selector-select.ts +++ b/src/components/ha-selector/ha-selector-select.ts @@ -108,7 +108,7 @@ export class HaSelectSelector extends LitElement { .hass=${this.hass} .label=${this.label} .disabled=${this.disabled} - .required=${this.required} + .required=${this.required && !value.length} .value=${this._filter} .items=${options.filter((item) => !this.value?.includes(item.value))} @filter-changed=${this._filterChanged} From 9557b604dabed163b2c1ce98708c17fb32a13a51 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 1 Apr 2022 18:35:08 +0200 Subject: [PATCH 15/15] Bumped version to 20220401.0 --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index eee0210ac8..ba0f034718 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = home-assistant-frontend -version = 20220330.0 +version = 20220401.0 author = The Home Assistant Authors author_email = hello@home-assistant.io license = Apache-2.0