Repository navigation
Add the Signature Rejection Policy Workbench module #8688
Description
Part of #8685. Blocked by #8687.
Goal
Create the policy-local frontend module for Signature Rejection.
Do not change the shared Policy Workbench engine in this issue.
Backend values
Use these backend keys:
| Key | Values | Default |
|---|---|---|
rejection_enabled |
false, true |
false |
rejection_behavior |
cancel, continue |
cancel |
rejection_comment_mode |
disabled, optional, required |
disabled |
rejection_visibility |
requester, participants, public |
requester |
rejection_comment_visibility |
requester, participants, public |
requester |
rejection_enabled is the parent policy.
Files
Create the module under:
src/views/Settings/PolicyWorkbench/settings/signature-rejection/
Use these existing modules as references:
settings/signature-flow/for themodel.ts+realDefinition.tspattern;settings/expiration-rules/for an editor that maps several fields into one draft value;settings/collect-metadata/for a small boolean policy definition.
Do not copy policy-specific behavior from those modules. Reuse only their structure and Workbench conventions.
Expected files:
model.ts
realDefinition.ts
SignatureRejectionRuleEditor.vue
Add mirrored unit tests.
Editor fields
Show:
- Signature rejection: enabled/disabled
- After rejection: cancel/continue
- Rejection comment: disabled/optional/required
- Rejection visibility: requester/participants/public
- Comment visibility: requester/participants/public
Use existing Nextcloud components.
Behavior
The table above documents the current backend contract. Do not create a second source of truth for capabilities.
When the effective policy state provides backend metadata such as allowedValues, use that metadata through the existing Workbench pattern. The local module is responsible for typed normalization, editor labels and compose/decompose mapping only.
- compose/decompose the five backend keys using the generic compound contract from Make the Policy Workbench compound helper use policy definitions #8687;
- allow values to be prepared while rejection is disabled;
- do not erase inactive values;
- do not add a setting for signer private comments;
- use translated labels;
- keep the summary short.
Do not recreate backend authorization, inheritance, delegation or cross-policy validation rules.
In particular, do not add Vue logic that decides whether a child scope may widen visibility or weaken a required comment. The backend owns those rules and the Workbench owns generic error handling.
Tests
Cover:
- defaults;
- compose/decompose of all five keys;
- every editor option;
- values remain unchanged when another option becomes inactive;
- summary text;
- emitted editor value.
Done when
- The Signature Rejection module exists.
- The editor supports all five backend values.
- The module uses the generic compound contract.
- No shared Workbench file contains Signature Rejection business logic.
- Unit tests pass.
-
npm run lintpasses. -
npm run stylelintpasses. -
npm run ts:checkpasses.
Good first issue
This issue is isolated to one policy module. The backend contract and generic Workbench behavior already exist. Use the neighboring policy modules as examples.
Metadata
Metadata
Assignees
Labels
Type
Fields
Priority
Projects
- StatusShow more project fieldsNo status
Activity
maia-andre commentedon Oct 2, 2026
I'd like to take this one, together with #8689, once #8687 lands (#8950 is in review).
They close the chain that #8161 is waiting for, which I have already claimed, and I worked on the backend contract they consume in #8423/#8706/#8398. I saw the
good first issuelabel, so if you'd rather keep these two for a newcomer, just say so and I'll leave them.For the module I'll follow the description:
model.ts,realDefinition.tsandSignatureRejectionRuleEditor.vueundersettings/signature-rejection/, compose/decompose of the fiverejection_*keys through the generic compound contract from #8687, backendallowedValuesthrough the existing Workbench pattern, inactive values preserved, and mirrored tests. I won't start before #8950 is merged, so I build on its final API.