diff --git a/OPEN_TASK.md b/OPEN_TASK.md new file mode 100644 index 00000000..164a5b49 --- /dev/null +++ b/OPEN_TASK.md @@ -0,0 +1,278 @@ +# 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 = [ +