The commit implements cross-page navigation for signatures in the `EnvelopeViewer.razor` component. Users can now navigate between signatures across pages using "Next Signature" and "Previous Signature" buttons. Key changes: - Fixed `getSignatureNavState()` to correctly calculate total, signed, and unsigned signatures globally. - Updated `goToNextSignature()` to navigate to the next unsigned signature, including automatic page changes and scrolling. - Updated `goToPreviousSignature()` to navigate to the last signed signature, including automatic page changes and scrolling. - Ensured navigation buttons are properly disabled when no further navigation is possible. The toolbar design remains unchanged, as requested. These changes address issues caused by a previous implementation that broke the counter and navigation functionality.
7.9 KiB
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):
// 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:
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
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
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
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)
// 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 = [
<button data-signature-id="2"> // Sadece Sayfa 1'deki imzalanmam??lar
];
?? De?i?tirilmeyecek Dosyalar
DOKUNMA:
EnvelopeGenerator.ReceiverUI/Pages/EnvelopeViewer.razor- UI mükemmelEnvelopeGenerator.ReceiverUI/wwwroot/css/envelope-viewer.css- Stil mükemmel
SADECE DE???T?R:
EnvelopeGenerator.ReceiverUI/wwwroot/js/pdf-viewer.jsgetSignatureNavState()- Counter düzeltgoToNextSignature()- Cross-page eklegoToPreviousSignature()- Cross-page ekle
? Ba?ar? Kriterleri
- Counter tüm sayfalarda do?ru gösteriliyor (örn: "2 / 5")
- ?mza uyguland?ktan sonra counter hemen güncelleniyor
- "Sonraki" butonu bir sonraki imzalanmam?? imzaya gidiyor (cross-page)
- "Önceki" butonu son imzalanan imzaya gidiyor (cross-page)
- Hedef imza farkl? sayfadaysa otomatik sayfa de?i?iyor
- ?mza butonu/overlay görünür hale geliyor (scroll ile)
- Butonlar do?ru disable oluyor (Sonraki=hepsi imzal?, Önceki=hiç imzalanmam??)
- Tasar?m de?i?medi (purple tema, compact layout)
Durum: ? BA?ARISIZ - YEN?DEN BA?LA
Tarih: 2025-01-26
Sebep: Önceki agent counter'? ve navigation'? bozdu
Kullan?c? Karar?: De?i?iklikleri geri al, sadece counter + navigation düzelt
Tasar?m: ? MÜKEMMEL - DOKUNMA