From 0b47d2c687c59d2c33b7675e2846671c3e90fb58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Fri, 1 Apr 2022 17:05:53 +0200 Subject: [PATCH] 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(); }