Refactor signature handling with SignatureCaptureDto
Introduced a new `SignatureCaptureDto` model to encapsulate signature-related data and metadata, replacing the previous `SignatureCapture` type in `EnvelopeViewer.razor`. - Added `SignatureCaptureDto` in `SignatureCaptureDto.cs` with properties for signature image, signer name, position, and place. - Updated `_capturedSignature` to use `SignatureCaptureDto` for consistency and maintainability. - Refactored signature capture logic to initialize `SignatureCaptureDto` using object initializer syntax. - Improved code clarity with detailed XML documentation for `SignatureCaptureDto`. These changes enhance maintainability, readability, and ensure a centralized model for signature-related data.
This commit is contained in:
62
EnvelopeGenerator.ReceiverUI/Models/SignatureCaptureDto.cs
Normal file
62
EnvelopeGenerator.ReceiverUI/Models/SignatureCaptureDto.cs
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
namespace EnvelopeGenerator.ReceiverUI.Models;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a captured signature with metadata created by the receiver in the signature popup.
|
||||||
|
/// This model holds the signature image (as base64 data URL) along with signer information
|
||||||
|
/// used for rendering applied signatures on the PDF canvas.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// <b>Used in:</b> EnvelopeViewer.razor signature popup workflow
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Creation:</b> User draws/types/uploads signature and fills required fields
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Storage:</b> Session-only (Blazor component state, lost on page refresh)
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Rendering:</b> Applied signatures display: Image + Separator + Name/Position/Place/Date
|
||||||
|
/// </remarks>
|
||||||
|
public sealed record SignatureCaptureDto
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Base64-encoded data URL of the signature image.
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Format:</b> <c>data:image/png;base64,iVBORw0KG...</c>
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Source:</b> Canvas.toDataURL() from signature pad (draw/text/image tabs)
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Usage:</b> Set as <c>img.src</c> in applied signature overlay
|
||||||
|
/// </summary>
|
||||||
|
public required string DataUrl { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Full name of the signer (first and last name).
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Required:</b> Yes (validated in popup)
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Display:</b> Bold text in applied signature block
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Example:</b> "Max Mustermann"
|
||||||
|
/// </summary>
|
||||||
|
public required string FullName { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Job title or position of the signer.
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Required:</b> No (optional field)
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Display:</b> Normal weight text between name and place/date
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Example:</b> "Geschäftsführer" or empty string
|
||||||
|
/// </summary>
|
||||||
|
public string Position { get; init; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Location/place where the signature was created.
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Required:</b> Yes (validated in popup)
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Display:</b> Shown with current date in German format (dd.MM.yyyy)
|
||||||
|
/// <br/>
|
||||||
|
/// <b>Example:</b> "Berlin" ? rendered as "Berlin, 26.01.2025"
|
||||||
|
/// </summary>
|
||||||
|
public required string Place { get; init; }
|
||||||
|
}
|
||||||
@@ -506,8 +506,7 @@ int _unsignedSignatures = 0;
|
|||||||
int _currentSignatureIndex = 0; // Şu an hangi imzada (1-based)
|
int _currentSignatureIndex = 0; // Şu an hangi imzada (1-based)
|
||||||
|
|
||||||
// Signature state
|
// Signature state
|
||||||
record SignatureCapture(string DataUrl, string FullName, string Position, string Place);
|
SignatureCaptureDto? _capturedSignature;
|
||||||
SignatureCapture? _capturedSignature;
|
|
||||||
bool _signaturePopupVisible = false;
|
bool _signaturePopupVisible = false;
|
||||||
string? _popupValidationMessage;
|
string? _popupValidationMessage;
|
||||||
string _activeSignatureTab = SignatureTabDraw;
|
string _activeSignatureTab = SignatureTabDraw;
|
||||||
@@ -873,7 +872,13 @@ const int MaxThumbnailWidth = 400;
|
|||||||
}
|
}
|
||||||
|
|
||||||
_popupValidationMessage = null;
|
_popupValidationMessage = null;
|
||||||
_capturedSignature = new(signatureDataUrl, _signerFullName.Trim(), _signerPosition.Trim(), _signaturePlace.Trim());
|
_capturedSignature = new SignatureCaptureDto
|
||||||
|
{
|
||||||
|
DataUrl = signatureDataUrl,
|
||||||
|
FullName = _signerFullName.Trim(),
|
||||||
|
Position = _signerPosition.Trim(),
|
||||||
|
Place = _signaturePlace.Trim()
|
||||||
|
};
|
||||||
_signaturePopupVisible = false;
|
_signaturePopupVisible = false;
|
||||||
|
|
||||||
await InvokeAsync(StateHasChanged);
|
await InvokeAsync(StateHasChanged);
|
||||||
|
|||||||
Reference in New Issue
Block a user