mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-07 17:45:42 +00:00
feat(freight): non-terminal change-request review + unified customer timeline
Backoffice can now "Request changes" on a pending settings change request without rejecting it outright: a new ChangesRequested status keeps the row open so the customer's next edit appends into the same request instead of starting a fresh cycle, and the reviewer's note persists across that round instead of being cleared on resubmit. Version History and Review History (previously two separate, differently-shaped lists) are merged into one chronological timeline under a new History tab, including document changes shown as a real previous-vs-current diff (both files openable). Bug fixes surfaced while wiring this up: - Replacing a single-file document slot left the old file live alongside the new one instead of retiring it (customer settings + onboarding uploads). - The "previous" file in a document diff 404'd once superseded — the preview route now also matches soft-deleted records. - A document replace was recorded twice in the timeline (once at upload, once again at change-request approval).
This commit is contained in:
@@ -150,10 +150,15 @@ export default function OnboardingResumeBanner({
|
||||
|
||||
/**
|
||||
* Post-onboarding review banner. Surfaces (in priority order):
|
||||
* 0. The account is suspended/blacklisted — hard lock.
|
||||
* 1. A pending profile-edit review — the whole account is locked until an admin
|
||||
* approves the submitted changes.
|
||||
* 2. A rejected profile-edit review — links to Settings to amend & resubmit.
|
||||
* 3. Per-operational-profile approval — bookings unlock as each role clears.
|
||||
* 2. Backoffice requested changes — soft: same edit-and-resubmit call to
|
||||
* action as a rejection, but the edit appends to the same request.
|
||||
* 3. A rejected profile-edit review — links to Settings to amend & resubmit
|
||||
* (starts a fresh request).
|
||||
* 4/5. Company- and per-operational-profile approval — bookings unlock as
|
||||
* each role clears.
|
||||
* Self-hides when there's nothing outstanding.
|
||||
*/
|
||||
export function AccountReviewBanner() {
|
||||
@@ -207,7 +212,41 @@ export function AccountReviewBanner() {
|
||||
);
|
||||
}
|
||||
|
||||
// 2. Profile-edit review rejected — prompt to fix & resubmit.
|
||||
// 2. Backoffice asked for specific changes — soft: same edit-and-resubmit
|
||||
// call to action as a rejection, but the copy stays collaborative since
|
||||
// the edit appends to this same request instead of starting over.
|
||||
if (reviewStatus === "changes_requested") {
|
||||
return (
|
||||
<div className="border-b border-amber-200 bg-amber-50 px-6 py-3">
|
||||
<div className="mx-auto flex max-w-6xl flex-wrap items-center justify-between gap-3">
|
||||
<div className="flex items-center gap-3">
|
||||
<span className="flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-amber-100 text-amber-700">
|
||||
<AlertTriangle size={18} />
|
||||
</span>
|
||||
<span className="flex flex-col gap-0.5">
|
||||
<span className="text-sm font-semibold text-amber-900">
|
||||
Changes requested on your submission
|
||||
</span>
|
||||
<span className="text-xs text-amber-800">
|
||||
{reviewNote
|
||||
? `Reviewer note: ${reviewNote}`
|
||||
: "Please update the requested details and resubmit for review."}
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
<Link
|
||||
to="/settings"
|
||||
className="inline-flex items-center gap-2 rounded-lg bg-amber-600 px-4 py-2 text-sm font-semibold text-white shadow-sm transition-transform hover:scale-[1.02]"
|
||||
>
|
||||
Review & resubmit
|
||||
<ArrowRight size={16} />
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// 3. Profile-edit review rejected — prompt to fix & resubmit.
|
||||
if (reviewStatus === "rejected") {
|
||||
return (
|
||||
<div className="border-b border-red-200 bg-red-50 px-6 py-3">
|
||||
@@ -239,7 +278,7 @@ export function AccountReviewBanner() {
|
||||
);
|
||||
}
|
||||
|
||||
// 3. Company approved and awaiting its first operational profile — nothing
|
||||
// 4. Company approved and awaiting its first operational profile — nothing
|
||||
// profile-specific to report yet, but the account itself is pending.
|
||||
if (profiles.length === 0) {
|
||||
if (companyStatus === "pending") {
|
||||
@@ -259,7 +298,7 @@ export function AccountReviewBanner() {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 4. Per-operational-profile approval (existing behaviour).
|
||||
// 5. Per-operational-profile approval (existing behaviour).
|
||||
if (pending.length === 0) {
|
||||
// Nothing outstanding — a quiet confirmation that the account is live.
|
||||
if (companyStatus === "active") {
|
||||
|
||||
Reference in New Issue
Block a user