# OPEN TASK: Cross-Page Signature Navigation ## ?? Görev Özeti EnvelopeViewer.razor'da **tüm sayfalarda imza navigasyonu** implement et. Kullan?c? "Nächste Unterschrift" (?) ve "Vorherige Unterschrift" (?) butonlar? ile farkl? sayfalardaki imzalar aras?nda gezinebilmeli. --- ## ? Ba?ar?l? Olan K?s?m: Toolbar Tasar?m? **Görünüm:** ``` [? ?? 2 / 5] [3 OFFEN] [?] ``` **Özellikler:** - ? Modern purple gradient tasar?m - ? Compact layout - ? "Nächste Unterschrift" butonu (?) - ? "Vorherige Unterschrift" butonu (?) - ? Counter alan? (2 / 5) - ? Badge ("3 offen" veya "? Komplett") **?? UYARI: TASARIMA DOKUNMA!** - Kullan?c? tasar?m?n mükemmel oldu?unu onaylad? - CSS de?i?tirme - Layout de?i?tirme - Sadece JavaScript logic düzelt --- ## ? Ba?ar?s?z Olan K?s?mlar ### Sorun 1: Counter Yanl?? De?erler Gösteriyor **Mevcut Durum (Revert sonras? bozuldu):** ```javascript // Counter logic geri al?nd?, ?imdi yanl?? de?erler gösteriyor // Düzeltilmesi gerekiyor ``` **Olmas? Gereken:** - Counter **HER ZAMAN** tüm sayfalardaki toplam imzay? göstermeli - Örnek: "2 / 5" = 5 toplam imza (tüm sayfalar), 2'si imzaland? - Kullan?c? farkl? sayfalara geçse de "2 / 5" de?i?memeli **Düzeltme:** ```javascript getSignatureNavState() { if (!this._allSignatures || this._allSignatures.length === 0) { return { total: 0, signed: 0, unsigned: 0, ... }; } const total = this._allSignatures.length; // TÜM imzalar const signed = this.appliedSignatures.length; // ?mzalananlar const unsigned = total - signed; return { total, signed, unsigned, ... }; } ``` ### Sorun 2: Navigasyon Sadece Mevcut Sayfada Çal???yor **Kullan?c?n?n Aç?klamas?:** > "imzalar aras?nda gezinme butonu var ya (yeni ekledik hani bir önceki bir sonraki imzaya direkt atlamak için. i?te onu düzeltmen laz?m. ?uanda sadece görüntülenen sayfada gezinilebiliyor." **Mevcut Durum (BOZUK):** - Kullan?c? Sayfa 1'de, tüm imzalar? (#1, #2, #3) imzalad? - "Sonraki ?mza" (?) butonuna bast? - ? Hiçbir ?ey olmuyor (mevcut sayfada imza kalmad??? için) **Olmas? Gereken:** - Kullan?c? Sayfa 1'de, tüm imzalar? (#1, #2, #3) imzalad? - "Sonraki ?mza" (?) butonuna bast? - ? **Otomatik Sayfa 2'ye geçer** - ? **?mza #4 butonunu görünür hale getirir** (scroll ile) **Ba?ka Senaryo:** - Kullan?c? Sayfa 2'de, ?mza #4'ü yeni imzalad? - "Önceki ?mza" (?) butonuna bast? - ? **Otomatik Sayfa 1'e döner** - ? **?mzalanm?? ?mza #3'ü görünür hale getirir** --- ## ?? Davran?? Spesifikasyonu **Senaryo: 3 Sayfada 5 ?mza** - **Sayfa 1:** ?mza #1, #2, #3 - **Sayfa 2:** ?mza #4 - **Sayfa 3:** ?mza #5 **Kullan?c? Aksiyonlar?:** | Mevcut Durum | Kullan?c? T?klar | Beklenen Davran?? | |--------------|------------------|-------------------| | Sayfa 1, imza yok | "Sonraki" (?) | ?mza #1'e focus (ayn? sayfa) | | Sayfa 1, #1 imzal? | "Sonraki" (?) | ?mza #2'ye focus (ayn? sayfa) | | Sayfa 1, #1,#2,#3 imzal? | "Sonraki" (?) | **Sayfa 2'ye geç**, ?mza #4'e focus | | Sayfa 2, #4 imzal? | "Sonraki" (?) | **Sayfa 3'e geç**, ?mza #5'e focus | | Sayfa 3, hepsi imzal? | "Sonraki" (?) | Buton disabled | | Sayfa 2, #4 imzal? | "Önceki" (?) | **Sayfa 1'e dön**, ?mza #3'e focus | **Counter Görünümü (Her zaman global):** - **Sayfa 1:** `[?? 0 / 5] [5 OFFEN]` (ba?lang?ç) - **Sayfa 2:** `[?? 3 / 5] [2 OFFEN]` (3 imza sonras?) ? TÜM sayfalarda ayn? - **Sayfa 3:** `[?? 5 / 5] [? KOMPLETT]` (hepsi imzal?) --- ## ?? ?mplementasyon Stratejisi ### 1. Counter Düzelt (ÖNCEL?K!) **Dosya:** `EnvelopeGenerator.ReceiverUI/wwwroot/js/pdf-viewer.js` ```javascript getSignatureNavState() { if (!this._allSignatures || this._allSignatures.length === 0) { return { total: 0, signed: 0, unsigned: 0, currentIndex: -1, canGoPrev: false, canGoNext: false }; } const total = this._allSignatures.length; // Global say?m const signed = this.appliedSignatures.length; // ?mzalananlar const unsigned = total - signed; return { total: total, signed: signed, unsigned: unsigned, currentIndex: signed, canGoPrev: signed > 0, canGoNext: unsigned > 0 }; } ``` ### 2. Sonraki ?mza Navigasyonu Düzelt ```javascript async goToNextSignature(dotNetRef) { if (!this._allSignatures || this._allSignatures.length === 0) { return false; } // ?lk imzalanmam?? imzay? bul (TÜM sayfalar aras?nda ara) const appliedIds = new Set(this.appliedSignatures.map(s => s.id)); const nextSignature = this._allSignatures.find(sig => !appliedIds.has(sig.id)); if (!nextSignature) { return false; // Hepsi imzalanm?? } // Farkl? sayfadaysa sayfa de?i?tir if (nextSignature.page !== this.pageNum) { await this.goToPage(nextSignature.page); await new Promise(resolve => setTimeout(resolve, 300)); // Render bekle } // Mevcut sayfadaki butonu bul const button = this.signatureButtons.find(btn => parseInt(btn.getAttribute('data-signature-id')) === nextSignature.id ); // Görünür hale getir (gerekirse scroll yap) if (button) { this.scrollToButton(button); } // Counter güncelle if (dotNetRef) { dotNetRef.invokeMethodAsync('OnSignatureNavChanged'); } return true; } ``` ### 3. Önceki ?mza Navigasyonu Düzelt ```javascript async goToPreviousSignature(dotNetRef) { if (this.appliedSignatures.length === 0) { return false; } // Son imzalanan imzay? al const lastApplied = this.appliedSignatures[this.appliedSignatures.length - 1]; // Farkl? sayfadaysa sayfa de?i?tir if (lastApplied.page !== this.pageNum) { await this.goToPage(lastApplied.page); await new Promise(resolve => setTimeout(resolve, 300)); // Render bekle } // ?mzalanm?? imza container'?n? bul (HTML overlay) const container = document.querySelector( `.applied-signature[data-signature-id="${lastApplied.id}"]` ); // Görünür hale getir if (container) { this.scrollToElement(container); } // Counter güncelle if (dotNetRef) { dotNetRef.invokeMethodAsync('OnSignatureNavChanged'); } return true; } ``` ### 4. Veri Yap?lar? (Referans) ```javascript // Global tracking (TÜM imzalar, TÜM sayfalar) this._allSignatures = [ { id: 1, page: 1, x: 100, y: 200 }, { id: 2, page: 1, x: 100, y: 400 }, { id: 3, page: 1, x: 100, y: 600 }, { id: 4, page: 2, x: 100, y: 200 }, { id: 5, page: 3, x: 100, y: 200 } ]; // ?mzalanm?? imzalar (sayfalar aras? kal?c?) this.appliedSignatures = [ { id: 1, page: 1 }, { id: 3, page: 1 } ]; // Mevcut sayfa butonlar? (geçici, sayfa de?i?ince yeniden olu?ur) this.signatureButtons = [