Context
Part of #8321.
A PDF can be digitally signed without showing a signature on the page.
A visible signature field is optional.
LibreSign already supports this behavior, but the current request flow does not explain it. A requester may think that a visible signature field is required.
LibreSign should explain this before sending the request.
Current flow
LibreSign already shows a confirmation dialog after the requester clicks Request signatures.
The current dialog shows:
Confirm
Send signature request?
Actions:
This issue must extend this existing dialog.
Do not add another modal or another confirmation step.
Expected behavior
Before showing the confirmation, LibreSign must identify which signers have no visible signature field.
If every signer has at least one visible signature field, keep the current confirmation unchanged.
If one or more signers have no visible signature field, show extra information inside the same Confirm dialog.
Normal confirmation
When all signers have visible signature fields, keep:
Confirm
Send signature request?
Actions:
Do not show any extra visible-signature information.
Confirmation with missing visible signatures
When one or more signers have no visible signature field, keep the same dialog title and the same main question:
Confirm
Send signature request?
Then show:
Some signers have no visible signature field.
A PDF can be digitally signed without showing a signature on the page. Their digital signatures will still be added to the PDF and can be validated.
List only the affected signers.
For example:
No visible signature:
Keep the same actions:
The request must never be blocked only because a visible signature field is missing.
How to detect affected signers
RequestSignatureTab.vue already imports:
getVisibleElementsFromDocument
from:
src/services/visibleElementsService.ts
Reuse this existing service.
Do not create a new visible-element parser.
The signer list already contains signRequestId.
A signer has a visible signature field when there is at least one visible element where:
element.signRequestId matches the signer signRequestId;
element.type === 'signature'.
Do not use signer name or email for this match.
Do not count other visible field types as a visible signature.
For example, a signer with a text or date field but no signature field must still be treated as having no visible signature field.
Reusable helper
Prefer adding a small reusable helper to:
src/services/visibleElementsService.ts
Suggested responsibility:
getSignersWithoutVisibleSignatureElements(document, signers)
The helper should:
- get visible elements with
getVisibleElementsFromDocument(document);
- keep only elements with
type === 'signature';
- match them to signers by
signRequestId;
- return only signers without a matching visible signature element.
Use the same helper for both request flows.
Do not duplicate the filter logic inside different methods of RequestSignatureTab.vue.
Full request
For Request signatures, run the check for all signers that will receive the request.
Example:
- Alice has one visible signature field;
- Bob has no visible signature field;
- Carol has two visible signature fields.
Only Bob must appear in the dialog.
Individual request
LibreSign also has an individual Request signature action.
This flow already uses its own confirmation dialog.
Reuse the same affected-signer helper with only the selected signer.
If the selected signer has a visible signature field, keep the current confirmation unchanged.
If not, show the same explanation in the existing dialog.
Do not add another modal.
Dialog implementation
The current dialogs use:
confirmSendSignatureRequestMessage
with the message property of NcDialog.
This is enough for the current simple text, but the new content needs:
- the normal confirmation text;
- the explanation;
- a signer list;
- a checkbox;
- helper text.
Use the normal content area of the existing NcDialog instead of trying to put all content inside the message property.
Keep:
- dialog title
Confirm;
Cancel action;
Send action;
- current loading behavior.
Do not create a new dialog component.
User preference
This issue depends on #8322.
RequestSignatureTab.vue already uses:
useUserConfigStore()
The existing store already provides the current user configuration and an update(key, value) method.
Reuse it.
Do not create another API client, store or composable.
The preference key is:
warn_without_visible_signature_fields
If the value is false, keep the normal confirmation dialog and do not show:
- the extra explanation;
- the affected signer list;
- the checkbox.
Do not warn again
When the warning is visible, show an unchecked checkbox:
Do not warn me again when signers have no visible signature field
Below it, show:
You can enable this warning again in LibreSign preferences.
The checkbox must be unchecked every time the dialog opens.
Use local state for the checkbox.
For example:
const disableMissingVisibleSignatureWarning = ref(false)
Do not save anything when the checkbox is selected.
Save the preference only when the requester clicks Send.
If selected, use the existing user config store to save:
await userConfigStore.update(
'warn_without_visible_signature_fields',
false,
)
Cancel and close behavior
If the requester:
- clicks
Cancel;
- closes the dialog;
- leaves without sending;
do not save the preference.
Reset the local checkbox state when the dialog closes.
The next time the warning opens, the checkbox must be unchecked again.
Save timing
The preference should only be changed as part of the confirmed Send action.
Do not save it before the requester confirms the request.
Do not save it from the checkbox change event.
Keep the existing request submission behavior unchanged.
Preferences screen
The user can enable the warning again from the Preferences screen implemented in #8324.
This issue must only consume and update the preference.
Do not add Preferences UI here.
Important rules
This feature only changes the information shown in the existing request confirmation.
It must not:
- require a visible signature field;
- create a visible signature field;
- create a signature position;
- change signer data;
- change the request payload because a field is missing;
- change signing behavior;
- add another confirmation step.
A request without visible signature fields must remain valid and sendable.
Frontend tests
Update:
src/tests/components/RightSidebar/RequestSignatureTab.spec.ts
Cover at least:
- all signers have visible signature fields;
- no signer has a visible signature field;
- mixed signers;
- only affected signers are returned;
- a text or date field does not count as a signature field;
- individual request with a visible signature field;
- individual request without a visible signature field;
- warning hidden when the preference is disabled;
- checkbox unchecked by default;
Cancel does not save the preference;
- closing the dialog does not save the preference;
Send saves the preference when the checkbox is selected.
If a helper is added to visibleElementsService.ts, add focused unit tests for it in:
src/tests/services/visibleElementsService.spec.ts
Use a data provider or table-driven cases if it keeps the signer/element combinations clear.
Playwright
Add or update Playwright coverage for the real requester flow.
Cover at least:
All signers have visible signatures
- open
Request signatures;
- current confirmation appears;
- no extra warning is shown;
- request can be sent.
Signer without visible signature
- open
Request signatures;
- warning appears;
- only the affected signer is listed;
- request can still be sent.
Mixed signers
- some signers have visible signature fields;
- some do not;
- only affected signers are listed.
Individual request
- use
Request signature for one signer;
- only that signer is checked.
Do not warn again
- warning appears;
- checkbox starts unchecked;
- select it;
- click
Send;
- open another affected request;
- warning is not shown.
Cancel
- select the checkbox;
- click
Cancel;
- open the confirmation again;
- warning is still shown.
Close
- select the checkbox;
- close the dialog;
- open it again;
- warning is still shown.
Reuse existing requester Playwright helpers and flows where possible.
Do not build a separate complete request workflow only for this feature.
Out of scope
This issue does not implement:
Good first issue
The main architecture already exists.
The contributor does not need to design a new request flow.
The implementation should reuse:
RequestSignatureTab.vue;
- the existing
NcDialog;
getVisibleElementsFromDocument();
visibleElementsService.ts;
- signer
signRequestId;
useUserConfigStore();
- the existing user config API;
- current component tests;
- current Playwright request flows.
The main work is:
- add one reusable helper for affected signers;
- extend the existing confirmation content;
- connect one existing user preference;
- add focused tests.
Do not create new backend endpoints, stores, dialogs or visible-element parsing.
Additional context
- If you have questions, feel free to ask in this issue.
- Give a ⭐️ star to this repository if you find LibreSign useful and would like to support the project.
- You can also join our community: https://t.me/LibreSign
Done when
Context
Part of #8321.
A PDF can be digitally signed without showing a signature on the page.
A visible signature field is optional.
LibreSign already supports this behavior, but the current request flow does not explain it. A requester may think that a visible signature field is required.
LibreSign should explain this before sending the request.
Current flow
LibreSign already shows a confirmation dialog after the requester clicks
Request signatures.The current dialog shows:
Actions:
CancelSendThis issue must extend this existing dialog.
Do not add another modal or another confirmation step.
Expected behavior
Before showing the confirmation, LibreSign must identify which signers have no visible signature field.
If every signer has at least one visible signature field, keep the current confirmation unchanged.
If one or more signers have no visible signature field, show extra information inside the same
Confirmdialog.Normal confirmation
When all signers have visible signature fields, keep:
Actions:
CancelSendDo not show any extra visible-signature information.
Confirmation with missing visible signatures
When one or more signers have no visible signature field, keep the same dialog title and the same main question:
Then show:
List only the affected signers.
For example:
Keep the same actions:
CancelSendThe request must never be blocked only because a visible signature field is missing.
How to detect affected signers
RequestSignatureTab.vuealready imports:getVisibleElementsFromDocumentfrom:
src/services/visibleElementsService.tsReuse this existing service.
Do not create a new visible-element parser.
The signer list already contains
signRequestId.A signer has a visible signature field when there is at least one visible element where:
element.signRequestIdmatches the signersignRequestId;element.type === 'signature'.Do not use signer name or email for this match.
Do not count other visible field types as a visible signature.
For example, a signer with a text or date field but no
signaturefield must still be treated as having no visible signature field.Reusable helper
Prefer adding a small reusable helper to:
src/services/visibleElementsService.tsSuggested responsibility:
The helper should:
getVisibleElementsFromDocument(document);type === 'signature';signRequestId;Use the same helper for both request flows.
Do not duplicate the filter logic inside different methods of
RequestSignatureTab.vue.Full request
For
Request signatures, run the check for all signers that will receive the request.Example:
Only Bob must appear in the dialog.
Individual request
LibreSign also has an individual
Request signatureaction.This flow already uses its own confirmation dialog.
Reuse the same affected-signer helper with only the selected signer.
If the selected signer has a visible signature field, keep the current confirmation unchanged.
If not, show the same explanation in the existing dialog.
Do not add another modal.
Dialog implementation
The current dialogs use:
confirmSendSignatureRequestMessagewith the
messageproperty ofNcDialog.This is enough for the current simple text, but the new content needs:
Use the normal content area of the existing
NcDialoginstead of trying to put all content inside themessageproperty.Keep:
Confirm;Cancelaction;Sendaction;Do not create a new dialog component.
User preference
This issue depends on #8322.
RequestSignatureTab.vuealready uses:useUserConfigStore()The existing store already provides the current user configuration and an
update(key, value)method.Reuse it.
Do not create another API client, store or composable.
The preference key is:
warn_without_visible_signature_fieldsIf the value is
false, keep the normal confirmation dialog and do not show:Do not warn again
When the warning is visible, show an unchecked checkbox:
Below it, show:
The checkbox must be unchecked every time the dialog opens.
Use local state for the checkbox.
For example:
Do not save anything when the checkbox is selected.
Save the preference only when the requester clicks
Send.If selected, use the existing user config store to save:
Cancel and close behavior
If the requester:
Cancel;do not save the preference.
Reset the local checkbox state when the dialog closes.
The next time the warning opens, the checkbox must be unchecked again.
Save timing
The preference should only be changed as part of the confirmed
Sendaction.Do not save it before the requester confirms the request.
Do not save it from the checkbox change event.
Keep the existing request submission behavior unchanged.
Preferences screen
The user can enable the warning again from the Preferences screen implemented in #8324.
This issue must only consume and update the preference.
Do not add Preferences UI here.
Important rules
This feature only changes the information shown in the existing request confirmation.
It must not:
A request without visible signature fields must remain valid and sendable.
Frontend tests
Update:
src/tests/components/RightSidebar/RequestSignatureTab.spec.tsCover at least:
Canceldoes not save the preference;Sendsaves the preference when the checkbox is selected.If a helper is added to
visibleElementsService.ts, add focused unit tests for it in:src/tests/services/visibleElementsService.spec.tsUse a data provider or table-driven cases if it keeps the signer/element combinations clear.
Playwright
Add or update Playwright coverage for the real requester flow.
Cover at least:
All signers have visible signatures
Request signatures;Signer without visible signature
Request signatures;Mixed signers
Individual request
Request signaturefor one signer;Do not warn again
Send;Cancel
Cancel;Close
Reuse existing requester Playwright helpers and flows where possible.
Do not build a separate complete request workflow only for this feature.
Out of scope
This issue does not implement:
Good first issue
The main architecture already exists.
The contributor does not need to design a new request flow.
The implementation should reuse:
RequestSignatureTab.vue;NcDialog;getVisibleElementsFromDocument();visibleElementsService.ts;signRequestId;useUserConfigStore();The main work is:
Do not create new backend endpoints, stores, dialogs or visible-element parsing.
Additional context
Done when
Confirmdialog is reused.Send signature request?remains the main confirmation.signaturevisible elements count.signRequestId.Send.Canceland dialog close do not save the preference.