From 50bf8866caa514fb97fd4bdd803a1b5c9e35be09 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Mon, 16 Dec 2019 23:00:54 +0100 Subject: [PATCH 1/4] Add ignore discovery button --- src/data/config_flow.ts | 5 ++ .../ha-config-entries-dashboard.ts | 50 ++++++++++++++++--- src/translations/en.json | 3 ++ 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/data/config_flow.ts b/src/data/config_flow.ts index d415524d8d01..a8b314c558d3 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"]; + 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 ecb02e913101..cd13e99800f3 100644 --- a/src/panels/config/integrations/ha-config-entries-dashboard.ts +++ b/src/panels/config/integrations/ha-config-entries-dashboard.ts @@ -23,7 +23,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, @@ -38,6 +42,7 @@ import { ConfigEntry } 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 { @@ -82,9 +87,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" + )} + + ` + : ""} ${this.hass.localize( "ui.panel.config.integrations.configure" )} 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.confirm_ignore_title", + "name", + localizeConfigFlowTitle(this.hass.localize, flow) + ), + text: this.hass!.localize("ui.panel.config.integrations.confirm_ignore"), + confirmBtnText: this.hass!.localize( + "ui.panel.config.integrations.ignore" + ), + confirm: () => { + ignoreConfigFlow(this.hass, flow.flow_id); + fireEvent(this, "hass-reload-entries"); + }, + }); + } + private _getEntities(configEntry: ConfigEntry): HassEntity[] { if (!this.entityRegistryEntries) { return []; @@ -203,8 +239,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 +264,9 @@ export class HaConfigManagerDashboard extends LitElement { right: auto; left: 16px; } + .overflow { + width: 56px; + } `; } } diff --git a/src/translations/en.json b/src/translations/en.json index 3f8110875d9a..8cf56b19f342 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1304,6 +1304,9 @@ "note_about_website_reference": "More are available on the ", "home_assistant_website": "Home Assistant website", "configure": "Configure", + "ignore": "Ignore", + "confirm_ignore_title": "Ignore discovery of {name}?", + "confirm_ignore": "Are you sure you don't want to setup this integration? We will not notify you of it again.", "none": "Nothing configured yet", "integration_not_found": "Integration not found.", "details": "Integration details", From e175dcbcbe89705c79511f2dd5f7ba4ca148295b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Tue, 17 Dec 2019 11:42:16 +0100 Subject: [PATCH 2/4] Add seperate list for ignored integrations --- .../ha-config-entries-dashboard.ts | 181 ++++++++++++++---- .../integrations/ha-config-integrations.ts | 2 +- src/translations/en.json | 8 +- 3 files changed, 147 insertions(+), 44 deletions(-) diff --git a/src/panels/config/integrations/ha-config-entries-dashboard.ts b/src/panels/config/integrations/ha-config-entries-dashboard.ts index cd13e99800f3..68c695875d67 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"; @@ -38,7 +39,7 @@ 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"; @@ -61,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(); @@ -72,6 +74,67 @@ export class HaConfigManagerDashboard extends LitElement { + + + + + ${this.hass.localize( + this._showIgnored + ? "ui.panel.config.integrations.hide_ignored" + : "ui.panel.config.integrations.show_ignored" + )} + + + + + ${this._showIgnored + ? html` + + ${this.hass.localize( + "ui.panel.config.integrations.ignored" + )} + + ${this.configEntries + .filter((item) => item.source === "ignore") + .map( + (item: ConfigEntry) => html` + + + ${this.hass.localize( + `component.${item.domain}.config.title` + )} + + + + ` + )} + + + ` + : ""} ${this.configEntriesInProgress.length ? html` @@ -116,49 +179,51 @@ export class HaConfigManagerDashboard extends LitElement { : ""} - ${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`
@@ -218,6 +283,38 @@ export class HaConfigManagerDashboard extends LitElement { }); } + 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.confirm_delete_ignore_title", + "name", + this.hass.localize(`component.${entry.domain}.config.title`) + ), + text: this.hass!.localize( + "ui.panel.config.integrations.confirm_delete_ignore" + ), + confirmBtnText: this.hass!.localize( + "ui.panel.config.integrations.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 []; diff --git a/src/panels/config/integrations/ha-config-integrations.ts b/src/panels/config/integrations/ha-config-integrations.ts index 8e97de6e37fc..ac30b659a11d 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 8cf56b19f342..990fc481741c 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1306,7 +1306,13 @@ "configure": "Configure", "ignore": "Ignore", "confirm_ignore_title": "Ignore discovery of {name}?", - "confirm_ignore": "Are you sure you don't want to setup this integration? We will not notify you of it again.", + "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", "none": "Nothing configured yet", "integration_not_found": "Integration not found.", "details": "Integration details", From ca9d8f5f436834225744b50fc941007263293a17 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 18 Dec 2019 10:45:02 +0100 Subject: [PATCH 3/4] Move translations --- .../ha-config-entries-dashboard.ts | 22 ++++++++++--------- src/translations/en.json | 20 +++++++++-------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/panels/config/integrations/ha-config-entries-dashboard.ts b/src/panels/config/integrations/ha-config-entries-dashboard.ts index 68c695875d67..3c7f4c337032 100644 --- a/src/panels/config/integrations/ha-config-entries-dashboard.ts +++ b/src/panels/config/integrations/ha-config-entries-dashboard.ts @@ -94,8 +94,8 @@ export class HaConfigManagerDashboard extends LitElement { ${this.hass.localize( this._showIgnored - ? "ui.panel.config.integrations.hide_ignored" - : "ui.panel.config.integrations.show_ignored" + ? "ui.panel.config.integrations.ignore.hide_ignored" + : "ui.panel.config.integrations.ignore.show_ignored" )} @@ -106,7 +106,7 @@ export class HaConfigManagerDashboard extends LitElement { ${this.hass.localize( - "ui.panel.config.integrations.ignored" + "ui.panel.config.integrations.ignore.ignored" )} @@ -158,7 +158,7 @@ export class HaConfigManagerDashboard extends LitElement { .flow=${flow} > ${this.hass.localize( - "ui.panel.config.integrations.ignore" + "ui.panel.config.integrations.ignore.ignore" )} ` @@ -268,13 +268,15 @@ export class HaConfigManagerDashboard extends LitElement { const flow = (ev.target! as any).flow; showConfirmationDialog(this, { title: this.hass!.localize( - "ui.panel.config.integrations.confirm_ignore_title", + "ui.panel.config.integrations.ignore.confirm_ignore_title", "name", localizeConfigFlowTitle(this.hass.localize, flow) ), - text: this.hass!.localize("ui.panel.config.integrations.confirm_ignore"), + text: this.hass!.localize( + "ui.panel.config.integrations.ignore.confirm_ignore" + ), confirmBtnText: this.hass!.localize( - "ui.panel.config.integrations.ignore" + "ui.panel.config.integrations.ignore.ignore" ), confirm: () => { ignoreConfigFlow(this.hass, flow.flow_id); @@ -291,15 +293,15 @@ export class HaConfigManagerDashboard extends LitElement { const entry = (ev.target! as any).entry; showConfirmationDialog(this, { title: this.hass!.localize( - "ui.panel.config.integrations.confirm_delete_ignore_title", + "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.confirm_delete_ignore" + "ui.panel.config.integrations.ignore.confirm_delete_ignore" ), confirmBtnText: this.hass!.localize( - "ui.panel.config.integrations.stop_ignore" + "ui.panel.config.integrations.ignore.stop_ignore" ), confirm: async () => { const result = await deleteConfigEntry(this.hass, entry.entry_id); diff --git a/src/translations/en.json b/src/translations/en.json index 990fc481741c..d5fba1419f1a 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1304,18 +1304,20 @@ "note_about_website_reference": "More are available on the ", "home_assistant_website": "Home Assistant website", "configure": "Configure", - "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", "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}", From 3e76f17218e2a155baae0543448845d59b9ad190 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 18 Dec 2019 10:47:14 +0100 Subject: [PATCH 4/4] Add zeroconf --- src/data/config_flow.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/config_flow.ts b/src/data/config_flow.ts index a8b314c558d3..e65cb948401c 100644 --- a/src/data/config_flow.ts +++ b/src/data/config_flow.ts @@ -4,7 +4,7 @@ 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"]; +export const DISCOVERY_SOURCES = ["homekit", "ssdp", "zeroconf"]; export const createConfigFlow = (hass: HomeAssistant, handler: string) => hass.callApi("POST", "config/config_entries/flow", {