feat(revisions): revision request flow — admin decisions, requests hub, deliverable promotion - #11
Merged
Merged
Conversation
… deliverableId, inline-phase approve input
…roject form, decline reason, attachment links
…k; export RevisionCard
This branch predates the clients.* subdomain work, so its new routes
still carried the /portal prefix. The rebase merged cleanly precisely
because the changes sat in different regions of the file — which left
the Requests nav pointing at /portal/requests right next to an
already-rewritten /projects link.
Under proxy.ts, clients.cloverdesign.xyz/portal/requests 307s to
/requests, so the nav would have bounced through a redirect on every
click and the active-state check (startsWith('/portal/requests'))
would never have matched.
portal-shell: /portal/requests → /requests
portal-revisions: /portal/projects/:id → /projects/:id
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
tanthehack
added a commit
that referenced
this pull request
Aug 28, 2026
…ms on a phone Follow-ups from the #11 merge. - `RevisionApproveInput` didn't carry `decisionNote`, so approvals sent no message even though the live endpoint accepts one and puts it in the client's approval email ("Note shown to the client alongside the approval"). Both approve dialogs now take an optional note, sharing one ClientNoteField — the decline path already had this. - The portal header regressed when #11 added the Requests nav item. Three items beside the wordmark and the sign-out needed 431px; an iPhone gives 375, so it overflowed. The wordmark now drops below `sm` (the clover mark still reads as the logo and the link keeps its aria-label) and the pills and header gap tighten. Measured 431 → 360, so it fits at 375. It still doesn't at 320 — no longer a width worth designing for. - Preview harness gains a `requests` view and the two new revision fields in its fixtures, so #11's hub is visible locally. The approved fixture carries a decisionNote, which confirms the display path renders it.
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.
Builds out the revision request flow end to end — the client raises a change, the studio decides on it, and the outcome links back to a project. Covers
docs/backend-requests§7a–§7d.What's in it
Model (
lib/api/models.ts)attachmentstyped asRevisionAttachment[]({url, name}) instead ofunknown[].decisionNote— the studio's message on a terminal decision, replacingresultingPhaseNote(kept and marked@deprecatedso nothing breaks mid-migration).deliverableId— set when a revision is raised from a deliverable rather than from scratch.RevisionApproveInputreshaped: a new-phase approval now authors itsphase,milestones[], andendDateinline at approval time.Admin —
components/admin/revisions/revision-detail.tsxPortal
/requests— a cross-project revision hub, plus a Requests tab in the portal shell.RevisionCardexported so the hub and the project view share one component.Route paths
This branch predates the
clients.*subdomain work, so its new routes were written with the/portalprefix. The rebase ontomainmerged cleanly because the changes sat in different regions of the same files — which left the Requests nav pointing at/portal/requestsdirectly beside an already-rewritten/projectslink.Under
proxy.tsthat would have meant a307on every Requests click, andstartsWith("/portal/requests")would never have matched, so the tab would never highlight. Fixed in 074764f.Verified
tsc --noEmitclean. eslint clean apart from the pre-existingportal-guard.tsxset-state-in-effecterror that is already onmain. Routing matrix against the dev server:/requestsclients.*/portal/requestsclients.*/requests/portal/requests/,/projects,/loginclients.*/admin,/admin/calendar/auth-wash.pngclients.*No server errors in the dev log.
Backend dependencies
The UI is built against fields the backend does not serve yet —
decisionNote,deliverableId, structuredattachments, and the reshaped approve payload. Rendering degrades quietly (the note and links are conditional), but the write paths need the endpoints before the flow works against live data.Related: #4, which carries the
docs/backend-requests.mdthe§7xcomments in this diff point at. That doc isn't onmainyet, so those references dangle until #4 lands.