Commit graph

10,582 commits

Author SHA1 Message Date
Vitor Mattos
552521e546
refactor: move SignRequestStatus enum to dedicated Enum directory
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>
2025-12-11 11:42:11 -03:00
Vitor Mattos
e5d703c51a
Merge pull request #6094 from LibreSign/fix/return-right-fields-when-save-a-new-file
fix: add status and created_at fields to file upload response
2025-12-11 11:28:00 -03:00
Vitor Mattos
3c223a06c2
feat: introduce FileStatus enum for type-safe status handling
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>
2025-12-11 11:08:20 -03:00
Vitor Mattos
6a4f3d231d
Merge pull request #6095 from LibreSign/fix/optional-parameter-before-required
fix: correct parameter order in getUserConfigByKey method
2025-12-11 11:05:50 -03:00
Vitor Mattos
d3fde80329
fix: correct parameter order in getUserConfigByKey method
Optional parameter declared before required parameter causes implicit
required treatment. Changed method signature to put required parameter
$key before optional parameter $user, and updated all call sites.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-11 09:54:11 -03:00
Vitor Mattos
4a57a99dc6
docs: regenerate OpenAPI documentation
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>
2025-12-11 09:47:55 -03:00
Vitor Mattos
8bc72d9616
docs: update LibresignNextcloudFile type definition
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>
2025-12-11 09:46:45 -03:00
Vitor Mattos
c2040e563a
fix: add status and created_at fields to file upload response
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>
2025-12-11 09:33:18 -03:00
Vitor Mattos
a8bb48e027
Merge pull request #6091 from LibreSign/fix/migration-sign-request-status
fix: Update migration to properly set SignRequest status
2025-12-11 09:31:54 -03:00
Nextcloud bot
1bd3dc79b8
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-12-11 02:14:51 +00:00
Vitor Mattos
24542f28d5
fix: Update migration to properly set SignRequest status
- 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>
2025-12-10 19:07:55 -03:00
Vitor Mattos
da429d3ae3
Merge pull request #6088 from LibreSign/improvement/reorganize-sidebar-buttons
Reorganize sidebar buttons for better UX
2025-12-10 17:29:52 -03:00
Vitor Mattos
1659bf96c1
refactor: reorganize sidebar buttons for better UX
- Group buttons by context using flexbox with consistent spacing
- Reorder buttons to follow logical workflow
- Improve button hierarchy (max 1 primary button visible)
- Update labels for clarity
- Remove NcFormBox in favor of simpler flexbox layout

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-10 17:27:31 -03:00
Vitor Mattos
3270f87417
Merge pull request #6085 from LibreSign/fix/keep-sidebar-open-on-save
fix: keep sidebar open on save
2025-12-10 15:32:07 -03:00
Vitor Mattos
0cb0086566
refactor: remove unused event listeners for visible-elements-saved
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>
2025-12-10 15:22:58 -03:00
Vitor Mattos
4e30b9ce2c
fix: remove event emission on draft save to keep sidebar open
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>
2025-12-10 15:22:45 -03:00
Vitor Mattos
ec9c50796f
Merge pull request #6082 from LibreSign/fix/empty-state-with-filters
fix: improve empty state message when filters are active
2025-12-10 15:01:12 -03:00
Vitor Mattos
4b8da80d6b
fix: improve empty state message when filters are active
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>
2025-12-10 14:59:54 -03:00
Vitor Mattos
0b43d58698
Merge pull request #6077 from LibreSign/fix/certificate-chain-toggle
fix: certificate chain toggle not working on button click
2025-12-10 14:28:07 -03:00
Vitor Mattos
5b5fe80961
fix: certificate chain toggle not working on button click
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>
2025-12-10 14:16:13 -03:00
Vitor Mattos
374b402fd9
Merge pull request #6074 from LibreSign/fix/multibyte-text-wrapping
fix: multibyte text wrapping
2025-12-10 14:15:58 -03:00
Vitor Mattos
dd2331915c
Merge pull request #6072 from LibreSign/dependabot/composer/vendor-bin/psalm/vimeo/psalm-6.14.1
chore(deps-dev): Bump vimeo/psalm from 6.13.1 to 6.14.1 in /vendor-bin/psalm
2025-12-10 14:02:52 -03:00
Vitor Mattos
a025bc90fd
test: add multibyte text wrapping test cases
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>
2025-12-10 14:01:58 -03:00
Vitor Mattos
714f424d7c
fix: replace wordwrap with multibyte-safe implementation
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>
2025-12-10 14:01:39 -03:00
dependabot[bot]
5388ed1d6a
chore(deps-dev): Bump vimeo/psalm in /vendor-bin/psalm
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 6.13.1 to 6.14.1.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/6.13.1...6.14.1)

---
updated-dependencies:
- dependency-name: vimeo/psalm
  dependency-version: 6.14.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-10 16:37:24 +00:00
Vitor Mattos
4c774f2c72
Merge pull request #6073 from LibreSign/dependabot/github_actions/peter-evans/create-pull-request-8.0.0
chore(deps): Bump peter-evans/create-pull-request from 7.0.11 to 8.0.0
2025-12-10 13:35:44 -03:00
dependabot[bot]
231b42589d
chore(deps): Bump peter-evans/create-pull-request from 7.0.11 to 8.0.0
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.11 to 8.0.0.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](22a9089034...98357b18bf)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-10 16:22:56 +00:00
Vitor Mattos
20a6616c12
Merge pull request #6069 from LibreSign/feat/sequential-signing
feat: sequential signing
2025-12-10 12:40:17 -03:00
Vitor Mattos
5caf995ab8
chore: update OpenAPI schemas with signingOrder field
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>
2025-12-10 12:31:01 -03:00
Vitor Mattos
af5b9bf14c
fix: preserve insertion order when signingOrder values are equal
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>
2025-12-10 12:29:58 -03:00
Vitor Mattos
70e7c3533c
feat: add signingOrder to OpenAPI schema definitions
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>
2025-12-10 12:19:40 -03:00
Vitor Mattos
3a44e0a8df
test: fix signature-flow endpoint URL in integration test
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>
2025-12-10 12:11:29 -03:00
Vitor Mattos
c86cb4a6ed
fix: only notify signers with ABLE_TO_SIGN status in sequential flow
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>
2025-12-10 11:59:16 -03:00
Vitor Mattos
9688265954
feat: add manual signing order input with auto-save
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>
2025-12-10 11:50:05 -03:00
Vitor Mattos
b15f95c32c
feat: implement drag-and-drop reordering for signers
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>
2025-12-10 11:50:01 -03:00
Vitor Mattos
c9dba8d5e0
feat: add visual indicators for signing order in Signer component
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>
2025-12-10 11:49:58 -03:00
Vitor Mattos
8e3411b884
feat: auto-assign signingOrder and adjust on signer deletion
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>
2025-12-10 11:49:54 -03:00
Vitor Mattos
37571fa0e9
feat: create signingOrderMixin for shared ordering logic
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>
2025-12-10 11:49:48 -03:00
Vitor Mattos
83a982fb96
feat: add signingOrder field to API responses and sort signers
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>
2025-12-10 11:49:39 -03:00
Vitor Mattos
f23e9d6d3e
feat: provide signature_flow initial state to frontend
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>
2025-12-10 11:49:22 -03:00
Vitor Mattos
1ca80e9adf
feat: add vuedraggable for drag-and-drop reordering
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>
2025-12-10 11:49:16 -03:00
Nextcloud bot
a49dfb9313
fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-12-10 02:16:46 +00:00
Vitor Mattos
5c6fc226c1
chore: update OpenAPI specs for signature flow endpoint
Regenerate OpenAPI documentation files to include the new
signature flow configuration endpoint.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-09 21:56:51 -03:00
Vitor Mattos
0367e5329c
feat: add signature flow configuration UI
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>
2025-12-09 21:56:51 -03:00
Vitor Mattos
ee69b44746
feat: add signature flow admin endpoint
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>
2025-12-09 21:56:51 -03:00
Vitor Mattos
fae11f133c
test: fix mock callbacks for testUpdateDatabaseWhenSign and testDispatchEventWhenSign
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>
2025-12-09 21:56:51 -03:00
Vitor Mattos
6502530576
feat: reorder signers after deletion in sequential mode
- 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>
2025-12-09 21:56:51 -03:00
Vitor Mattos
3e2a04dbf7
test: fix mock callbacks to include getFileId and getSigningOrder
- 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>
2025-12-09 21:56:51 -03:00
Vitor Mattos
74e2adecbf
chore: reorder method and change visibility
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-12-09 21:56:51 -03:00
Vitor Mattos
b14cc50915
test: fix unit tests to include SequentialSigningService mock
- 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>
2025-12-09 21:56:51 -03:00