Commit graph

10474 commits

Author SHA1 Message Date
Samuelson Brito
0042aa23ce feat: add donate button
Signed-off-by: Samuelson Brito <samuelsonma@gmail.com>
2025-12-13 12:07:19 -04:00
Samuelson Brito
b7cfd99350 feat: notify admins only once per LibreSign version after upgrade
Signed-off-by: Samuelson Brito <samuelsonma@gmail.com>
2025-12-13 11:39:08 -04:00
Samuelson Brito
c204315f97 feat: add dismiss button
Signed-off-by: Samuelson Brito <samuelsonma@gmail.com>
2025-12-13 11:39:08 -04:00
Samuelson Brito
56b59602ea feat: send notification to admins after LibreSign upgrade
Signed-off-by: Samuelson Brito <samuelsonma@gmail.com>
2025-12-13 11:39:08 -04:00
Vitor Mattos
25e6961dfb
Merge pull request #6172 from LibreSign/fix/parallel-flow-signer-status
fix: parallel flow signer status
2025-12-13 10:27:12 -03:00
Vitor Mattos
90536362d8
test: Add tests for parallel and ordered flow status determination
Added two unit tests to validate status determination logic:

1. testParallelFlowIgnoresSignerDraftStatusWhenFileIsAbleToSign:
   Validates that in parallel flow, all signers are set to ABLE_TO_SIGN
   when file status is ABLE_TO_SIGN, ignoring individual DRAFT status
   sent by frontend.

2. testOrderedFlowRespectsSigningOrderWhenFileIsAbleToSign:
   Validates that in ordered flow, only the first signer (order 1)
   gets ABLE_TO_SIGN status, while subsequent signers remain DRAFT
   until their turn.

Also updated getService() method to accept optional
SequentialSigningService parameter for testing different flows.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-13 10:07:04 -03:00
Vitor Mattos
5d33e0b1f4
fix: Prioritize file status over signer status in parallel flow
When file status is ABLE_TO_SIGN (1) in parallel flow, all signers
should be set to ABLE_TO_SIGN regardless of individual signer status
sent by frontend. This fixes the issue where signers remained in DRAFT
status (0) even after clicking 'Request signatures'.

The logic now:
1. Check file status DRAFT first - keep all signers as DRAFT
2. Check file status ABLE_TO_SIGN - apply flow-based logic:
   - Parallel: All signers get ABLE_TO_SIGN
   - Ordered: Only first signer gets ABLE_TO_SIGN
3. Fallback to individual signer status for other cases

Resolves issue where sign_request records stayed at status 0 while
libresign_file was updated to status 1.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-13 10:07:04 -03:00
Nextcloud bot
48f330e980
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-12-13 02:13:39 +00:00
Vitor Mattos
b09a16a7d8
Merge pull request #6169 from LibreSign/feat/file-level-signature-flow
feat: file level signature flow
2025-12-12 17:36:12 -03:00
Vitor Mattos
e97580bc21
fix: correctly increment order counter after user-provided order
When user provides a specific signing order, the next auto-assigned
order should be the provided value + 1.

Changed condition from > to >= and set currentOrder to userProvidedOrder + 1
instead of just userProvidedOrder.

This ensures proper order sequencing when mixing user-provided and
auto-assigned orders.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:27:11 -03:00
Vitor Mattos
4a15f791d4
fix: openapi documentation
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:24:52 -03:00
Vitor Mattos
da8ca88f2b
fix: add signatureFlow to ValidateFile schema in openapi.json
Complete the OpenAPI schema update by adding signatureFlow field to
the ValidateFile schema definition.

This was manually corrected after the initial automated update.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:22:16 -03:00
Vitor Mattos
c468f3a15f
test: add unit tests for signature flow feature
Add comprehensive unit tests for the signature flow implementation.

- SequentialSigningServiceTest: Test flow detection and order assignment
- FileTest: Test enum conversion methods in File entity
- RequestSignatureServiceTest: Fix constructor to include IAppConfig mock

Tests validate the core logic without focusing on coverage metrics.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:21:52 -03:00
Vitor Mattos
d38d3c0358
refactor: read signature flow from file data in frontend
Replace global config usage with file-level signature flow from store.

- RequestSignatureTab.vue: Compute signatureFlow from file data
- Signer.vue: Read signatureFlow from file instead of loadState
- Signers.vue: Check file.signatureFlow for ordered flow mode
- files.js: Use file.signatureFlow for signer order management

This enables per-file signature flow configuration in the UI.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:19:36 -03:00
Vitor Mattos
df44227af1
fix: add signatureFlow to ValidateFile schema
Add signatureFlow field to ValidateFile schema in OpenAPI specs and
ResponseDefinitions.

- Update openapi.json and openapi-full.json schemas
- Add signatureFlow to LibresignValidateFile psalm type
- Mark as required field with integer type

This fixes OpenAPI validation errors in API tests.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:18:55 -03:00
Vitor Mattos
06b1b8faac
chore: regenerate TypeScript types from OpenAPI spec
Update generated TypeScript types to include signatureFlow parameter.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:15:19 -03:00
Vitor Mattos
1d62e46b5c
refactor: move signature flow constants to enum
Move database value constants from File entity to SignatureFlow enum
where they belong as the single source of truth.

- Add SignatureFlow::NUMERIC_PARALLEL and NUMERIC_ORDERED_NUMERIC
- Remove circular dependency between File and SignatureFlow
- Update all references to use enum constants
- Use descriptive names instead of abbreviations

This follows single responsibility principle: the enum owns its
database representation.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:14:12 -03:00
Vitor Mattos
a02bb43ebf
chore: remove unecessary docblock
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:05:04 -03:00
Vitor Mattos
0e3ed551e6
docs: add signatureFlow parameter to OpenAPI specification
Update API documentation for request-signature endpoint.

- Add signatureFlow parameter to request body schema
- Type: string, nullable
- Description documents accepted values and fallback behavior

This ensures API consumers have accurate documentation for the
signature flow parameter.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:02:39 -03:00
Vitor Mattos
8a4e018c6a
feat: include signatureFlow in API responses
Expose signature flow configuration in file list and detail endpoints.

FileService changes:
- Add signatureFlow to fileData object in formatFile()

SignRequestMapper changes:
- Include f.signature_flow in SELECT query
- Convert numeric value to enum string in formatListRow()
- Remove signature_flow from response (cleanup after conversion)

This enables frontend to display and use per-file signature flow
configuration.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:02:18 -03:00
Vitor Mattos
3ac6e064f6
refactor: pass file entity to SequentialSigningService in SignFileService
Update releaseNextOrder call to provide file entity context.

- Call setFile() before releaseNextOrder()
- Enables SequentialSigningService to read file-level signature flow

This ensures signature flow logic uses the correct per-file
configuration during document signing workflow.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:01:47 -03:00
Vitor Mattos
7918cd51c5
feat: implement signature flow handling in RequestSignatureService
Add signature flow parameter processing and file configuration logic.

- Parse signatureFlow from request data and convert to enum
- Fall back to global config if parameter invalid or missing
- Set file entity signature flow via setSignatureFlowEnum()
- Initialize SequentialSigningService with file entity context
- Add IAppConfig dependency for global fallback

This completes the backend logic for per-file signature flow
configuration with graceful fallback to system defaults.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:01:13 -03:00
Vitor Mattos
c16ba73bc8
feat: add signatureFlow parameter to request-signature endpoint
Add optional signatureFlow parameter to POST /request-signature API.

- Accepts 'parallel' or 'ordered_numeric' values
- Falls back to global configuration if not provided
- Documented in PHPDoc and OpenAPI annotations

This enables clients to specify signature flow mode per document
when creating signature requests.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 17:00:53 -03:00
Vitor Mattos
ad71acbbcd
refactor: use file-level signature flow in SequentialSigningService
Replace global config dependency with file-level signature flow.

- Add setFile() method to inject File entity
- Replace getSignatureFlow() to read from file instead of IAppConfig
- Remove IAppConfig dependency (no longer needed)
- Add validation: throws LogicException if getSignatureFlow() called without file

This enables per-file signature flow configuration while maintaining
backward compatibility through database default values.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 16:59:14 -03:00
Vitor Mattos
ff7b64b526
feat: add signature flow support to File entity
Add signatureFlow property and enum conversion helper methods to File entity.

- New protected property: signatureFlow (SMALLINT, default 1)
- getSignatureFlowEnum(): Returns SignatureFlow enum from integer
- setSignatureFlowEnum(): Sets integer from SignatureFlow enum

These methods provide type-safe access to signature flow configuration
stored in the database.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 16:58:51 -03:00
Vitor Mattos
0f89027464
feat: add signature_flow column to libresign_file table
Add signature_flow column to store signature flow mode at file level.

- Column type: SMALLINT NOT NULL DEFAULT 1
- 1 = parallel (default)
- 2 = ordered_numeric

This enables per-file configuration of signature flow, overriding the
global application setting when specified.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 16:58:18 -03:00
Vitor Mattos
abf6bb70b1
feat: add numeric conversion methods to SignatureFlow enum
Add toNumeric() and fromNumeric() methods to enable conversion between
SignatureFlow enum values and their integer database representations.

- PARALLEL = 1
- ORDERED_NUMERIC = 2

This allows storing signature flow as integers in the database while
maintaining type-safe enum usage in the code.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 16:57:57 -03:00
Vitor Mattos
c05b15a8e1
Merge pull request #6166 from LibreSign/fix/migration-signer-order-default
fix: set default value for signer_order column in migration
2025-12-12 16:55:52 -03:00
Vitor Mattos
6f83a9c04d
fix: set default value for signer_order column in migration
Set default value of 0 for signer_order column to prevent NULL values
that would cause issues with sequential signing feature.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 16:30:59 -03:00
Vitor Mattos
b2044c630a
Merge pull request #6163 from LibreSign/refactor/move-status-validation-to-sequential-service
refactor: move status validation to sequential service
2025-12-12 15:17:05 -03:00
Vitor Mattos
ede3fe8b9b
fix: cs
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 15:07:42 -03:00
Vitor Mattos
48915dca4b
refactor: delegate status validation to SequentialSigningService
Remove internal validation methods from RequestSignatureService and
delegate to SequentialSigningService for better separation of concerns.

Changes:
- Remove hasPendingLowerOrderSigners() private method
- Remove isStatusUpgrade() private method
- Replace inline ordering validation with call to
  validateStatusByOrder()
- Simplify determineInitialStatus() by delegating validation logic

This reduces complexity in RequestSignatureService and makes the code
more maintainable by following single responsibility principle. All
sequential signing logic is now centralized in the specialized service.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 15:03:52 -03:00
Vitor Mattos
e557674ef0
refactor: add status validation methods to SequentialSigningService
Move status-related validation logic to SequentialSigningService where
it belongs, improving code cohesion and testability.

Changes:
- Add hasPendingLowerOrderSigners() method to check for incomplete
  lower-order signers
- Add isStatusUpgrade() method to validate status transitions
- Add validateStatusByOrder() method to encapsulate ordering
  validation logic for status transitions

These methods are now public and easily testable, centralizing all
sequential signing validation logic in a single specialized service.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 15:03:32 -03:00
Vitor Mattos
9c6cebf5f5
Merge pull request #6160 from LibreSign/fix/individual-signer-status-control
fix: add ordering validation for signature request actions
2025-12-12 14:49:08 -03:00
Vitor Mattos
c9f2fa9feb
fix: add ordering validation for signature request actions
In ordered numeric signing flow, the frontend now validates that
all lower-order signers have signed before showing 'Request signature'
or 'Send reminder' buttons for higher-order signers.

Changes:
- Extract duplicate ordering validation logic into shared method
  canSignerActInOrder
- Apply ordering validation to both canRequestSignature and
  canSendReminder computed properties
- Move canSignerActInOrder to methods section (takes parameter)

This prevents users from requesting signatures or sending reminders
to signers out of turn when sequential signing is enabled.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 14:46:24 -03:00
Vitor Mattos
4535979d7d
Merge pull request #6157 from LibreSign/fix/edit-signer-modal-title
fix: update modal title to reflect edit vs add signer action
2025-12-12 13:40:03 -03:00
Vitor Mattos
562cb296d1
fix: update modal title to reflect edit vs add signer action
The modal dialog was displaying 'Add new signer' title when clicking
an existing signer to edit, which was confusing. Added a computed
property 'modalTitle' that dynamically returns 'Edit signer' when
editing an existing signer or 'Add new signer' when adding a new one.

The logic checks if signerToEdit object has properties to determine
the correct context.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 13:38:03 -03:00
Vitor Mattos
3eff421a84
Merge pull request #6154 from LibreSign/fix/remove-sidebar-tab-box-shadow
fix: remove blue line from sidebar tab
2025-12-12 13:27:51 -03:00
Vitor Mattos
87d02c9c71
fix: remove blue line from sidebar tab
Remove box-shadow from .app-sidebar__tab to eliminate the blue line
that appeared above tab content when clicking on sidebar tabs.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-12 13:24:44 -03:00
Nextcloud bot
504db48812
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-12-12 02:16:18 +00:00
Vitor Mattos
4212de89e4
Merge pull request #6151 from LibreSign/fix/visible-elements-signer-prop
fix: correct Signer component prop in VisibleElements
2025-12-11 20:12:04 -03:00
Vitor Mattos
0a129e4aaf
fix: correct Signer component prop in VisibleElements
The Signer component expects signerIndex prop but VisibleElements
was passing current-signer instead. This caused Vue warnings about
missing required prop and errors when trying to access signer data.

Changed :current-signer to :signer-index and removed obsolete
:signer prop since the component now fetches signer data from
the store using the signerIndex.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-11 20:10:46 -03:00
Vitor Mattos
4c740d9c6c
Merge pull request #6148 from LibreSign/refactor/centralize-file-status-translations
refactor: centralize file status translations in FileStatus enum
2025-12-11 20:09:05 -03:00
Vitor Mattos
e425b186d9
refactor: centralize file status translations in FileStatus enum
- Add getLabel() method to FileStatus enum similar to DocMdpLevel and SignRequestStatus
- Simplify FileMapper::getTextOfStatus() to delegate to enum's getLabel()
- Improves maintainability by centralizing translations in a single place

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-11 19:59:15 -03:00
Vitor Mattos
c0b87930b4
Merge pull request #6145 from LibreSign/feat/status-chip-improvements
feat: status chip improvements
2025-12-11 19:53:40 -03:00
Vitor Mattos
1d8f1d5a1f
feat: pass signers prop to FileEntryStatus in grid view
- Add signers prop binding for grid view consistency
- Enables language-independent status detection

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-11 19:52:29 -03:00
Vitor Mattos
e55950f0ec
feat: pass signers prop to FileEntryStatus
- Add signers prop binding to enable language-independent status detection
- Defaults to empty array if signers data is not available

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-11 19:52:29 -03:00
Vitor Mattos
affa4f987d
feat: update status filter icon colors to match chips
- Use softer, more visible colors for status icons
- draft: #9E9E9E (medium gray)
- available/partial: #D4A843 (soft gold)
- signed: #4CAF50 (medium green)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-11 19:49:11 -03:00
Vitor Mattos
a6d748e91e
feat: adjust status column alignment and width
- Center status column content
- Set column width to 2.5x row height
- Add mobile responsive width (0.8x row height for ≤768px)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-11 19:49:05 -03:00
Vitor Mattos
62d792d890
feat: replace status dot with responsive chip component
- Replace simple status dot with custom chip component
- Desktop: shows chip with text that breaks into multiple lines
- Mobile (≤768px): shows only colored icon
- Supports multiple status colors: error (red), draft (gray), available/partial (yellow), signed (green)

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-11 19:48:49 -03:00