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;