From 2c57ab60f1df88453569cbc60f8ff4cd159f2d27 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 18 Dec 2019 16:22:17 +0100 Subject: [PATCH] Add ignore discovery button (#4354) * Add ignore discovery button * Add seperate list for ignored integrations * Move translations * Add zeroconf --- src/data/config_flow.ts | 5 + .../ha-config-entries-dashboard.ts | 233 ++++++++++++++---- .../integrations/ha-config-integrations.ts | 2 +- src/translations/en.json | 11 + 4 files changed, 202 insertions(+), 49 deletions(-) diff --git a/src/data/config_flow.ts b/src/data/config_flow.ts index d415524d8d..e65cb94840 100644 --- a/src/data/config_flow.ts +++ b/src/data/config_flow.ts @@ -4,6 +4,8 @@ import { debounce } from "../common/util/debounce"; import { getCollection, Connection } from "home-assistant-js-websocket"; import { LocalizeFunc } from "../common/translations/localize"; +export const DISCOVERY_SOURCES = ["homekit", "ssdp", "zeroconf"]; + export const createConfigFlow = (hass: HomeAssistant, handler: string) => hass.callApi("POST", "config/config_entries/flow", { handler, @@ -26,6 +28,9 @@ export const handleConfigFlowStep = ( data ); +export const ignoreConfigFlow = (hass: HomeAssistant, flowId: string) => + hass.callWS({ type: "config_entries/ignore_flow", flow_id: flowId }); + export const deleteConfigFlow = (hass: HomeAssistant, flowId: string) => hass.callApi("DELETE", `config/config_entries/flow/${flowId}`); diff --git a/src/panels/config/integrations/ha-config-entries-dashboard.ts b/src/panels/config/integrations/ha-config-entries-dashboard.ts index ecb02e9131..3c7f4c3370 100644 --- a/src/panels/config/integrations/ha-config-entries-dashboard.ts +++ b/src/panels/config/integrations/ha-config-entries-dashboard.ts @@ -2,6 +2,7 @@ import "@polymer/iron-flex-layout/iron-flex-layout-classes"; import "@polymer/paper-tooltip/paper-tooltip"; import "@material/mwc-button"; import "@polymer/iron-icon/iron-icon"; +import "@polymer/paper-listbox/paper-listbox"; import "@polymer/paper-item/paper-item"; import "@polymer/paper-item/paper-item-body"; @@ -23,7 +24,11 @@ import { loadConfigFlowDialog, showConfigFlowDialog, } from "../../../dialogs/config-flow/show-dialog-config-flow"; -import { localizeConfigFlowTitle } from "../../../data/config_flow"; +import { + localizeConfigFlowTitle, + ignoreConfigFlow, + DISCOVERY_SOURCES, +} from "../../../data/config_flow"; import { LitElement, TemplateResult, @@ -34,10 +39,11 @@ import { CSSResult, } from "lit-element"; import { HomeAssistant } from "../../../types"; -import { ConfigEntry } from "../../../data/config_entries"; +import { ConfigEntry, deleteConfigEntry } from "../../../data/config_entries"; import { fireEvent } from "../../../common/dom/fire_event"; import { EntityRegistryEntry } from "../../../data/entity_registry"; import { DataEntryFlowProgress } from "../../../data/data_entry_flow"; +import { showConfirmationDialog } from "../../../dialogs/confirmation/show-dialog-confirmation"; @customElement("ha-config-entries-dashboard") export class HaConfigManagerDashboard extends LitElement { @@ -56,6 +62,7 @@ export class HaConfigManagerDashboard extends LitElement { * For example, can be discovered devices that require more config. */ @property() private configEntriesInProgress!: DataEntryFlowProgress[]; + @property() private _showIgnored = false; public connectedCallback() { super.connectedCallback(); @@ -67,6 +74,67 @@ export class HaConfigManagerDashboard extends LitElement { + + + + + ${this.hass.localize( + this._showIgnored + ? "ui.panel.config.integrations.ignore.hide_ignored" + : "ui.panel.config.integrations.ignore.show_ignored" + )} + + + + + ${this._showIgnored + ? html` + + ${this.hass.localize( + "ui.panel.config.integrations.ignore.ignored" + )} + + ${this.configEntries + .filter((item) => item.source === "ignore") + .map( + (item: ConfigEntry) => html` + + + ${this.hass.localize( + `component.${item.domain}.config.title` + )} + + + + ` + )} + + + ` + : ""} ${this.configEntriesInProgress.length ? html` @@ -82,9 +150,22 @@ export class HaConfigManagerDashboard extends LitElement { ${localizeConfigFlowTitle(this.hass.localize, flow)} + ${DISCOVERY_SOURCES.includes(flow.context.source) && + flow.context.unique_id + ? html` + + ${this.hass.localize( + "ui.panel.config.integrations.ignore.ignore" + )} + + ` + : ""} ${this.hass.localize( "ui.panel.config.integrations.configure" )} - ${this.hass.localize( - "ui.panel.config.integrations.configured" - )} + + ${this.hass.localize("ui.panel.config.integrations.configured")} + ${this.entityRegistryEntries.length - ? this.configEntries.map( - (item: any, idx) => html` - - - -
- ${this.hass.localize( - `component.${item.domain}.config.title` - )}: - ${item.title} -
-
- ${this._getEntities(item).map( - (entity) => html` - - - ${computeStateName(entity)} - - ` - )} -
-
- -
-
- ` + ? this.configEntries.map((item: any, idx) => + item.source === "ignore" + ? "" + : html` + + + +
+ ${this.hass.localize( + `component.${item.domain}.config.title` + )}: + ${item.title} +
+
+ ${this._getEntities(item).map( + (entity) => html` + + + ${computeStateName( + entity + )} + + ` + )} +
+
+ +
+
+ ` ) : html`
@@ -176,12 +259,64 @@ export class HaConfigManagerDashboard extends LitElement { private _continueFlow(ev: Event) { showConfigFlowDialog(this, { - continueFlowId: - (ev.target as HTMLElement).getAttribute("data-id") || undefined, + continueFlowId: (ev.target! as any).flowId, dialogClosedCallback: () => fireEvent(this, "hass-reload-entries"), }); } + private _ignoreFlow(ev: Event) { + const flow = (ev.target! as any).flow; + showConfirmationDialog(this, { + title: this.hass!.localize( + "ui.panel.config.integrations.ignore.confirm_ignore_title", + "name", + localizeConfigFlowTitle(this.hass.localize, flow) + ), + text: this.hass!.localize( + "ui.panel.config.integrations.ignore.confirm_ignore" + ), + confirmBtnText: this.hass!.localize( + "ui.panel.config.integrations.ignore.ignore" + ), + confirm: () => { + ignoreConfigFlow(this.hass, flow.flow_id); + fireEvent(this, "hass-reload-entries"); + }, + }); + } + + private _toggleShowIgnored() { + this._showIgnored = !this._showIgnored; + } + + private async _removeIgnoredIntegration(ev: Event) { + const entry = (ev.target! as any).entry; + showConfirmationDialog(this, { + title: this.hass!.localize( + "ui.panel.config.integrations.ignore.confirm_delete_ignore_title", + "name", + this.hass.localize(`component.${entry.domain}.config.title`) + ), + text: this.hass!.localize( + "ui.panel.config.integrations.ignore.confirm_delete_ignore" + ), + confirmBtnText: this.hass!.localize( + "ui.panel.config.integrations.ignore.stop_ignore" + ), + confirm: async () => { + const result = await deleteConfigEntry(this.hass, entry.entry_id); + if (result.require_restart) { + alert( + this.hass.localize( + "ui.panel.config.integrations.config_entry.restart_confirm" + ) + ); + } + fireEvent(this, "hass-reload-entries"); + }, + }); + } + private _getEntities(configEntry: ConfigEntry): HassEntity[] { if (!this.entityRegistryEntries) { return []; @@ -203,8 +338,7 @@ export class HaConfigManagerDashboard extends LitElement { overflow: hidden; } mwc-button { - top: 3px; - margin-right: -0.57em; + align-self: center; } .config-entry-row { display: flex; @@ -229,6 +363,9 @@ export class HaConfigManagerDashboard extends LitElement { right: auto; left: 16px; } + .overflow { + width: 56px; + } `; } } diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index 8e97de6e37..ac30b659a1 100644 --- a/src/panels/config/integrations/ha-config-integrations.ts +++ b/src/panels/config/integrations/ha-config-integrations.ts @@ -116,7 +116,7 @@ class HaConfigIntegrations extends HassRouterPage { private _loadData() { getConfigEntries(this.hass).then((configEntries) => { this._configEntries = configEntries.sort((conf1, conf2) => - compare(conf1.title, conf2.title) + compare(conf1.domain + conf1.title, conf2.domain + conf2.title) ); }); if (this._unsubs) { diff --git a/src/translations/en.json b/src/translations/en.json index 3f8110875d..d5fba1419f 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1307,6 +1307,17 @@ "none": "Nothing configured yet", "integration_not_found": "Integration not found.", "details": "Integration details", + "ignore": { + "ignore": "Ignore", + "confirm_ignore_title": "Ignore discovery of {name}?", + "confirm_ignore": "Are you sure you don't want to setup this integration? You can undo this by clicking the 'Show ignored integrations' in the overflow menu on the top right.", + "show_ignored": "Show ignored integrations", + "hide_ignored": "Hide ignored integrations", + "ignored": "Ignored", + "confirm_delete_ignore_title": "Stop ignoring {name}?", + "confirm_delete_ignore": "This will make the integration appear in your discovered integrations again when it gets discovered. This might require a restart or take some time.", + "stop_ignore": "Stop ignoring" + }, "config_entry": { "settings_button": "Edit settings for {integration}", "system_options_button": "System options for {integration}",