More-info service

This commit is contained in:
Thomas Lovén 2022-07-20 00:57:51 +00:00
parent 30d8f027dc
commit 77554aa86c
7 changed files with 104 additions and 9 deletions

View File

@ -887,6 +887,13 @@ const ServicesMixin = (SuperClass) => {
[timeout: <number>] [timeout: <number>]
[timeout_action: <service call>] [timeout_action: <service call>]
More-info:
service: browser_mod.more_info
data:
entity: <string>
[large: <true/FALSE>]
[ignore_popup_card: <true/FALSE>]
Close popup: Close popup:
service: browser_mod.close_popup service: browser_mod.close_popup
@ -914,6 +921,7 @@ const ServicesMixin = (SuperClass) => {
"sequence", "sequence",
"delay", "delay",
"popup", "popup",
"more_info",
"close_popup", "close_popup",
"navigate", "navigate",
"refresh", "refresh",
@ -948,6 +956,10 @@ const ServicesMixin = (SuperClass) => {
case "delay": case "delay":
await new Promise((resolve) => setTimeout(resolve, data.time)); await new Promise((resolve) => setTimeout(resolve, data.time));
break; break;
case "more_info":
const { entity, large, ignore_popup_card } = data;
this.showMoreInfo(entity, large, ignore_popup_card);
break;
case "popup": case "popup":
const { title, content } = data, d = __rest(data, ["title", "content"]); const { title, content } = data, d = __rest(data, ["title", "content"]);
for (const [k, v] of Object.entries(d)) { for (const [k, v] of Object.entries(d)) {
@ -1332,6 +1344,22 @@ const PopupMixin = (SuperClass) => {
} }
closePopup(...args) { closePopup(...args) {
this._popupEl.closeDialog(); this._popupEl.closeDialog();
this.showMoreInfo("");
}
async showMoreInfo(entityId, large = false, ignore_popup_card = undefined) {
const base = await hass_base_el();
base.dispatchEvent(new CustomEvent("hass-more-info", {
bubbles: true,
composed: true,
cancelable: false,
detail: { entityId, ignore_popup_card },
}));
if (large) {
await new Promise((resolve) => setTimeout(resolve, 50));
const dialog = base.shadowRoot.querySelector("ha-more-info-dialog");
if (dialog)
dialog.large = true;
}
} }
}; };
}; };
@ -1670,18 +1698,19 @@ class PopupCard extends s {
window.removeEventListener("hass-more-info", this.popup); window.removeEventListener("hass-more-info", this.popup);
} }
popup(ev) { popup(ev) {
var _a, _b; var _a, _b, _c;
if (((_a = ev.detail) === null || _a === void 0 ? void 0 : _a.entityId) === this._config.entity) { if (((_a = ev.detail) === null || _a === void 0 ? void 0 : _a.entityId) === this._config.entity &&
!((_b = ev.detail) === null || _b === void 0 ? void 0 : _b.ignore_popup_card)) {
ev.stopPropagation(); ev.stopPropagation();
ev.preventDefault(); ev.preventDefault();
const config = Object.assign({}, this._config); const config = Object.assign({}, this._config);
delete config.card; delete config.card;
(_b = window.browser_mod) === null || _b === void 0 ? void 0 : _b.service("popup", Object.assign({ content: this._config.card }, this._config)); (_c = window.browser_mod) === null || _c === void 0 ? void 0 : _c.service("popup", Object.assign({ content: this._config.card }, this._config));
setTimeout(() => this.dispatchEvent(new CustomEvent("hass-more-info", { setTimeout(() => this.dispatchEvent(new CustomEvent("hass-more-info", {
bubbles: true, bubbles: true,
composed: true, composed: true,
cancelable: false, cancelable: false,
detail: { entityID: "." }, detail: { entityId: "." },
})), 50); })), 50);
} }
} }
@ -1761,7 +1790,7 @@ __decorate([
- Commands - Commands
x popup x popup
x close_popup x close_popup
- more-info x more-info
x navigate x navigate
- lovelace-reload? - lovelace-reload?
x window-reload x window-reload

View File

@ -62,6 +62,7 @@ async def async_setup_services(hass):
hass.services.async_register(DOMAIN, "sequence", handle_service) hass.services.async_register(DOMAIN, "sequence", handle_service)
hass.services.async_register(DOMAIN, "delay", handle_service) hass.services.async_register(DOMAIN, "delay", handle_service)
hass.services.async_register(DOMAIN, "popup", handle_service) hass.services.async_register(DOMAIN, "popup", handle_service)
hass.services.async_register(DOMAIN, "more_info", handle_service)
hass.services.async_register(DOMAIN, "close_popup", handle_service) hass.services.async_register(DOMAIN, "close_popup", handle_service)
hass.services.async_register(DOMAIN, "navigate", handle_service) hass.services.async_register(DOMAIN, "navigate", handle_service)
hass.services.async_register(DOMAIN, "refresh", handle_service) hass.services.async_register(DOMAIN, "refresh", handle_service)

View File

@ -113,6 +113,35 @@ popup:
selector: selector:
object: object:
more_info:
description: "Show more-info dialog"
target:
device:
integration: "browser_mod"
multiple: true
entity:
integration: "browser_mod_none"
area:
device:
integration: "browser_mod"
multiple: true
fields:
entity:
name: Entity ID
required: true
selector:
text:
large:
name: Large size
default: false
selector:
boolean:
ignore_popup_card:
name: Ignore any active popup-card overrides
default: false
selector:
boolean:
close_popup: close_popup:
description: "Close a popup" description: "Close a popup"
target: target:

View File

@ -36,7 +36,7 @@ import "./popup-card";
- Commands - Commands
x popup x popup
x close_popup x close_popup
- more-info x more-info
x navigate x navigate
- lovelace-reload? - lovelace-reload?
x window-reload x window-reload

View File

@ -52,7 +52,10 @@ class PopupCard extends LitElement {
} }
popup(ev: CustomEvent) { popup(ev: CustomEvent) {
if (ev.detail?.entityId === this._config.entity) { if (
ev.detail?.entityId === this._config.entity &&
!ev.detail?.ignore_popup_card
) {
ev.stopPropagation(); ev.stopPropagation();
ev.preventDefault(); ev.preventDefault();
const config = { ...this._config }; const config = { ...this._config };
@ -69,7 +72,7 @@ class PopupCard extends LitElement {
bubbles: true, bubbles: true,
composed: true, composed: true,
cancelable: false, cancelable: false,
detail: { entityID: "." }, detail: { entityId: "." },
}) })
), ),
50 50

View File

@ -1,7 +1,7 @@
import { LitElement, html, css } from "lit"; import { LitElement, html, css } from "lit";
import { property } from "lit/decorators.js"; import { property } from "lit/decorators.js";
import { unsafeHTML } from "lit/directives/unsafe-html.js"; import { unsafeHTML } from "lit/directives/unsafe-html.js";
import { provideHass, loadLoadCardHelpers } from "../helpers"; import { provideHass, loadLoadCardHelpers, hass_base_el } from "../helpers";
class BrowserModPopup extends LitElement { class BrowserModPopup extends LitElement {
@property() open; @property() open;
@ -309,6 +309,26 @@ export const PopupMixin = (SuperClass) => {
closePopup(...args) { closePopup(...args) {
this._popupEl.closeDialog(); this._popupEl.closeDialog();
this.showMoreInfo("");
}
async showMoreInfo(entityId, large = false, ignore_popup_card = undefined) {
const base = await hass_base_el();
base.dispatchEvent(
new CustomEvent("hass-more-info", {
bubbles: true,
composed: true,
cancelable: false,
detail: { entityId, ignore_popup_card },
})
);
if (large) {
await new Promise((resolve) => setTimeout(resolve, 50));
const dialog: any = base.shadowRoot.querySelector(
"ha-more-info-dialog"
);
if (dialog) dialog.large = true;
}
} }
}; };
}; };

View File

@ -32,6 +32,13 @@ export const ServicesMixin = (SuperClass) => {
[timeout: <number>] [timeout: <number>]
[timeout_action: <service call>] [timeout_action: <service call>]
More-info:
service: browser_mod.more_info
data:
entity: <string>
[large: <true/FALSE>]
[ignore_popup_card: <true/FALSE>]
Close popup: Close popup:
service: browser_mod.close_popup service: browser_mod.close_popup
@ -60,6 +67,7 @@ export const ServicesMixin = (SuperClass) => {
"sequence", "sequence",
"delay", "delay",
"popup", "popup",
"more_info",
"close_popup", "close_popup",
"navigate", "navigate",
"refresh", "refresh",
@ -101,6 +109,11 @@ export const ServicesMixin = (SuperClass) => {
await new Promise((resolve) => setTimeout(resolve, data.time)); await new Promise((resolve) => setTimeout(resolve, data.time));
break; break;
case "more_info":
const { entity, large, ignore_popup_card } = data;
this.showMoreInfo(entity, large, ignore_popup_card);
break;
case "popup": case "popup":
const { title, content, ...d } = data; const { title, content, ...d } = data;
for (const [k, v] of Object.entries(d)) { for (const [k, v] of Object.entries(d)) {