From b6004122853bb6aaf785dffedf9c2e2f58dc35f9 Mon Sep 17 00:00:00 2001 From: livio Date: Fri, 25 Sep 2026 22:44:54 +0200 Subject: [PATCH] Fix layer search cursor and refresh project revisions --- Components/MenuHelp.razor | 2 +- Components/Pages/Home.razor | 24 +++++++++++++++++++++++- LMEMappeCatastaliApp.csproj | 4 ++-- README.md | 6 ++++++ Services/MapExportService.cs | 2 +- wwwroot/js/lme-map.js | 8 +++++++- 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/Components/MenuHelp.razor b/Components/MenuHelp.razor index f78c591..808f7e9 100644 --- a/Components/MenuHelp.razor +++ b/Components/MenuHelp.razor @@ -83,7 +83,7 @@ "Rinomina cambia il nome del progetto selezionato senza alterarne contenuti e revisioni. Duplica crea invece una copia modificabile, utile prima di una variante importante o quando ricevi un progetto in sola lettura.", "Archivia nasconde logicamente i lavori conclusi senza eliminarli; Ripristina li riporta tra quelli attivi. Elimina rimuove invece il progetto dall'archivio.", "Condividi modificabile consente al destinatario di continuare il lavoro; Condividi in sola lettura protegge l'originale e richiede una duplicazione per modificarlo.", - "Revisioni: seleziona una data e usa Apri revisione per consultarne lo stato oppure Confronta per vedere le differenze con la versione corrente.", + "Revisioni: la prima viene creata quando salvi per la seconda volta un progetto gia esistente. L'elenco si aggiorna anche dopo i salvataggi automatici; seleziona una data e usa Apri revisione oppure Confronta.", "Backup: Crea backup raccoglie tutti i progetti in un file trasferibile. Ripristina backup ricarica un archivio completo; Importa progetto aggiunge invece un singolo progetto condiviso." ], "tools" => diff --git a/Components/Pages/Home.razor b/Components/Pages/Home.razor index 8246470..ebe56e7 100644 --- a/Components/Pages/Home.razor +++ b/Components/Pages/Home.razor @@ -374,6 +374,14 @@ } + @if (!string.IsNullOrWhiteSpace(SelectedProjectId) && ProjectVersions.Count == 0) + { + Non ci sono ancora revisioni: la prima viene creata quando salvi nuovamente un progetto già esistente. + } + else if (ProjectVersions.Count > 0) + { + @ProjectVersions.Count revisioni disponibili, ordinate dalla più recente. + }
@@ -905,6 +913,7 @@ await JS.InvokeVoidAsync("lmeMap.clearLegacyProjectSnapshot"); await RefreshProjectsAsync(); SelectedProjectId = migrated.Id; + await RefreshProjectVersionsAsync(true); await InvokeAsync(StateHasChanged); } catch @@ -1366,6 +1375,7 @@ { SelectedProjectId = string.Empty; } + await RefreshProjectVersionsAsync(); ProjectArchiveMessage = Projects.Count == 0 ? "Nessun progetto salvato." : $"{Projects.Count} {(Projects.Count == 1 ? "progetto salvato" : "progetti salvati")} nell'archivio interno."; @@ -1380,10 +1390,18 @@ { SelectedProjectId = args.Value?.ToString() ?? string.Empty; ProjectFolder = SelectedProject?.Folder ?? string.Empty; - SelectedVersionId = string.Empty; + await RefreshProjectVersionsAsync(true); + } + + private async Task RefreshProjectVersionsAsync(bool resetSelection = false) + { ProjectVersions = string.IsNullOrWhiteSpace(SelectedProjectId) ? [] : await ProjectStorageService.GetVersionsAsync(SelectedProjectId); + if (resetSelection || ProjectVersions.All(version => version.Id != SelectedVersionId)) + { + SelectedVersionId = string.Empty; + } } private Task UndoMapChange() => JS.InvokeVoidAsync("lmeMap.undoMapChange").AsTask(); @@ -1405,6 +1423,7 @@ await RefreshProjectsAsync(); SelectedProjectId = copy.Id; ProjectFolder = copy.Folder; + await RefreshProjectVersionsAsync(true); await JS.InvokeVoidAsync("lmeMap.showInfo", $"Progetto duplicato: {copy.Name}."); } @@ -1424,6 +1443,7 @@ var renamed = await ProjectStorageService.RenameAsync(project.Id, requestedName); await RefreshProjectsAsync(); SelectedProjectId = renamed.Id; + await RefreshProjectVersionsAsync(); NewProjectName = renamed.Name; if (!HasUnsavedChanges) { @@ -1488,6 +1508,7 @@ var imported = await ProjectStorageService.ImportProjectAsync(path); await RefreshProjectsAsync(); SelectedProjectId = imported.Id; + await RefreshProjectVersionsAsync(true); await JS.InvokeVoidAsync("lmeMap.showInfo", $"Progetto importato: {imported.Name}."); } @@ -1588,6 +1609,7 @@ existing?.Id); await RefreshProjectsAsync(); SelectedProjectId = saved.Id; + await RefreshProjectVersionsAsync(); NewProjectName = saved.Name; await JS.InvokeVoidAsync("lmeMap.setProjectReadOnly", false); await JS.InvokeVoidAsync("lmeMap.markProjectSaved"); diff --git a/LMEMappeCatastaliApp.csproj b/LMEMappeCatastaliApp.csproj index 77c12a7..c18fef1 100644 --- a/LMEMappeCatastaliApp.csproj +++ b/LMEMappeCatastaliApp.csproj @@ -28,8 +28,8 @@ com.companyname.lmemappecatastaliapp - 0.4.6 - 41 + 0.4.7 + 42 $(ApplicationDisplayVersion) diff --git a/README.md b/README.md index bf8f273..d116c3a 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,12 @@ App .NET MAUI Blazor Hybrid per Android, iOS, Mac Catalyst e Windows, pensata per consultare mappe catastali e lavorare sul campo con GPS. +## Versione 0.4.7 + +- La ricerca nel pannello Layer conserva correttamente posizione e selezione del cursore durante il filtraggio; digitando `pio` il testo non viene piu invertito in `oip`. +- L'elenco revisioni viene aggiornato dopo salvataggi manuali e automatici, rinomina, importazione e selezione del progetto. +- Il pannello Progetti mostra quante revisioni sono disponibili e spiega quando un progetto appena creato non possiede ancora versioni precedenti. + ## Versione 0.4.6 - `Mostra cornice/layer del foglio` carica dal WFS ufficiale AdE il vero confine `CP:CadastralZoning` di ciascun foglio delle particelle. diff --git a/Services/MapExportService.cs b/Services/MapExportService.cs index 492073a..2796fc7 100644 --- a/Services/MapExportService.cs +++ b/Services/MapExportService.cs @@ -85,7 +85,7 @@ public sealed class MapExportService { var root = new XElement("gpx", new XAttribute("version", "1.1"), - new XAttribute("creator", "LME Mappe Catastali 0.4.6"), + new XAttribute("creator", "LME Mappe Catastali 0.4.7"), new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"), new XElement("metadata", new XElement("name", name))); foreach (var feature in features.EnumerateArray()) diff --git a/wwwroot/js/lme-map.js b/wwwroot/js/lme-map.js index 7bc9b4c..73ef12a 100644 --- a/wwwroot/js/lme-map.js +++ b/wwwroot/js/lme-map.js @@ -2019,9 +2019,15 @@ function renderLayerSelectionToolbar() {
`; const search = toolbar.querySelector("input"); search.addEventListener("input", () => { + const selectionStart = search.selectionStart ?? search.value.length; + const selectionEnd = search.selectionEnd ?? selectionStart; lmeState.managerSearchText = search.value; refreshLayerManager(); - requestAnimationFrame(() => document.querySelector(".layer-selection-toolbar input")?.focus()); + const replacement = document.querySelector(".layer-selection-toolbar input"); + if (replacement) { + replacement.focus({ preventScroll: true }); + replacement.setSelectionRange(selectionStart, selectionEnd); + } }); toolbar.querySelectorAll("button").forEach(button => button.addEventListener("click", () => { const records = [...lmeState.managerSelectedObjectIds]