Project-7525: [DO NOT MERGE] Feature branch for the new returns flow#2667
Project-7525: [DO NOT MERGE] Feature branch for the new returns flow#2667bc-vivekaggarwal wants to merge 61 commits into
Conversation
There was a problem hiding this comment.
Pull request overview
This PR parks initial Cornerstone theme changes for PROJECT-7525’s “new returns flow”, adding new templates/assets for a redesigned return-request experience and gating existing “Return” affordances on a new settings.returns_v2_enabled flag (with fallback to settings.returns_enabled).
Changes:
- Add new return-related templates: a guest return portal page and a new account “add return” page layout.
- Add new styling and a new page manager (
AddReturnNew) plus bundle wiring for the new return-request UI. - Gate “Return” entry points in order details and orders list on returns settings; update
CHANGELOG.md.
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| templates/pages/guest-return-portal.html | New guest-facing return portal page scaffold. |
| templates/pages/account/orders/details.html | Gate “Return” button using returns_v2_enabled OR returns_enabled. |
| templates/pages/account/add-return-new.html | New account return-request page markup for the redesigned flow. |
| templates/components/account/orders-list.html | Gate “Return Items” link using returns_v2_enabled OR returns_enabled. |
| CHANGELOG.md | Add draft entries for the new return pages / gating changes. |
| assets/scss/components/stencil/addReturn/_addReturn.scss | Add styling for the new return-request page (.newReturn). |
| assets/js/theme/add-return-new.js | New page manager that renders the new return UI (currently with placeholder data). |
| assets/js/app.js | Wire account_new_return page type to load the new return page manager. |
Comments suppressed due to low confidence (3)
assets/js/theme/add-return-new.js:96
- Date formatting is hardcoded to the
en-AUlocale. This will display incorrect date formats for stores with different locales; use store locale from Stencil context (e.g.this.context.storeLocale) or omit the locale to allow the browser/store locale to drive formatting.
// TODO ORDERS-7715: invoke createReturn Storefront GQL mutation.
});
}
}
assets/js/theme/add-return-new.js:142
- Currency formatting is hardcoded to
en-AUand always usesitem.totalIncTaxeven thoughorder.isTaxInclusiveis available. This will display incorrect amounts/formatting for non-AU stores and for tax-exclusive display settings. Use a locale from context and choosetotalIncTaxvstotalExTaxbased onorder.isTaxInclusive(or use server-provided formatted totals if available).
assets/js/theme/add-return-new.js:239 console.log('Submitting return', ...)should not ship in theme code. Either remove it or gate it behind an explicit debug flag, and replace with the real API call / proper error handling when wiring this up.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| account_order: getAccount, | ||
| account_addressbook: getAccount, | ||
| shippingaddressform: getAccount, | ||
| account_new_return: getAccount, | ||
| account_new_return: getAddReturnNew, | ||
| 'add-wishlist': () => import('./theme/wishlist'), |
| {{> components/common/breadcrumbs breadcrumbs=breadcrumbs}} | ||
|
|
||
| <h1> Guest Return Portal</h1> | ||
|
|
| </div> | ||
| <div class="newReturn-headerActions"> | ||
| <a href="{{../urls.account.orders.all}}" class="newReturn-btnBack">{{lang 'account.orders.return.back_button'}}</a> | ||
| <a href="/return-policy" class="newReturn-btnPolicy">View return policy →</a> | ||
| </div> | ||
| </div> | ||
| {{#if date}}<p class="newReturn-orderDate">{{date}}</p>{{/if}} |
| this.bindSubmit($form); | ||
| } | ||
|
|
||
| bindOrderLineItemEvents() { | ||
| document.querySelectorAll('.newReturn-stepperBtn').forEach(button => { | ||
| button.addEventListener('click', () => { | ||
| // Derive itemId from the parent row — buttons do not carry data-item-id, | ||
| // so the [data-item-id] selector stays scoped to the row container only. | ||
| const row = button.closest('.newReturn-orderLineItem'); | ||
| const itemId = row?.dataset?.itemId; | ||
| if (!itemId) return; | ||
| const action = button.getAttribute('data-action'); |
| - Fix duplicate `id="default_instrument"` on Update Payment Method page [#2661](https://github.com/bigcommerce/cornerstone/pull/2661) | ||
| - Respect `available_to_sell` on PDP so the Sold Out alert is hidden and the Add to Cart button stays enabled for backorderable products, and is disabled when quantity exceeds `available_to_sell` [#2659](https://github.com/bigcommerce/cornerstone/pull/2659) | ||
| - Updated accessibility features [2656](https://github.com/bigcommerce/cornerstone/pull/2656) | ||
| - Adds new guest-return-portal page. [2645](https://github.com/bigcommerce/cornerstone/pull/2645) |
|
cursor review |
…2653) * feat(returns): ORDERS-7704 condition for new returns on orders page * feat(returns): ORDERS-7704 condition for new returns on orders page - confirmed
feat(orders): ORDERS-7706 add new return page layout
…context (#2665) * feat(returns): ORDERS-7708 new-return page — render items from order context, stepper qty controls, responsive layout, gate behind returns_v2_enabled flag * feat(returns): ORDERS-7708 new-return page - review feedback
feat(orders): ORDERS-7681 add Cancel return button to return-detailsjs page
…age-mobile-tablet-views feat(returns): ORDERS-7771 tighten spacing on mobile and tablet viewports
| } finally { | ||
| this.isCancelling = false; | ||
| if (cancelBtn) cancelBtn.disabled = false; | ||
| if (overlay) overlay.style.display = ''; |
There was a problem hiding this comment.
Cancel enabled before reload
Medium Severity
On successful cancel, window.location.reload() runs but the finally block always clears isCancelling and re-enables the cancel button before navigation finishes, allowing duplicate cancel requests against an already-cancelled return.
Reviewed by Cursor Bugbot for commit 8a15ff6. Configure here.
| throw new Error('Failed to start return guest session'); | ||
| } | ||
|
|
||
| window.location.href = `/create-return/${payload.orderEntityId}`; |
There was a problem hiding this comment.
Guest redirect ignores locale path
Medium Severity
After a successful guest session, navigation uses a root-absolute /create-return/{orderId} URL, which drops the active language subfolder on multi-language storefronts and can land shoppers on the wrong locale or a 404.
Reviewed by Cursor Bugbot for commit 20ca5bc. Configure here.
…h phone contact details if available. (#2698)
| if (!errorBox) return; | ||
|
|
||
| errorBox.style.display = ''; | ||
| } |
There was a problem hiding this comment.
API errors never shown
Medium Severity
getErrorMessages collects GraphQL error text, but showError only reveals the static error box and never writes those messages into the DOM, so shoppers always see the generic copy.
Reviewed by Cursor Bugbot for commit 4a8e4e7. Configure here.
| {{lang 'account.returns.contact_merchant' phone_number=../settings.phone_number }} | ||
| </p> | ||
| {{/if}} | ||
| </p> |
There was a problem hiding this comment.
Nested paragraph in error markup
Low Severity
The create-return error block nests a second <p class="alertBox-message"> inside another alertBox-message paragraph when phone_number is set, which is invalid HTML and can break error layout in the browser.
Reviewed by Cursor Bugbot for commit 4a8e4e7. Configure here.
feat(orders): ORDERS-7935 add badge for CANCELLED order returns
| } | ||
|
|
||
| startReturnGuestSession(input) { | ||
| return fetch('/graphql', { |
There was a problem hiding this comment.
GraphQL fetch omits base URL
Medium Severity
New returns flows call fetch('/graphql', …) with a root-absolute URL, unlike other theme API usage that passes secureBaseUrl, so GraphQL may miss the correct prefixed path on multi-language storefronts.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 99a9c87. Configure here.
… on returns details page (#2697) * feat(returns): ORDERS-7900: strike requested with resolved resolution on returns details page * feat(returns): ORDERS-7900: add translation strings for resolution request
…page for desktop/tablet/mobile views
…gination feat(returns): ORDERS-7752 add cursor pagination to returns
feat(orders): ORDERS-7770 add responsive styling for returns details page for desktop/tablet/mobile views
…creating a return
feat(orders): ORDERS-7837 add additional note field to mutation when creating a return
…return detail page
feat(orders): ORDERS-7838 add additional note section to new shopper return detail page
| const overlay = document.querySelector('.guest-return-portal .loadingOverlay'); | ||
| if (submitBtn) submitBtn.disabled = true; | ||
| if (overlay) overlay.style.display = 'block'; | ||
| const payload = this.buildRequestPayload(); |
There was a problem hiding this comment.
Guest error alert never cleared
Low Severity
The guest return portal shows errors via showError but never hides or clears the alert when a new submit starts. A prior failure message stays visible during and after later attempts until navigation succeeds.
Reviewed by Cursor Bugbot for commit 8447deb. Configure here.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 7 total unresolved issues (including 6 from previous reviews).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit de1a079. Configure here.
| throw new Error('Failed to start return guest session'); | ||
| } | ||
|
|
||
| window.location.href = `/create-return/${payload.orderEntityId}`; |
There was a problem hiding this comment.
Root-absolute return URLs
Medium Severity
After a successful guest session, navigation uses a root-absolute /create-return/... URL, and the returns list links to /account.php?.... On multi-language storefronts with locale subfolders, those paths skip the active prefix while other return links use urls.*, so shoppers can land on the wrong locale or a broken page.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit de1a079. Configure here.


What?
This PR is for a feature branch to park all reviewed changes related to the new returns flow PROJECT-7525
Requirements
Tickets / Documentation
PROJECT-7525
Screenshots (if appropriate)
Not applicable: They are part of individual PRs
Testing
TBD
Note
Medium Risk
Large, customer-facing order/returns changes with storefront GraphQL mutations and guest session handling; mitigated by feature flags and parallel legacy path when v2 is disabled.
Overview
Introduces a returns v2 shopper experience behind
settings.returns_v2_enabled(withreturns_enabledfallback for legacy links and nav), while keeping the old account return flow when v2 is off.New surfaces and behavior: Guest return portal (email + order ID validation,
startReturnGuestSessionGraphQL, redirect to/create-return/{orderId}), create-return page (per-line qty/reason/resolution, note length validation,createReturnmutation, inline confirmation), return details (summary, line items with images, requested vs final resolution, cancel viacancelReturn+ modal), and a v2 returns list with status badges and cursor prev/next pagination.Wiring: Lazy-loaded page modules in
app.jsforcreate_return,guest_return_portal, and return detail page types; new templates, SCSS components, andlang/en.jsoncopy. Account nav, mobile nav, orders list, and order details return actions are gated on the new settings.Reviewed by Cursor Bugbot for commit de1a079. Bugbot is set up for automated code reviews on this repo. Configure here.