Fix layer search cursor and refresh project revisions

This commit is contained in:
livio committed 2026-09-25 22:44:54 +02:00
1 parent f65451c414
commit 2f36f57609
6 files changed
+40 -6

No files matched your search

+1 -1
View File
@@ -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.", "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.", "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.", "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." "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" => "tools" =>
+23 -1
View File
@@ -374,6 +374,14 @@
} }
</select> </select>
</label> </label>
@if (!string.IsNullOrWhiteSpace(SelectedProjectId) && ProjectVersions.Count == 0)
{
<small class="field-help">Non ci sono ancora revisioni: la prima viene creata quando salvi nuovamente un progetto già esistente.</small>
}
else if (ProjectVersions.Count > 0)
{
<small class="field-help">@ProjectVersions.Count revisioni disponibili, ordinate dalla più recente.</small>
}
<div class="button-row"> <div class="button-row">
<button class="secondary-command" @onclick="LoadProjectVersion" disabled="@(string.IsNullOrWhiteSpace(SelectedVersionId))">Apri revisione</button> <button class="secondary-command" @onclick="LoadProjectVersion" disabled="@(string.IsNullOrWhiteSpace(SelectedVersionId))">Apri revisione</button>
<button class="secondary-command" @onclick="CompareProjectVersion" disabled="@(string.IsNullOrWhiteSpace(SelectedVersionId))">Confronta</button> <button class="secondary-command" @onclick="CompareProjectVersion" disabled="@(string.IsNullOrWhiteSpace(SelectedVersionId))">Confronta</button>
@@ -905,6 +913,7 @@
await JS.InvokeVoidAsync("lmeMap.clearLegacyProjectSnapshot"); await JS.InvokeVoidAsync("lmeMap.clearLegacyProjectSnapshot");
await RefreshProjectsAsync(); await RefreshProjectsAsync();
SelectedProjectId = migrated.Id; SelectedProjectId = migrated.Id;
await RefreshProjectVersionsAsync(true);
await InvokeAsync(StateHasChanged); await InvokeAsync(StateHasChanged);
} }
catch catch
@@ -1366,6 +1375,7 @@
{ {
SelectedProjectId = string.Empty; SelectedProjectId = string.Empty;
} }
await RefreshProjectVersionsAsync();
ProjectArchiveMessage = Projects.Count == 0 ProjectArchiveMessage = Projects.Count == 0
? "Nessun progetto salvato." ? "Nessun progetto salvato."
: $"{Projects.Count} {(Projects.Count == 1 ? "progetto salvato" : "progetti salvati")} nell'archivio interno."; : $"{Projects.Count} {(Projects.Count == 1 ? "progetto salvato" : "progetti salvati")} nell'archivio interno.";
@@ -1380,10 +1390,18 @@
{ {
SelectedProjectId = args.Value?.ToString() ?? string.Empty; SelectedProjectId = args.Value?.ToString() ?? string.Empty;
ProjectFolder = SelectedProject?.Folder ?? string.Empty; ProjectFolder = SelectedProject?.Folder ?? string.Empty;
SelectedVersionId = string.Empty; await RefreshProjectVersionsAsync(true);
}
private async Task RefreshProjectVersionsAsync(bool resetSelection = false)
{
ProjectVersions = string.IsNullOrWhiteSpace(SelectedProjectId) ProjectVersions = string.IsNullOrWhiteSpace(SelectedProjectId)
? [] ? []
: await ProjectStorageService.GetVersionsAsync(SelectedProjectId); : await ProjectStorageService.GetVersionsAsync(SelectedProjectId);
if (resetSelection || ProjectVersions.All(version => version.Id != SelectedVersionId))
{
SelectedVersionId = string.Empty;
}
} }
private Task UndoMapChange() => JS.InvokeVoidAsync("lmeMap.undoMapChange").AsTask(); private Task UndoMapChange() => JS.InvokeVoidAsync("lmeMap.undoMapChange").AsTask();
@@ -1405,6 +1423,7 @@
await RefreshProjectsAsync(); await RefreshProjectsAsync();
SelectedProjectId = copy.Id; SelectedProjectId = copy.Id;
ProjectFolder = copy.Folder; ProjectFolder = copy.Folder;
await RefreshProjectVersionsAsync(true);
await JS.InvokeVoidAsync("lmeMap.showInfo", $"Progetto duplicato: {copy.Name}."); await JS.InvokeVoidAsync("lmeMap.showInfo", $"Progetto duplicato: {copy.Name}.");
} }
@@ -1424,6 +1443,7 @@
var renamed = await ProjectStorageService.RenameAsync(project.Id, requestedName); var renamed = await ProjectStorageService.RenameAsync(project.Id, requestedName);
await RefreshProjectsAsync(); await RefreshProjectsAsync();
SelectedProjectId = renamed.Id; SelectedProjectId = renamed.Id;
await RefreshProjectVersionsAsync();
NewProjectName = renamed.Name; NewProjectName = renamed.Name;
if (!HasUnsavedChanges) if (!HasUnsavedChanges)
{ {
@@ -1488,6 +1508,7 @@
var imported = await ProjectStorageService.ImportProjectAsync(path); var imported = await ProjectStorageService.ImportProjectAsync(path);
await RefreshProjectsAsync(); await RefreshProjectsAsync();
SelectedProjectId = imported.Id; SelectedProjectId = imported.Id;
await RefreshProjectVersionsAsync(true);
await JS.InvokeVoidAsync("lmeMap.showInfo", $"Progetto importato: {imported.Name}."); await JS.InvokeVoidAsync("lmeMap.showInfo", $"Progetto importato: {imported.Name}.");
} }
@@ -1588,6 +1609,7 @@
existing?.Id); existing?.Id);
await RefreshProjectsAsync(); await RefreshProjectsAsync();
SelectedProjectId = saved.Id; SelectedProjectId = saved.Id;
await RefreshProjectVersionsAsync();
NewProjectName = saved.Name; NewProjectName = saved.Name;
await JS.InvokeVoidAsync("lmeMap.setProjectReadOnly", false); await JS.InvokeVoidAsync("lmeMap.setProjectReadOnly", false);
await JS.InvokeVoidAsync("lmeMap.markProjectSaved"); await JS.InvokeVoidAsync("lmeMap.markProjectSaved");
+2 -2
View File
@@ -28,8 +28,8 @@
<ApplicationId>com.companyname.lmemappecatastaliapp</ApplicationId> <ApplicationId>com.companyname.lmemappecatastaliapp</ApplicationId>
<!-- Versions --> <!-- Versions -->
<ApplicationDisplayVersion>0.4.6</ApplicationDisplayVersion> <ApplicationDisplayVersion>0.4.7</ApplicationDisplayVersion>
<ApplicationVersion>41</ApplicationVersion> <ApplicationVersion>42</ApplicationVersion>
<Version>$(ApplicationDisplayVersion)</Version> <Version>$(ApplicationDisplayVersion)</Version>
<!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged --> <!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged -->
+6
View File
@@ -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. 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 ## Versione 0.4.6
- `Mostra cornice/layer del foglio` carica dal WFS ufficiale AdE il vero confine `CP:CadastralZoning` di ciascun foglio delle particelle. - `Mostra cornice/layer del foglio` carica dal WFS ufficiale AdE il vero confine `CP:CadastralZoning` di ciascun foglio delle particelle.
+1 -1
View File
@@ -85,7 +85,7 @@ public sealed class MapExportService
{ {
var root = new XElement("gpx", var root = new XElement("gpx",
new XAttribute("version", "1.1"), 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 XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
new XElement("metadata", new XElement("name", name))); new XElement("metadata", new XElement("name", name)));
foreach (var feature in features.EnumerateArray()) foreach (var feature in features.EnumerateArray())
+7 -1
View File
@@ -2019,9 +2019,15 @@ function renderLayerSelectionToolbar() {
</div>`; </div>`;
const search = toolbar.querySelector("input"); const search = toolbar.querySelector("input");
search.addEventListener("input", () => { search.addEventListener("input", () => {
const selectionStart = search.selectionStart ?? search.value.length;
const selectionEnd = search.selectionEnd ?? selectionStart;
lmeState.managerSearchText = search.value; lmeState.managerSearchText = search.value;
refreshLayerManager(); 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", () => { toolbar.querySelectorAll("button").forEach(button => button.addEventListener("click", () => {
const records = [...lmeState.managerSelectedObjectIds] const records = [...lmeState.managerSelectedObjectIds]