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>
Integrate vuedraggable to enable drag-and-drop reordering when in
ordered_numeric mode. Track originalOrders during drag operations,
recalculate signingOrder using shared mixin logic, emit
signing-order-changed event to trigger auto-save. Include CSS
animations and visual feedback for drag states.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Display counter-number badge with highlighted style when in
ordered_numeric mode. Show DragVertical icon handle when drag-and-drop
is enabled. Add closeActions method to programmatically close action
menu after input submission.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Auto-assign incrementing signingOrder to new signers in ordered_numeric
mode. When deleting a signer, decrement signingOrder of subsequent
signers to close gaps and maintain sequential ordering.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add signingOrderMixin.js with recalculateSigningOrders and
normalizeSigningOrders methods to centralize signing order
calculations and normalization logic used by both drag-and-drop
and manual input components.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Include signingOrder field in signer data returned by FileService.
Sort signers by signingOrder (ascending) and displayName as secondary
sort to maintain consistent ordering in the UI.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add signature_flow to initial state in PageController and
TemplateLoader to enable frontend components to access the
current signature flow mode (parallel or ordered_numeric).
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Install vuedraggable v2.24.3 to enable drag-and-drop
functionality for signing order management in sequential
signature flows.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Regenerate OpenAPI documentation files to include the new
signature flow configuration endpoint.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Create SignatureFlow.vue component for admin settings to configure
signing order mode. Administrators can choose between:
- Simultaneous (Parallel): all signers receive at the same time
- Sequential: signers organized by order number
The component follows the same pattern as other admin settings
(DocMDP) with radio buttons, loading states, and error handling.
Integrated into Settings.vue admin panel.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add setSignatureFlowConfig() method to AdminController to allow
administrators to configure the signature flow mode (parallel or
ordered_numeric). The endpoint validates the mode using the
SignatureFlow enum and deletes the config key when parallel mode
is selected (as it's the default).
Endpoint: POST /api/v1/admin/signature-flow/config
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Add __call callbacks to SignRequest mocks in both tests to properly return
fileId and signingOrder values. Without these callbacks, the mocks were
returning null when these magic methods were called, causing
SequentialSigningService::releaseNextOrder() to fail with a TypeError.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Add reorderAfterDeletion method to SequentialSigningService
- Automatically activate next order when a signer is deleted
- Prevents gaps in signing sequence that would block workflow
- Call reorderAfterDeletion in unassociateToUser after deletion
- Ensures sequential flow continues even when signers are removed
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Add getFileId and getSigningOrder to __call callback mocks
- Return 1 for both methods in tests
- Fixes TypeError when releaseNextOrder is called with null fileId
- All 12 affected tests now pass
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Add SequentialSigningService mock in RequestSignatureServiceTest
- Add SequentialSigningService mock in SignFileServiceTest
- Update constructor calls in both test files to include new dependency
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Change SignRequestStatus enum from string-backed to int-backed (0, 1, 2)
- Update database migration to use SMALLINT instead of VARCHAR(20)
- Update SignRequest entity to use int type for status property
- Reduces storage overhead and improves performance
- Integer values: 0=draft, 1=able_to_sign, 2=signed
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Test parallel signing: all signers can sign immediately
- Test sequential signing: order enforced, status transitions validated
- Verify status 422 when signer attempts to sign out of order
- Verify status changes from DRAFT to ABLE_TO_SIGN after previous signer completes
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Validate signer cannot sign if status is DRAFT
- Validate signer cannot sign again if already SIGNED
- Use getStatusEnum() for enum comparisons
- Proper error messages for blocked signers
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Mark SignRequest as SIGNED using setStatusEnum()
- Update next signer status after successful signature
- Integrate with SequentialSigningService for flow management
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Inject SequentialSigningService dependency
- Reset order counter before processing signers
- Determine signing order for each user
- Set initial status based on order (ABLE_TO_SIGN for first, DRAFT for others)
- Type casting for signingOrder from JSON input
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Manages signing order determination and counter
- Validates signature flow (parallel vs sequential)
- Updates next signer status after signature completion
- Integrates with IAppConfig for flow configuration
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- SignRequestStatus: Enum with DRAFT, ABLE_TO_SIGN, SIGNED states
- SignatureFlow: Enum with PARALLEL and ORDERED_NUMERIC modes
- String-backed enums for database compatibility
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Improve signature request workflow in sidebar:
- Add separate 'Save' and 'Send' buttons with clear actions
- Show 'Edit visible signatures' when elements available
- Hide edit button when document is partially/fully signed
- Add visual icons: Pencil (edit), Send (send), Draw (sign), FileDocument (open)
- Simplify save/request methods using store
- Add status-based button visibility logic using SIGN_STATUS enum
- Improve button naming: 'Request' → 'Send' for clarity
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Refactor VisibleElements to use centralized store methods:
- Replace inline axios calls with store methods
- Add buildVisibleElements helper to construct elements array
- Separate save (status 0) and request (status 1) actions
- Show 'Save' for drafts, 'Send' for requests
- Add Send icon to request button
- Remove confirmation dialog for save action
- Keep confirmation dialog for send action with proper error handling
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Centralize logic for saving and requesting signatures in the filesStore.
This allows reusable methods across different components:
- saveWithVisibleElements: saves draft (status 0)
- requestSignaturesWithVisibleElements: sends request (status 1)
Both methods handle visible elements positioning data.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Replace NcTextArea with CodeEditor component for better Twig
syntax highlighting and code editing experience.
- Remove inline variables list in favor of dialog
- Add 'Available variables' button with help icon
- Use CodeEditor with Twig syntax highlighting
- Apply debounced save on input (500ms)
- Maintain dynamic height with min-height: 80px
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
- Add viewportMargin: Infinity to render all content
- Reduce min-height from 200px to 80px for better UX
- Allow editor to grow dynamically with content
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Use NcRichText component to properly render formatted tips in the
configuration check table, replacing plain text rendering.
This change:
- Imports and uses NcRichText component from @nextcloud/vue
- Enables Markdown rendering for tip content with autolink support
- Adds CSS styling for proper text wrapping and width constraints
- Ensures secure rendering through NcRichText's built-in sanitization
The tips now display with proper formatting including bold text, lists,
code blocks, and clickable links, improving readability and user experience.
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Improve the non-UTF-8 encoding detection in ConfigureCheckService to provide
comprehensive diagnostic information when Java reports incorrect encoding.
The enhanced check now:
- Shows the specific encoding detected by Java
- Displays current PHP environment variables (LC_CTYPE, LC_ALL, LANG)
- Provides step-by-step resolution instructions
- Links to issue #4872 with detailed troubleshooting
This helps administrators quickly identify and resolve locale inheritance
issues between PHP and Java that cause character encoding problems in
PDF signatures.
Ref: https://github.com/LibreSign/libresign/issues/4872
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>