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 32 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 |
| </div> | ||
| <div class="newReturn-headerActions"> | ||
| <a href="{{../urls.account.orders.all}}" class="button">{{lang 'account.returns.back'}}</a> | ||
| <a href="/return-policy" class="button button--primary">{{lang 'account.returns.view_return_policy'}} →</a> |
There was a problem hiding this comment.
Return policy URL not localized
Medium Severity
The “View return policy” action points to a root-absolute /return-policy path instead of a storefront-aware URL, so it can 404 or miss the language subfolder on multi-language channels.
Reviewed by Cursor Bugbot for commit 621d2ce. Configure here.
| requestedResolution: this.buildRequestedResolution(document.getElementById(`resolution-${itemId}`)?.value), | ||
| }]; | ||
| }), | ||
| }; |
There was a problem hiding this comment.
Additional note omitted from payload
Medium Severity
The create-return page collects an “Additional Note” in data-new-return-note, but buildReturnInput() never reads that field, so shopper notes are dropped and never sent with the createReturn mutation.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit bcea92e. Configure here.
|
|
||
| // Storefront GraphQL `createReturn` mutation | ||
| createReturn(input) { | ||
| return fetch('/graphql', { |
There was a problem hiding this comment.
GraphQL URL ignores storefront base
Medium Severity
createReturn posts to a hardcoded /graphql path. On multi-language subfolder storefronts, that can miss the localized base URL used elsewhere for theme API calls, so the mutation may hit the wrong host path and fail.
Reviewed by Cursor Bugbot for commit bcea92e. Configure here.
| <select class="form-select form-select--small" id="resolution-{{id}}" aria-label="{{lang 'account.returns.select_resolution'}}"> | ||
| <option value="">{{lang 'account.returns.select_resolution'}}</option> | ||
| {{#each ../../resolutions}} | ||
| <option value="{{resolutionType}}">{{label}}</option> |
There was a problem hiding this comment.
Resolution option value mismatch
Medium Severity
Resolution <option> values use resolutionType, while buildRequestedResolution() treats any non-system value as customResolutionEntityId. Custom resolutions whose type is CUSTOM can send the literal string CUSTOM instead of the real entity id.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit bcea92e. Configure here.
| <h6 class="account-orderStatus-label account-orderStatus-label--closed">{{lang 'account.returns.status.closed'}}</h6> | ||
| {{/if}} | ||
| </div> | ||
| <a class="button button--small" href="/account.php?action=view_return&return_id={{id}}">{{lang 'account.returns.list.view_details'}}</a> |
There was a problem hiding this comment.
Return details link wrong locale
Medium Severity
The “View details” link uses a hardcoded /account.php?action=view_return&return_id=... href instead of a storefront urls helper, so on multi-language sites the link may leave the active locale path and fail or show the wrong context.
Reviewed by Cursor Bugbot for commit 281c2c9. 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 34bc18e. Configure here.
| } finally { | ||
| this.isSubmitting = false; | ||
| if (submitBtn) submitBtn.disabled = false; | ||
| if (overlay) overlay.style.display = ''; |
There was a problem hiding this comment.
Submit re-enabled without validation
Medium Severity
After a failed or errored createReturn request, the submit handler’s finally block sets return-new-submitBtn to enabled without calling updateSubmitState(), so the button can stay clickable when no line items have quantity, resolution, and reason filled in.
Reviewed by Cursor Bugbot for commit 34bc18e. Configure here.
…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-7706 add new return page layout
* feat(returns): ORDERS-7764 render create return page with stencil context * feat(returns): ORDERS-7764 render create return page with stencil context * feat(returns): ORDERS-7764 render create return page with stencil context * feat(returns): ORDERS-7764 render create return page with stencil context * feat(returns): ORDERS-7764 fix code review comments * feat(returns): ORDERS-7764 fix code review comments * feat(returns): ORDERS-7764 fix design feedback * feat(returns): ORDERS-7764 fix design feedback
…page to returnsV2 create return
34bc18e to
38101ea
Compare


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
Touches order return submission via Storefront GraphQL and broad account/order template gating, but changes are theme-scoped behind returns settings rather than core checkout or auth.
Overview
This PR lands the returns v2 storefront experience: shoppers can request returns on a new create-return page, see an updated returns list when v2 is on, and open a return details view. Entry points on the orders list and order details page are gated on
settings.returns_v2_enabledwithsettings.returns_enabledas fallback.The create-return page adds line-item quantity, preferred resolution, and reason controls, validates before submit, and posts the
createReturnStorefront GraphQL mutation (with injected order context and API token) instead of the legacy form POST. Success swaps the form for an inline confirmation; errors surface in-page.Account returns switches to
returns-list-v2(status badges, dates, item count, view-details link) when v2 is enabled; otherwise the legacy list remains. A new return details template renders RMA, status, line items, and a summary sidebar fromreturn_detailcontext. A guest return portal page is added as a stub.Supporting changes include new SCSS for create/detail layouts, status label styling, expanded
lang/en.jsoncopy, legacy add-return table a11y tweaks, andapp.jspage loaders forcreate_returnand return detail page types.Reviewed by Cursor Bugbot for commit 38101ea. Bugbot is set up for automated code reviews on this repo. Configure here.