diff --git a/LMEMappeCatastaliApp.csproj b/LMEMappeCatastaliApp.csproj index 1fa40ab..97c028d 100644 --- a/LMEMappeCatastaliApp.csproj +++ b/LMEMappeCatastaliApp.csproj @@ -28,8 +28,8 @@ com.companyname.lmemappecatastaliapp - 0.2.20 - 24 + 0.2.21 + 25 None diff --git a/Services/AzureMapsService.cs b/Services/AzureMapsService.cs index 75e79ba..c5ebc83 100644 --- a/Services/AzureMapsService.cs +++ b/Services/AzureMapsService.cs @@ -13,7 +13,7 @@ public sealed class AzureMapsService public AzureMapsService() { - _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.20"); + _httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.21"); _httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/json"); } diff --git a/Services/NetworkLocationService.cs b/Services/NetworkLocationService.cs index 5512e8b..e5b5d9a 100644 --- a/Services/NetworkLocationService.cs +++ b/Services/NetworkLocationService.cs @@ -13,7 +13,7 @@ public sealed class NetworkLocationService public NetworkLocationService() { - httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.20"); + httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("LMEMappeCatastali/0.2.21"); } public async Task GetApproximateLocationAsync( diff --git a/wwwroot/js/lme-map.js b/wwwroot/js/lme-map.js index ce51c4a..b03c146 100644 --- a/wwwroot/js/lme-map.js +++ b/wwwroot/js/lme-map.js @@ -55,7 +55,8 @@ const lmeState = { managerHiddenObjects: new Map(), managerHiddenObjectIds: new Set(), managerHiddenCategories: new Set(), - managerObjectOrder: {} + managerObjectOrder: {}, + managerExpandedRows: new Set() }; // AdE publishes the cadastral WMS in ETRS89. WMS 1.1.1 keeps the longitude, @@ -1180,6 +1181,9 @@ function refreshLayerManager() { if (!container || !lmeState.map) { return; } + captureLayerManagerExpansion(container); + const scrollHost = container.closest(".map-layer-panel"); + const scrollTop = scrollHost?.scrollTop || 0; applyStoredLayerManagerVisibility(); container.innerHTML = ""; lmeState.managerRecords = new Map(); @@ -1200,6 +1204,12 @@ function refreshLayerManager() { applyManagedVisualOrder(container); bindLayerManagerDrag(container); bindLayerManagerMoveButtons(container); + if (scrollHost) { + scrollHost.scrollTop = scrollTop; + window.requestAnimationFrame(() => { + scrollHost.scrollTop = scrollTop; + }); + } } function renderLayerManagerCategory(category, records) { @@ -1207,6 +1217,7 @@ function renderLayerManagerCategory(category, records) { group.className = "layer-manager-group"; group.dataset.dragType = "category"; group.dataset.categoryKey = category.key; + bindLayerManagerExpansion(group, `category:${category.key}`); const visibleCount = records.filter(record => !lmeState.managerHiddenObjectIds.has(record.id)).length; const categoryVisible = !lmeState.managerHiddenCategories.has(category.key) && (!category.roots.length || category.roots.some(layer => lmeState.map.hasLayer(layer))); @@ -1237,6 +1248,7 @@ function renderLayerManagerBlock(category, source, records) { block.dataset.dragType = "block"; block.dataset.categoryKey = category.key; block.dataset.blockKey = source; + bindLayerManagerExpansion(block, `block:${category.key}:${source}`); const visibleCount = records.filter(record => !lmeState.managerHiddenObjectIds.has(record.id)).length; const visible = visibleCount === records.length; block.innerHTML = `${escapeHtml(source)}${layerManagerMoveButtons("blocco")}${records.length}
`; @@ -1260,6 +1272,7 @@ function renderLayerManagerObject(record, index) { } object.dataset.dragType = "object"; object.dataset.objectId = record.id; + bindLayerManagerExpansion(object, `object:${record.id}`); const visible = !lmeState.managerHiddenObjectIds.has(record.id); object.innerHTML = `${escapeHtml(managedObjectLabel(record, index))}${layerManagerMoveButtons("oggetto")}›
`; const checkbox = object.querySelector("input"); @@ -1279,6 +1292,28 @@ function renderLayerManagerObject(record, index) { return object; } +function captureLayerManagerExpansion(container) { + container.querySelectorAll("details[data-expansion-key]").forEach(row => { + if (row.open) { + lmeState.managerExpandedRows.add(row.dataset.expansionKey); + } else { + lmeState.managerExpandedRows.delete(row.dataset.expansionKey); + } + }); +} + +function bindLayerManagerExpansion(row, key) { + row.dataset.expansionKey = key; + row.open = lmeState.managerExpandedRows.has(key); + row.addEventListener("toggle", () => { + if (row.open) { + lmeState.managerExpandedRows.add(key); + } else { + lmeState.managerExpandedRows.delete(key); + } + }); +} + function setManagedCategoryVisible(category, visible) { if (category.key === "imported") { lmeState.importedVisible = visible;