feat(boards): add 'comment_required_for_review' rule and update related logic

This commit is contained in:
Abhimanyu Saharan
2026-02-26 00:31:47 +05:30
parent adad72373c
commit 6b21ea6f99
13 changed files with 203 additions and 5 deletions

View File

@@ -23,6 +23,7 @@ export interface BoardCreate {
goal_source?: string | null;
require_approval_for_done?: boolean;
require_review_before_done?: boolean;
comment_required_for_review?: boolean;
block_status_changes_with_pending_approval?: boolean;
only_lead_can_change_status?: boolean;
/** @minimum 0 */

View File

@@ -23,6 +23,7 @@ export interface BoardRead {
goal_source?: string | null;
require_approval_for_done?: boolean;
require_review_before_done?: boolean;
comment_required_for_review?: boolean;
block_status_changes_with_pending_approval?: boolean;
only_lead_can_change_status?: boolean;
/** @minimum 0 */

View File

@@ -23,6 +23,7 @@ export interface BoardUpdate {
goal_source?: string | null;
require_approval_for_done?: boolean | null;
require_review_before_done?: boolean | null;
comment_required_for_review?: boolean | null;
block_status_changes_with_pending_approval?: boolean | null;
only_lead_can_change_status?: boolean | null;
max_agents?: number | null;

View File

@@ -291,6 +291,9 @@ export default function EditBoardPage() {
const [requireReviewBeforeDone, setRequireReviewBeforeDone] = useState<
boolean | undefined
>(undefined);
const [commentRequiredForReview, setCommentRequiredForReview] = useState<
boolean | undefined
>(undefined);
const [
blockStatusChangesWithPendingApproval,
setBlockStatusChangesWithPendingApproval,
@@ -504,6 +507,8 @@ export default function EditBoardPage() {
requireApprovalForDone ?? baseBoard?.require_approval_for_done ?? true;
const resolvedRequireReviewBeforeDone =
requireReviewBeforeDone ?? baseBoard?.require_review_before_done ?? false;
const resolvedCommentRequiredForReview =
commentRequiredForReview ?? baseBoard?.comment_required_for_review ?? false;
const resolvedBlockStatusChangesWithPendingApproval =
blockStatusChangesWithPendingApproval ??
baseBoard?.block_status_changes_with_pending_approval ??
@@ -588,6 +593,7 @@ export default function EditBoardPage() {
setObjective(updated.objective ?? "");
setRequireApprovalForDone(updated.require_approval_for_done ?? true);
setRequireReviewBeforeDone(updated.require_review_before_done ?? false);
setCommentRequiredForReview(updated.comment_required_for_review ?? false);
setBlockStatusChangesWithPendingApproval(
updated.block_status_changes_with_pending_approval ?? false,
);
@@ -656,6 +662,7 @@ export default function EditBoardPage() {
: resolvedObjective.trim() || null,
require_approval_for_done: resolvedRequireApprovalForDone,
require_review_before_done: resolvedRequireReviewBeforeDone,
comment_required_for_review: resolvedCommentRequiredForReview,
block_status_changes_with_pending_approval:
resolvedBlockStatusChangesWithPendingApproval,
only_lead_can_change_status: resolvedOnlyLeadCanChangeStatus,
@@ -1016,6 +1023,40 @@ export default function EditBoardPage() {
</span>
</span>
</div>
<div className="flex items-start gap-3 rounded-lg border border-slate-200 px-3 py-3">
<button
type="button"
role="switch"
aria-checked={resolvedCommentRequiredForReview}
aria-label="Require comment for review"
onClick={() =>
setCommentRequiredForReview(!resolvedCommentRequiredForReview)
}
disabled={isLoading}
className={`mt-0.5 inline-flex h-6 w-11 shrink-0 items-center rounded-full border transition ${
resolvedCommentRequiredForReview
? "border-emerald-600 bg-emerald-600"
: "border-slate-300 bg-slate-200"
} ${isLoading ? "cursor-not-allowed opacity-60" : "cursor-pointer"}`}
>
<span
className={`inline-block h-5 w-5 rounded-full bg-white shadow-sm transition ${
resolvedCommentRequiredForReview
? "translate-x-5"
: "translate-x-0.5"
}`}
/>
</button>
<span className="space-y-1">
<span className="block text-sm font-medium text-slate-900">
Require comment for review
</span>
<span className="block text-xs text-slate-600">
Require a task comment when moving status to{" "}
<code>review</code>.
</span>
</span>
</div>
<div className="flex items-start gap-3 rounded-lg border border-slate-200 px-3 py-3">
<button
type="button"