Merged
Conversation
* Add page_size to program list query when pulling programs for contracts, so we get a few more back * Add page size where we're generating a list of page IDs
* feat: move enrollment button below course summary content
Reorder the sidebar card so the enroll button appears after the summary
info rows rather than before them, matching the Figma design.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: add program bundle upsell to course summary sidebar
Replace the "Course is part of the following programs" info row with a
ProgramBundleUpsell component that fetches each parent program's details
and shows a bundle pricing card with a "View Program" link, ordered after
the enroll button.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: single-structure info box with CSS grid, fix bundle upsell borders/padding
Replace three separate DOM structures (desktop/tablet/mobile) in the product page
info box with a single HTML structure using CSS grid for responsive layout. Fixes
program bundle upsell border on tablet by resetting bleed margins and adding direct
border; adjusts SummaryRoot padding per breakpoint; adds AskTIM placeholder button.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: remove product page navbar/navigation links
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: split SummaryCard/SummaryContent, delete ProductNavbar, add AskTIM placeholder
- Split SummaryRoot into SummaryCard (border/shadow wrapper) and
SummaryContent (padded metadata area) so the bundle upsell can span
edge-to-edge without negative margins
- Delete unused ProductNavbar.tsx
- Add temporary AskTIM button placeholder using smoot-design Button
- Add TODO comment for hardcoded 1.2x strike price
- Add comment explaining per-program detail fetches
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: simplify sidebar layout, tablet 2-col metadata, row-style upsell
- Remove grid-based tablet layout (RightCol, ActionsArea) from template
- Enrollment button desktop-only via DesktopEnrollArea; AskTIM outside card
- SummaryContent is now just a padding wrapper; gap/layout owned by SummaryRows
- SummaryRows: flex-column on desktop/mobile, column-count:2 on tablet
- Bundle upsell: row layout on tablet (text left, button right), skip if no price
- Add separator borders between multiple upsell items
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: move sticky to SummaryCol, use HEADER_HEIGHT, add column-rule
- Sticky position on SummaryCol so AskTIM scrolls with the card
- align-self: flex-start required for sticky in flex parent
- Replace magic top offset with HEADER_HEIGHT constant
- Add column-rule divider between tablet metadata columns
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: refine bundle upsell copy, pricing, and AskTIM layout
- Use avoidCents for bundle price formatting (whole dollars)
- Show required course count in upsell title ("Get all 5 ...")
- Bold program title, normal weight for rest of upsell text
- Replace strikethrough price with static "(19% off)" discount
- Replace "Want a program certificate?" with "Best value"
- Make AskTIM button full width, match Figma shadow opacity
- Adjust bundle spacing to match Figma (8px header gap, 24px item gap)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: restore enrollment button at all breakpoints, update upsell tests
- Replace DesktopEnrollArea (md-only) with EnrollArea (always visible)
- Tablet enrollment button: max-width 50%, center-aligned
- Update ProgramBundleUpsell tests for new copy ("Best value", course
count, avoidCents price, "(19% off)") and add no-price test case
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: hide empty upsell, parameterize AskTIM, require enrollButton
- ProgramBundleUpsell waits for all queries to load and filters to
programs with prices before rendering, preventing an empty "Best
value" header
- AskTIM button text uses productNoun prop ("course" or "program")
- enrollButton is now a required prop on ProductPageTemplate
- Remove console.log placeholder from AskTIM onClick
- Clean up BundleUpsellContainer border styles per breakpoint
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix some minor spacing issues
* fix: replace hardcoded dates in ProductSummary tests with relative dates
Use monthsFromNow() helper so tests don't rot as calendar time passes.
Past dates for "Anytime" logic use negative offsets; ordering tests use
spaced-out future offsets; display-only tests let the factory decide.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: add error-state test for ProgramBundleUpsell, use deferred promises
Add test verifying the upsell renders nothing when the program detail
fetch fails. Use Promise.withResolvers() to control mock response timing
in both no-price and error tests, replacing the fragile
queryClient.isFetching() polling pattern.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: extract hardcoded bundle discount to named constant
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add loading skeleton to ProgramBundleUpsell, improve tests
Show structured skeleton placeholders (title, price, button) while
program details load, then render real content or unmount if no priced
programs. Tests now verify the full loading→removed lifecycle using
waitForElementToBeRemoved and use distinct prices for multi-program
assertions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: create CourseInfoBox wrapper component
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: create ProgramInfoBox wrapper component
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: assert summary mocks are rendered in InfoBox tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: simplify ProductPageTemplate to single infoBox prop
Replace sidebarSummary, enrollButton, programUpsell, summaryTitle, and
productNoun props with a single infoBox prop. CoursePage uses
CourseInfoBox, ProgramPage uses ProgramInfoBox.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: log warning when program bundle upsell queries fail
Rather than silently returning null when all program detail fetches
fail, log a console.warn to aid debugging. Add allowConsoleErrors()
to the error-state test to accommodate jest-fail-on-console.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: rename and reorganize InfoBox components
Rename CourseInfoBox → InfoBoxCourse, ProgramInfoBox → InfoBoxProgram
for alphabetical grouping with InfoBoxParts. Extract shared styled
components (now InfoBoxCard, InfoBoxContent, InfoBoxEnrollArea,
AskTimButton) into InfoBoxParts so InfoBoxProgram no longer depends
on InfoBoxCourse for shared primitives.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor: extract ProgramBundleUpsell to its own module
Move ProgramBundleUpsell component and all its styled components out
of ProductSummary.tsx into ProgramBundleUpsell.tsx, with tests moved
to ProgramBundleUpsell.test.tsx.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test: assert summary mocks are rendered in InfoBox tests
Remove dedicated InfoBoxCourse and InfoBoxProgram test files — their
coverage is better placed at the page level. Rename section headings
to "Course Information" / "Program Information". Add a CoursePage
test asserting the program bundle upsell renders when the course
belongs to a program.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* remove asktim
* refactor: clean up review feedback and batch program queries
- Remove redundant fragment wrappers in InfoBoxCourse and InfoBoxProgram
- Use V2ProgramDetail instead of V2Program for RequirementsSection prop type
- Remove no-op `& {}` intersection on CourseCertificateBox
- Clarify bundle upsell smoke test name in CoursePage.test
- Fix misleading `courses` variable name in ProgramPage 404 test
- Batch program detail fetches into single programsList query
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* simplify a test call
* align enrollment button to right column on tablet
On tablet, use flex + justify-end instead of centering the enrollment
button. Also remove unnecessary width: 100% and WideButtonLink wrapper
from enrollment button components.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor program bundle upsell layout and remove best value header
Remove "Best value" header, use h5 bold for full title line, and
regroup price + button into BundleUpsellActions so price sits above
the button on tablet (single HTML structure, CSS-only responsive).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* restore disabled link behavior
* fix wrapping
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
change the banner design --------- Co-authored-by: Ahtesham Quraish <ahtesham.quraish@192.168.10.4>
* upgrade api package * remove some redundant comments * set default instructor icon * remove another redundant comment * add a test for the default icon
* fix: change articles mobile design --------- Co-authored-by: Ahtesham Quraish <ahtesham.quraish@192.168.10.4>
Co-authored-by: Ahtesham Quraish <ahtesham.quraish@192.168.10.26>
e69ab5b to
845724e
Compare
| content: page.faculty.length ? "x" : undefined, | ||
| }, | ||
| ] as const | ||
| return all.filter((item) => item.content) |
There was a problem hiding this comment.
Bug: The breadcrumb label for Course and Program pages is incorrectly hardcoded to "Learning Path", which is misleading for users navigating the site.
Severity: MEDIUM
Suggested Fix
The currentBreadcrumbLabel prop should be set correctly for each page type. In CoursePage.tsx, it should be set to "Course". In ProgramPage.tsx, it should be set to "Program". This will restore the correct navigational context for users.
Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent.
Verify if this is a real issue. If it is, propose a fix; if not, explain why it's not
valid.
Location: frontends/main/src/app-pages/ProductPages/CoursePage.tsx#L71
Potential issue: The `currentBreadcrumbLabel` prop in `CoursePage.tsx` and
`ProgramPage.tsx` is hardcoded to the string "Learning Path". This causes the breadcrumb
navigation on both course and program pages to incorrectly display "Home > Learning
Path". This is a functional UI regression that is semantically incorrect and can confuse
users about the type of product page they are viewing, as internal headings still
correctly differentiate between "Course Information" and "Program Information".
Did we get this right? 👍 / 👎 to inform future reviews.
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.
Matt Bertrand
Ahtesham Quraish
Carey P Gumaer
Chris Chudzicki
James Kachel