Skip to content

Commit 057d6de

Browse files
committed
chore: bump version to v0.16.16
1 parent 40177f6 commit 057d6de

8 files changed

Lines changed: 30 additions & 39 deletions

File tree

VERSION.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
padspanHA package version: 0.16.15
1+
padspanHA package version: 0.16.16

custom_components/padspan_ha/build_info.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
# See LICENSE file or https://www.gnu.org/licenses/gpl-3.0.html
55
"""Generated at build time. Used to prove what version is actually installed."""
66

7-
BUILD_VERSION = "0.16.15"
8-
BUILD_ID = "20260322T013753Z"
7+
BUILD_VERSION = "0.16.16"
8+
BUILD_ID = "20260322T014128Z"
99
CHANNEL = "beta"
1010

1111
# Backwards/for convenience

custom_components/padspan_ha/const.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
DOMAIN = "padspan_ha"
2121
NAME = "PadSpan HA"
22-
VERSION = "0.16.15"
22+
VERSION = "0.16.16"
2323

2424
# ── Config-flow option keys ───────────────────────────────────────────────────
2525
CONF_ENABLE_CLOUD = "enable_cloud"

custom_components/padspan_ha/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@
2020
"issue_tracker": "https://github.com/gbroeckling/padspanHA/issues",
2121
"requirements": [],
2222
"single_config_entry": true,
23-
"version": "0.16.15"
23+
"version": "0.16.16"
2424
}

custom_components/padspan_ha/www/padspan-ha/lights_panel.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
BUILD_ID / APP_VERSION updated automatically by scripts/release.py.
1313
*/
1414

15-
const APP_VERSION = "0.16.15";
16-
const BUILD_ID = "20260322T013753Z";
15+
const APP_VERSION = "0.16.16";
16+
const BUILD_ID = "20260322T014128Z";
1717

1818
// ── DOM helpers ──────────────────────────────────────────────────────────────
1919
function el(tag, attrs={}, children=[]){

custom_components/padspan_ha/www/padspan-ha/panel.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ If UI changes don't show:
2222
// BUILD_ID (YYYYMMDDTHHMMSSZ) is appended to all JS import URLs as a cache-buster
2323
// so browsers always load the latest code after a release.
2424
// CHANNEL controls the sidebar badge and maps to GitHub release types (beta=pre-release).
25-
const APP_VERSION = "0.16.15";
26-
const BUILD_ID = "20260322T013753Z";
25+
const APP_VERSION = "0.16.16";
26+
const BUILD_ID = "20260322T014128Z";
2727
const CHANNEL = "beta";
2828

2929
// ── Dynamic view imports ─────────────────────────────────────────────────────
@@ -1466,7 +1466,7 @@ class PadSpanHaApp extends HTMLElement {
14661466
mapsUpload: async (payload)=>{ const r = await this._callWS(Object.assign({type:"padspan_ha/maps_upload"}, payload)); await this._getMapsList(); return r; },
14671467
mapsUpdate: async (payload)=>{ await this._callWS(Object.assign({type:"padspan_ha/maps_update"}, payload)); await this._getMapsList(); this._renderCurrentView(); },
14681468
mapsUpdateQuiet: async (payload)=>{ await this._callWS(Object.assign({type:"padspan_ha/maps_update"}, payload)); },
1469-
fabricSpatialSave: async (payload)=>{ const r = await this._callWS(Object.assign({type:"padspan_ha/fabric_spatial_batch_save"}, payload)); await this._getMapsList(); return r; },
1469+
fabricSpatialSave: async (payload)=>{ return await this._callWS(Object.assign({type:"padspan_ha/fabric_spatial_batch_save"}, payload)); },
14701470
mapsReplaceImage: async (payload)=>{ await this._callWS(Object.assign({type:"padspan_ha/maps_replace_image"}, payload)); await this._getMapsList(); this._renderCurrentView(); },
14711471
modelUpdate: async (payload)=>{ await this._callWS(Object.assign({type:"padspan_ha/model_update"}, payload)); await this._getModel(); this._renderCurrentView(); },
14721472

custom_components/padspan_ha/www/padspan-ha/views/calibration.js

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3055,43 +3055,34 @@ function _beaconTuneTab(ctx, el, cs, calData) {
30553055

30563056
const pickerRow = el("div", { style: "display:flex;gap:8px;align-items:center;flex-wrap:wrap" });
30573057

3058-
// Map selector for beacon placement (with floor groups, matching Setup tab)
3058+
// Floor selector for beacon placement
30593059
const bkMapSel = document.createElement("select");
30603060
bkMapSel.style.cssText = "min-width:120px;";
30613061
{
30623062
const _fl = ctx.state.model?.floors || [];
30633063
const _floorMaps = new Map();
30643064
for (const m of sorted) {
3065-
const z = m.stack?.z_level ?? 0;
3066-
if (!_floorMaps.has(z)) _floorMaps.set(z, []);
3067-
_floorMaps.get(z).push(m);
3065+
const fid = m.floor_id || "main";
3066+
if (!_floorMaps.has(fid)) _floorMaps.set(fid, []);
3067+
_floorMaps.get(fid).push(m);
30683068
}
3069-
const _sortedZ = [..._floorMaps.keys()].sort((a, b) => a - b);
3070-
if (_sortedZ.length > 1) {
3071-
const floorGroup = document.createElement("optgroup");
3072-
floorGroup.label = "Floors";
3073-
for (const z of _sortedZ) {
3074-
const fObj = _fl.find(f => f.level === z);
3075-
const fName = fObj ? (fObj.name || `Floor ${z}`) : `Floor ${z}`;
3076-
const opt = document.createElement("option");
3077-
opt.value = `__floor__${z}`;
3078-
opt.textContent = `${fName} (${_floorMaps.get(z).length} map${_floorMaps.get(z).length > 1 ? "s" : ""})`;
3079-
floorGroup.appendChild(opt);
3080-
}
3081-
bkMapSel.appendChild(floorGroup);
3069+
// Floor entries only
3070+
for (const f of _fl) {
3071+
const fMaps = _floorMaps.get(f.id) || [];
3072+
if (!fMaps.length) continue;
3073+
const opt = document.createElement("option");
3074+
opt.value = `__floor__${f.id}`;
3075+
opt.textContent = f.name || f.id;
3076+
bkMapSel.appendChild(opt);
30823077
}
3083-
const mapGroup = _sortedZ.length > 1 ? document.createElement("optgroup") : null;
3084-
if (mapGroup) mapGroup.label = "Maps";
3085-
for (const m of sorted) {
3086-
const z = m.stack?.z_level ?? 0;
3087-
const fObj = _fl.find(f => f.level === z);
3088-
const fLabel = fObj ? ` (${fObj.name || `Floor ${z}`})` : "";
3078+
// Floors in maps but not in model
3079+
for (const [fid, fMaps] of _floorMaps) {
3080+
if (_fl.some(f => f.id === fid)) continue;
30893081
const opt = document.createElement("option");
3090-
opt.value = m.id;
3091-
opt.textContent = (m.name || m.id) + fLabel;
3092-
(mapGroup || bkMapSel).appendChild(opt);
3082+
opt.value = `__floor__${fid}`;
3083+
opt.textContent = fid;
3084+
bkMapSel.appendChild(opt);
30933085
}
3094-
if (mapGroup) bkMapSel.appendChild(mapGroup);
30953086
}
30963087

30973088
const bkSel = document.createElement("select");
@@ -3117,8 +3108,8 @@ function _beaconTuneTab(ctx, el, cs, calData) {
31173108
let targetMapId = bkMapSel.value;
31183109
// Resolve floor selection to best map on that floor
31193110
if (targetMapId.startsWith("__floor__")) {
3120-
const z = Number(targetMapId.replace("__floor__", ""));
3121-
const candidates = sorted.filter(m => (m.stack?.z_level ?? 0) === z);
3111+
const fid = targetMapId.replace("__floor__", "");
3112+
const candidates = sorted.filter(m => (m.floor_id || "main") === fid);
31223113
const best = candidates.slice().sort((a, b) => {
31233114
const ra = (a.receivers || []).length + Object.keys(a.room_bounds || {}).length;
31243115
const rb = (b.receivers || []).length + Object.keys(b.room_bounds || {}).length;

dist/padspan_ha.zip

-62 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)