mirror of
https://github.com/home-assistant/frontend.git
synced 2025-12-12 02:57:25 +00:00
Compare commits
4 Commits
duplicate-
...
config-ent
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ca2344eb10 | ||
|
|
6c9f51071c | ||
|
|
0c1f57e2ce | ||
|
|
e573f2012e |
29
src/common/util/configuration-url.ts
Normal file
29
src/common/util/configuration-url.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
export interface ProcessedConfigurationUrl {
|
||||||
|
url: string;
|
||||||
|
isLocal: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a processed configuration URL, converting homeassistant:// URLs to local paths
|
||||||
|
* and determining if it should be opened locally or in a new tab.
|
||||||
|
*
|
||||||
|
* @param configurationUrl - The configuration URL to process
|
||||||
|
* @returns Processed URL and whether it's a local link, or null if URL is empty
|
||||||
|
*/
|
||||||
|
export const getConfigurationUrl = (
|
||||||
|
configurationUrl: string | null | undefined
|
||||||
|
): ProcessedConfigurationUrl | null => {
|
||||||
|
if (!configurationUrl) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const isHomeAssistant = configurationUrl.startsWith("homeassistant://");
|
||||||
|
const url = isHomeAssistant
|
||||||
|
? configurationUrl.replace("homeassistant://", "/")
|
||||||
|
: configurationUrl;
|
||||||
|
|
||||||
|
return {
|
||||||
|
url,
|
||||||
|
isLocal: isHomeAssistant,
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -27,6 +27,7 @@ export interface ConfigEntry {
|
|||||||
reason: string | null;
|
reason: string | null;
|
||||||
error_reason_translation_key: string | null;
|
error_reason_translation_key: string | null;
|
||||||
error_reason_translation_placeholders: Record<string, string> | null;
|
error_reason_translation_placeholders: Record<string, string> | null;
|
||||||
|
configuration_url?: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SubEntry {
|
export interface SubEntry {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import { computeStateName } from "../../../common/entity/compute_state_name";
|
|||||||
import { stringCompare } from "../../../common/string/compare";
|
import { stringCompare } from "../../../common/string/compare";
|
||||||
import { slugify } from "../../../common/string/slugify";
|
import { slugify } from "../../../common/string/slugify";
|
||||||
import { groupBy } from "../../../common/util/group-by";
|
import { groupBy } from "../../../common/util/group-by";
|
||||||
|
import { getConfigurationUrl } from "../../../common/util/configuration-url";
|
||||||
import "../../../components/entity/ha-battery-icon";
|
import "../../../components/entity/ha-battery-icon";
|
||||||
import "../../../components/ha-alert";
|
import "../../../components/ha-alert";
|
||||||
import "../../../components/ha-button";
|
import "../../../components/ha-button";
|
||||||
@@ -1090,17 +1091,12 @@ export class HaConfigDevicePage extends LitElement {
|
|||||||
|
|
||||||
const deviceActions: DeviceAction[] = [];
|
const deviceActions: DeviceAction[] = [];
|
||||||
|
|
||||||
const configurationUrlIsHomeAssistant =
|
const processedUrl = getConfigurationUrl(device.configuration_url);
|
||||||
device.configuration_url?.startsWith("homeassistant://") || false;
|
|
||||||
|
|
||||||
const configurationUrl = configurationUrlIsHomeAssistant
|
if (processedUrl) {
|
||||||
? device.configuration_url!.replace("homeassistant://", "/")
|
|
||||||
: device.configuration_url;
|
|
||||||
|
|
||||||
if (configurationUrl) {
|
|
||||||
deviceActions.push({
|
deviceActions.push({
|
||||||
href: configurationUrl,
|
href: processedUrl.url,
|
||||||
target: configurationUrlIsHomeAssistant ? undefined : "_blank",
|
target: processedUrl.isLocal ? undefined : "_blank",
|
||||||
icon: mdiCog,
|
icon: mdiCog,
|
||||||
label: this.hass.localize(
|
label: this.hass.localize(
|
||||||
"ui.panel.config.devices.open_configuration_url"
|
"ui.panel.config.devices.open_configuration_url"
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import {
|
|||||||
mdiDotsVertical,
|
mdiDotsVertical,
|
||||||
mdiDownload,
|
mdiDownload,
|
||||||
mdiHandExtendedOutline,
|
mdiHandExtendedOutline,
|
||||||
|
mdiOpenInNew,
|
||||||
mdiPlayCircleOutline,
|
mdiPlayCircleOutline,
|
||||||
mdiPlus,
|
mdiPlus,
|
||||||
mdiProgressHelper,
|
mdiProgressHelper,
|
||||||
@@ -73,6 +74,7 @@ import "./ha-config-entry-device-row";
|
|||||||
import { renderConfigEntryError } from "./ha-config-integration-page";
|
import { renderConfigEntryError } from "./ha-config-integration-page";
|
||||||
import "./ha-config-sub-entry-row";
|
import "./ha-config-sub-entry-row";
|
||||||
import { copyToClipboard } from "../../../common/util/copy-clipboard";
|
import { copyToClipboard } from "../../../common/util/copy-clipboard";
|
||||||
|
import { getConfigurationUrl } from "../../../common/util/configuration-url";
|
||||||
import { showToast } from "../../../util/toast";
|
import { showToast } from "../../../util/toast";
|
||||||
|
|
||||||
@customElement("ha-config-entry-row")
|
@customElement("ha-config-entry-row")
|
||||||
@@ -213,34 +215,53 @@ class HaConfigEntryRow extends LitElement {
|
|||||||
? html`<ha-button slot="end" @click=${this._handleEnable}>
|
? html`<ha-button slot="end" @click=${this._handleEnable}>
|
||||||
${this.hass.localize("ui.common.enable")}
|
${this.hass.localize("ui.common.enable")}
|
||||||
</ha-button>`
|
</ha-button>`
|
||||||
: configPanel &&
|
: (() => {
|
||||||
(item.domain !== "matter" ||
|
const processedUrl = getConfigurationUrl(item.configuration_url);
|
||||||
isDevVersion(this.hass.config.version)) &&
|
|
||||||
!stateText
|
return html`
|
||||||
? html`<a
|
${processedUrl
|
||||||
slot="end"
|
? html`<a
|
||||||
href=${`/${configPanel}?config_entry=${item.entry_id}`}
|
slot="end"
|
||||||
><ha-icon-button
|
href=${processedUrl.url}
|
||||||
.path=${mdiCogOutline}
|
target=${processedUrl.isLocal ? undefined : "_blank"}
|
||||||
.label=${this.hass.localize(
|
rel=${processedUrl.isLocal ? undefined : "noreferrer"}
|
||||||
"ui.panel.config.integrations.config_entry.configure"
|
>
|
||||||
)}
|
<ha-icon-button
|
||||||
>
|
.path=${mdiOpenInNew}
|
||||||
</ha-icon-button
|
.label=${processedUrl.url}
|
||||||
></a>`
|
></ha-icon-button>
|
||||||
: item.supports_options
|
</a>`
|
||||||
? html`
|
: nothing}
|
||||||
<ha-icon-button
|
${configPanel &&
|
||||||
slot="end"
|
(item.domain !== "matter" ||
|
||||||
@click=${this._showOptions}
|
isDevVersion(this.hass.config.version)) &&
|
||||||
.path=${mdiCogOutline}
|
!stateText
|
||||||
.label=${this.hass.localize(
|
? html`<a
|
||||||
"ui.panel.config.integrations.config_entry.configure"
|
slot="end"
|
||||||
)}
|
href=${`/${configPanel}?config_entry=${item.entry_id}`}
|
||||||
>
|
><ha-icon-button
|
||||||
</ha-icon-button>
|
.path=${mdiCogOutline}
|
||||||
`
|
.label=${this.hass.localize(
|
||||||
: nothing}
|
"ui.panel.config.integrations.config_entry.configure"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
</ha-icon-button
|
||||||
|
></a>`
|
||||||
|
: item.supports_options
|
||||||
|
? html`
|
||||||
|
<ha-icon-button
|
||||||
|
slot="end"
|
||||||
|
@click=${this._showOptions}
|
||||||
|
.path=${mdiCogOutline}
|
||||||
|
.label=${this.hass.localize(
|
||||||
|
"ui.panel.config.integrations.config_entry.configure"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
</ha-icon-button>
|
||||||
|
`
|
||||||
|
: nothing}
|
||||||
|
`;
|
||||||
|
})()}
|
||||||
<ha-md-button-menu positioning="popover" slot="end">
|
<ha-md-button-menu positioning="popover" slot="end">
|
||||||
<ha-icon-button
|
<ha-icon-button
|
||||||
slot="trigger"
|
slot="trigger"
|
||||||
|
|||||||
Reference in New Issue
Block a user