feat(groups): ratissage élargi (3 lettres, sous-chaînes, singletons, plafond, copie inclassables)
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user