Include status and statusText fields when formatting signers in
ID documents responses. This ensures consistency across all API
endpoints that return signer information.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add status and statusText fields to all signer data returned by
FileService. This includes:
- Signers from LibreSign metadata (loadLibreSignSigners)
- Signers from PDF certificate data (loadSignersFromCertData)
- Signers in file listings (associateAllAndFormat)
The status field contains the numeric code (0=Draft, 1=Pending, 2=Signed)
and statusText contains the localized label.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Update the LibresignSigner psalm type definition to include status
and statusText as required fields (not optional). These fields will
always be present in API responses for signer data.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add a helper method to get localized status text for signers using
the SignRequestStatus enum. This method delegates to the enum's
getLabel() method to maintain consistency across the application.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add a getLabel() method to the SignRequestStatus enum to provide
localized status labels (Draft, Pending, Signed). This follows the
same pattern as DocMdpLevel enum and centralizes the translation
logic in the enum itself rather than spreading it across multiple
files.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Automatically saves the signer to the server with status 0 (draft)
when the user adds a new signer through the Add Signer dialog.
This eliminates the need for a separate manual save action after
adding each signer.
The PATCH request is sent to /apps/libresign/api/v1/request-signature
with status: 0 immediately after the signer is added to the local state.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
When file status is draft, new sign requests should also start as
draft regardless of signing order. This prevents automatic
notifications and keeps requests in draft mode until file is ready.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Include signer status in the signers array returned by file info
endpoint to allow frontend to display draft/pending status.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Move SignatureFlow from lib/Service/ to lib/Enum/ to centralize all
enum definitions in the same location following project structure
conventions.
Updated namespace from OCA\Libresign\Service to OCA\Libresign\Enum
and adjusted all imports and references across:
- AdminController (updated FQN references for from() and comparison)
- PageController (updated FQN reference)
- TemplateLoader (updated FQN reference)
- Settings/Admin (updated import statement)
- SequentialSigningService (added explicit import)
This completes the consolidation of enum types, making the codebase
more organized and easier to maintain.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Move SignRequestStatus from lib/Db/ to lib/Enum/ to follow project
convention of keeping all enums in a dedicated folder alongside
CRLStatus, CRLReason, CertificateType, and DocMdpLevel.
Updated namespace from OCA\Libresign\Db to OCA\Libresign\Enum and
adjusted all imports and references across:
- SignRequest entity (added import)
- ValidateHelper (updated FQN references)
- RequestSignatureService (updated FQN references)
- SequentialSigningService (updated import)
- SignFileService (updated FQN reference)
This improves code organization by consolidating all enum types in
one location.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add FileStatus backed enum to provide compile-time type safety for file
status values. This replaces the previous int-based approach with a
proper enum that:
- Eliminates the need for default fallback in match expressions
- Provides IDE autocomplete for all valid status values
- Throws ValueError for invalid status codes instead of silently
returning unknown status
- Accepts both int and FileStatus for backward compatibility
Updated getTextOfStatus() to use FileStatus enum with automatic
conversion from int via FileStatus::from(). Removed null return type
as status column is NOT NULL in database, ensuring statusText is
always a string.
This improves code maintainability and prevents invalid status values
from being used throughout the codebase.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Update OpenAPI spec and TypeScript types to reflect changes in
LibresignNextcloudFile response type with status, statusText, and
created_at fields.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Update psalm type to reflect the actual fields returned by the
file upload endpoint: status, statusText, and created_at instead
of etag, path, and type.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Return status, statusText and created_at in the API response after
file upload to display immediately in the files list without needing
to reload. Also removed unused etag, path and type fields.
Uses FileMapper to get status text and returns FileEntity directly
from save() method instead of additional database query.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Add postSchemaChange method to migrate existing data
- Set status = 2 (SIGNED) when signed IS NOT NULL
- Set status = 1 (ABLE_TO_SIGN) when signed IS NULL and file.status = 1
- Status 0 (DRAFT) remains as default
- Only update records with status = 0 to avoid overwriting
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Since the 'libresign:visible-elements-saved' event is no longer
emitted on draft saves, the event listeners and related methods
in Request.vue and FilesList.vue are no longer needed.
- Removed subscribe/unsubscribe calls
- Removed closeSidebar() methods
- Removed unused imports from @nextcloud/event-bus
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
The 'libresign:visible-elements-saved' event was being emitted when
saving draft signatures, causing the sidebar to close unexpectedly.
This event should only be emitted when sending signature requests,
not when saving drafts.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
When filters are applied but return no results, the empty state
now displays 'No documents found' without the request button or
'Choose the file to request signatures' text.
This provides better UX by distinguishing between:
- No documents in the system (shows request button)
- Filters with no matches (shows only message)
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
When clicking directly on the toggle button icon, the event was
not properly triggering the expand/collapse action. This fix adds
@click.stop to the NcButton to ensure the toggle action is executed
and prevents event bubbling issues.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add test cases for Portuguese text with accents to verify that the
multibyte-safe wordwrap implementation correctly handles text with
diacritical marks and other Unicode characters in signature images.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
The native PHP wordwrap() function does not handle multibyte characters
correctly, causing text with accents, CJK characters, or emojis to be
wrapped at incorrect positions.
This commit introduces mbWordwrap(), a custom implementation that uses
mb_strlen() and mb_substr() to properly handle UTF-8 and multibyte
text wrapping in signature images.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Auto-generated update of OpenAPI schemas to include the signingOrder
field in NewSigner and Signer types.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
When multiple signers have the same signingOrder value, they should
maintain their insertion order (defined by signRequestId) rather than
being sorted alphabetically by displayName.
This change ensures that when signingOrder is equal, signers are
sorted by signRequestId (which is auto-incrementing) instead of
displayName, preserving the order in which they were originally added.
Fixes Behat integration test failures where tests expected signers
to appear in insertion order.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add signingOrder field to LibresignSigner and LibresignNewSigner
schemas to support ordered signature flow in API documentation.
This fixes OpenAPI validation errors in API tests that were failing
because the signingOrder field was being returned but not defined
in the schema.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Update Behat test to use correct endpoint URL and parameter name:
- Changed from '/api/v1/admin/signature-flow' to '/api/v1/admin/signature-flow/config'
- Changed parameter from 'flow' to 'mode'
This aligns with the actual AdminController endpoint implementation.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
In ordered_numeric signature flow, all signers were receiving
notifications regardless of their status. This caused signers
with signing_order > 1 (status DRAFT) to be notified immediately.
Changes:
- Update SignRequest status on PATCH operations, not just INSERT
- Only notify signers when status is ABLE_TO_SIGN
- Ensure signers with order > 1 remain in DRAFT status until
previous orders are completed
This ensures notifications are sent only to signers who can
actually sign at that moment.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add NcActionInput for manual signing order entry with dual-mode
behavior: updateSigningOrder for visual reordering during typing,
confirmSigningOrder for normalization and persistence on submit/blur.
Implement debounced auto-save (1000ms) after drag-and-drop or manual
order changes. Listen to signing-order-changed event from Signers
component using Vue $emit pattern.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>