Allow multiple tap/hold/doubletap actions.

This commit is contained in:
Thomas Lovén 2021-01-10 13:52:28 +01:00
parent 1538fbb102
commit 4dcfe3031d
10 changed files with 100 additions and 61 deletions

View File

@ -148,6 +148,11 @@ export interface CustomActionConfig extends BaseActionConfig {
action: "fire-dom-event";
}
export interface MultipleActionConfig extends BaseActionConfig {
action: "multiple";
actions: ActionConfig[];
}
export interface BaseActionConfig {
confirmation?: ConfirmationRestrictionConfig;
}
@ -168,7 +173,8 @@ export type ActionConfig =
| UrlActionConfig
| MoreInfoActionConfig
| NoActionConfig
| CustomActionConfig;
| CustomActionConfig
| MultipleActionConfig;
type LovelaceUpdatedEvent = HassEventBase & {
event_type: "lovelace_updated";

View File

@ -40,69 +40,74 @@ export const handleAction = async (
};
}
if (
actionConfig.confirmation &&
(!actionConfig.confirmation.exemptions ||
!actionConfig.confirmation.exemptions.some(
(e) => e.user === hass!.user!.id
))
) {
forwardHaptic("warning");
const actionConfigs =
actionConfig.action === "multiple" ? actionConfig.actions : [actionConfig];
for await (actionConfig of actionConfigs) {
if (
!(await showConfirmationDialog(node, {
text:
actionConfig.confirmation.text ||
hass.localize(
"ui.panel.lovelace.cards.action_confirmation",
"action",
actionConfig.action
),
}))
actionConfig.confirmation &&
(!actionConfig.confirmation.exemptions ||
!actionConfig.confirmation.exemptions.some(
(e) => e.user === hass!.user!.id
))
) {
return;
}
}
forwardHaptic("warning");
switch (actionConfig.action) {
case "more-info": {
if (config.entity || config.camera_image) {
fireEvent(node, "hass-more-info", {
entityId: config.entity ? config.entity : config.camera_image!,
});
}
break;
}
case "navigate":
if (actionConfig.navigation_path) {
navigate(node, actionConfig.navigation_path);
}
break;
case "url": {
if (actionConfig.url_path) {
window.open(actionConfig.url_path);
}
break;
}
case "toggle": {
if (config.entity) {
toggleEntity(hass, config.entity!);
forwardHaptic("light");
}
break;
}
case "call-service": {
if (!actionConfig.service) {
forwardHaptic("failure");
if (
!(await showConfirmationDialog(node, {
text:
actionConfig.confirmation.text ||
hass.localize(
"ui.panel.lovelace.cards.action_confirmation",
"action",
actionConfig.action
),
}))
) {
return;
}
const [domain, service] = actionConfig.service.split(".", 2);
hass.callService(domain, service, actionConfig.service_data);
forwardHaptic("light");
break;
}
case "fire-dom-event": {
fireEvent(node, "ll-custom", actionConfig);
switch (actionConfig.action) {
case "more-info": {
if (config.entity || config.camera_image) {
fireEvent(node, "hass-more-info", {
entityId: config.entity ? config.entity : config.camera_image!,
});
}
break;
}
case "navigate":
if (actionConfig.navigation_path) {
navigate(node, actionConfig.navigation_path);
}
break;
case "url": {
if (actionConfig.url_path) {
window.open(actionConfig.url_path);
}
break;
}
case "toggle": {
if (config.entity) {
toggleEntity(hass, config.entity!);
forwardHaptic("light");
}
break;
}
case "call-service": {
if (!actionConfig.service) {
forwardHaptic("failure");
return;
}
const [domain, service] = actionConfig.service.split(".", 2);
hass.callService(domain, service, actionConfig.service_data);
forwardHaptic("light");
break;
}
case "fire-dom-event": {
fireEvent(node, "ll-custom", actionConfig);
}
}
}
};

View File

@ -130,6 +130,15 @@ export class HuiActionEditor extends LitElement {
</b>
`
: ""}
${this.config?.action === "multiple"
? html`
<b>
${this.hass!.localize(
"ui.panel.lovelace.editor.action-editor.editor_multiple_actions"
)}
</b>
`
: ""}
`;
}

View File

@ -46,6 +46,7 @@ const actions = [
"url",
"call-service",
"none",
"multiple",
];
@customElement("hui-button-card-editor")

View File

@ -82,6 +82,7 @@ export class HuiLightCardEditor extends LitElement
"url",
"call-service",
"none",
"multiple",
];
return html`

View File

@ -60,7 +60,7 @@ export class HuiPictureCardEditor extends LitElement
return html``;
}
const actions = ["navigate", "url", "call-service", "none"];
const actions = ["navigate", "url", "call-service", "none", "multiple"];
return html`
<div class="card-config">

View File

@ -104,7 +104,14 @@ export class HuiPictureEntityCardEditor extends LitElement
return html``;
}
const actions = ["more-info", "toggle", "navigate", "call-service", "none"];
const actions = [
"more-info",
"toggle",
"navigate",
"call-service",
"none",
"multiple",
];
const views = ["auto", "live"];
const dir = computeRTLDirection(this.hass!);

View File

@ -108,7 +108,14 @@ export class HuiPictureGlanceCardEditor extends LitElement
return html``;
}
const actions = ["more-info", "toggle", "navigate", "call-service", "none"];
const actions = [
"more-info",
"toggle",
"navigate",
"call-service",
"none",
"multiple",
];
const views = ["auto", "live"];
return html`

View File

@ -98,6 +98,7 @@ export const actionConfigStruct = object({
url_path: optional(string()),
service: optional(string()),
service_data: optional(object()),
actions: optional(array()),
});
const buttonEntitiesRowConfigStruct = object({

View File

@ -2564,6 +2564,7 @@
"action-editor": {
"navigation_path": "Navigation Path",
"url_path": "URL Path",
"editor_multiple_actions": "Multiple actions can only be entered in the code editor",
"editor_service_data": "Service data can only be entered in the code editor",
"actions": {
"default_action": "Default Action",
@ -2572,7 +2573,8 @@
"toggle": "Toggle",
"navigate": "Navigate",
"url": "URL",
"none": "No Action"
"none": "No Action",
"multiple": "Multiple actions"
}
},
"card": {