feat(approvals): decision attachments in inbox + quorum/per_group designer sync (#2678)#2681
Merged
Merged
Conversation
…igner sync (#2678) P1 of the SDUI-first approvals UX plan (#2678): - Decision attachments (the one genuinely bespoke gap): the inbox decision composer gains a CommentAttachment dropzone backed by the presigned-storage adapter (same pipeline as RecordAttachmentsPanel); staged fileIds ride approve/reject as `attachments[]`, and the activity timeline renders attachment chips that open via a Bearer-authed signed URL. Staged files clear on drawer open/close and after a decision. - approvalsApi: approve/reject/comment accept `attachments?: string[]`; ApprovalActionRecord carries `attachments` for the timeline. - flow-node-config: sync the approval-node fallback with the engine schema — behavior enum += quorum / per_group, new Min approvals number field, and a Group column on the approvers list (the configSchema-driven path needs no client change; the fallback no longer drifts). Verified in the browser against a live framework backend (:3000 + Vite :5180): per_group request pends on both groups, composer uploads a real file and the approve action row persists its fileId, the manager approval holds the node until finance signs, and the designer renders Behavior=Per Group / Min Approvals / Group from the server configSchema. Console + app-shell test suites green; eslint delta zero (9 pre-existing errors unchanged). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ypkQikZ55oWUHUnMebwXA
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
6 tasks
…link + attachment names (#2678 P1.5) - Drawer renders the server-computed `decision_progress`: "Approvals — M of N" for quorum/unanimous, and per-group tick badges (legal 1/1 ✓ · finance 0/1) for per_group sign-off, above the Waiting-on list. Pure rendering — the aggregation semantics live server-side, so future behaviors (e.g. weighted) need no client change. - Notification deep link: the inbox consumes `?request=<id>` (sent by the backend's rewritten actionUrls), auto-opens that request's drawer, and strips the param so refresh/back doesn't re-open it. - Timeline attachment chips now show the real file name (batch-resolved from sys_file, cached, best-effort fallback to "Attachment n"). Counterpart of framework's decision-progress/deep-link commit; row click verified already whole-row-opens-drawer (record link stays an explicit external link). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ypkQikZ55oWUHUnMebwXA
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
os-zhuang
marked this pull request as ready for review
July 19, 2026 13:06
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
P1 of #2678 (SDUI-first approvals UX). Backend counterparts already merged: framework#3235/#3255 (OOO delegation) and framework#3268 (quorum/per_group + decision attachments).
What's in this PR
Decision attachments — the one genuinely bespoke gap (#2678 判定 ④)
CommentAttachmentdropzone backed by the presigned-storage adapter (same pipeline asRecordAttachmentsPanel); staged fileIds ride approve/reject asattachments[].approvalsApi:approve/reject/commentacceptattachments?: string[];ApprovalActionRecordcarriesattachments.Flow designer fallback sync (#2678 P1-b)
flow-node-config.tsapproval fallback no longer drifts from the engine schema: behavior enum +=quorum/per_group, new Min approvals number field, and a Group column on the approvers list. The configSchema-driven path (FlowNodeInspector→json-schema-to-fields) needed no client change — verified live.Zero-code SDUI paths verified (no diff needed — #2678 判定 ①③)
sys_approval_delegation(OOO) renders fully from server metadata in the console (lookups tosys_user, datetime, descriptions, icon).configSchema.Browser verification (live framework backend :3000 + Vite console :5180)
per_grouprequest pending on both groups (manager + finance) — inbox shows "Manager + Finance Sign-off", Waiting on both.attachments:["<fileId>"](API-verified).ApprovalsInboxPage.tsxunchanged — same count on pristineorigin/main).Out of scope (later phases of #2678)
sys_approval_request(needs a small framework counterpart PR).SchemaForm).🤖 Generated with Claude Code
Generated by Claude Code