mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 08:28:31 +00:00
ux v1.30.4: Escape closes all dialogs
- Esc closes the topmost dialog: opening/device info, icon rules, general settings, marker dialog, opening editor, space dialog (abandons import queue like Cancel); draw-undo via Esc preserved with dialog priority - smoke_esc_dialogs.mjs; TESTING/CHANGELOG same-commit
This commit is contained in:
@@ -11,7 +11,7 @@ PLANS_DIR = "houseplan/plans" # relative to the HA configuration directory
|
|||||||
FILES_URL = "/houseplan_files/files"
|
FILES_URL = "/houseplan_files/files"
|
||||||
FILES_DIR = "houseplan/files"
|
FILES_DIR = "houseplan/files"
|
||||||
CONF_ADMIN_ONLY = "admin_only"
|
CONF_ADMIN_ONLY = "admin_only"
|
||||||
VERSION = "1.30.3"
|
VERSION = "1.30.4"
|
||||||
|
|
||||||
DEFAULT_CONFIG: dict = {
|
DEFAULT_CONFIG: dict = {
|
||||||
"spaces": [],
|
"spaces": [],
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -16,5 +16,5 @@
|
|||||||
"issue_tracker": "https://github.com/Matysh/houseplan-card/issues",
|
"issue_tracker": "https://github.com/Matysh/houseplan-card/issues",
|
||||||
"requirements": [],
|
"requirements": [],
|
||||||
"single_config_entry": true,
|
"single_config_entry": true,
|
||||||
"version": "1.30.3"
|
"version": "1.30.4"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import { launch } from './serve.mjs';
|
||||||
|
const { page, browser } = await launch();
|
||||||
|
const res = await page.evaluate(async () => {
|
||||||
|
const out = {};
|
||||||
|
const c = window.__card;
|
||||||
|
const esc = async () => { window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' })); await c.updateComplete; };
|
||||||
|
// общие настройки
|
||||||
|
c._openSettingsDialog(); await c.updateComplete;
|
||||||
|
await esc(); out.settings = !c._settingsDialog;
|
||||||
|
// правила иконок
|
||||||
|
c._openRulesDialog(); await c.updateComplete;
|
||||||
|
await esc(); out.rules = !c._rulesDialog;
|
||||||
|
// диалог устройства
|
||||||
|
c._setMode('devices'); c._openMarkerDialog(); await c.updateComplete;
|
||||||
|
await esc(); out.marker = !c._markerDialog;
|
||||||
|
// диалог пространства (+ очистка очереди импорта)
|
||||||
|
c._openSpaceDialog('edit', c._space); c._importQueue = ['x']; c._importTotal = 1; await c.updateComplete;
|
||||||
|
await esc(); out.space = !c._spaceDialog && c._importQueue.length === 0;
|
||||||
|
// инфо-карточка устройства
|
||||||
|
c._setMode('view'); c._infoCard = c._devices[0]; await c.updateComplete;
|
||||||
|
await esc(); out.info = !c._infoCard;
|
||||||
|
// инфо двери/замка
|
||||||
|
c._openingInfo = { id: 'op1', type: 'door', rx: 550, ry: 200, len_cm: 90, lock: 'lock.front_door' }; await c.updateComplete;
|
||||||
|
await esc(); out.openingInfo = !c._openingInfo;
|
||||||
|
// приоритет: инфо поверх настроек — Esc закрывает только инфо
|
||||||
|
c._openSettingsDialog(); c._infoCard = c._devices[0]; await c.updateComplete;
|
||||||
|
await esc(); out.stacked = !c._infoCard && !!c._settingsDialog;
|
||||||
|
await esc(); out.stacked2 = !c._settingsDialog;
|
||||||
|
// Esc в разметке по-прежнему откатывает точку, а не только диалоги
|
||||||
|
c._setMode('plan'); c._tool = 'draw'; c._path = [[1, 2], [3, 4]]; await c.updateComplete;
|
||||||
|
await esc(); out.undoPointStillWorks = c._path.length === 1;
|
||||||
|
return out;
|
||||||
|
});
|
||||||
|
console.log(JSON.stringify(res, null, 1));
|
||||||
|
await browser.close();
|
||||||
File diff suppressed because one or more lines are too long
Vendored
+5
-5
File diff suppressed because one or more lines are too long
@@ -1,5 +1,12 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v1.30.4 — 2026-07-22
|
||||||
|
- **Escape now closes every dialog** (general settings, icon rules, device
|
||||||
|
editor, space dialog, opening editor, info cards), topmost first when
|
||||||
|
stacked. Closing the space dialog with Esc abandons a floor-import queue,
|
||||||
|
same as its Cancel button. Esc while drawing an outline still undoes the
|
||||||
|
last point (dialogs take priority).
|
||||||
|
|
||||||
## v1.30.3 — 2026-07-22
|
## v1.30.3 — 2026-07-22
|
||||||
- The **General settings** (fill palette) gear in the header is now visible in
|
- The **General settings** (fill palette) gear in the header is now visible in
|
||||||
every mode for users who can edit, not just in the Plan editor.
|
every mode for users who can edit, not just in the Plan editor.
|
||||||
|
|||||||
@@ -140,6 +140,10 @@ Run the *core flows* (marked ★ below) in each environment at least once per mi
|
|||||||
(explicit ripple color still wins); off/white lights unchanged [auto]
|
(explicit ripple color still wins); off/white lights unchanged [auto]
|
||||||
- [ ] Alarm pulse (v1.27.0): leak/smoke/gas/CO/siren in 'on' pulse a red ring over any
|
- [ ] Alarm pulse (v1.27.0): leak/smoke/gas/CO/siren in 'on' pulse a red ring over any
|
||||||
display mode; clears on 'off'; unavailable never alarms [auto]; reduced-motion static
|
display mode; clears on 'off'; unavailable never alarms [auto]; reduced-motion static
|
||||||
|
- [ ] Esc closes dialogs (v1.30.4): Escape closes the topmost dialog (opening
|
||||||
|
info, device info, icon rules, general settings, device editor, opening
|
||||||
|
editor, space dialog incl. abandoning an import queue); stacked dialogs
|
||||||
|
close one per press; Esc while drawing still undoes the last point [auto]
|
||||||
- [ ] General settings gear (v1.30.3): the header cog is visible in every mode
|
- [ ] General settings gear (v1.30.3): the header cog is visible in every mode
|
||||||
(admins), opens the palette dialog from View too [auto]
|
(admins), opens the palette dialog from View too [auto]
|
||||||
- [ ] Editor tabs (v1.30.2): only two tabs — "Plan editor" / "Device editor"
|
- [ ] Editor tabs (v1.30.2): only two tabs — "Plan editor" / "Device editor"
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "houseplan-card",
|
"name": "houseplan-card",
|
||||||
"version": "1.30.3",
|
"version": "1.30.4",
|
||||||
"description": "Interactive house plan Lovelace card for Home Assistant",
|
"description": "Interactive house plan Lovelace card for Home Assistant",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
+13
-1
@@ -32,7 +32,7 @@ import './space-card';
|
|||||||
import { cardStyles } from './styles';
|
import { cardStyles } from './styles';
|
||||||
import { langOf, t, type I18nKey } from './i18n';
|
import { langOf, t, type I18nKey } from './i18n';
|
||||||
|
|
||||||
const CARD_VERSION = '1.30.3';
|
const CARD_VERSION = '1.30.4';
|
||||||
const LS_KEY = 'houseplan_card_layout_v1';
|
const LS_KEY = 'houseplan_card_layout_v1';
|
||||||
const LS_CFG = 'houseplan_card_cfg_v1'; // cache of the server config+layout for instant rendering
|
const LS_CFG = 'houseplan_card_cfg_v1'; // cache of the server config+layout for instant rendering
|
||||||
const LS_ZOOM = 'houseplan_card_zoom_v1';
|
const LS_ZOOM = 'houseplan_card_zoom_v1';
|
||||||
@@ -253,8 +253,20 @@ class HouseplanCard extends LitElement {
|
|||||||
|
|
||||||
private _onKey(e: KeyboardEvent): void {
|
private _onKey(e: KeyboardEvent): void {
|
||||||
if (e.key === 'Escape') {
|
if (e.key === 'Escape') {
|
||||||
|
// close the topmost open dialog; info popups first, then editors
|
||||||
|
if (this._openingInfo) { this._openingInfo = null; return; }
|
||||||
if (this._infoCard) { this._infoCard = null; return; }
|
if (this._infoCard) { this._infoCard = null; return; }
|
||||||
|
if (this._rulesDialog) { this._rulesDialog = null; return; }
|
||||||
|
if (this._settingsDialog) { this._settingsDialog = null; return; }
|
||||||
if (this._markerDialog) { this._markerDialog = null; return; }
|
if (this._markerDialog) { this._markerDialog = null; return; }
|
||||||
|
if (this._openingDialog) { this._openingDialog = null; return; }
|
||||||
|
if (this._spaceDialog && !this._roomDialog) {
|
||||||
|
// same semantics as the dialog's Cancel: an import queue is abandoned
|
||||||
|
this._spaceDialog = null;
|
||||||
|
this._importQueue = [];
|
||||||
|
this._importTotal = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!this._markup) return;
|
if (!this._markup) return;
|
||||||
const undo = e.key === 'Escape' || ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'z');
|
const undo = e.key === 'Escape' || ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'z');
|
||||||
|
|||||||
Reference in New Issue
Block a user