Allow downloading diagnostics of a config entry (#11345)

Co-authored-by: Zack Barett <arnett.zackary@gmail.com>
This commit is contained in:
Paulus Schoutsen 2022-01-17 18:25:52 -08:00 committed by GitHub
parent 09a27a6791
commit 441f1fbcb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 61 additions and 0 deletions

18
src/data/diagnostics.ts Normal file
View File

@ -0,0 +1,18 @@
import { HomeAssistant } from "../types";
interface DiagnosticInfo {
domain: string;
handlers: {
config_entry: boolean;
};
}
export const fetchDiagnosticHandlers = (
hass: HomeAssistant
): Promise<DiagnosticInfo[]> =>
hass.callWS<DiagnosticInfo[]>({
type: "diagnostics/list",
});
export const getConfigEntryDiagnosticsDownloadUrl = (entry_id: string) =>
`/api/diagnostics/config_entry/${entry_id}`;

View File

@ -61,6 +61,7 @@ import "./ha-config-flow-card";
import "./ha-ignored-config-entry-card";
import "./ha-integration-card";
import type { HaIntegrationCard } from "./ha-integration-card";
import { fetchDiagnosticHandlers } from "../../../data/diagnostics";
export interface ConfigEntryUpdatedEvent {
entry: ConfigEntry;
@ -138,6 +139,8 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
@state() private _filter?: string;
@state() private _diagnosticHandlers?: Record<string, boolean>;
public hassSubscribe(): UnsubscribeFunc[] {
return [
subscribeEntityRegistry(this.hass.connection, (entries) => {
@ -252,6 +255,15 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
this._handleAdd(localizePromise);
}
this._scanUSBDevices();
if (isComponentLoaded(this.hass, "diagnostics")) {
fetchDiagnosticHandlers(this.hass).then((infos) => {
const handlers = {};
for (const info of infos) {
handlers[info.domain] = info.handlers.config_entry;
}
this._diagnosticHandlers = handlers;
});
}
}
protected updated(changed: PropertyValues) {
@ -423,6 +435,9 @@ class HaConfigIntegrations extends SubscribeMixin(LitElement) {
.manifest=${this._manifests[domain]}
.entityRegistryEntries=${this._entityRegistryEntries}
.deviceRegistryEntries=${this._deviceRegistryEntries}
.supportsDiagnostics=${this._diagnosticHandlers
? this._diagnosticHandlers[domain]
: false}
></ha-integration-card>`
)
: this._filter &&

View File

@ -20,6 +20,7 @@ import "../../../components/ha-card";
import "../../../components/ha-icon-button";
import "../../../components/ha-icon-next";
import "../../../components/ha-svg-icon";
import { getSignedPath } from "../../../data/auth";
import {
ConfigEntry,
deleteConfigEntry,
@ -31,6 +32,7 @@ import {
ERROR_STATES,
} from "../../../data/config_entries";
import type { DeviceRegistryEntry } from "../../../data/device_registry";
import { getConfigEntryDiagnosticsDownloadUrl } from "../../../data/diagnostics";
import type { EntityRegistryEntry } from "../../../data/entity_registry";
import type { IntegrationManifest } from "../../../data/integration";
import { integrationIssuesUrl } from "../../../data/integration";
@ -73,6 +75,8 @@ export class HaIntegrationCard extends LitElement {
@property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) public supportsDiagnostics = false;
protected render(): TemplateResult {
let item = this._selectededConfigEntry;
@ -357,6 +361,19 @@ export class HaIntegrationCard extends LitElement {
)}
</mwc-list-item>`
: ""}
${this.supportsDiagnostics
? html`<a
href=${getConfigEntryDiagnosticsDownloadUrl(item.entry_id)}
target="_blank"
@click=${this._signUrl}
>
<mwc-list-item>
${this.hass.localize(
"ui.panel.config.integrations.config_entry.download_diagnostics"
)}
</mwc-list-item>
</a>`
: ""}
${item.disabled_by === "user"
? html`<mwc-list-item @request-selected=${this._handleEnable}>
${this.hass.localize("ui.common.enable")}
@ -623,6 +640,16 @@ export class HaIntegrationCard extends LitElement {
fireEvent(this, "entry-updated", { entry: result.config_entry });
}
private async _signUrl(ev) {
const anchor = ev.target.closest("a");
ev.preventDefault();
const signedUrl = await getSignedPath(
this.hass,
anchor.getAttribute("href")
);
document.location.assign(signedUrl.path);
}
static get styles(): CSSResultGroup {
return [
haStyle,

View File

@ -2440,6 +2440,7 @@
"configure": "Configure",
"system_options": "System options",
"documentation": "Documentation",
"download_diagnostics": "Download diagnostics",
"known_issues": "Known issues",
"delete": "Delete",
"delete_confirm": "Are you sure you want to delete the {title} integration?",