Skip to content

Release 0.68.5#3368

Open
odlbot wants to merge 8 commits into
releasefrom
release-candidate
Open

Release 0.68.5#3368
odlbot wants to merge 8 commits into
releasefrom
release-candidate

Conversation

@odlbot
Copy link
Copy Markdown
Contributor

@odlbot odlbot commented May 21, 2026

Carey P Gumaer

Matt Bertrand

Rachel Lougee

Chris Chudzicki

Nathan Levesque

Ahtesham Quraish

ahtesham-quraish and others added 8 commits May 20, 2026 14:18
… First Part) (#3332)

* refactor: rename the articles app and update its links all over the places like etl





---------

Co-authored-by: Ahtesham Quraish <ahtesham.quraish@192.168.1.47>
* Fix eslint config to ignore node_modules

* Update frontends/.eslintrc.js

Co-authored-by: Chris Chudzicki <christopher.chudzicki@gmail.com>

* Fmt

---------

Co-authored-by: Chris Chudzicki <christopher.chudzicki@gmail.com>
* plan: record settled Phase 4 pre-decisions

Folds the Phase 4 brainstorming outcomes into the plan as a SETTLED block:
- (A) build the real entry constructor + adapter; rename DashboardCourseSlot →
  DashboardCourseEntry (code + remainder of plan doc) as step 0
- composer emits the RequirementSectionItem discriminated union + shared aux
  (enrollmentsByCourseId / pre-derived ancestorProgramEnrollment)
- buildProgramScenario = thin entities-in mock-wirer (2a); tests own scenario
- language picker: hook-owned, derive-during-render, effective key, own test
- shared structure-only parseProgramRequirementSections in @/common/mitxonline;
  buildRequirementSections owns dashboard display policy; product parseReqTree
  migration is the next stacked PR; re-ask at Phase 4 exit
- behavior-preservation scope: stable render is the contract, first paint
  negotiable except loading states

Full design record (rationale + rejected alternatives) in
feature_work/TODOS_AND_IDEAS/phase4-design.md (local).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: rename DashboardCourseSlot → DashboardCourseEntry (Phase 4 step 0)

Pure rename, zero behavior change, zero production callers today:
- DashboardCourseSlot → DashboardCourseEntry
- resolveSlotForLanguage → resolveCourseEntryForLanguage
- adaptCourseSlotToLegacyDashboardCardProps → adaptCourseEntryToLegacyDashboardCardProps
- dashboardRefactorPlan.md slot vocabulary swept to "entry"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(mitxonline): add structure-only parseProgramRequirementSections (Phase 4 Task B)

Shared req-tree → ordered operator sections parse (ids + operator metadata +
rawTitle only; no display copy/completion/entity resolution). Composed by the
Phase 4 dashboard helpers (Task C). Product parseReqTree migration is a later PR.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(dashboard): add buildCourseEntry + buildRequirementSections (Phase 4 Task C)

Pure model helpers composing the shared parseProgramRequirementSections into the
RequirementSectionItem discriminated union; behavior-preserving extraction of the
inline ProgramEnrollmentDisplay logic. getRequirementSectionTitle moved into the
model. Flat-req_tree assumption documented.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(dashboard): add useDashboardLanguagePicker hook (Phase 4 Task D)

Derive-during-render language-picker state (no reconcile effect). Stable
contract preserved (effective key ∈ options or "" ; default = options[0];
user pick persists while valid, falls back when it disappears). Reused by
Phase 5. setSelectedLanguageKey records the raw user choice.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(dashboard): add useProgramDashboardData composer + buildProgramScenario (Phase 4 Task E)

Thin composer: replicates the program dashboard's 6-query orchestration exactly
and composes the pure helpers (grouping, getDistinctDashboardLanguageOptions,
useDashboardLanguagePicker, buildRequirementSections) into the durable returned
contract incl. shared aux (enrollmentsByCourseId, ancestorProgramEnrollment).
renderHook suite asserts the returned contract (never through the adapter);
buildProgramScenario is a thin entities-in mock-wirer (tests own scenario shape).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(dashboard): ProgramEnrollmentDisplay consumes useProgramDashboardData (Phase 4 Task F)

Component is now purely presentational: consumes the composer hook and routes the
course arm through adaptCourseEntryToLegacyDashboardCardProps. All inline query
orchestration / language state / req-tree shaping removed. Behavior byte-identical
— ProgramEnrollmentDisplay.test.tsx unchanged and green (the regression oracle).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(dashboard): Phase 4 cleanup batch (behavior-neutral)

Branch-review follow-ups, no production behavior change:

1. test-utils buildProgramScenario: derive requiredProgramIds via
   getIdsFromReqTree(program.req_tree) + Set dedup so it truly mirrors
   the hook's useMemo (the drift-protection comment was inaccurate;
   closes a silent mock-key-drift trap).
2. useProgramDashboardData: reword stale '6 queries (replicated
   exactly from oracle)' comment (the hook is canonical post-Task-F).
3. useProgramDashboardData: drop dead re-export of
   V3UserProgramEnrollment + its now-unused import.
4. dashboardViewModel: make getRequirementSectionTitle module-private
   (only exercised internally via buildRequirementSections; not
   imported directly by tests).
5. useProgramDashboardData.test: add a composer renderHook scenario
   exercising the program-enrollment arm (closes a wiring-layer gap).
6. parseProgramRequirementSections: doc the recursion ≡ direct-children
   parity under the flat-req_tree invariant.

Verified: yarn test DashboardPage/ (458 pass), mitxonline.test.ts
(34 pass), frontends typecheck — all green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(test): document layer-3 scope in oracle headers

Add a file-header comment to HomeEnrollmentsDisplay.test.tsx and
ProgramEnrollmentDisplay.test.tsx stating what belongs in these
component (layer-3) suites — seam/smoke + genuine component concerns —
and that exhaustive case coverage belongs in the pure model / hook
tests. Anti-bloat guardrail for future contributors.

Comment-only: +33/-0, zero assertion/code changes. This is the single
change to the otherwise-frozen Phase-4 behavior oracle
(ProgramEnrollmentDisplay.test.tsx) — the oracle's diff vs origin/main
is now exactly this one comment-only commit, no behavior change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix typo

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: add PostHog tracking for onboarding CTA interactions

* feedback
)

* extract individual contract hooks to useContractDashboardData, sorting / filtering logic to dashboardViewModel and implement usage in ContractContent

* add tests for contract dashboard helpers

* add explicit tests for checking to make sure the contract dashboard only renders programs with contract scoped courses

* improve contract program sorting logic

* remove redundant contract id filtering

* show "no programs" message if both programs and collections are empty, not just programs

* use useDashboardLanguagePicker

* rename slot -> entry

* null check on program.page

* remove unnecessary factory overrides

* swap buildContractCourseEntries for buildCourseEntry

and add a missing test for buildCourseEntry

* add a docstring for getRenderableContractCollections

---------

Co-authored-by: Chris Chudzicki <christopher.chudzicki@gmail.com>
@github-actions
Copy link
Copy Markdown

OpenAPI Changes

30 changes: 0 error, 0 warning, 30 info

View full changelog

Unexpected changes? Ensure your branch is up-to-date with main (consider rebasing).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants