feat(groups): ratissage élargi (3 lettres, sous-chaînes, singletons, plafond, copie inclassables)

This commit is contained in:
2026-09-27 14:05:08 -04:00
parent 63a2bddf47
commit a2b4139887
3 changed files with 103 additions and 24 deletions
@@ -219,6 +219,45 @@ export class SubscriptionsComponent {
}
}
copiedUngrouped = signal<boolean>(false);
/** Copie les chaînes sans groupe (une par ligne) pour analyse des règles. */
copyUngrouped(): void {
const lines = this.items()
.filter((item) => this.itemGroupIds(item).length === 0)
.map((item) => item.channel?.title || item.channel?.handle || `#${item.subscriptionId}`);
const text = lines.join('\n');
if (!text) return;
const done = () => {
this.copiedUngrouped.set(true);
setTimeout(() => this.copiedUngrouped.set(false), 2000);
};
try {
const nav = navigator as Navigator & { clipboard?: { writeText(t: string): Promise<void> } };
if (nav?.clipboard?.writeText) {
nav.clipboard.writeText(text).then(done, () => this.copyUngroupedFallback(text, done));
} else {
this.copyUngroupedFallback(text, done);
}
} catch {
this.copyUngroupedFallback(text, done);
}
}
private copyUngroupedFallback(text: string, done: () => void): void {
try {
const ta = document.createElement('textarea');
ta.value = text;
ta.style.position = 'fixed';
ta.style.opacity = '0';
document.body.appendChild(ta);
ta.select();
document.execCommand('copy');
document.body.removeChild(ta);
done();
} catch {}
}
// --- trackBy : DOM stable (pas de re-rendu complet + recharge d'images à chaque tick) ---
trackBySubscriptionId(_idx: number, item: SubscriptionItem): number {
return item.subscriptionId;