feat: deduplicazione lista canti comunità con precedenza al canto non validato

- In HomePage, dopo il filtro per comunità, viene applicata una deduplicazione basata sull'id_canti: se lo stesso canto esiste sia nella lista globale (validato) sia in quella parrocchiale (non validato), viene mantenuto solo quello non validato.
- In HomePage.findCanto(), Player, Display e Playlist: quando il filtro comunità è attivo, la ricerca di un canto per ID dà precedenza alla lista comunitaCantiPersonali rispetto al catalogo globale.
- In PlaylistPage: aggiunta gestione completa delle sorgenti (global, my-canti, canti personali comunità) con stesso ordine di priorità.
This commit is contained in:
David Frassi
2026-05-20 13:01:09 +02:00
parent 89b7ac50e3
commit 98fc5e9c97
5 changed files with 58 additions and 4 deletions
+20
View File
@@ -123,6 +123,22 @@ export class HomePage implements OnDestroy {
list = list.filter(c => {
return comunitaIds.includes(c.id_canti) || comunitaIds.includes(c.id);
});
// Deduplicate: if a song exists in both validated and unvalidated lists, keep only the unvalidated/custom one
const seen = new Map<number | string, any>();
for (const canto of list) {
const key = canto.id_canti || canto.id;
const existing = seen.get(key);
if (!existing) {
seen.set(key, canto);
} else {
// Precedence to unvalidated/custom version
if (canto.nonValidato) {
seen.set(key, canto);
}
}
}
list = Array.from(seen.values());
// Sort list by community song number (num_canto) ASC!
const cantiInfo = this.comunitaService.comunitaCantiInfo();
@@ -332,6 +348,10 @@ export class HomePage implements OnDestroy {
}
findCanto(id: string) {
if (this.comunitaService.comunitaCode() && this.comunitaService.isFilterActive()) {
const personal = this.comunitaService.comunitaCantiPersonali().find(c => c.id === id);
if (personal) return personal;
}
return [
...this.cantiService.canti(),
...this.myCantiService.myCanti(),