mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-28 19:01:34 +00:00
100 lines
4.7 KiB
JavaScript
100 lines
4.7 KiB
JavaScript
// #485 Stage 1: eligibility, manual entry and session-local on-plan setup.
|
|
import { launch, checkAll, finish } from './serve.mjs';
|
|
|
|
const { page, browser } = await launch();
|
|
const out = await page.evaluate(async () => {
|
|
const card = window.__card;
|
|
const root = () => card.shadowRoot || card.renderRoot;
|
|
const update = async () => {
|
|
card.requestUpdate();
|
|
await card.updateComplete;
|
|
await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve)));
|
|
};
|
|
card._setMode('devices');
|
|
await update();
|
|
const ordinary = card._devices.find((device) => device.bindingKind !== 'virtual'
|
|
&& !device.marker?.radar && device.id === 'd_lamp')
|
|
|| card._devices.find((device) => device.bindingKind !== 'virtual' && !device.marker?.radar);
|
|
card._openMarkerDialog(ordinary);
|
|
await update();
|
|
const noAutomaticSection = !root().querySelector('.radargroup');
|
|
const manualToggle = root().querySelector('#marker-radar-presence');
|
|
manualToggle?.click();
|
|
await update();
|
|
const declared = !!card._markerDialog?.radar && !!root().querySelector('.radargroup');
|
|
|
|
const room = card._spaceModelById(ordinary.space)?.rooms?.[0];
|
|
const binary = Object.keys(card._planHass.states || {}).find((id) => id.startsWith('binary_sensor.'));
|
|
card._markerDialog = {
|
|
...card._markerDialog,
|
|
radar: {
|
|
...card._markerDialog.radar,
|
|
profile: 'presence_v1', roomId: room?.id || '', occupancyEntity: binary || '',
|
|
},
|
|
};
|
|
await update();
|
|
root().querySelector('.radargroup button ha-icon[icon="mdi:map-marker-radius"]')
|
|
?.closest('button')?.click();
|
|
await update();
|
|
const setup = root().querySelector('.radarsetup');
|
|
const setupOpened = !!setup;
|
|
const planSvg = setup?.querySelector('svg');
|
|
const press = (x, y) => planSvg?.dispatchEvent(new PointerEvent('pointerdown', {
|
|
bubbles: true, clientX: x, clientY: y, pointerId: 1,
|
|
}));
|
|
if (planSvg) {
|
|
planSvg.getBoundingClientRect = () => ({ left: 0, top: 0, width: 1000, height: 1000,
|
|
right: 1000, bottom: 1000, x: 0, y: 0, toJSON() {} });
|
|
press(250, 400);
|
|
press(250, 100);
|
|
}
|
|
await update();
|
|
const installationDrafted = card._editorRuntime?._radarSetup?.isActive() === true;
|
|
const persistedBeforeSave = card._serverCfg.markers.find((marker) => marker.id === ordinary.id)?.radar;
|
|
root().querySelector('.radarsetup .iconbtn')?.click();
|
|
await update();
|
|
const cancelReleased = !root().querySelector('.radarsetup')
|
|
&& card._serverCfg.markers.find((marker) => marker.id === ordinary.id)?.radar === persistedBeforeSave;
|
|
|
|
card._closeMarkerDialog();
|
|
// #602: a radar saved in an earlier session reopens as an enabled toggle in
|
|
// Details, regardless of whether it was once manual or auto-recognized.
|
|
const savedRadar = {
|
|
version: 1, enabled: true, show_live: true, profile: 'presence_v1',
|
|
sources: { occupancy_entity: binary || '' },
|
|
mount: { installation_id: 'saved-radar-smoke', x: 50, y: 50, heading_deg: 0, range_cm: 500, fov_deg: 120 },
|
|
room_id: room?.id || '',
|
|
calibration: { method: 'not_required', mirror: false, cell_cm: card._spaceModelById(ordinary.space)?.cellCm || 5 },
|
|
};
|
|
const originalMarker = ordinary.marker;
|
|
ordinary.marker = { ...(ordinary.marker || {}), id: ordinary.id, binding: `device:${ordinary.bindingRef}`, radar: savedRadar };
|
|
card._openMarkerDialog(ordinary);
|
|
await update();
|
|
const savedToggle = root().querySelector('#marker-radar-presence');
|
|
const savedReopensInline = savedToggle?.checked === true
|
|
&& !!savedToggle.closest('.hpf-card[data-card="details"] .radaradditional')?.querySelector('.radargroup')
|
|
&& !root().querySelector('.hpf-card[data-card="basics"] .radargroup');
|
|
savedToggle?.click(); await update();
|
|
const savedOffKeepsOriginal = card._markerDialog?.radarRemove === true
|
|
&& card._markerDialog?.radar?.original?.mount?.installation_id === 'saved-radar-smoke';
|
|
root().querySelector('#marker-radar-presence')?.click(); await update();
|
|
const savedOnRestoresOriginal = card._markerDialog?.radarRemove === false
|
|
&& card._markerDialog?.radar?.original?.mount?.installation_id === 'saved-radar-smoke';
|
|
card._closeMarkerDialog();
|
|
ordinary.marker = originalMarker;
|
|
const virtual = card._devices.find((device) => device.bindingKind === 'virtual');
|
|
if (virtual) card._openMarkerDialog(virtual);
|
|
await update();
|
|
const virtualHasNoEntry = !virtual || (!root().querySelector('.radargroup')
|
|
&& !root().querySelector('.radaradditional'));
|
|
card._closeMarkerDialog();
|
|
card._setMode('view');
|
|
return {
|
|
noAutomaticSection, manualToggleVisible: !!manualToggle, declared, setupOpened,
|
|
installationDrafted, cancelReleased, savedReopensInline, savedOffKeepsOriginal,
|
|
savedOnRestoresOriginal, virtualHasNoEntry,
|
|
};
|
|
});
|
|
|
|
await finish(browser, checkAll(out));
|