diff --git a/PlotLine/Views/FloorPlans/Edit.cshtml b/PlotLine/Views/FloorPlans/Edit.cshtml index b225bcb..13efd58 100644 --- a/PlotLine/Views/FloorPlans/Edit.cshtml +++ b/PlotLine/Views/FloorPlans/Edit.cshtml @@ -423,11 +423,21 @@
- +
- +
@@ -1167,6 +1177,23 @@ return label; } + function populateCoordinateSelect(select, count, labelForValue, selectedValue) { + if (!select) return; + const selected = String(Math.max(0, Math.min(Number(selectedValue || 0), Math.max(count - 1, 0)))); + const existingValues = [...select.options].map(option => option.value).join("|"); + const nextValues = Array.from({ length: Math.max(count, 1) }, (_, index) => String(index)).join("|"); + if (existingValues !== nextValues) { + select.replaceChildren(...Array.from({ length: Math.max(count, 1) }, (_, index) => { + const option = document.createElement("option"); + option.value = String(index); + option.textContent = labelForValue(index); + return option; + })); + } + select.value = selected; + select.dataset.coordinateValue = selected; + } + function refreshGridCoordinateLabels() { const show = gridCoordinatesToggle?.checked === true; panels.forEach(panel => { @@ -1665,11 +1692,16 @@ const wrap = document.createElement("div"); wrap.className = "col-6"; wrap.innerHTML = ``; - const input = document.createElement("input"); - input.className = "form-control form-control-sm"; - input.type = "number"; - input.min = field === "x" || field === "y" ? "0" : "1"; - input.max = field === "x" || field === "y" ? "79" : "80"; + const input = field === "x" || field === "y" ? document.createElement("select") : document.createElement("input"); + input.className = field === "x" || field === "y" ? "form-select form-select-sm" : "form-control form-control-sm"; + if (input instanceof HTMLInputElement) { + input.type = "number"; + input.min = "1"; + input.max = "80"; + } else { + input.dataset.coordinateAxis = field; + input.dataset.coordinateValue = value; + } input.name = `Blocks[${index}].${property}`; input.value = value; input.dataset.blockField = field; @@ -1738,6 +1770,7 @@ blocks.push(button); attachBlockEvents(button); createBlockEditor(block); + writeBlock(button, readBlock(button)); checkOverlaps(); return button; } @@ -1818,8 +1851,8 @@ function readBlock(block) { const fields = fieldsFor(block); return { - x: Number(fields.x?.value || block.style.getPropertyValue("--x") || 0), - y: Number(fields.y?.value || block.style.getPropertyValue("--y") || 0), + x: Number(fields.x?.value || fields.x?.dataset.coordinateValue || block.style.getPropertyValue("--x") || 0), + y: Number(fields.y?.value || fields.y?.dataset.coordinateValue || block.style.getPropertyValue("--y") || 0), w: Number(fields.w?.value || block.style.getPropertyValue("--w") || 1), h: Number(fields.h?.value || block.style.getPropertyValue("--h") || 1) }; @@ -1827,13 +1860,18 @@ function writeBlock(block, values) { const next = clampBlock(block, values); + const grid = gridFor(block); + const gridWidth = Number(grid?.dataset.gridWidth || 24); + const gridHeight = Number(grid?.dataset.gridHeight || 16); + const maxXOptions = Math.max(gridWidth - next.w + 1, 1); + const maxYOptions = Math.max(gridHeight - next.h + 1, 1); block.style.setProperty("--x", next.x); block.style.setProperty("--y", next.y); block.style.setProperty("--w", next.w); block.style.setProperty("--h", next.h); const fields = fieldsFor(block); - if (fields.x) fields.x.value = next.x; - if (fields.y) fields.y.value = next.y; + populateCoordinateSelect(fields.x, maxXOptions, gridColumnLabel, next.x); + populateCoordinateSelect(fields.y, maxYOptions, value => String(value + 1), next.y); if (fields.w) fields.w.value = next.w; if (fields.h) fields.h.value = next.h; scheduleGeometryRefresh(); @@ -2467,7 +2505,10 @@ saveLayoutAsync(); }); - blocks.forEach(attachBlockEvents); + blocks.forEach(block => { + attachBlockEvents(block); + writeBlock(block, readBlock(block)); + }); editor.addEventListener("pointermove", event => { if (!pointerState) return;