Skip to content

Commit 4674384

Browse files
frenckclaude
andauthored
Allow deleting helpers directly from helpers panel (#28044)
* Allow deleting helpers directly from helpers panel * Fix error handling in helper deletion logic Address review feedback by improving the logic in _deleteHelper: - Throw error when entity is not found in registry or component not loaded - Move return statement outside of nested condition to ensure proper control flow - Prevent fallthrough to config entry deletion for old-style helpers Addresses review comment from @MindFreeze 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> --------- Co-authored-by: Claude <[email protected]>
1 parent 2e7c95a commit 4674384

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

src/panels/config/helpers/ha-config-helpers.ts

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
mdiCancel,
66
mdiChevronRight,
77
mdiCog,
8+
mdiDelete,
89
mdiDotsVertical,
910
mdiMenuDown,
1011
mdiPencilOff,
@@ -109,10 +110,11 @@ import { configSections } from "../ha-panel-config";
109110
import "../integrations/ha-integration-overflow-menu";
110111
import { renderConfigEntryError } from "../integrations/ha-config-integration-page";
111112
import { showLabelDetailDialog } from "../labels/show-dialog-label-detail";
112-
import { isHelperDomain } from "./const";
113+
import { isHelperDomain, type HelperDomain } from "./const";
113114
import { showHelperDetailDialog } from "./show-dialog-helper-detail";
114115
import { slugify } from "../../../common/string/slugify";
115116
import { isComponentLoaded } from "../../../common/config/is_component_loaded";
117+
import { HELPERS_CRUD } from "../../../data/helpers_crud";
116118
import {
117119
fetchDiagnosticHandlers,
118120
getConfigEntryDiagnosticsDownloadUrl,
@@ -451,6 +453,19 @@ export class HaConfigHelpers extends SubscribeMixin(LitElement) {
451453
},
452454
]
453455
: []),
456+
...(helper.editable && helper.entity
457+
? [
458+
{
459+
divider: true,
460+
},
461+
{
462+
path: mdiDelete,
463+
label: this.hass.localize("ui.common.delete"),
464+
warning: true,
465+
action: () => this._deleteHelper(helper),
466+
},
467+
]
468+
: []),
454469
]}
455470
>
456471
</ha-icon-overflow-menu>
@@ -1280,6 +1295,62 @@ ${rejected
12801295
}
12811296
}
12821297

1298+
private async _deleteHelper(helper: HelperItem) {
1299+
if (!helper.entity_id) {
1300+
return;
1301+
}
1302+
1303+
const confirmed = await showConfirmationDialog(this, {
1304+
title: this.hass.localize(
1305+
"ui.panel.config.helpers.picker.delete_confirm_title"
1306+
),
1307+
text: this.hass.localize(
1308+
"ui.panel.config.helpers.picker.delete_confirm_text",
1309+
{ name: helper.name }
1310+
),
1311+
confirmText: this.hass.localize("ui.common.delete"),
1312+
dismissText: this.hass.localize("ui.common.cancel"),
1313+
destructive: true,
1314+
});
1315+
1316+
if (!confirmed) {
1317+
return;
1318+
}
1319+
1320+
try {
1321+
// For old-style helpers (input_boolean, etc.), use HELPERS_CRUD
1322+
if (isHelperDomain(helper.type)) {
1323+
const entityReg = this._entityReg.find(
1324+
(e) => e.entity_id === helper.entity_id
1325+
);
1326+
if (
1327+
!entityReg?.unique_id ||
1328+
!isComponentLoaded(this.hass, helper.type)
1329+
) {
1330+
throw new Error(
1331+
this.hass.localize("ui.panel.config.helpers.picker.delete_failed")
1332+
);
1333+
}
1334+
await HELPERS_CRUD[helper.type as HelperDomain].delete(
1335+
this.hass,
1336+
entityReg.unique_id
1337+
);
1338+
return;
1339+
}
1340+
1341+
// For config entry-based helpers, delete the config entry
1342+
if (helper.configEntry) {
1343+
await deleteConfigEntry(this.hass, helper.configEntry.entry_id);
1344+
}
1345+
} catch (err: any) {
1346+
showAlertDialog(this, {
1347+
text:
1348+
err.message ||
1349+
this.hass.localize("ui.panel.config.helpers.picker.delete_failed"),
1350+
});
1351+
}
1352+
}
1353+
12831354
private _createHelper() {
12841355
showHelperDetailDialog(this, {});
12851356
}

src/translations/en.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3265,7 +3265,10 @@
32653265
"create_helper": "Create helper",
32663266
"no_helpers": "Looks like you don't have any helpers yet!",
32673267
"search": "Search {number} {number, plural,\n one {helper}\n other {helpers}\n}",
3268-
"error_information": "Error information"
3268+
"error_information": "Error information",
3269+
"delete_confirm_title": "Delete helper?",
3270+
"delete_confirm_text": "Are you sure you want to delete {name}?",
3271+
"delete_failed": "Failed to delete helper"
32693272
},
32703273
"dialog": {
32713274
"create": "Create",

0 commit comments

Comments
 (0)