Defer locked-period supplements to a pending ledger, route duty-holder notifications, persist stage-scoped comments, and prefer Approver for reopen.
43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
import type { UserRole } from '../types/docgov';
|
|
|
|
export type CommentAuthorRole = 'reviewer' | 'approver' | 'author';
|
|
export type DocLifecycleState = 'drafting' | 'reviewing' | 'approving' | 'approved' | string;
|
|
|
|
/** Stage-scoped comment matrix (viewer always read-only). */
|
|
export function canAddBlockComment(
|
|
role: UserRole | string,
|
|
state: DocLifecycleState = 'drafting',
|
|
): boolean {
|
|
if (role === 'viewer' || role === 'system') {
|
|
return role === 'system';
|
|
}
|
|
switch (state) {
|
|
case 'drafting':
|
|
return role === 'author' || role === 'reviewer';
|
|
case 'reviewing':
|
|
return role === 'reviewer' || role === 'author';
|
|
case 'approving':
|
|
return role === 'approver' || role === 'reviewer';
|
|
case 'approved':
|
|
return false;
|
|
default:
|
|
return role === 'author' || role === 'reviewer' || role === 'approver';
|
|
}
|
|
}
|
|
|
|
/** Persist author role as-is when author comments; otherwise reviewer/approver. */
|
|
export function resolveCommentAuthorRole(role: UserRole | string): CommentAuthorRole | null {
|
|
if (role === 'approver') return 'approver';
|
|
if (role === 'reviewer') return 'reviewer';
|
|
if (role === 'author') return 'author';
|
|
return null;
|
|
}
|
|
|
|
export function canResolveComment(
|
|
role: UserRole | string,
|
|
state: DocLifecycleState,
|
|
): boolean {
|
|
if (role === 'reviewer') return true;
|
|
return role === 'author' && state === 'drafting';
|
|
}
|